@bobfrankston/rmfmail 1.0.706 → 1.0.708

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/client/android-bootstrap.bundle.js +163 -2
  2. package/client/android-bootstrap.bundle.js.map +2 -2
  3. package/client/app.bundle.js.map +2 -2
  4. package/client/compose/compose.bundle.js +15 -1
  5. package/client/compose/compose.bundle.js.map +2 -2
  6. package/client/compose/compose.js +25 -5
  7. package/client/compose/compose.js.map +1 -1
  8. package/client/compose/compose.ts +21 -5
  9. package/package.json +3 -3
  10. package/packages/mailx-service/index.d.ts +27 -2
  11. package/packages/mailx-service/index.d.ts.map +1 -1
  12. package/packages/mailx-service/index.js +17 -0
  13. package/packages/mailx-service/index.js.map +1 -1
  14. package/packages/mailx-service/index.ts +21 -2
  15. package/packages/mailx-settings/index.d.ts.map +1 -1
  16. package/packages/mailx-settings/index.js +11 -1
  17. package/packages/mailx-settings/index.js.map +1 -1
  18. package/packages/mailx-settings/index.ts +11 -1
  19. package/packages/mailx-store/parse-worker.js +17 -1
  20. package/packages/mailx-store/parse-worker.js.map +1 -1
  21. package/packages/mailx-store/parse-worker.ts +17 -1
  22. package/packages/mailx-store-web/package.json +1 -1
  23. package/packages/mailx-store-web/web-service.d.ts +88 -3
  24. package/packages/mailx-store-web/web-service.d.ts.map +1 -1
  25. package/packages/mailx-store-web/web-service.js +92 -2
  26. package/packages/mailx-store-web/web-service.js.map +1 -1
  27. package/packages/mailx-store-web/web-service.ts +110 -5
  28. package/packages/mailx-types/index.d.ts +1 -0
  29. package/packages/mailx-types/index.d.ts.map +1 -1
  30. package/packages/mailx-types/index.js.map +1 -1
  31. package/packages/mailx-types/index.ts +1 -0
  32. package/packages/mailx-types/mailx-api.d.ts +212 -0
  33. package/packages/mailx-types/mailx-api.d.ts.map +1 -0
  34. package/packages/mailx-types/mailx-api.js +41 -0
  35. package/packages/mailx-types/mailx-api.js.map +1 -0
  36. package/packages/mailx-types/mailx-api.ts +159 -0
  37. package/packages/mailx-types/package.json +1 -1
  38. /package/packages/mailx-imap/{node_modules.npmglobalize-stash-44928 → node_modules.npmglobalize-stash-24548}/.package-lock.json +0 -0
@@ -3662,8 +3662,8 @@ ${textEncoded}`;
3662
3662
  const raw = `${headers}\r
3663
3663
  \r
3664
3664
  ${bodyEncoded}`;
3665
- const uid = await this.syncManager.saveDraft(accountId, raw, previousDraftUid, id);
3666
- return { uid, draftId: id };
3665
+ const draftUid = await this.syncManager.saveDraft(accountId, raw, previousDraftUid, id);
3666
+ return { draftUid, draftId: id };
3667
3667
  }
3668
3668
  async deleteDraft(accountId, draftUid) {
3669
3669
  await this.syncManager.deleteDraft(accountId, draftUid);
@@ -3829,6 +3829,167 @@ ${bodyEncoded}`;
3829
3829
  cfg.priorityDomains.splice(i, 1);
3830
3830
  await cloudWrite2("contacts.jsonc", JSON.stringify(cfg, null, 2));
3831
3831
  }
