···333333let query t prompt =
334334 let msg = Message.user_string prompt in
335335 Log.info (fun m -> m "→ %a" Message.pp msg);
336336- let json = match Jsont.Json.encode Message.jsont msg with
337337- | Ok j -> j
338338- | Error err -> failwith ("Failed to encode message: " ^ err)
339339- in
336336+ let json = Message.to_json msg in
340337 Transport.send t.transport json
341338342339let send_message t msg =
343340 Log.info (fun m -> m "→ %a" Message.pp msg);
344344- let json = match Jsont.Json.encode Message.jsont msg with
345345- | Ok j -> j
346346- | Error err -> failwith ("Failed to encode message: " ^ err)
347347- in
341341+ let json = Message.to_json msg in
348342 Transport.send t.transport json
349343350344let send_user_message t user_msg =
351345 let msg = Message.User user_msg in
352346 Log.info (fun m -> m "→ %a" Message.pp msg);
353353- let json = match Jsont.Json.encode Message.User.jsont user_msg with
354354- | Ok j -> j
355355- | Error err -> failwith ("Failed to encode user message: " ^ err)
356356- in
347347+ let json = Message.User.to_json user_msg in
357348 Transport.send t.transport json
358349359350let receive t =
+19-31
claudeio/lib/message.ml
···374374 let data t = t.data
375375 let unknown t = t.unknown
376376377377+ (* Custom jsont that handles both formats:
378378+ - Old format: {"type":"system","subtype":"init","data":{...}}
379379+ - New format: {"type":"system","subtype":"init","cwd":"...","session_id":"...",...}
380380+ When data field is not present, we use the entire object as data *)
377381 let jsont : t Jsont.t =
378378- Jsont.Object.map ~kind:"System" make
382382+ let make_with_optional_data subtype opt_data unknown_json =
383383+ let data = match opt_data with
384384+ | Some d -> d
385385+ | None -> unknown_json (* Use the full unknown object as data *)
386386+ in
387387+ make subtype data Unknown.empty
388388+ in
389389+ Jsont.Object.map ~kind:"System" make_with_optional_data
379390 |> Jsont.Object.mem "subtype" Jsont.string ~enc:subtype
380380- |> Jsont.Object.mem "data" Data.jsont ~enc:data
381381- |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown
391391+ |> Jsont.Object.opt_mem "data" Data.jsont ~enc:(fun t -> Some (data t))
392392+ |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun _ -> Unknown.empty)
382393 |> Jsont.Object.finish
383394384395 let to_json t =
···683694 Result (Result.create ~subtype ~duration_ms ~duration_api_ms ~is_error
684695 ~num_turns ~session_id ?total_cost_usd ?usage ?result ?structured_output ())
685696686686-(* Jsont codec for the main Message variant type *)
687687-let jsont : t Jsont.t =
688688- let case_map kind obj dec = Jsont.Object.Case.map kind obj ~dec in
689689-690690- let case_user = case_map "user" User.jsont (fun v -> User v) in
691691- let case_assistant = case_map "assistant" Assistant.jsont (fun v -> Assistant v) in
692692- let case_system = case_map "system" System.jsont (fun v -> System v) in
693693- let case_result = case_map "result" Result.jsont (fun v -> Result v) in
694694-695695- let enc_case = function
696696- | User v -> Jsont.Object.Case.value case_user v
697697- | Assistant v -> Jsont.Object.Case.value case_assistant v
698698- | System v -> Jsont.Object.Case.value case_system v
699699- | Result v -> Jsont.Object.Case.value case_result v
700700- in
701701-702702- let cases = Jsont.Object.Case.[
703703- make case_user;
704704- make case_assistant;
705705- make case_system;
706706- make case_result
707707- ] in
708708-709709- Jsont.Object.map ~kind:"Message" Fun.id
710710- |> Jsont.Object.case_mem "type" Jsont.string ~enc:Fun.id ~enc_case cases
711711- ~tag_to_string:Fun.id ~tag_compare:String.compare
712712- |> Jsont.Object.finish
713713-714697let to_json = function
715698 | User t -> User.to_json t
716699 | Assistant t -> Assistant.to_json t
···729712 | None -> raise (Invalid_argument "Message.of_json: missing type field")
730713 )
731714 | _ -> raise (Invalid_argument "Message.of_json: expected object")
715715+716716+(* Jsont codec for the main Message variant type.
717717+ Uses a custom decoder to handle both old and new formats. *)
718718+let jsont : t Jsont.t =
719719+ Jsont.map ~kind:"Message" ~dec:of_json ~enc:to_json Jsont.json
732720733721let pp fmt = function
734722 | User t -> User.pp fmt t