+23
-22
jmap/CLAUDE.md
+23
-22
jmap/CLAUDE.md
······························
+8
-5
jmap/README.md
+8
-5
jmap/README.md
···-let (ctx, session) = Jmap_unix.quick_connect ~host:"jmap.example.com" ~username:"user" ~password:"pass" in+match Jmap_unix.quick_connect env ~host:"jmap.example.com" ~username:"user" ~password:"pass" () with
+20
-20
jmap/bin/fastmail_connect.ml
+20
-20
jmap/bin/fastmail_connect.ml
···-Jmap_email.Jmap_email_query.(query () |> with_account account_id |> order_by Sort.by_date_desc |> limit 5 |> build_email_query) in+Jmap_email.Query.(query () |> with_account account_id |> order_by Sort.by_date_desc |> limit 5 |> build_email_query) in~properties:[`Id; `ThreadId; `From; `Subject; `ReceivedAt; `Preview; `Keywords; `HasAttachment]···let+ query_response_json = Jmap_unix.Response.extract_method ~method_name:`Email_query ~method_call_id:"q1" response in-printf "✓ Found %d emails\n\n" (Jmap_email.Email_response.ids_from_query_response query_response |> List.length);+printf "✓ Found %d emails\n\n" (Jmap_email.Response.ids_from_query_response query_response |> List.length);let+ get_response_json = Jmap_unix.Response.extract_method ~method_name:`Email_get ~method_call_id:"g1" response in···+printf " Subject: %s\n" (Jmap_email.Email.subject email |> Option.value ~default:"(No Subject)");···-("Jmap.Date", Ok (Jmap.Date.(Unix.time () |> of_timestamp |> to_timestamp |> Printf.sprintf "%.0f")));+("Jmap.Types.Id", Jmap.Types.Id.(of_string "test-id-123" |> Result.map (Format.asprintf "%a" pp)));+("Jmap.Types.Date", Ok (Jmap.Types.Date.(Unix.time () |> of_timestamp |> to_timestamp |> Printf.sprintf "%.0f")));···-| Error error -> Format.printf "⚠ Error closing connection: %a\n" Jmap.Protocol.Error.pp error);
+9
-9
jmap/bin/test_session_wire.ml
+9
-9
jmap/bin/test_session_wire.ml
·········
+1
-1
jmap/docs/queries/README.md
+1
-1
jmap/docs/queries/README.md
···- [RFC 8620: The JSON Meta Application Protocol (JMAP)](https://www.rfc-editor.org/rfc/rfc8620.html)- [RFC 8621: The JSON Meta Application Protocol (JMAP) for Mail](https://www.rfc-editor.org/rfc/rfc8621.html)
+18
-18
jmap/jmap-email/dune
+18
-18
jmap/jmap-email/dune
···
+42
-42
jmap/jmap-email/jmap_email.ml
jmap/jmap-email/email.ml
+42
-42
jmap/jmap-email/jmap_email.ml
jmap/jmap-email/email.ml
···-let email_address_list (name : string) (fields : (string * Yojson.Safe.t) list) : Jmap_email_address.t list option =+let email_address_list (name : string) (fields : (string * Yojson.Safe.t) list) : Address.t list option =·····················
+43
-43
jmap/jmap-email/jmap_email.mli
jmap/jmap-email/email.mli
+43
-43
jmap/jmap-email/jmap_email.mli
jmap/jmap-email/email.mli
·····················
jmap/jmap-email/jmap_email_address.ml
jmap/jmap-email/address.ml
jmap/jmap-email/jmap_email_address.ml
jmap/jmap-email/address.ml
jmap/jmap-email/jmap_email_address.mli
jmap/jmap-email/address.mli
jmap/jmap-email/jmap_email_address.mli
jmap/jmap-email/address.mli
+1
-1
jmap/jmap-email/jmap_email_apple.ml
jmap/jmap-email/apple.ml
+1
-1
jmap/jmap-email/jmap_email_apple.ml
jmap/jmap-email/apple.ml
+1
-1
jmap/jmap-email/jmap_email_apple.mli
jmap/jmap-email/apple.mli
+1
-1
jmap/jmap-email/jmap_email_apple.mli
jmap/jmap-email/apple.mli
+3
-3
jmap/jmap-email/jmap_email_body.ml
jmap/jmap-email/body.ml
+3
-3
jmap/jmap-email/jmap_email_body.ml
jmap/jmap-email/body.ml
·········
+3
-3
jmap/jmap-email/jmap_email_body.mli
jmap/jmap-email/body.mli
+3
-3
jmap/jmap-email/jmap_email_body.mli
jmap/jmap-email/body.mli
·········
jmap/jmap-email/jmap_email_changes.ml
jmap/jmap-email/changes.ml
jmap/jmap-email/jmap_email_changes.ml
jmap/jmap-email/changes.ml
jmap/jmap-email/jmap_email_changes.mli
jmap/jmap-email/changes.mli
jmap/jmap-email/jmap_email_changes.mli
jmap/jmap-email/changes.mli
jmap/jmap-email/jmap_email_header.ml
jmap/jmap-email/header.ml
jmap/jmap-email/jmap_email_header.ml
jmap/jmap-email/header.ml
jmap/jmap-email/jmap_email_header.mli
jmap/jmap-email/header.mli
jmap/jmap-email/jmap_email_header.mli
jmap/jmap-email/header.mli
jmap/jmap-email/jmap_email_keywords.ml
jmap/jmap-email/keywords.ml
jmap/jmap-email/jmap_email_keywords.ml
jmap/jmap-email/keywords.ml
jmap/jmap-email/jmap_email_keywords.mli
jmap/jmap-email/keywords.mli
jmap/jmap-email/jmap_email_keywords.mli
jmap/jmap-email/keywords.mli
jmap/jmap-email/jmap_email_property.ml
jmap/jmap-email/property.ml
jmap/jmap-email/jmap_email_property.ml
jmap/jmap-email/property.ml
jmap/jmap-email/jmap_email_property.mli
jmap/jmap-email/property.mli
jmap/jmap-email/jmap_email_property.mli
jmap/jmap-email/property.mli
+12
-12
jmap/jmap-email/jmap_email_query.ml
jmap/jmap-email/query.ml
+12
-12
jmap/jmap-email/jmap_email_query.ml
jmap/jmap-email/query.ml
···············
+2
-2
jmap/jmap-email/jmap_email_query.mli
jmap/jmap-email/query.mli
+2
-2
jmap/jmap-email/jmap_email_query.mli
jmap/jmap-email/query.mli
···
jmap/jmap-email/jmap_email_response.ml
jmap/jmap-email/response.ml
jmap/jmap-email/jmap_email_response.ml
jmap/jmap-email/response.ml
jmap/jmap-email/jmap_email_response.mli
jmap/jmap-email/response.mli
jmap/jmap-email/jmap_email_response.mli
jmap/jmap-email/response.mli
+9
-9
jmap/jmap-email/jmap_email_set.ml
jmap/jmap-email/set.ml
+9
-9
jmap/jmap-email/jmap_email_set.ml
jmap/jmap-email/set.ml
······("mailboxIds", (`Assoc (List.map (fun (id, v) -> (id, `Bool v)) t.mailbox_ids) : Yojson.Safe.t));-("keywords", (`Assoc (List.map (fun (kw, v) -> (Jmap_email_keywords.keyword_to_string kw, `Bool v)) t.keywords) : Yojson.Safe.t));+("keywords", (`Assoc (List.map (fun (kw, v) -> (Keywords.keyword_to_string kw, `Bool v)) t.keywords) : Yojson.Safe.t));| Some timestamp -> ("receivedAt", (`String (Jmap.Date.of_timestamp timestamp |> Jmap.Date.to_rfc3339) : Yojson.Safe.t)) :: fields···-("keywords", `Assoc (List.map (fun (kw, v) -> (Jmap_email_keywords.keyword_to_string kw, `Bool v)) keywords)) :: patch+("keywords", `Assoc (List.map (fun (kw, v) -> (Keywords.keyword_to_string kw, `Bool v)) keywords)) :: patch············
+5
-5
jmap/jmap-email/jmap_email_set.mli
jmap/jmap-email/set.mli
+5
-5
jmap/jmap-email/jmap_email_set.mli
jmap/jmap-email/set.mli
·········
+2
-2
jmap/jmap-email/jmap_email_types.ml
jmap/jmap-email/types.ml
+2
-2
jmap/jmap-email/jmap_email_types.ml
jmap/jmap-email/types.ml
······
+4
-4
jmap/jmap-email/jmap_email_types.mli
jmap/jmap-email/types.mli
+4
-4
jmap/jmap-email/jmap_email_types.mli
jmap/jmap-email/types.mli
···-not_created : Jmap.Protocol.Error.Set_error.t id_map; (** Failed imports with error details *)······-not_created : Jmap.Protocol.Error.Set_error.t id_map option; (** Failed copies with error details *)···
+23
-23
jmap/jmap-email/jmap_identity.ml
jmap/jmap-email/identity.ml
+23
-23
jmap/jmap-email/jmap_identity.ml
jmap/jmap-email/identity.ml
······-| Some addrs -> ("replyTo", `List (List.map Jmap_email_types.Email_address.to_json addrs)) :: fields-| Some addrs -> ("bcc", `List (List.map Jmap_email_types.Email_address.to_json addrs)) :: fields············-| Some addrs -> ("replyTo", `List (List.map Jmap_email_types.Email_address.to_json addrs)) :: fields-| Some addrs -> ("bcc", `List (List.map Jmap_email_types.Email_address.to_json addrs)) :: fields·········-| Some (Some addrs) -> ("replyTo", `List (List.map Jmap_email_types.Email_address.to_json addrs)) :: fields+| Some (Some addrs) -> ("replyTo", `List (List.map Types.Email_address.to_json addrs)) :: fields-| Some (Some addrs) -> ("bcc", `List (List.map Jmap_email_types.Email_address.to_json addrs)) :: fields·········-| Some addrs -> ("replyTo", `List (List.map Jmap_email_types.Email_address.to_json addrs)) :: fields-| Some addrs -> ("bcc", `List (List.map Jmap_email_types.Email_address.to_json addrs)) :: fields···
+13
-13
jmap/jmap-email/jmap_identity.mli
jmap/jmap-email/identity.mli
+13
-13
jmap/jmap-email/jmap_identity.mli
jmap/jmap-email/identity.mli
·····················
+3
-3
jmap/jmap-email/jmap_mailbox.ml
jmap/jmap-email/mailbox.ml
+3
-3
jmap/jmap-email/jmap_mailbox.ml
jmap/jmap-email/mailbox.ml
···
+3
-3
jmap/jmap-email/jmap_mailbox.mli
jmap/jmap-email/mailbox.mli
+3
-3
jmap/jmap-email/jmap_mailbox.mli
jmap/jmap-email/mailbox.mli
···
jmap/jmap-email/jmap_search_snippet.ml
jmap/jmap-email/search.ml
jmap/jmap-email/jmap_search_snippet.ml
jmap/jmap-email/search.ml
jmap/jmap-email/jmap_search_snippet.mli
jmap/jmap-email/search.mli
jmap/jmap-email/jmap_search_snippet.mli
jmap/jmap-email/search.mli
jmap/jmap-email/jmap_submission.ml
jmap/jmap-email/submission.ml
jmap/jmap-email/jmap_submission.ml
jmap/jmap-email/submission.ml
+3
-3
jmap/jmap-email/jmap_submission.mli
jmap/jmap-email/submission.mli
+3
-3
jmap/jmap-email/jmap_submission.mli
jmap/jmap-email/submission.mli
···
jmap/jmap-email/jmap_thread.ml
jmap/jmap-email/thread.ml
jmap/jmap-email/jmap_thread.ml
jmap/jmap-email/thread.ml
jmap/jmap-email/jmap_thread.mli
jmap/jmap-email/thread.mli
jmap/jmap-email/jmap_thread.mli
jmap/jmap-email/thread.mli
+2
-2
jmap/jmap-email/jmap_vacation.ml
jmap/jmap-email/vacation.ml
+2
-2
jmap/jmap-email/jmap_vacation.ml
jmap/jmap-email/vacation.ml
···
+1
-1
jmap/jmap-email/jmap_vacation.mli
jmap/jmap-email/vacation.mli
+1
-1
jmap/jmap-email/jmap_vacation.mli
jmap/jmap-email/vacation.mli
+2
-2
jmap/jmap-email/test_apple_mail.ml
+2
-2
jmap/jmap-email/test_apple_mail.ml
+3
-3
jmap/jmap-email/test_email_json.ml
+3
-3
jmap/jmap-email/test_email_json.ml
······
+32
-19
jmap/jmap-unix/README.md
+32
-19
jmap/jmap-unix/README.md
···+match Jmap_unix.quick_connect env ~host:"jmap.example.com" ~username:"user" ~password:"pass" () with···
+56
-57
jmap/jmap-unix/jmap_unix.ml
+56
-57
jmap/jmap-unix/jmap_unix.ml
···-(* module JmapEmailQuery = Jmap_email_query (* Module interface issue - will implement later *) *)+(* module JmapEmailQuery = Jmap_email.Query (* Module interface issue - will implement later *) *)············let connect env ctx ?session_url ?username ~host ?(port = 443) ?(use_tls = true) ?(auth_method = No_auth) () =······-let invocation = Wire.Invocation.v ~method_name:method_name_str ~arguments ~method_call_id () in+let invocation = Jmap.Wire.Invocation.v ~method_name:method_name_str ~arguments ~method_call_id () in···-let invocation = Wire.Invocation.v ~method_name ~arguments:args_json ~method_call_id:call_id () in+let invocation = Jmap.Wire.Invocation.v ~method_name ~arguments:args_json ~method_call_id:call_id () in···let session_state = json |> member "sessionState" |> to_string_option |> Option.value ~default:"unknown" in-let builder = { ctx; using = Wire.Request.using req; method_calls = Wire.Request.method_calls req } in+let builder = { ctx; using = Jmap.Wire.Request.using req; method_calls = Jmap.Wire.Request.method_calls req } in···let download env ctx ~account_id ~blob_id ?(content_type="application/octet-stream") ?(name="download") () =···············-| Ok _ -> Error (Jmap.Protocol.Error.Method (`InvalidArguments, Some "Email parsing not implemented"))······let move_emails _env _ctx ~account_id:_ ~email_ids:_ ~mailbox_id:_ ?remove_from_mailboxes:_ () =······························
+77
-78
jmap/jmap-unix/jmap_unix.mli
+77
-78
jmap/jmap-unix/jmap_unix.mli
·········-val execute : < net : 'a Eio.Net.t ; .. > -> request_builder -> Jmap.Protocol.Wire.Response.t Jmap.Protocol.Error.result+val execute : < net : 'a Eio.Net.t ; .. > -> request_builder -> Jmap.Wire.Response.t Jmap.Error.result···-val request : < net : 'a Eio.Net.t ; .. > -> context -> Jmap.Protocol.Wire.Request.t -> Jmap.Protocol.Wire.Response.t Jmap.Protocol.Error.result+val request : < net : 'a Eio.Net.t ; .. > -> context -> Jmap.Wire.Request.t -> Jmap.Wire.Response.t Jmap.Error.result············-([`State of Jmap.Push.State_change.t | `Ping of Jmap.Push.Event_source_ping_data.t ] Seq.t)) Jmap.Protocol.Error.result+([`State of Jmap.Push.State_change.t | `Ping of Jmap.Push.Event_source_ping_data.t ] Seq.t)) Jmap.Error.result····················································································
+4
-8
jmap/jmap/dune
+4
-8
jmap/jmap/dune
···
+16
-12
jmap/jmap/jmap.ml
+16
-12
jmap/jmap/jmap.ml
············
+82
-51
jmap/jmap/jmap.mli
+82
-51
jmap/jmap/jmap.mli
···············-val get_primary_account : Protocol.Session.Session.t -> Jmap_capability.t -> (Id.t, Protocol.Error.error) result+val get_primary_account : Session.Session.t -> Jmap_capability.t -> (Id.t, Error.error) result······
+2
-2
jmap/jmap/jmap_binary.ml
+2
-2
jmap/jmap/jmap_binary.ml
······
+3
-3
jmap/jmap/jmap_binary.mli
+3
-3
jmap/jmap/jmap_binary.mli
······
+1
-1
jmap/jmap/jmap_client.mli
+1
-1
jmap/jmap/jmap_client.mli
-122
jmap/jmap/jmap_date.ml
-122
jmap/jmap/jmap_date.ml
···
-98
jmap/jmap/jmap_date.mli
-98
jmap/jmap/jmap_date.mli
···
+1
-1
jmap/jmap/jmap_error.ml
jmap/jmap/error.ml
+1
-1
jmap/jmap/jmap_error.ml
jmap/jmap/error.ml
+1
-1
jmap/jmap/jmap_error.mli
jmap/jmap/error.mli
+1
-1
jmap/jmap/jmap_error.mli
jmap/jmap/error.mli
-54
jmap/jmap/jmap_id.ml
-54
jmap/jmap/jmap_id.ml
···
-74
jmap/jmap/jmap_id.mli
-74
jmap/jmap/jmap_id.mli
···
+17
-17
jmap/jmap/jmap_methods.ml
+17
-17
jmap/jmap/jmap_methods.ml
······-| Yojson.Safe.Util.Type_error (msg, _) -> Error (Jmap_error.parse_error ("Get_response parse error: " ^ msg))-| exn -> Error (Jmap_error.parse_error ("Get_response parse error: " ^ Printexc.to_string exn))+| Yojson.Safe.Util.Type_error (msg, _) -> Error (Error.parse_error ("Get_response parse error: " ^ msg))···-| Yojson.Safe.Util.Type_error (msg, _) -> Error (Jmap_error.parse_error ("Changes_response parse error: " ^ msg))-| exn -> Error (Jmap_error.parse_error ("Changes_response parse error: " ^ Printexc.to_string exn))+| Yojson.Safe.Util.Type_error (msg, _) -> Error (Error.parse_error ("Changes_response parse error: " ^ msg))+| exn -> Error (Error.parse_error ("Changes_response parse error: " ^ Printexc.to_string exn))···············-| Yojson.Safe.Util.Type_error (msg, _) -> Error (Jmap_error.parse_error ("Set_response parse error: " ^ msg))-| exn -> Error (Jmap_error.parse_error ("Set_response parse error: " ^ Printexc.to_string exn))+| Yojson.Safe.Util.Type_error (msg, _) -> Error (Error.parse_error ("Set_response parse error: " ^ msg))······-| Yojson.Safe.Util.Type_error (msg, _) -> Error (Jmap_error.parse_error ("Query_response parse error: " ^ msg))-| exn -> Error (Jmap_error.parse_error ("Query_response parse error: " ^ Printexc.to_string exn))+| Yojson.Safe.Util.Type_error (msg, _) -> Error (Error.parse_error ("Query_response parse error: " ^ msg))···
+13
-13
jmap/jmap/jmap_methods.mli
+13
-13
jmap/jmap/jmap_methods.mli
···@see <https://www.rfc-editor.org/rfc/rfc8620.html#section-5> RFC 8620, Section 5 (Standard Methods) *)························
-134
jmap/jmap/jmap_patch.ml
-134
jmap/jmap/jmap_patch.ml
···
-122
jmap/jmap/jmap_patch.mli
-122
jmap/jmap/jmap_patch.mli
···
-6
jmap/jmap/jmap_protocol.ml
-6
jmap/jmap/jmap_protocol.ml
+3
-39
jmap/jmap/jmap_protocol.mli
+3
-39
jmap/jmap/jmap_protocol.mli
·········
+4
-4
jmap/jmap/jmap_push.ml
+4
-4
jmap/jmap/jmap_push.ml
······
+7
-7
jmap/jmap/jmap_push.mli
+7
-7
jmap/jmap/jmap_push.mli
······
+3
-3
jmap/jmap/jmap_request.ml
+3
-3
jmap/jmap/jmap_request.ml
······
+2
-2
jmap/jmap/jmap_request.mli
+2
-2
jmap/jmap/jmap_request.mli
···@see <https://www.rfc-editor.org/rfc/rfc8620.html#section-3.3> RFC 8620, Section 3.3 (Request Object)@see <https://www.rfc-editor.org/rfc/rfc8620.html#section-3.7> RFC 8620, Section 3.7 (Result References) *)···
+25
-25
jmap/jmap/jmap_response.ml
+25
-25
jmap/jmap/jmap_response.ml
··················match Jmap_methods.Set_response.of_json ~from_created_json:(fun j -> j) ~from_updated_json:(fun j -> j) json with············match Jmap_methods.Set_response.of_json ~from_created_json:(fun j -> j) ~from_updated_json:(fun j -> j) json with···············match Jmap_methods.Set_response.of_json ~from_created_json:(fun j -> j) ~from_updated_json:(fun j -> j) json with·········match Jmap_methods.Set_response.of_json ~from_created_json:(fun j -> j) ~from_updated_json:(fun j -> j) json with············match Jmap_methods.Set_response.of_json ~from_created_json:(fun j -> j) ~from_updated_json:(fun j -> j) json with
+5
-5
jmap/jmap/jmap_response.mli
+5
-5
jmap/jmap/jmap_response.mli
···@see <https://www.rfc-editor.org/rfc/rfc8620.html#section-3.4> RFC 8620, Section 3.4 (Method Responses)············
+2
-2
jmap/jmap/jmap_session.ml
jmap/jmap/session.ml
+2
-2
jmap/jmap/jmap_session.ml
jmap/jmap/session.ml
······-let headers = ("Accept", Jmap_types.Constants.Content_type.json) :: ("User-Agent", Jmap_types.Constants.User_agent.ocaml_jmap) :: (auth_headers auth) in+let headers = ("Accept", Types.Constants.Content_type.json) :: ("User-Agent", Types.Constants.User_agent.ocaml_jmap) :: (auth_headers auth) in
+2
-2
jmap/jmap/jmap_session.mli
jmap/jmap/session.mli
+2
-2
jmap/jmap/jmap_session.mli
jmap/jmap/session.mli
······
-28
jmap/jmap/jmap_types.ml
-28
jmap/jmap/jmap_types.ml
···
-148
jmap/jmap/jmap_types.mli
-148
jmap/jmap/jmap_types.mli
···
-85
jmap/jmap/jmap_uint.ml
-85
jmap/jmap/jmap_uint.ml
···
-128
jmap/jmap/jmap_uint.mli
-128
jmap/jmap/jmap_uint.mli
···
+3
-4
jmap/jmap/jmap_wire.ml
jmap/jmap/wire.ml
+3
-4
jmap/jmap/jmap_wire.ml
jmap/jmap/wire.ml
·········
+3
-3
jmap/jmap/jmap_wire.mli
jmap/jmap/wire.mli
+3
-3
jmap/jmap/jmap_wire.mli
jmap/jmap/wire.mli
·········
+432
jmap/jmap/types.ml
+432
jmap/jmap/types.ml
···
+592
jmap/jmap/types.mli
+592
jmap/jmap/types.mli
···
+23
-23
jmap/test_method.ml
+23
-23
jmap/test_method.ml
···············