My agentic slop goes here. Not intended for anyone else!

sync

Changed files
+22 -43
claudeio
+3 -12
claudeio/lib/client.ml
···
let query t prompt =
let msg = Message.user_string prompt in
Log.info (fun m -> m "→ %a" Message.pp msg);
-
let json = match Jsont.Json.encode Message.jsont msg with
-
| Ok j -> j
-
| Error err -> failwith ("Failed to encode message: " ^ err)
-
in
+
let json = Message.to_json msg in
Transport.send t.transport json
let send_message t msg =
Log.info (fun m -> m "→ %a" Message.pp msg);
-
let json = match Jsont.Json.encode Message.jsont msg with
-
| Ok j -> j
-
| Error err -> failwith ("Failed to encode message: " ^ err)
-
in
+
let json = Message.to_json msg in
Transport.send t.transport json
let send_user_message t user_msg =
let msg = Message.User user_msg in
Log.info (fun m -> m "→ %a" Message.pp msg);
-
let json = match Jsont.Json.encode Message.User.jsont user_msg with
-
| Ok j -> j
-
| Error err -> failwith ("Failed to encode user message: " ^ err)
-
in
+
let json = Message.User.to_json user_msg in
Transport.send t.transport json
let receive t =
+19 -31
claudeio/lib/message.ml
···
let data t = t.data
let unknown t = t.unknown
+
(* Custom jsont that handles both formats:
+
- Old format: {"type":"system","subtype":"init","data":{...}}
+
- New format: {"type":"system","subtype":"init","cwd":"...","session_id":"...",...}
+
When data field is not present, we use the entire object as data *)
let jsont : t Jsont.t =
-
Jsont.Object.map ~kind:"System" make
+
let make_with_optional_data subtype opt_data unknown_json =
+
let data = match opt_data with
+
| Some d -> d
+
| None -> unknown_json (* Use the full unknown object as data *)
+
in
+
make subtype data Unknown.empty
+
in
+
Jsont.Object.map ~kind:"System" make_with_optional_data
|> Jsont.Object.mem "subtype" Jsont.string ~enc:subtype
-
|> Jsont.Object.mem "data" Data.jsont ~enc:data
-
|> Jsont.Object.keep_unknown Jsont.json_mems ~enc:unknown
+
|> Jsont.Object.opt_mem "data" Data.jsont ~enc:(fun t -> Some (data t))
+
|> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun _ -> Unknown.empty)
|> Jsont.Object.finish
let to_json t =
···
Result (Result.create ~subtype ~duration_ms ~duration_api_ms ~is_error
~num_turns ~session_id ?total_cost_usd ?usage ?result ?structured_output ())
-
(* Jsont codec for the main Message variant type *)
-
let jsont : t Jsont.t =
-
let case_map kind obj dec = Jsont.Object.Case.map kind obj ~dec in
-
-
let case_user = case_map "user" User.jsont (fun v -> User v) in
-
let case_assistant = case_map "assistant" Assistant.jsont (fun v -> Assistant v) in
-
let case_system = case_map "system" System.jsont (fun v -> System v) in
-
let case_result = case_map "result" Result.jsont (fun v -> Result v) in
-
-
let enc_case = function
-
| User v -> Jsont.Object.Case.value case_user v
-
| Assistant v -> Jsont.Object.Case.value case_assistant v
-
| System v -> Jsont.Object.Case.value case_system v
-
| Result v -> Jsont.Object.Case.value case_result v
-
in
-
-
let cases = Jsont.Object.Case.[
-
make case_user;
-
make case_assistant;
-
make case_system;
-
make case_result
-
] in
-
-
Jsont.Object.map ~kind:"Message" Fun.id
-
|> Jsont.Object.case_mem "type" Jsont.string ~enc:Fun.id ~enc_case cases
-
~tag_to_string:Fun.id ~tag_compare:String.compare
-
|> Jsont.Object.finish
-
let to_json = function
| User t -> User.to_json t
| Assistant t -> Assistant.to_json t
···
| None -> raise (Invalid_argument "Message.of_json: missing type field")
)
| _ -> raise (Invalid_argument "Message.of_json: expected object")
+
+
(* Jsont codec for the main Message variant type.
+
Uses a custom decoder to handle both old and new formats. *)
+
let jsont : t Jsont.t =
+
Jsont.map ~kind:"Message" ~dec:of_json ~enc:to_json Jsont.json
let pp fmt = function
| User t -> User.pp fmt t