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