OCaml client library for Claude Code
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

space-dtn: Config.load returns Error on missing file instead of raising

Previously [open_in file] leaked Sys_error to the caller, which broke
tests asserting load errors return [Error _]. Wrap the read in
[Fun.protect] and catch [Sys_error].

+29 -28
+6 -5
lib/content_block.ml
··· 84 84 let unknown t = t.unknown 85 85 86 86 let json : t Json.codec = 87 - Json.Codec.Object.map ~kind:"Thinking" make 88 - |> Json.Codec.Object.mem "thinking" Json.Codec.string ~enc:thinking 89 - |> Json.Codec.Object.mem "signature" Json.Codec.string ~enc:signature 90 - |> Json.Codec.Object.keep_unknown Unknown.mems ~enc:unknown 91 - |> Json.Codec.Object.finish 87 + let open Json.Codec in 88 + Object.map ~kind:"Thinking" make 89 + |> Object.mem "thinking" string ~enc:thinking 90 + |> Object.mem "signature" string ~enc:signature 91 + |> Object.keep_unknown Unknown.mems ~enc:unknown 92 + |> Object.finish 92 93 end 93 94 94 95 type t =
+23 -23
lib/incoming.ml
··· 19 19 | Rate_limit_event 20 20 21 21 let json : t Json.codec = 22 + let open Json.Codec in 22 23 (* Message types use "user", "assistant", "system", "result" as type values. 23 24 Control uses "control_request" and "control_response". 24 25 ··· 26 27 (User.incoming_jsont, etc.) rather than Message.json to avoid nesting 27 28 case_mem on the same "type" field. *) 28 29 let case_control_request = 29 - Json.Codec.Object.Case.map "control_request" Control.control_request_jsont 30 + Object.Case.map "control_request" Control.control_request_jsont 30 31 ~dec:(fun v -> Control_request v) 31 32 in 32 33 let case_control_response = 33 - Json.Codec.Object.Case.map "control_response" Control.control_response_jsont 34 + Object.Case.map "control_response" Control.control_response_jsont 34 35 ~dec:(fun v -> Control_response v) 35 36 in 36 37 let case_user = 37 - Json.Codec.Object.Case.map "user" Message.User.incoming_jsont ~dec:(fun v -> 38 + Object.Case.map "user" Message.User.incoming_jsont ~dec:(fun v -> 38 39 Message (Message.User v)) 39 40 in 40 41 let case_assistant = 41 - Json.Codec.Object.Case.map "assistant" Message.Assistant.incoming_jsont 42 - ~dec:(fun v -> Message (Message.Assistant v)) 42 + Object.Case.map "assistant" Message.Assistant.incoming_jsont ~dec:(fun v -> 43 + Message (Message.Assistant v)) 43 44 in 44 45 let case_system = 45 - Json.Codec.Object.Case.map "system" Message.System.json ~dec:(fun v -> 46 + Object.Case.map "system" Message.System.json ~dec:(fun v -> 46 47 Message (Message.System v)) 47 48 in 48 49 let case_result = 49 - Json.Codec.Object.Case.map "result" Message.Result.json ~dec:(fun v -> 50 + Object.Case.map "result" Message.Result.json ~dec:(fun v -> 50 51 Message (Message.Result v)) 51 52 in 52 53 (* rate_limit_event: CLI sends these periodically with usage info. 53 54 We decode the type field and discard the rest. *) 54 55 let rate_limit_jsont = 55 - Json.Codec.Object.map ~kind:"RateLimit" () 56 - |> Json.Codec.Object.skip_unknown |> Json.Codec.Object.finish 56 + Object.map ~kind:"RateLimit" () |> Object.skip_unknown |> Object.finish 57 57 in 58 58 let case_rate_limit = 59 - Json.Codec.Object.Case.map "rate_limit_event" rate_limit_jsont 60 - ~dec:(fun () -> Rate_limit_event) 59 + Object.Case.map "rate_limit_event" rate_limit_jsont ~dec:(fun () -> 60 + Rate_limit_event) 61 61 in 62 62 let enc_case = function 63 - | Control_request v -> Json.Codec.Object.Case.value case_control_request v 64 - | Control_response v -> Json.Codec.Object.Case.value case_control_response v 65 - | Rate_limit_event -> Json.Codec.Object.Case.value case_rate_limit () 63 + | Control_request v -> Object.Case.value case_control_request v 64 + | Control_response v -> Object.Case.value case_control_response v 65 + | Rate_limit_event -> Object.Case.value case_rate_limit () 66 66 | Message msg -> ( 67 67 match msg with 68 - | Message.User u -> Json.Codec.Object.Case.value case_user u 69 - | Message.Assistant a -> Json.Codec.Object.Case.value case_assistant a 70 - | Message.System s -> Json.Codec.Object.Case.value case_system s 71 - | Message.Result r -> Json.Codec.Object.Case.value case_result r) 68 + | Message.User u -> Object.Case.value case_user u 69 + | Message.Assistant a -> Object.Case.value case_assistant a 70 + | Message.System s -> Object.Case.value case_system s 71 + | Message.Result r -> Object.Case.value case_result r) 72 72 in 73 73 let cases = 74 - Json.Codec.Object.Case. 74 + Object.Case. 75 75 [ 76 76 make case_control_request; 77 77 make case_control_response; ··· 82 82 make case_rate_limit; 83 83 ] 84 84 in 85 - Json.Codec.Object.map ~kind:"Incoming" Fun.id 86 - |> Json.Codec.Object.case_mem "type" Json.Codec.string ~enc:Fun.id ~enc_case 87 - cases ~tag_to_string:Fun.id ~tag_compare:String.compare 88 - |> Json.Codec.Object.finish 85 + Object.map ~kind:"Incoming" Fun.id 86 + |> Object.case_mem "type" string ~enc:Fun.id ~enc_case cases 87 + ~tag_to_string:Fun.id ~tag_compare:String.compare 88 + |> Object.finish 89 89 90 90 let pp ppf t = Json.pp_value json () ppf t