···159159 (* Extract session ID from system messages *)
160160 (match msg with
161161 | Message.System sys ->
162162- (match Message.System.Data.session_id (Message.System.data sys) with
162162+ (match Message.System.session_id sys with
163163 | Some session_id ->
164164 t.session_id <- Some session_id;
165165 Log.debug (fun m -> m "Stored session ID: %s" session_id)
+1-29
claudeio/lib/content_block.ml
···334455module Text = struct
66- module Unknown = struct
77- type t = Jsont.json
88- let empty = Jsont.Object ([], Jsont.Meta.none)
99- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
1010- let jsont = Jsont.json
1111- end
1212-136 type t = {
147 text : string;
158 unknown : Unknown.t;
···8578 let of_json json = json
8679 end
87808888- module Unknown = struct
8989- type t = Jsont.json
9090- let empty = Jsont.Object ([], Jsont.Meta.none)
9191- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
9292- let jsont = Jsont.json
9393- end
9494-9581 type t = {
9682 id : string;
9783 name : string;
···136122end
137123138124module Tool_result = struct
139139- module Unknown = struct
140140- type t = Jsont.json
141141- let empty = Jsont.Object ([], Jsont.Meta.none)
142142- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
143143- let jsont = Jsont.json
144144- end
145145-146125 type t = {
147126 tool_use_id : string;
148127 content : string option;
···196175end
197176198177module Thinking = struct
199199- module Unknown = struct
200200- type t = Jsont.json
201201- let empty = Jsont.Object ([], Jsont.Meta.none)
202202- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
203203- let jsont = Jsont.json
204204- end
205205-206178 type t = {
207179 thinking : string;
208180 signature : string;
···301273 Log.debug (fun m -> m "Received content block: %a" pp t)
302274303275let log_sending t =
304304- Log.debug (fun m -> m "Sending content block: %a" pp t)276276+ Log.debug (fun m -> m "Sending content block: %a" pp t)
+13-29
claudeio/lib/content_block.mli
···1111module Text : sig
1212 (** Plain text content blocks. *)
13131414- module Unknown : sig
1515- type t = Jsont.json
1616- val empty : t
1717- val is_empty : t -> bool
1818- val jsont : t Jsont.t
1919- end
2020-2114 type t
2215 (** The type of text blocks. *)
2316···26192720 val text : t -> string
2821 (** [text t] returns the text content of the block. *)
2222+2323+ val unknown : t -> Unknown.t
2424+ (** [unknown t] returns any unknown fields from JSON parsing. *)
29253026 val jsont : t Jsont.t
3127 (** [jsont] is the Jsont codec for text blocks. *)
···8379 (** [of_json json] parses from JSON. Internal use only. *)
8480 end
85818686- module Unknown : sig
8787- type t = Jsont.json
8888- val empty : t
8989- val is_empty : t -> bool
9090- val jsont : t Jsont.t
9191- end
9292-9382 type t
9483 (** The type of tool use blocks. *)
9584···1079610897 val input : t -> Input.t
10998 (** [input t] returns the input parameters for the tool. *)
9999+100100+ val unknown : t -> Unknown.t
101101+ (** [unknown t] returns any unknown fields from JSON parsing. *)
110102111103 val jsont : t Jsont.t
112104 (** [jsont] is the Jsont codec for tool use blocks. *)
···127119module Tool_result : sig
128120 (** Results from tool invocations. *)
129121130130- module Unknown : sig
131131- type t = Jsont.json
132132- val empty : t
133133- val is_empty : t -> bool
134134- val jsont : t Jsont.t
135135- end
136136-137122 type t
138123 (** The type of tool result blocks. *)
139124···152137 val is_error : t -> bool option
153138 (** [is_error t] returns whether this result represents an error. *)
154139140140+ val unknown : t -> Unknown.t
141141+ (** [unknown t] returns any unknown fields from JSON parsing. *)
142142+155143 val jsont : t Jsont.t
156144 (** [jsont] is the Jsont codec for tool result blocks. *)
157145···171159module Thinking : sig
172160 (** Assistant's internal reasoning blocks. *)
173161174174- module Unknown : sig
175175- type t = Jsont.json
176176- val empty : t
177177- val is_empty : t -> bool
178178- val jsont : t Jsont.t
179179- end
180180-181162 type t
182163 (** The type of thinking blocks. *)
183164···191172192173 val signature : t -> string
193174 (** [signature t] returns the cryptographic signature. *)
175175+176176+ val unknown : t -> Unknown.t
177177+ (** [unknown t] returns any unknown fields from JSON parsing. *)
194178195179 val jsont : t Jsont.t
196180 (** [jsont] is the Jsont codec for thinking blocks. *)
···246230(** [log_received t] logs that a content block was received. *)
247231248232val log_sending : t -> unit
249249-(** [log_sending t] logs that a content block is being sent. *)233233+(** [log_sending t] logs that a content block is being sent. *)
-7
claudeio/lib/control.ml
···99 in
1010 Fmt.string fmt s
11111212-module Unknown = struct
1313- type t = Jsont.json
1414- let empty = Jsont.Object ([], Jsont.Meta.none)
1515- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
1616- let jsont = Jsont.json
1717-end
1818-1912type t = {
2013 request_id : string;
2114 subtype : string;
-8
claudeio/lib/control.mli
···77(** The log source for control message operations *)
88val src : Logs.Src.t
991010-(** Unknown field preservation *)
1111-module Unknown : sig
1212- type t = Jsont.json
1313- val empty : t
1414- val is_empty : t -> bool
1515- val jsont : t Jsont.t
1616-end
1717-1810type t
1911(** The type of control messages. *)
2012
+22-99
claudeio/lib/hooks.ml
···39394040(** Context provided to hook callbacks *)
4141module Context = struct
4242- module Unknown = struct
4343- type t = Jsont.json
4444- let empty = Jsont.Object ([], Jsont.Meta.none)
4545- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
4646- let jsont = Jsont.json
4747- end
4848-4942 type t = {
5043 signal: unit option; (* Future: abort signal support *)
5144 unknown : Unknown.t;
···7568 ]
76697770(** Generic hook result *)
7878-module Result_unknown = struct
7979- type t = Jsont.json
8080- let empty = Jsont.Object ([], Jsont.Meta.none)
8181- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
8282- let jsont = Jsont.json
8383-end
8484-8571type result = {
8672 decision: decision option;
8773 system_message: string option;
8874 hook_specific_output: Jsont.json option;
8989- unknown : Result_unknown.t;
7575+ unknown : Unknown.t;
9076}
91779278let result_jsont : result Jsont.t =
···1028810389(** {1 PreToolUse Hook} *)
10490module PreToolUse = struct
105105- module Input_unknown = struct
106106- type t = Jsont.json
107107- let empty = Jsont.Object ([], Jsont.Meta.none)
108108- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
109109- let jsont = Jsont.json
110110- end
111111-11291 type input = {
11392 session_id: string;
11493 transcript_path: string;
11594 tool_name: string;
11695 tool_input: Jsont.json;
117117- unknown : Input_unknown.t;
9696+ unknown : Unknown.t;
11897 }
1199812099 type t = input
···151130 "ask", `Ask;
152131 ]
153132154154- module Output_unknown = struct
155155- type t = Jsont.json
156156- let empty = Jsont.Object ([], Jsont.Meta.none)
157157- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
158158- let jsont = Jsont.json
159159- end
160160-161133 type output = {
162134 permission_decision: permission_decision option;
163135 permission_decision_reason: string option;
164136 updated_input: Jsont.json option;
165165- unknown : Output_unknown.t;
137137+ unknown : Unknown.t;
166138 }
167139168140 let output_jsont : output Jsont.t =
···181153 | Ok json -> json
182154 | Error msg -> failwith ("PreToolUse.output_to_json: " ^ msg)
183155184184- let allow ?reason ?updated_input ?(unknown = Output_unknown.empty) () =
156156+ let allow ?reason ?updated_input ?(unknown = Unknown.empty) () =
185157 { permission_decision = Some `Allow; permission_decision_reason = reason;
186158 updated_input; unknown }
187159188188- let deny ?reason ?(unknown = Output_unknown.empty) () =
160160+ let deny ?reason ?(unknown = Unknown.empty) () =
189161 { permission_decision = Some `Deny; permission_decision_reason = reason;
190162 updated_input = None; unknown }
191163192192- let ask ?reason ?(unknown = Output_unknown.empty) () =
164164+ let ask ?reason ?(unknown = Unknown.empty) () =
193165 { permission_decision = Some `Ask; permission_decision_reason = reason;
194166 updated_input = None; unknown }
195167196196- let continue ?(unknown = Output_unknown.empty) () =
168168+ let continue ?(unknown = Unknown.empty) () =
197169 { permission_decision = None; permission_decision_reason = None;
198170 updated_input = None; unknown }
199171end
200172201173(** {1 PostToolUse Hook} *)
202174module PostToolUse = struct
203203- module Input_unknown = struct
204204- type t = Jsont.json
205205- let empty = Jsont.Object ([], Jsont.Meta.none)
206206- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
207207- let jsont = Jsont.json
208208- end
209209-210175 type input = {
211176 session_id: string;
212177 transcript_path: string;
213178 tool_name: string;
214179 tool_input: Jsont.json;
215180 tool_response: Jsont.json;
216216- unknown : Input_unknown.t;
181181+ unknown : Unknown.t;
217182 }
218183219184 type t = input
···243208 | Ok v -> v
244209 | Error msg -> raise (Invalid_argument ("PostToolUse: " ^ msg))
245210246246- module Output_unknown = struct
247247- type t = Jsont.json
248248- let empty = Jsont.Object ([], Jsont.Meta.none)
249249- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
250250- let jsont = Jsont.json
251251- end
252252-253211 type output = {
254212 decision: decision option;
255213 reason: string option;
256214 additional_context: string option;
257257- unknown : Output_unknown.t;
215215+ unknown : Unknown.t;
258216 }
259217260218 let output_jsont : output Jsont.t =
···273231 | Ok json -> json
274232 | Error msg -> failwith ("PostToolUse.output_to_json: " ^ msg)
275233276276- let continue ?additional_context ?(unknown = Output_unknown.empty) () =
234234+ let continue ?additional_context ?(unknown = Unknown.empty) () =
277235 { decision = None; reason = None; additional_context; unknown }
278236279279- let block ?reason ?additional_context ?(unknown = Output_unknown.empty) () =
237237+ let block ?reason ?additional_context ?(unknown = Unknown.empty) () =
280238 { decision = Some Block; reason; additional_context; unknown }
281239end
282240283241(** {1 UserPromptSubmit Hook} *)
284242module UserPromptSubmit = struct
285285- module Input_unknown = struct
286286- type t = Jsont.json
287287- let empty = Jsont.Object ([], Jsont.Meta.none)
288288- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
289289- let jsont = Jsont.json
290290- end
291291-292243 type input = {
293244 session_id: string;
294245 transcript_path: string;
295246 prompt: string;
296296- unknown : Input_unknown.t;
247247+ unknown : Unknown.t;
297248 }
298249299250 type t = input
···319270 | Ok v -> v
320271 | Error msg -> raise (Invalid_argument ("UserPromptSubmit: " ^ msg))
321272322322- module Output_unknown = struct
323323- type t = Jsont.json
324324- let empty = Jsont.Object ([], Jsont.Meta.none)
325325- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
326326- let jsont = Jsont.json
327327- end
328328-329273 type output = {
330274 decision: decision option;
331275 reason: string option;
332276 additional_context: string option;
333333- unknown : Output_unknown.t;
277277+ unknown : Unknown.t;
334278 }
335279336280 let output_jsont : output Jsont.t =
···349293 | Ok json -> json
350294 | Error msg -> failwith ("UserPromptSubmit.output_to_json: " ^ msg)
351295352352- let continue ?additional_context ?(unknown = Output_unknown.empty) () =
296296+ let continue ?additional_context ?(unknown = Unknown.empty) () =
353297 { decision = None; reason = None; additional_context; unknown }
354298355355- let block ?reason ?(unknown = Output_unknown.empty) () =
299299+ let block ?reason ?(unknown = Unknown.empty) () =
356300 { decision = Some Block; reason; additional_context = None; unknown }
357301end
358302359303(** {1 Stop Hook} *)
360304module Stop = struct
361361- module Input_unknown = struct
362362- type t = Jsont.json
363363- let empty = Jsont.Object ([], Jsont.Meta.none)
364364- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
365365- let jsont = Jsont.json
366366- end
367367-368305 type input = {
369306 session_id: string;
370307 transcript_path: string;
371308 stop_hook_active: bool;
372372- unknown : Input_unknown.t;
309309+ unknown : Unknown.t;
373310 }
374311375312 type t = input
···395332 | Ok v -> v
396333 | Error msg -> raise (Invalid_argument ("Stop: " ^ msg))
397334398398- module Output_unknown = struct
399399- type t = Jsont.json
400400- let empty = Jsont.Object ([], Jsont.Meta.none)
401401- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
402402- let jsont = Jsont.json
403403- end
404404-405335 type output = {
406336 decision: decision option;
407337 reason: string option;
408408- unknown : Output_unknown.t;
338338+ unknown : Unknown.t;
409339 }
410340411341 let output_jsont : output Jsont.t =
···423353 | Ok json -> json
424354 | Error msg -> failwith ("Stop.output_to_json: " ^ msg)
425355426426- let continue ?(unknown = Output_unknown.empty) () = { decision = None; reason = None; unknown }
427427- let block ?reason ?(unknown = Output_unknown.empty) () = { decision = Some Block; reason; unknown }
356356+ let continue ?(unknown = Unknown.empty) () = { decision = None; reason = None; unknown }
357357+ let block ?reason ?(unknown = Unknown.empty) () = { decision = Some Block; reason; unknown }
428358end
429359430360(** {1 SubagentStop Hook} - Same structure as Stop *)
···434364435365(** {1 PreCompact Hook} *)
436366module PreCompact = struct
437437- module Input_unknown = struct
438438- type t = Jsont.json
439439- let empty = Jsont.Object ([], Jsont.Meta.none)
440440- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
441441- let jsont = Jsont.json
442442- end
443443-444367 type input = {
445368 session_id: string;
446369 transcript_path: string;
447447- unknown : Input_unknown.t;
370370+ unknown : Unknown.t;
448371 }
449372450373 type t = input
···491414type config = (event * matcher list) list
492415493416(** {1 Result Builders} *)
494494-let continue ?system_message ?hook_specific_output ?(unknown = Result_unknown.empty) () =
417417+let continue ?system_message ?hook_specific_output ?(unknown = Unknown.empty) () =
495418 { decision = None; system_message; hook_specific_output; unknown }
496419497497-let block ?system_message ?hook_specific_output ?(unknown = Result_unknown.empty) () =
420420+let block ?system_message ?hook_specific_output ?(unknown = Unknown.empty) () =
498421 { decision = Some Block; system_message; hook_specific_output; unknown }
499422500423(** {1 Matcher Builders} *)
+27-104
claudeio/lib/hooks.mli
···7373(** {1 Context} *)
74747575module Context : sig
7676- module Unknown : sig
7777- type t = Jsont.json
7878- val empty : t
7979- val is_empty : t -> bool
8080- val jsont : t Jsont.t
8181- end
8282-8376 type t = {
8477 signal: unit option;
8578 unknown : Unknown.t;
···1019410295(** {1 Generic Hook Result} *)
10396104104-module Result_unknown : sig
105105- type t = Jsont.json
106106- val empty : t
107107- val is_empty : t -> bool
108108- val jsont : t Jsont.t
109109-end
110110-11197(** Generic result structure for hooks *)
11298type result = {
11399 decision: decision option;
114100 system_message: string option;
115101 hook_specific_output: Jsont.json option;
116116- unknown: Result_unknown.t;
102102+ unknown: Unknown.t;
117103}
118104119105val result_jsont : result Jsont.t
···122108123109(** PreToolUse hook - fires before tool execution *)
124110module PreToolUse : sig
125125- module Input_unknown : sig
126126- type t = Jsont.json
127127- val empty : t
128128- val is_empty : t -> bool
129129- val jsont : t Jsont.t
130130- end
131131-132111 (** Typed input for PreToolUse hooks *)
133112 type input = {
134113 session_id: string;
135114 transcript_path: string;
136115 tool_name: string;
137116 tool_input: Jsont.json;
138138- unknown: Input_unknown.t;
117117+ unknown: Unknown.t;
139118 }
140119141120 type t = input
···148127 val transcript_path : t -> string
149128 val tool_name : t -> string
150129 val tool_input : t -> Jsont.json
151151- val unknown : t -> Input_unknown.t
130130+ val unknown : t -> Unknown.t
152131153132 val input_jsont : input Jsont.t
154133···157136158137 val permission_decision_jsont : permission_decision Jsont.t
159138160160- module Output_unknown : sig
161161- type t = Jsont.json
162162- val empty : t
163163- val is_empty : t -> bool
164164- val jsont : t Jsont.t
165165- end
166166-167139 (** Typed output for PreToolUse hooks *)
168140 type output = {
169141 permission_decision: permission_decision option;
170142 permission_decision_reason: string option;
171143 updated_input: Jsont.json option;
172172- unknown: Output_unknown.t;
144144+ unknown: Unknown.t;
173145 }
174146175147 val output_jsont : output Jsont.t
176148177149 (** {2 Response Builders} *)
178178- val allow : ?reason:string -> ?updated_input:Jsont.json -> ?unknown:Output_unknown.t -> unit -> output
179179- val deny : ?reason:string -> ?unknown:Output_unknown.t -> unit -> output
180180- val ask : ?reason:string -> ?unknown:Output_unknown.t -> unit -> output
181181- val continue : ?unknown:Output_unknown.t -> unit -> output
150150+ val allow : ?reason:string -> ?updated_input:Jsont.json -> ?unknown:Unknown.t -> unit -> output
151151+ val deny : ?reason:string -> ?unknown:Unknown.t -> unit -> output
152152+ val ask : ?reason:string -> ?unknown:Unknown.t -> unit -> output
153153+ val continue : ?unknown:Unknown.t -> unit -> output
182154183155 (** Convert output to JSON for hook_specific_output *)
184156 val output_to_json : output -> Jsont.json
···186158187159(** PostToolUse hook - fires after tool execution *)
188160module PostToolUse : sig
189189- module Input_unknown : sig
190190- type t = Jsont.json
191191- val empty : t
192192- val is_empty : t -> bool
193193- val jsont : t Jsont.t
194194- end
195195-196161 type input = {
197162 session_id: string;
198163 transcript_path: string;
199164 tool_name: string;
200165 tool_input: Jsont.json;
201166 tool_response: Jsont.json;
202202- unknown: Input_unknown.t;
167167+ unknown: Unknown.t;
203168 }
204169205170 type t = input
···211176 val tool_name : t -> string
212177 val tool_input : t -> Jsont.json
213178 val tool_response : t -> Jsont.json
214214- val unknown : t -> Input_unknown.t
179179+ val unknown : t -> Unknown.t
215180216181 val input_jsont : input Jsont.t
217182218218- module Output_unknown : sig
219219- type t = Jsont.json
220220- val empty : t
221221- val is_empty : t -> bool
222222- val jsont : t Jsont.t
223223- end
224224-225183 type output = {
226184 decision: decision option;
227185 reason: string option;
228186 additional_context: string option;
229229- unknown: Output_unknown.t;
187187+ unknown: Unknown.t;
230188 }
231189232190 val output_jsont : output Jsont.t
233191234234- val continue : ?additional_context:string -> ?unknown:Output_unknown.t -> unit -> output
235235- val block : ?reason:string -> ?additional_context:string -> ?unknown:Output_unknown.t -> unit -> output
192192+ val continue : ?additional_context:string -> ?unknown:Unknown.t -> unit -> output
193193+ val block : ?reason:string -> ?additional_context:string -> ?unknown:Unknown.t -> unit -> output
236194 val output_to_json : output -> Jsont.json
237195end
238196239197(** UserPromptSubmit hook - fires when user submits a prompt *)
240198module UserPromptSubmit : sig
241241- module Input_unknown : sig
242242- type t = Jsont.json
243243- val empty : t
244244- val is_empty : t -> bool
245245- val jsont : t Jsont.t
246246- end
247247-248199 type input = {
249200 session_id: string;
250201 transcript_path: string;
251202 prompt: string;
252252- unknown: Input_unknown.t;
203203+ unknown: Unknown.t;
253204 }
254205255206 type t = input
···259210 val session_id : t -> string
260211 val transcript_path : t -> string
261212 val prompt : t -> string
262262- val unknown : t -> Input_unknown.t
213213+ val unknown : t -> Unknown.t
263214264215 val input_jsont : input Jsont.t
265216266266- module Output_unknown : sig
267267- type t = Jsont.json
268268- val empty : t
269269- val is_empty : t -> bool
270270- val jsont : t Jsont.t
271271- end
272272-273217 type output = {
274218 decision: decision option;
275219 reason: string option;
276220 additional_context: string option;
277277- unknown: Output_unknown.t;
221221+ unknown: Unknown.t;
278222 }
279223280224 val output_jsont : output Jsont.t
281225282282- val continue : ?additional_context:string -> ?unknown:Output_unknown.t -> unit -> output
283283- val block : ?reason:string -> ?unknown:Output_unknown.t -> unit -> output
226226+ val continue : ?additional_context:string -> ?unknown:Unknown.t -> unit -> output
227227+ val block : ?reason:string -> ?unknown:Unknown.t -> unit -> output
284228 val output_to_json : output -> Jsont.json
285229end
286230287231(** Stop hook - fires when conversation stops *)
288232module Stop : sig
289289- module Input_unknown : sig
290290- type t = Jsont.json
291291- val empty : t
292292- val is_empty : t -> bool
293293- val jsont : t Jsont.t
294294- end
295295-296233 type input = {
297234 session_id: string;
298235 transcript_path: string;
299236 stop_hook_active: bool;
300300- unknown: Input_unknown.t;
237237+ unknown: Unknown.t;
301238 }
302239303240 type t = input
···307244 val session_id : t -> string
308245 val transcript_path : t -> string
309246 val stop_hook_active : t -> bool
310310- val unknown : t -> Input_unknown.t
247247+ val unknown : t -> Unknown.t
311248312249 val input_jsont : input Jsont.t
313250314314- module Output_unknown : sig
315315- type t = Jsont.json
316316- val empty : t
317317- val is_empty : t -> bool
318318- val jsont : t Jsont.t
319319- end
320320-321251 type output = {
322252 decision: decision option;
323253 reason: string option;
324324- unknown: Output_unknown.t;
254254+ unknown: Unknown.t;
325255 }
326256327257 val output_jsont : output Jsont.t
328258329329- val continue : ?unknown:Output_unknown.t -> unit -> output
330330- val block : ?reason:string -> ?unknown:Output_unknown.t -> unit -> output
259259+ val continue : ?unknown:Unknown.t -> unit -> output
260260+ val block : ?reason:string -> ?unknown:Unknown.t -> unit -> output
331261 val output_to_json : output -> Jsont.json
332262end
333263···339269340270(** PreCompact hook - fires before message compaction *)
341271module PreCompact : sig
342342- module Input_unknown : sig
343343- type t = Jsont.json
344344- val empty : t
345345- val is_empty : t -> bool
346346- val jsont : t Jsont.t
347347- end
348348-349272 type input = {
350273 session_id: string;
351274 transcript_path: string;
352352- unknown: Input_unknown.t;
275275+ unknown: Unknown.t;
353276 }
354277355278 type t = input
···360283361284 val session_id : t -> string
362285 val transcript_path : t -> string
363363- val unknown : t -> Input_unknown.t
286286+ val unknown : t -> Unknown.t
364287365288 val input_jsont : input Jsont.t
366289···399322(** {1 Generic Result Builders} *)
400323401324(** [continue ?system_message ?hook_specific_output ?unknown ()] creates a continue result *)
402402-val continue : ?system_message:string -> ?hook_specific_output:Jsont.json -> ?unknown:Result_unknown.t -> unit -> result
325325+val continue : ?system_message:string -> ?hook_specific_output:Jsont.json -> ?unknown:Unknown.t -> unit -> result
403326404327(** [block ?system_message ?hook_specific_output ?unknown ()] creates a block result *)
405405-val block : ?system_message:string -> ?hook_specific_output:Jsont.json -> ?unknown:Result_unknown.t -> unit -> result
328328+val block : ?system_message:string -> ?hook_specific_output:Jsont.json -> ?unknown:Unknown.t -> unit -> result
406329407330(** {1 Configuration Builders} *)
408331
+82-199
claudeio/lib/message.ml
···77 | String of string
88 | Blocks of Content_block.t list
991010- module Unknown = struct
1111- type t = Jsont.json
1212- let empty = Jsont.Object ([], Jsont.Meta.none)
1313- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
1414- let jsont = Jsont.json
1515- end
1616-1710 type t = {
1811 content : content;
1912 unknown : Unknown.t;
···173166 ("unknown", `Unknown);
174167 ]
175168176176- module Unknown = struct
177177- type t = Jsont.json
178178- let empty = Jsont.Object ([], Jsont.Meta.none)
179179- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
180180- let jsont = Jsont.json
181181- end
182182-183169 type t = {
184170 content : Content_block.t list;
185171 model : string;
···287273end
288274289275module System = struct
290290- (** Typed data for system init messages *)
291291- module Init = struct
292292- module Unknown = struct
293293- type t = Jsont.json
294294- let empty = Jsont.Object ([], Jsont.Meta.none)
295295- let _jsont = Jsont.json
296296- end
276276+ (** System messages as a discriminated union on "subtype" field *)
297277298298- type t = {
299299- session_id : string option;
300300- model : string option;
301301- cwd : string option;
302302- unknown : Unknown.t;
303303- }
278278+ type init = {
279279+ session_id : string option;
280280+ model : string option;
281281+ cwd : string option;
282282+ unknown : Unknown.t;
283283+ }
304284305305- let make session_id model cwd unknown = { session_id; model; cwd; unknown }
306306-307307- let create ?session_id ?model ?cwd () =
308308- { session_id; model; cwd; unknown = Unknown.empty }
309309-310310- let session_id t = t.session_id
311311- let model t = t.model
312312- let cwd t = t.cwd
313313- let unknown t = t.unknown
285285+ type error = {
286286+ error : string;
287287+ unknown : Unknown.t;
288288+ }
314289315315- let jsont : t Jsont.t =
316316- Jsont.Object.map ~kind:"SystemInit" make
317317- |> Jsont.Object.opt_mem "session_id" Jsont.string ~enc:session_id
318318- |> Jsont.Object.opt_mem "model" Jsont.string ~enc:model
319319- |> Jsont.Object.opt_mem "cwd" Jsont.string ~enc:cwd
320320- |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown
321321- |> Jsont.Object.finish
322322- end
323323-324324- (** Typed data for system error messages *)
325325- module Error = struct
326326- module Unknown = struct
327327- type t = Jsont.json
328328- let empty = Jsont.Object ([], Jsont.Meta.none)
329329- let _jsont = Jsont.json
330330- end
331331-332332- type t = {
333333- error : string;
334334- unknown : Unknown.t;
335335- }
336336-337337- let make error unknown = { error; unknown }
338338-339339- let create ~error = { error; unknown = Unknown.empty }
340340-341341- let error t = t.error
342342- let unknown t = t.unknown
343343-344344- let jsont : t Jsont.t =
345345- Jsont.Object.map ~kind:"SystemError" make
346346- |> Jsont.Object.mem "error" Jsont.string ~enc:error
347347- |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown
348348- |> Jsont.Object.finish
349349- end
350350-351351- (** Sum type for system message data *)
352352- module Data = struct
353353- type t =
354354- | Init of Init.t
355355- | Error of Error.t
356356- | Other of Jsont.json (** Unknown subtypes preserve raw JSON *)
357357-358358- let init ?session_id ?model ?cwd () = Init (Init.create ?session_id ?model ?cwd ())
359359- let error ~error = Error (Error.create ~error)
360360- let other json = Other json
361361-362362- let session_id = function
363363- | Init i -> Init.session_id i
364364- | _ -> None
365365-366366- let model = function
367367- | Init i -> Init.model i
368368- | _ -> None
369369-370370- let cwd = function
371371- | Init i -> Init.cwd i
372372- | _ -> None
373373-374374- let error_msg = function
375375- | Error e -> Some (Error.error e)
376376- | _ -> None
377377-378378- let to_json = function
379379- | Init i ->
380380- (match Jsont.Json.encode Init.jsont i with
381381- | Ok json -> json
382382- | Error msg -> failwith ("Init.to_json: " ^ msg))
383383- | Error e ->
384384- (match Jsont.Json.encode Error.jsont e with
385385- | Ok json -> json
386386- | Error msg -> failwith ("Error.to_json: " ^ msg))
387387- | Other json -> json
388388-389389- let of_json ~subtype json =
390390- match subtype with
391391- | "init" ->
392392- (match Jsont.Json.decode Init.jsont json with
393393- | Ok i -> Init i
394394- | Error _ -> Other json)
395395- | "error" ->
396396- (match Jsont.Json.decode Error.jsont json with
397397- | Ok e -> Error e
398398- | Error _ -> Other json)
399399- | _ -> Other json
400400- end
401401-402402- module Unknown = struct
403403- type t = Jsont.json
404404- let empty = Jsont.Object ([], Jsont.Meta.none)
405405- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
406406- let jsont = Jsont.json
407407- end
408408-409409- type t = {
290290+ type other = {
410291 subtype : string;
411411- data : Data.t;
412292 unknown : Unknown.t;
413293 }
414294415415- let create ~subtype ~data = { subtype; data; unknown = Unknown.empty }
416416- let subtype t = t.subtype
417417- let data t = t.data
418418- let unknown t = t.unknown
295295+ type t =
296296+ | Init of init
297297+ | Error of error
298298+ | Other of other
299299+300300+ (* Accessors *)
301301+ let session_id = function Init i -> i.session_id | _ -> None
302302+ let model = function Init i -> i.model | _ -> None
303303+ let cwd = function Init i -> i.cwd | _ -> None
304304+ let error_msg = function Error e -> Some e.error | _ -> None
305305+ let subtype = function Init _ -> "init" | Error _ -> "error" | Other o -> o.subtype
306306+ let unknown = function
307307+ | Init i -> i.unknown
308308+ | Error e -> e.unknown
309309+ | Other o -> o.unknown
419310420420- (** Create a system init message *)
311311+ (* Constructors *)
421312 let init ?session_id ?model ?cwd () =
422422- { subtype = "init";
423423- data = Data.init ?session_id ?model ?cwd ();
424424- unknown = Unknown.empty }
313313+ Init { session_id; model; cwd; unknown = Unknown.empty }
425314426426- (** Create a system error message *)
427315 let error ~error =
428428- { subtype = "error";
429429- data = Data.error ~error;
430430- unknown = Unknown.empty }
316316+ Error { error; unknown = Unknown.empty }
431317432432- (* Custom jsont that handles both formats:
433433- - Old format: {"type":"system","subtype":"init","data":{...}}
434434- - New format: {"type":"system","subtype":"init","cwd":"...","session_id":"...",...}
435435- When data field is not present, we use the entire object as data *)
318318+ let other ~subtype =
319319+ Other { subtype; unknown = Unknown.empty }
320320+321321+ (* Individual record codecs *)
322322+ let init_jsont : init Jsont.t =
323323+ let make session_id model cwd unknown : init = { session_id; model; cwd; unknown } in
324324+ Jsont.Object.map ~kind:"SystemInit" make
325325+ |> Jsont.Object.opt_mem "session_id" Jsont.string ~enc:(fun (r : init) -> r.session_id)
326326+ |> Jsont.Object.opt_mem "model" Jsont.string ~enc:(fun (r : init) -> r.model)
327327+ |> Jsont.Object.opt_mem "cwd" Jsont.string ~enc:(fun (r : init) -> r.cwd)
328328+ |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun (r : init) -> r.unknown)
329329+ |> Jsont.Object.finish
330330+331331+ let error_jsont : error Jsont.t =
332332+ let make err unknown : error = { error = err; unknown } in
333333+ Jsont.Object.map ~kind:"SystemError" make
334334+ |> Jsont.Object.mem "error" Jsont.string ~enc:(fun (r : error) -> r.error)
335335+ |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun (r : error) -> r.unknown)
336336+ |> Jsont.Object.finish
337337+338338+ (* Main codec using case_mem for "subtype" discriminator *)
436339 let jsont : t Jsont.t =
437437- let dec json =
438438- (* First decode just the subtype *)
439439- let subtype_codec = Jsont.Object.map ~kind:"SystemSubtype" Fun.id
440440- |> Jsont.Object.mem "subtype" Jsont.string ~enc:Fun.id
340340+ let case_init = Jsont.Object.Case.map "init" init_jsont ~dec:(fun v -> Init v) in
341341+ let case_error = Jsont.Object.Case.map "error" error_jsont ~dec:(fun v -> Error v) in
342342+ let case_other tag =
343343+ (* For unknown subtypes, create Other with the tag as subtype *)
344344+ let other_codec : other Jsont.t =
345345+ let make unknown : other = { subtype = tag; unknown } in
346346+ Jsont.Object.map ~kind:"SystemOther" make
347347+ |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun (r : other) -> r.unknown)
441348 |> Jsont.Object.finish
442349 in
443443- match Jsont.Json.decode subtype_codec json with
444444- | Error msg -> failwith ("System.jsont: " ^ msg)
445445- | Ok subtype ->
446446- (* Try to get data field, otherwise use full object *)
447447- let data_codec = Jsont.Object.map ~kind:"SystemDataField" Fun.id
448448- |> Jsont.Object.opt_mem "data" Jsont.json ~enc:Fun.id
449449- |> Jsont.Object.finish
450450- in
451451- let data_json = match Jsont.Json.decode data_codec json with
452452- | Ok (Some d) -> d
453453- | _ -> json
454454- in
455455- let data = Data.of_json ~subtype data_json in
456456- { subtype; data; unknown = Unknown.empty }
350350+ Jsont.Object.Case.map tag other_codec ~dec:(fun v -> Other v)
457351 in
458458- let enc t =
459459- Jsont.Json.object' [
460460- Jsont.Json.mem (Jsont.Json.name "type") (Jsont.Json.string "system");
461461- Jsont.Json.mem (Jsont.Json.name "subtype") (Jsont.Json.string t.subtype);
462462- Jsont.Json.mem (Jsont.Json.name "data") (Data.to_json t.data);
463463- ]
352352+ let enc_case = function
353353+ | Init v -> Jsont.Object.Case.value case_init v
354354+ | Error v -> Jsont.Object.Case.value case_error v
355355+ | Other v -> Jsont.Object.Case.value (case_other v.subtype) v
464356 in
465465- Jsont.map ~kind:"System" ~dec ~enc Jsont.json
357357+ let cases = Jsont.Object.Case.[
358358+ make case_init;
359359+ make case_error;
360360+ ] in
361361+ Jsont.Object.map ~kind:"System" Fun.id
362362+ |> Jsont.Object.case_mem "subtype" Jsont.string ~enc:Fun.id ~enc_case cases
363363+ ~tag_to_string:Fun.id ~tag_compare:String.compare
364364+ |> Jsont.Object.finish
466365467366 let to_json t =
468367 match Jsont.Json.encode jsont t with
···474373 | Ok v -> v
475374 | Error msg -> raise (Invalid_argument ("System.of_json: " ^ msg))
476375477477- let pp fmt t =
478478- match t.data with
479479- | Data.Init i ->
376376+ let pp fmt = function
377377+ | Init i ->
480378 Fmt.pf fmt "@[<2>System.init@ { session_id = %a;@ model = %a;@ cwd = %a }@]"
481481- Fmt.(option string) (Init.session_id i)
482482- Fmt.(option string) (Init.model i)
483483- Fmt.(option string) (Init.cwd i)
484484- | Data.Error e ->
485485- Fmt.pf fmt "@[<2>System.error@ { error = %s }@]" (Error.error e)
486486- | Data.Other _ ->
487487- Fmt.pf fmt "@[<2>System.%s@ { ... }@]" t.subtype
379379+ Fmt.(option string) i.session_id
380380+ Fmt.(option string) i.model
381381+ Fmt.(option string) i.cwd
382382+ | Error e ->
383383+ Fmt.pf fmt "@[<2>System.error@ { error = %s }@]" e.error
384384+ | Other o ->
385385+ Fmt.pf fmt "@[<2>System.%s@ { ... }@]" o.subtype
488386end
489387490388module Result = struct
491389 module Usage = struct
492492- module Unknown = struct
493493- type t = Jsont.json
494494- let empty = Jsont.Object ([], Jsont.Meta.none)
495495- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
496496- let jsont = Jsont.json
497497- end
498498-499390 type t = {
500391 input_tokens : int option;
501392 output_tokens : int option;
···568459 | Error msg -> raise (Invalid_argument ("Usage.of_json: " ^ msg))
569460 end
570461571571- module Unknown = struct
572572- type t = Jsont.json
573573- let empty = Jsont.Object ([], Jsont.Meta.none)
574574- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
575575- let jsont = Jsont.json
576576- end
577577-578462 type t = {
579463 subtype : string;
580464 duration_ms : int;
···700584let assistant_text ~text ~model ?error () =
701585 Assistant (Assistant.create ~content:[Content_block.text text] ~model ?error ())
702586703703-let system ~subtype ~data = System (System.create ~subtype ~data)
704587let system_init ~session_id =
705588 System (System.init ~session_id ())
706589let system_error ~error =
···775658 | _ -> []
776659777660let get_session_id = function
778778- | System s -> System.Data.session_id (System.data s)
661661+ | System s -> System.session_id s
779662 | Result r -> Some (Result.session_id r)
780663 | _ -> None
781664
+53-122
claudeio/lib/message.mli
···1717 | Blocks of Content_block.t list (** Complex message with multiple content blocks *)
1818 (** The content of a user message. *)
19192020- module Unknown : sig
2121- type t = Jsont.json
2222- val empty : t
2323- val is_empty : t -> bool
2424- val jsont : t Jsont.t
2525- end
2626-2720 type t
2821 (** The type of user messages. *)
2922···9285 val error_of_string : string -> error
9386 (** [error_of_string s] parses an error string. Unknown strings become [`Unknown]. *)
94879595- module Unknown : sig
9696- type t = Jsont.json
9797- val empty : t
9898- val is_empty : t -> bool
9999- val jsont : t Jsont.t
100100- end
101101-10288 type t
10389 (** The type of assistant messages. *)
10490···152138(** {1 System Messages} *)
153139154140module System : sig
155155- (** System control and status messages. *)
141141+ (** System control and status messages.
156142157157- (** Typed data for system init messages *)
158158- module Init : sig
159159- type t
160160- (** Type of init message data. *)
143143+ System messages use a discriminated union on the "subtype" field:
144144+ - "init": Session initialization with session_id, model, cwd
145145+ - "error": Error messages with error string
146146+ - Other subtypes are preserved as [Other] *)
161147162162- val create : ?session_id:string -> ?model:string -> ?cwd:string -> unit -> t
163163- (** [create ?session_id ?model ?cwd ()] creates init data. *)
148148+ type init = {
149149+ session_id : string option;
150150+ model : string option;
151151+ cwd : string option;
152152+ unknown : Unknown.t;
153153+ }
154154+ (** Init message fields. *)
164155165165- val session_id : t -> string option
166166- (** [session_id t] returns the session ID if present. *)
156156+ type error = {
157157+ error : string;
158158+ unknown : Unknown.t;
159159+ }
160160+ (** Error message fields. *)
167161168168- val model : t -> string option
169169- (** [model t] returns the model name if present. *)
162162+ type other = {
163163+ subtype : string;
164164+ unknown : Unknown.t;
165165+ }
166166+ (** Unknown subtype fields. *)
170167171171- val cwd : t -> string option
172172- (** [cwd t] returns the current working directory if present. *)
168168+ type t =
169169+ | Init of init
170170+ | Error of error
171171+ | Other of other
172172+ (** The type of system messages. *)
173173174174- val jsont : t Jsont.t
175175- (** [jsont] is the Jsont codec for init data. *)
176176- end
174174+ val jsont : t Jsont.t
175175+ (** [jsont] is the Jsont codec for system messages. *)
177176178178- (** Typed data for system error messages *)
179179- module Error : sig
180180- type t
181181- (** Type of error message data. *)
177177+ (** {2 Constructors} *)
182178183183- val create : error:string -> t
184184- (** [create ~error] creates error data. *)
179179+ val init : ?session_id:string -> ?model:string -> ?cwd:string -> unit -> t
180180+ (** [init ?session_id ?model ?cwd ()] creates an init message. *)
185181186186- val error : t -> string
187187- (** [error t] returns the error message. *)
182182+ val error : error:string -> t
183183+ (** [error ~error] creates an error message. *)
188184189189- val jsont : t Jsont.t
190190- (** [jsont] is the Jsont codec for error data. *)
191191- end
185185+ val other : subtype:string -> t
186186+ (** [other ~subtype] creates a message with unknown subtype. *)
192187193193- (** System message data variants *)
194194- module Data : sig
195195- type t =
196196- | Init of Init.t (** Init message data *)
197197- | Error of Error.t (** Error message data *)
198198- | Other of Jsont.json (** Unknown subtype data *)
199199- (** Variant type for system message data. *)
188188+ (** {2 Accessors} *)
200189201201- val init : ?session_id:string -> ?model:string -> ?cwd:string -> unit -> t
202202- (** [init ?session_id ?model ?cwd ()] creates init data. *)
203203-204204- val error : error:string -> t
205205- (** [error ~error] creates error data. *)
206206-207207- val other : Jsont.json -> t
208208- (** [other json] creates data for unknown subtypes. *)
209209-210210- val session_id : t -> string option
211211- (** [session_id t] extracts session_id from Init data, None otherwise. *)
212212-213213- val model : t -> string option
214214- (** [model t] extracts model from Init data, None otherwise. *)
215215-216216- val cwd : t -> string option
217217- (** [cwd t] extracts cwd from Init data, None otherwise. *)
218218-219219- val error_msg : t -> string option
220220- (** [error_msg t] extracts error from Error data, None otherwise. *)
221221-222222- val to_json : t -> Jsont.json
223223- (** [to_json t] converts to JSON representation. *)
190190+ val session_id : t -> string option
191191+ (** [session_id t] returns session_id from Init, None otherwise. *)
224192225225- val of_json : subtype:string -> Jsont.json -> t
226226- (** [of_json ~subtype json] parses data based on subtype. *)
227227- end
228228-229229- module Unknown : sig
230230- type t = Jsont.json
231231- val empty : t
232232- val is_empty : t -> bool
233233- val jsont : t Jsont.t
234234- end
193193+ val model : t -> string option
194194+ (** [model t] returns model from Init, None otherwise. *)
235195236236- type t
237237- (** The type of system messages. *)
196196+ val cwd : t -> string option
197197+ (** [cwd t] returns cwd from Init, None otherwise. *)
238198239239- val jsont : t Jsont.t
240240- (** [jsont] is the Jsont codec for system messages. *)
241241-242242- val create : subtype:string -> data:Data.t -> t
243243- (** [create ~subtype ~data] creates a system message.
244244- @param subtype The subtype of the system message
245245- @param data Additional data for the message *)
246246-247247- val init : ?session_id:string -> ?model:string -> ?cwd:string -> unit -> t
248248- (** [init ?session_id ?model ?cwd ()] creates a system init message. *)
249249-250250- val error : error:string -> t
251251- (** [error ~error] creates a system error message. *)
199199+ val error_msg : t -> string option
200200+ (** [error_msg t] returns error from Error, None otherwise. *)
252201253202 val subtype : t -> string
254254- (** [subtype t] returns the subtype of the system message. *)
255255-256256- val data : t -> Data.t
257257- (** [data t] returns the additional data of the system message. *)
203203+ (** [subtype t] returns the subtype string. *)
258204259205 val unknown : t -> Unknown.t
260260- (** [unknown t] returns the unknown fields preserved from JSON. *)
206206+ (** [unknown t] returns the unknown fields. *)
207207+208208+ (** {2 Conversion} *)
261209262210 val to_json : t -> Jsont.json
263263- (** [to_json t] converts the system message to its JSON representation. *)
211211+ (** [to_json t] converts to JSON representation. *)
264212265213 val of_json : Jsont.json -> t
266266- (** [of_json json] parses a system message from JSON.
267267- @raise Invalid_argument if the JSON is not a valid system message. *)
214214+ (** [of_json json] parses from JSON.
215215+ @raise Invalid_argument if invalid. *)
268216269217 val pp : Format.formatter -> t -> unit
270270- (** [pp fmt t] pretty-prints the system message. *)
218218+ (** [pp fmt t] pretty-prints the message. *)
271219end
272220273221(** {1 Result Messages} *)
···277225278226 module Usage : sig
279227 (** Usage statistics for API calls. *)
280280-281281- module Unknown : sig
282282- type t = Jsont.json
283283- val empty : t
284284- val is_empty : t -> bool
285285- val jsont : t Jsont.t
286286- end
287228288229 type t
289230 (** Type for usage statistics. *)
···334275335276 val of_json : Jsont.json -> t
336277 (** [of_json json] parses from JSON. Internal use only. *)
337337- end
338338-339339- module Unknown : sig
340340- type t = Jsont.json
341341- val empty : t
342342- val is_empty : t -> bool
343343- val jsont : t Jsont.t
344278 end
345279346280 type t
···445379446380val assistant_text : text:string -> model:string -> ?error:Assistant.error -> unit -> t
447381(** [assistant_text ~text ~model ?error ()] creates an assistant message with only text content. *)
448448-449449-val system : subtype:string -> data:System.Data.t -> t
450450-(** [system ~subtype ~data] creates a system message. *)
451382452383val system_init : session_id:string -> t
453384(** [system_init ~session_id] creates a system init message. *)
-28
claudeio/lib/permissions.ml
···68686969(** Permission rules *)
7070module Rule = struct
7171- module Unknown = struct
7272- type t = Jsont.json
7373- let empty = Jsont.Object ([], Jsont.Meta.none)
7474- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
7575- let jsont = Jsont.json
7676- end
7777-7871 type t = {
7972 tool_name : string;
8073 rule_content : string option;
···163156 "addDirectories", Add_directories;
164157 "removeDirectories", Remove_directories;
165158 ]
166166-167167- module Unknown = struct
168168- type t = Jsont.json
169169- let empty = Jsont.Object ([], Jsont.Meta.none)
170170- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
171171- let jsont = Jsont.json
172172- end
173159174160 type t = {
175161 update_type : update_type;
···219205220206(** Permission context for callbacks *)
221207module Context = struct
222222- module Unknown = struct
223223- type t = Jsont.json
224224- let empty = Jsont.Object ([], Jsont.Meta.none)
225225- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
226226- let jsont = Jsont.json
227227- end
228228-229208 type t = {
230209 suggestions : Update.t list;
231210 unknown : Unknown.t;
···249228250229(** Permission results *)
251230module Result = struct
252252- module Unknown = struct
253253- type t = Jsont.json
254254- let empty = Jsont.Object ([], Jsont.Meta.none)
255255- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
256256- let jsont = Jsont.json
257257- end
258258-259231 type t =
260232 | Allow of {
261233 updated_input : Jsont.json option;
-28
claudeio/lib/permissions.mli
···6363module Rule : sig
6464 (** Rules define specific permissions for tools. *)
65656666- module Unknown : sig
6767- type t = Jsont.json
6868- val empty : t
6969- val is_empty : t -> bool
7070- val jsont : t Jsont.t
7171- end
7272-7366 type t = {
7467 tool_name : string; (** Name of the tool *)
7568 rule_content : string option; (** Optional rule specification *)
···119112 | Add_directories (** Add allowed directories *)
120113 | Remove_directories (** Remove allowed directories *)
121114 (** The type of permission update. *)
122122-123123- module Unknown : sig
124124- type t = Jsont.json
125125- val empty : t
126126- val is_empty : t -> bool
127127- val jsont : t Jsont.t
128128- end
129115130116 type t
131117 (** The type of permission updates. *)
···182168module Context : sig
183169 (** Context provided to permission callbacks. *)
184170185185- module Unknown : sig
186186- type t = Jsont.json
187187- val empty : t
188188- val is_empty : t -> bool
189189- val jsont : t Jsont.t
190190- end
191191-192171 type t = {
193172 suggestions : Update.t list; (** Suggested permission updates *)
194173 unknown : Unknown.t; (** Unknown fields *)
···217196218197module Result : sig
219198 (** Results of permission checks. *)
220220-221221- module Unknown : sig
222222- type t = Jsont.json
223223- val empty : t
224224- val is_empty : t -> bool
225225- val jsont : t Jsont.t
226226- end
227199228200 type t =
229201 | Allow of {
-28
claudeio/lib/sdk_control.ml
···5454end
55555656module Request = struct
5757- module Unknown = struct
5858- type t = Jsont.json
5959- let empty = Jsont.Object ([], Jsont.Meta.none)
6060- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
6161- let jsont = Jsont.json
6262- end
6363-6457 type interrupt = {
6558 subtype : [`Interrupt];
6659 unknown : Unknown.t;
···280273end
281274282275module Response = struct
283283- module Unknown = struct
284284- type t = Jsont.json
285285- let empty = Jsont.Object ([], Jsont.Meta.none)
286286- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
287287- let jsont = Jsont.json
288288- end
289289-290276 type success = {
291277 subtype : [`Success];
292278 request_id : string;
···371357 e.request_id e.error
372358end
373359374374-module Unknown = struct
375375- type t = Jsont.json
376376- let empty = Jsont.Object ([], Jsont.Meta.none)
377377- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
378378- let jsont = Jsont.json
379379-end
380380-381360type control_request = {
382361 type_ : [`Control_request];
383362 request_id : string;
···466445467446(** Server information *)
468447module Server_info = struct
469469- module Unknown = struct
470470- type t = Jsont.json
471471- let empty = Jsont.Object ([], Jsont.Meta.none)
472472- let is_empty = function Jsont.Object ([], _) -> true | _ -> false
473473- let jsont = Jsont.json
474474- end
475475-476448 type t = {
477449 version : string;
478450 capabilities : string list;
-28
claudeio/lib/sdk_control.mli
···131131module Request : sig
132132 (** SDK control request types. *)
133133134134- module Unknown : sig
135135- type t = Jsont.json
136136- val empty : t
137137- val is_empty : t -> bool
138138- val jsont : t Jsont.t
139139- end
140140-141134 type interrupt = {
142135 subtype : [`Interrupt];
143136 unknown : Unknown.t;
···248241249242module Response : sig
250243 (** SDK control response types. *)
251251-252252- module Unknown : sig
253253- type t = Jsont.json
254254- val empty : t
255255- val is_empty : t -> bool
256256- val jsont : t Jsont.t
257257- end
258244259245 type success = {
260246 subtype : [`Success];
···292278293279(** {1 Control Messages} *)
294280295295-module Unknown : sig
296296- type t = Jsont.json
297297- val empty : t
298298- val is_empty : t -> bool
299299- val jsont : t Jsont.t
300300-end
301301-302281type control_request = {
303282 type_ : [`Control_request];
304283 request_id : string;
···369348370349module Server_info : sig
371350 (** Server information and capabilities. *)
372372-373373- module Unknown : sig
374374- type t = Jsont.json
375375- val empty : t
376376- val is_empty : t -> bool
377377- val jsont : t Jsont.t
378378- end
379351380352 type t = {
381353 version : string;
+20
claudeio/lib/unknown.ml
···11+(** Unknown fields for capturing extra JSON object members.
22+33+ This module provides a type and utilities for preserving unknown/extra
44+ fields when parsing JSON objects with jsont. Use with
55+ [Jsont.Object.keep_unknown] to capture fields not explicitly defined
66+ in your codec. *)
77+88+type t = Jsont.json
99+(** The type of unknown fields - stored as raw JSON. *)
1010+1111+let empty = Jsont.Object ([], Jsont.Meta.none)
1212+(** An empty unknown fields value (empty JSON object). *)
1313+1414+let is_empty = function
1515+ | Jsont.Object ([], _) -> true
1616+ | _ -> false
1717+(** [is_empty t] returns [true] if there are no unknown fields. *)
1818+1919+let jsont = Jsont.json
2020+(** Codec for unknown fields. *)
+18
claudeio/lib/unknown.mli
···11+(** Unknown fields for capturing extra JSON object members.
22+33+ This module provides a type and utilities for preserving unknown/extra
44+ fields when parsing JSON objects with jsont. Use with
55+ [Jsont.Object.keep_unknown] to capture fields not explicitly defined
66+ in your codec. *)
77+88+type t = Jsont.json
99+(** The type of unknown fields - stored as raw JSON. *)
1010+1111+val empty : t
1212+(** An empty unknown fields value (empty JSON object). *)
1313+1414+val is_empty : t -> bool
1515+(** [is_empty t] returns [true] if there are no unknown fields. *)
1616+1717+val jsont : t Jsont.t
1818+(** Codec for unknown fields. *)