3832
+ // ── MailxApi contract: name aliases ───────────────────────────────
3833
+ // The IPC dispatch names (`sendMessage`, `searchMessages`) differ from
3834
+ // the historical web method names (`send`, `search`). Thin aliases keep
3835
+ // the existing internal method bodies while satisfying `implements
3836
+ // MailxApi`. NEW methods should use the IPC name directly so this
3837
+ // section doesn't grow.
3838
+ sendMessage(msg) {
3839
+ return this.send(msg);
3840
+ }
3841
+ searchMessages(query, page, pageSize, scope, accountId, folderId, _includeTrashSpam) {
3842
+ return this.search(query, page, pageSize, scope, accountId, folderId);
3843
+ }
3844
+ // ── MailxApi contract: explicit stubs for unimplemented Android features ─
3845
+ //
3846
+ // Every method below is in the contract but has no Android implementation
3847
+ // today. Each is declared explicitly so it's *visible* in this file —
3848
+ // before the contract was added, these were just absent and IPC calls
3849
+ // returned "parent bridge has no method X", silently swallowed by
3850
+ // `.catch()` in callers. Now the gap is in one auditable list.
3851
+ //
3852
+ // Implementation policy:
3853
+ // - Pure read with no Android backing: return [] / {} / null / false.
3854
+ // UI degrades gracefully; no crash.
3855
+ // - Write that mutates state: throw `notImpl()` so a UI button that
3856
+ // calls it surfaces an error rather than appearing to succeed.
3857
+ // - OS-specific (Word, msger popups, OS file open): also `notImpl()`.
3858
+ // These are declared optional `?:` in the contract so we technically
3859
+ // could omit them entirely — explicit stubs are clearer.
3860
+ //
3861
+ // To wire one up: replace the stub body, run tsc, the contract enforces
3862
+ // the signature.
3863
+ notImpl(name) {
3864
+ throw new Error(`Not implemented on Android: ${name}`);
3865
+ }
3866
+ // Threads / attachments / message reads
3867
+ getThreadMessages(_accountId, _threadId) {
3868
+ return [];
3869
+ }
3870
+ async getAttachment(_accountId, _uid, _attachmentId, _folderId) {
3871
+ return this.notImpl("getAttachment");
3872
+ }
3873
+ // Spam / abuse
3874
+ async markAsSpamMessages(_accountId, _uids) {
3875
+ return this.notImpl("markAsSpamMessages");
3876
+ }
3877
+ async recordSpamReport(_accountId, _uid, _folderId) {
3878
+ return this.notImpl("recordSpamReport");
3879
+ }
3880
+ // Folder CRUD
3881
+ async createFolder(_accountId, _parentPath, _name) {
3882
+ this.notImpl("createFolder");
3883
+ }
3884
+ async renameFolder(_accountId, _folderId, _newName) {
3885
+ this.notImpl("renameFolder");
3886
+ }
3887
+ async deleteFolder(_accountId, _folderId) {
3888
+ this.notImpl("deleteFolder");
3889
+ }
3890
+ async moveFolderToTrash(_accountId, _folderId) {
3891
+ this.notImpl("moveFolderToTrash");
3892
+ }
3893
+ async emptyFolder(_accountId, _folderId) {
3894
+ this.notImpl("emptyFolder");
3895
+ }
3896
+ // Outbox management
3897
+ getOutboxStatus() {
3898
+ return { count: 0, items: [] };
3899
+ }
3900
+ listQueuedOutgoing() {
3901
+ return [];
3902
+ }
3903
+ cancelQueuedOutgoing(_filePath) {
3904
+ return { ok: true };
3905
+ }
3906
+ // Sync infrastructure — getSyncPending already defined above
3907
+ async drainStoreSync() {
3908
+ }
3909
+ reauthGoogleScopes() {
3910
+ return { cleared: 0 };
3911
+ }
3912
+ // Contacts extensions
3913
+ async addPreferredContact(_entry) {
3914
+ this.notImpl("addPreferredContact");
3915
+ }
3916
+ async addToDenylist(_email) {
3917
+ this.notImpl("addToDenylist");
3918
+ }
3919
+ hasBccHistoryTo(_email) {
3920
+ return false;
3921
+ }
3922
+ async loadContactsConfig() {
3923
+ return null;
3924
+ }
3925
+ // Calendar — Android UI has its own native calendar; no JS-side data.
3926
+ async getCalendarEvents(_fromMs, _toMs) {
3927
+ return [];
3928
+ }
3929
+ async createCalendarEvent(_ev) {
3930
+ return this.notImpl("createCalendarEvent");
3931
+ }
3932
+ async updateCalendarEvent(_uuid, _patch) {
3933
+ return this.notImpl("updateCalendarEvent");
3934
+ }
3935
+ async deleteCalendarEvent(_uuid) {
3936
+ return this.notImpl("deleteCalendarEvent");
3937
+ }
3938
+ // Tasks — same story
3939
+ async getTasks(_includeCompleted) {
3940
+ return [];
3941
+ }
3942
+ async createTask(_t) {
3943
+ return this.notImpl("createTask");
3944
+ }
3945
+ async updateTask(_uuid, _patch) {
3946
+ return this.notImpl("updateTask");
3947
+ }
3948
+ async deleteTask(_uuid) {
3949
+ return this.notImpl("deleteTask");
3950
+ }
3951
+ // User dictionary (cloud-mirrored) — Android can implement these via
3952
+ // the same userdict.jsonc cloud round-trip the desktop uses; until that
3953
+ // wire-up lands, return safe defaults so spellcheck.ts catch() paths
3954
+ // don't fire and clutter logs.
3955
+ async getUserDict() {
3956
+ return [];
3957
+ }
3958
+ async addUserDictWord(_word) {
3959
+ return [];
3960
+ }
3961
+ async removeUserDictWord(_word) {
3962
+ return [];
3963
+ }
3964
+ // Diagnostics / version / primary account
3965
+ getDiagnostics() {
3966
+ return { ok: true, platform: "android" };
3967
+ }
3968
+ getPrimaryAccount(_feature) {
3969
+ return null;
3970
+ }
3971
+ getVersion() {
3972
+ return { version: "android", platform: "android" };
3973
+ }
3974
+ consumePendingMailto() {
3975
+ return null;
3976
+ }
3977
+ logClientEvent(..._args) {
3978
+ }
3979
+ // Setup / repair / unsubscribe
3980
+ async setupAccount(_name, _email, _password) {
3981
+ return this.notImpl("setupAccount");
3982
+ }
3983
+ async repairAccounts() {
3984
+ return this.notImpl("repairAccounts");
3985
+ }
3986
+ async unsubscribeOneClick(_url) {
3987
+ return this.notImpl("unsubscribeOneClick");
3988
+ }
3989
+ // AI transforms — pipe through to web autocomplete or no-op
3990
+ async aiTransform(_req) {
3991
+ return this.notImpl("aiTransform");
3992
+ }
3832
3993
  };
3833
3994
  function parseJsoncLoose(raw) {
3834
3995
  try {