My agentic slop goes here. Not intended for anyone else!
1(** Email changes operations using core JMAP Changes_args. 2 3 This module provides type-safe Email/changes operations for tracking 4 modifications to emails since a given state, enabling efficient 5 incremental synchronization. 6 7 @see <https://www.rfc-editor.org/rfc/rfc8621.html#section-4.6> RFC 8621 Section 4.6 *) 8 9open Jmap.Methods 10 11(** {1 Changes Arguments} *) 12 13(** Build Email/changes arguments using core Changes_args. 14 @param account_id The account to check for changes 15 @param since_state The state to get changes since 16 @param ?max_changes Optional maximum number of changes to return 17 @return Changes_args for Email/changes method *) 18val build_changes_args : 19 account_id:Jmap.Id.t -> 20 since_state:string -> 21 ?max_changes:Jmap.UInt.t -> 22 unit -> 23 Changes_args.t 24 25(** Convert Email/changes arguments to JSON. 26 @param args The Changes_args to convert 27 @return JSON representation for Email/changes method *) 28val changes_args_to_json : Changes_args.t -> Yojson.Safe.t 29 30(** {1 Change Tracking} *) 31 32(** Change tracker for accumulating changes over time *) 33type change_tracker 34 35(** Create a new change tracker. 36 @param account_id The account ID to track 37 @param initial_state The starting state 38 @return A new change tracker *) 39val create_tracker : 40 account_id:Jmap.Id.t -> 41 initial_state:string -> 42 change_tracker 43 44(** Update tracker with a Changes_response. 45 @param tracker The tracker to update 46 @param response The changes response to process 47 @return Updated tracker with accumulated changes *) 48val update_tracker : 49 change_tracker -> 50 Changes_response.t -> 51 change_tracker 52 53(** Get all accumulated changes. 54 @param tracker The change tracker 55 @return Tuple of (created_ids, updated_ids, destroyed_ids) *) 56val get_all_changes : 57 change_tracker -> 58 (Jmap.Id.t list * Jmap.Id.t list * Jmap.Id.t list) 59 60(** {1 Incremental Sync} *) 61 62(** Get next batch of changes. 63 @param account_id The account ID 64 @param since_state State to get changes since 65 @param ?max_changes Maximum changes per batch (default 500) 66 @return Changes_args for fetching next batch *) 67val get_next_changes : 68 account_id:Jmap.Id.t -> 69 since_state:string -> 70 ?max_changes:int -> 71 unit -> 72 Changes_args.t 73 74(** Check if there are more changes pending. 75 @param response The changes response to check 76 @return True if has_more_changes flag is set *) 77val has_pending_changes : Changes_response.t -> bool 78 79(** Module for managing incremental sync state *) 80module Sync : sig 81 (** Sync state tracking *) 82 type sync_state 83 84 (** Initialize sync state. 85 @param account_id The account to sync 86 @param initial_state The starting state 87 @return New sync state *) 88 val init : 89 account_id:Jmap.Id.t -> 90 initial_state:string -> 91 sync_state 92 93 (** Add a changes response to sync state. 94 @param sync Current sync state 95 @param response Changes response to add 96 @return Updated sync state *) 97 val add_response : 98 sync_state -> 99 Changes_response.t -> 100 sync_state 101 102 (** Clear pending changes from sync state. 103 @param sync Sync state to clear 104 @return Sync state with empty pending lists *) 105 val clear_pending : sync_state -> sync_state 106 107 (** Get pending changes. 108 @param sync Sync state 109 @return Tuple of (created, updated, destroyed) ID lists *) 110 val get_pending : 111 sync_state -> 112 (Jmap.Id.t list * Jmap.Id.t list * Jmap.Id.t list) 113 114 (** Check if sync is needed. 115 @param sync Current sync state 116 @param response Last changes response 117 @return True if more changes or pending items exist *) 118 val needs_sync : 119 sync_state -> 120 Changes_response.t -> 121 bool 122end 123 124(** {1 Utilities} *) 125 126(** Merge multiple change responses. 127 @param responses List of changes responses 128 @return Combined (created, updated, destroyed) ID lists *) 129val merge_changes : 130 Changes_response.t list -> 131 (Jmap.Id.t list * Jmap.Id.t list * Jmap.Id.t list) 132 133(** Get updated properties if available. 134 @param response Changes response 135 @return Optional list of properties that were updated *) 136val get_updated_properties : 137 Changes_response.t -> 138 string list option