@bobfrankston/rmfmail 1.0.467

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 (330) hide show
  1. package/README.md +429 -0
  2. package/bin/build-icon-ico.js +283 -0
  3. package/bin/lean-accounts.js +172 -0
  4. package/bin/mailx.js +1580 -0
  5. package/bin/mailx.js.map +1 -0
  6. package/bin/mailx.ts +1549 -0
  7. package/bin/postinstall.js +39 -0
  8. package/bin/postinstall.js.map +1 -0
  9. package/bin/postinstall.ts +41 -0
  10. package/bin/tsconfig.json +10 -0
  11. package/client/.gitattributes +10 -0
  12. package/client/.msger-window.json +1 -0
  13. package/client/android.html +226 -0
  14. package/client/app.js +3400 -0
  15. package/client/app.js.map +1 -0
  16. package/client/app.ts +3190 -0
  17. package/client/components/address-book.js +199 -0
  18. package/client/components/address-book.js.map +1 -0
  19. package/client/components/address-book.ts +204 -0
  20. package/client/components/alarms.js +299 -0
  21. package/client/components/alarms.js.map +1 -0
  22. package/client/components/alarms.ts +276 -0
  23. package/client/components/calendar-sidebar.js +508 -0
  24. package/client/components/calendar-sidebar.js.map +1 -0
  25. package/client/components/calendar-sidebar.ts +474 -0
  26. package/client/components/calendar.js +217 -0
  27. package/client/components/calendar.js.map +1 -0
  28. package/client/components/calendar.ts +211 -0
  29. package/client/components/context-menu.js +80 -0
  30. package/client/components/context-menu.js.map +1 -0
  31. package/client/components/context-menu.ts +95 -0
  32. package/client/components/folder-picker.js +119 -0
  33. package/client/components/folder-picker.js.map +1 -0
  34. package/client/components/folder-picker.ts +127 -0
  35. package/client/components/folder-tree.js +1093 -0
  36. package/client/components/folder-tree.js.map +1 -0
  37. package/client/components/folder-tree.ts +1069 -0
  38. package/client/components/message-list.js +1140 -0
  39. package/client/components/message-list.js.map +1 -0
  40. package/client/components/message-list.ts +1129 -0
  41. package/client/components/message-viewer.js +1291 -0
  42. package/client/components/message-viewer.js.map +1 -0
  43. package/client/components/message-viewer.ts +1257 -0
  44. package/client/components/outbox-view.js +104 -0
  45. package/client/components/outbox-view.js.map +1 -0
  46. package/client/components/outbox-view.ts +102 -0
  47. package/client/components/tasks.js +261 -0
  48. package/client/components/tasks.js.map +1 -0
  49. package/client/components/tasks.ts +234 -0
  50. package/client/compose/compose.css +560 -0
  51. package/client/compose/compose.html +52 -0
  52. package/client/compose/compose.js +1289 -0
  53. package/client/compose/compose.js.map +1 -0
  54. package/client/compose/compose.ts +1231 -0
  55. package/client/compose/editor.js +616 -0
  56. package/client/compose/editor.js.map +1 -0
  57. package/client/compose/editor.ts +599 -0
  58. package/client/compose/ghost-text.js +122 -0
  59. package/client/compose/ghost-text.js.map +1 -0
  60. package/client/compose/ghost-text.ts +140 -0
  61. package/client/favicon.svg +11 -0
  62. package/client/icon.ico +0 -0
  63. package/client/icon.png +0 -0
  64. package/client/index.html +230 -0
  65. package/client/lib/android-bootstrap.js +9 -0
  66. package/client/lib/android-bootstrap.js.map +1 -0
  67. package/client/lib/android-bootstrap.ts +9 -0
  68. package/client/lib/api-client.js +378 -0
  69. package/client/lib/api-client.js.map +1 -0
  70. package/client/lib/api-client.ts +439 -0
  71. package/client/lib/local-service.js +603 -0
  72. package/client/lib/local-service.js.map +1 -0
  73. package/client/lib/local-service.ts +646 -0
  74. package/client/lib/local-store.js +214 -0
  75. package/client/lib/local-store.js.map +1 -0
  76. package/client/lib/local-store.ts +283 -0
  77. package/client/lib/mailxapi.js +304 -0
  78. package/client/lib/message-state.js +132 -0
  79. package/client/lib/message-state.js.map +1 -0
  80. package/client/lib/message-state.ts +160 -0
  81. package/client/package.json +16 -0
  82. package/client/styles/components.css +2049 -0
  83. package/client/styles/layout.css +332 -0
  84. package/client/styles/variables.css +85 -0
  85. package/client/tsconfig.json +19 -0
  86. package/package.json +124 -0
  87. package/packages/mailx-api/.gitattributes +10 -0
  88. package/packages/mailx-api/index.d.ts +10 -0
  89. package/packages/mailx-api/index.d.ts.map +1 -0
  90. package/packages/mailx-api/index.js +322 -0
  91. package/packages/mailx-api/index.js.map +1 -0
  92. package/packages/mailx-api/index.ts +283 -0
  93. package/packages/mailx-api/package.json +27 -0
  94. package/packages/mailx-api/tsconfig.json +9 -0
  95. package/packages/mailx-api/tsconfig.tsbuildinfo +1 -0
  96. package/packages/mailx-compose/.gitattributes +10 -0
  97. package/packages/mailx-compose/index.d.ts +21 -0
  98. package/packages/mailx-compose/index.d.ts.map +1 -0
  99. package/packages/mailx-compose/index.js +61 -0
  100. package/packages/mailx-compose/index.js.map +1 -0
  101. package/packages/mailx-compose/index.ts +85 -0
  102. package/packages/mailx-compose/package.json +18 -0
  103. package/packages/mailx-compose/tsconfig.json +9 -0
  104. package/packages/mailx-core/index.d.ts +139 -0
  105. package/packages/mailx-core/index.d.ts.map +1 -0
  106. package/packages/mailx-core/index.js +403 -0
  107. package/packages/mailx-core/index.js.map +1 -0
  108. package/packages/mailx-core/index.ts +424 -0
  109. package/packages/mailx-core/ipc.d.ts +13 -0
  110. package/packages/mailx-core/ipc.d.ts.map +1 -0
  111. package/packages/mailx-core/ipc.js +56 -0
  112. package/packages/mailx-core/ipc.js.map +1 -0
  113. package/packages/mailx-core/ipc.ts +62 -0
  114. package/packages/mailx-core/package.json +18 -0
  115. package/packages/mailx-core/tsconfig.json +9 -0
  116. package/packages/mailx-host/.gitattributes +10 -0
  117. package/packages/mailx-host/index.d.ts +21 -0
  118. package/packages/mailx-host/index.d.ts.map +1 -0
  119. package/packages/mailx-host/index.js +29 -0
  120. package/packages/mailx-host/index.js.map +1 -0
  121. package/packages/mailx-host/index.ts +38 -0
  122. package/packages/mailx-host/package.json +23 -0
  123. package/packages/mailx-host/tsconfig.json +9 -0
  124. package/packages/mailx-host/types-shim.d.ts +14 -0
  125. package/packages/mailx-imap/.gitattributes +10 -0
  126. package/packages/mailx-imap/index.d.ts +442 -0
  127. package/packages/mailx-imap/index.d.ts.map +1 -0
  128. package/packages/mailx-imap/index.js +3684 -0
  129. package/packages/mailx-imap/index.js.map +1 -0
  130. package/packages/mailx-imap/index.ts +3652 -0
  131. package/packages/mailx-imap/package-lock.json +131 -0
  132. package/packages/mailx-imap/package.json +28 -0
  133. package/packages/mailx-imap/providers/gmail-api.d.ts +8 -0
  134. package/packages/mailx-imap/providers/gmail-api.d.ts.map +1 -0
  135. package/packages/mailx-imap/providers/gmail-api.js +8 -0
  136. package/packages/mailx-imap/providers/gmail-api.js.map +1 -0
  137. package/packages/mailx-imap/providers/gmail-api.ts +8 -0
  138. package/packages/mailx-imap/providers/outlook-api.ts +7 -0
  139. package/packages/mailx-imap/providers/types.d.ts +9 -0
  140. package/packages/mailx-imap/providers/types.d.ts.map +1 -0
  141. package/packages/mailx-imap/providers/types.js +9 -0
  142. package/packages/mailx-imap/providers/types.js.map +1 -0
  143. package/packages/mailx-imap/providers/types.ts +9 -0
  144. package/packages/mailx-imap/tsconfig.json +9 -0
  145. package/packages/mailx-imap/tsconfig.tsbuildinfo +1 -0
  146. package/packages/mailx-send/.gitattributes +10 -0
  147. package/packages/mailx-send/README.md +217 -0
  148. package/packages/mailx-send/cli-queue.d.ts +11 -0
  149. package/packages/mailx-send/cli-queue.d.ts.map +1 -0
  150. package/packages/mailx-send/cli-queue.js +59 -0
  151. package/packages/mailx-send/cli-queue.js.map +1 -0
  152. package/packages/mailx-send/cli-queue.ts +62 -0
  153. package/packages/mailx-send/cli-send.d.ts +17 -0
  154. package/packages/mailx-send/cli-send.d.ts.map +1 -0
  155. package/packages/mailx-send/cli-send.js +75 -0
  156. package/packages/mailx-send/cli-send.js.map +1 -0
  157. package/packages/mailx-send/cli-send.ts +83 -0
  158. package/packages/mailx-send/cli.d.ts +22 -0
  159. package/packages/mailx-send/cli.d.ts.map +1 -0
  160. package/packages/mailx-send/cli.js +115 -0
  161. package/packages/mailx-send/cli.js.map +1 -0
  162. package/packages/mailx-send/cli.ts +126 -0
  163. package/packages/mailx-send/index.d.ts +77 -0
  164. package/packages/mailx-send/index.d.ts.map +1 -0
  165. package/packages/mailx-send/index.js +264 -0
  166. package/packages/mailx-send/index.js.map +1 -0
  167. package/packages/mailx-send/index.ts +333 -0
  168. package/packages/mailx-send/mailsend/README.md +133 -0
  169. package/packages/mailx-send/mailsend/cli.d.ts +12 -0
  170. package/packages/mailx-send/mailsend/cli.d.ts.map +1 -0
  171. package/packages/mailx-send/mailsend/cli.js +70 -0
  172. package/packages/mailx-send/mailsend/cli.js.map +1 -0
  173. package/packages/mailx-send/mailsend/cli.ts +81 -0
  174. package/packages/mailx-send/mailsend/index.d.ts +77 -0
  175. package/packages/mailx-send/mailsend/index.d.ts.map +1 -0
  176. package/packages/mailx-send/mailsend/index.js +264 -0
  177. package/packages/mailx-send/mailsend/index.js.map +1 -0
  178. package/packages/mailx-send/mailsend/index.ts +333 -0
  179. package/packages/mailx-send/mailsend/package-lock.json +65 -0
  180. package/packages/mailx-send/mailsend/package.json +26 -0
  181. package/packages/mailx-send/mailsend/tsconfig.json +21 -0
  182. package/packages/mailx-send/package-lock.json +65 -0
  183. package/packages/mailx-send/package.json +37 -0
  184. package/packages/mailx-send/tsconfig.json +21 -0
  185. package/packages/mailx-server/.gitattributes +10 -0
  186. package/packages/mailx-server/index.d.ts +8 -0
  187. package/packages/mailx-server/index.d.ts.map +1 -0
  188. package/packages/mailx-server/index.js +397 -0
  189. package/packages/mailx-server/index.js.map +1 -0
  190. package/packages/mailx-server/index.ts +429 -0
  191. package/packages/mailx-server/package.json +28 -0
  192. package/packages/mailx-server/tsconfig.json +9 -0
  193. package/packages/mailx-server/tsconfig.tsbuildinfo +1 -0
  194. package/packages/mailx-service/google-sync.d.ts +96 -0
  195. package/packages/mailx-service/google-sync.d.ts.map +1 -0
  196. package/packages/mailx-service/google-sync.js +153 -0
  197. package/packages/mailx-service/google-sync.js.map +1 -0
  198. package/packages/mailx-service/google-sync.ts +238 -0
  199. package/packages/mailx-service/index.d.ts +366 -0
  200. package/packages/mailx-service/index.d.ts.map +1 -0
  201. package/packages/mailx-service/index.js +2589 -0
  202. package/packages/mailx-service/index.js.map +1 -0
  203. package/packages/mailx-service/index.ts +2512 -0
  204. package/packages/mailx-service/jsonrpc.d.ts +25 -0
  205. package/packages/mailx-service/jsonrpc.d.ts.map +1 -0
  206. package/packages/mailx-service/jsonrpc.js +238 -0
  207. package/packages/mailx-service/jsonrpc.js.map +1 -0
  208. package/packages/mailx-service/jsonrpc.ts +268 -0
  209. package/packages/mailx-service/package.json +22 -0
  210. package/packages/mailx-service/tsconfig.json +9 -0
  211. package/packages/mailx-settings/.gitattributes +10 -0
  212. package/packages/mailx-settings/cloud.d.ts +47 -0
  213. package/packages/mailx-settings/cloud.d.ts.map +1 -0
  214. package/packages/mailx-settings/cloud.js +408 -0
  215. package/packages/mailx-settings/cloud.js.map +1 -0
  216. package/packages/mailx-settings/cloud.ts +393 -0
  217. package/packages/mailx-settings/index.d.ts +140 -0
  218. package/packages/mailx-settings/index.d.ts.map +1 -0
  219. package/packages/mailx-settings/index.js +872 -0
  220. package/packages/mailx-settings/index.js.map +1 -0
  221. package/packages/mailx-settings/index.ts +908 -0
  222. package/packages/mailx-settings/package.json +20 -0
  223. package/packages/mailx-settings/tsconfig.json +9 -0
  224. package/packages/mailx-settings/tsconfig.tsbuildinfo +1 -0
  225. package/packages/mailx-store/.gitattributes +10 -0
  226. package/packages/mailx-store/db.d.ts +346 -0
  227. package/packages/mailx-store/db.d.ts.map +1 -0
  228. package/packages/mailx-store/db.js +1796 -0
  229. package/packages/mailx-store/db.js.map +1 -0
  230. package/packages/mailx-store/db.ts +2007 -0
  231. package/packages/mailx-store/file-store.d.ts +36 -0
  232. package/packages/mailx-store/file-store.d.ts.map +1 -0
  233. package/packages/mailx-store/file-store.js +80 -0
  234. package/packages/mailx-store/file-store.js.map +1 -0
  235. package/packages/mailx-store/file-store.ts +82 -0
  236. package/packages/mailx-store/index.d.ts +7 -0
  237. package/packages/mailx-store/index.d.ts.map +1 -0
  238. package/packages/mailx-store/index.js +7 -0
  239. package/packages/mailx-store/index.js.map +1 -0
  240. package/packages/mailx-store/index.ts +7 -0
  241. package/packages/mailx-store/package.json +19 -0
  242. package/packages/mailx-store/tsconfig.json +9 -0
  243. package/packages/mailx-store/tsconfig.tsbuildinfo +1 -0
  244. package/packages/mailx-store-web/android-bootstrap.d.ts +16 -0
  245. package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -0
  246. package/packages/mailx-store-web/android-bootstrap.js +1247 -0
  247. package/packages/mailx-store-web/android-bootstrap.js.map +1 -0
  248. package/packages/mailx-store-web/android-bootstrap.ts +1262 -0
  249. package/packages/mailx-store-web/db.d.ts +132 -0
  250. package/packages/mailx-store-web/db.d.ts.map +1 -0
  251. package/packages/mailx-store-web/db.js +642 -0
  252. package/packages/mailx-store-web/db.js.map +1 -0
  253. package/packages/mailx-store-web/db.ts +756 -0
  254. package/packages/mailx-store-web/gmail-api-web.d.ts +11 -0
  255. package/packages/mailx-store-web/gmail-api-web.d.ts.map +1 -0
  256. package/packages/mailx-store-web/gmail-api-web.js +11 -0
  257. package/packages/mailx-store-web/gmail-api-web.js.map +1 -0
  258. package/packages/mailx-store-web/gmail-api-web.ts +11 -0
  259. package/packages/mailx-store-web/imap-web-provider.d.ts +33 -0
  260. package/packages/mailx-store-web/imap-web-provider.d.ts.map +1 -0
  261. package/packages/mailx-store-web/imap-web-provider.js +140 -0
  262. package/packages/mailx-store-web/imap-web-provider.js.map +1 -0
  263. package/packages/mailx-store-web/imap-web-provider.ts +156 -0
  264. package/packages/mailx-store-web/index.d.ts +10 -0
  265. package/packages/mailx-store-web/index.d.ts.map +1 -0
  266. package/packages/mailx-store-web/index.js +10 -0
  267. package/packages/mailx-store-web/index.js.map +1 -0
  268. package/packages/mailx-store-web/index.ts +10 -0
  269. package/packages/mailx-store-web/main-thread-host.d.ts +15 -0
  270. package/packages/mailx-store-web/main-thread-host.d.ts.map +1 -0
  271. package/packages/mailx-store-web/main-thread-host.js +292 -0
  272. package/packages/mailx-store-web/main-thread-host.js.map +1 -0
  273. package/packages/mailx-store-web/main-thread-host.ts +322 -0
  274. package/packages/mailx-store-web/package.json +23 -0
  275. package/packages/mailx-store-web/provider-types.d.ts +7 -0
  276. package/packages/mailx-store-web/provider-types.d.ts.map +1 -0
  277. package/packages/mailx-store-web/provider-types.js +7 -0
  278. package/packages/mailx-store-web/provider-types.js.map +1 -0
  279. package/packages/mailx-store-web/provider-types.ts +7 -0
  280. package/packages/mailx-store-web/sql-wasm-esm.js +10 -0
  281. package/packages/mailx-store-web/sql.js.d.ts +29 -0
  282. package/packages/mailx-store-web/sync-manager.d.ts +68 -0
  283. package/packages/mailx-store-web/sync-manager.d.ts.map +1 -0
  284. package/packages/mailx-store-web/sync-manager.js +506 -0
  285. package/packages/mailx-store-web/sync-manager.js.map +1 -0
  286. package/packages/mailx-store-web/sync-manager.ts +508 -0
  287. package/packages/mailx-store-web/tsconfig.json +10 -0
  288. package/packages/mailx-store-web/web-jsonrpc.d.ts +20 -0
  289. package/packages/mailx-store-web/web-jsonrpc.d.ts.map +1 -0
  290. package/packages/mailx-store-web/web-jsonrpc.js +102 -0
  291. package/packages/mailx-store-web/web-jsonrpc.js.map +1 -0
  292. package/packages/mailx-store-web/web-jsonrpc.ts +116 -0
  293. package/packages/mailx-store-web/web-message-store.d.ts +16 -0
  294. package/packages/mailx-store-web/web-message-store.d.ts.map +1 -0
  295. package/packages/mailx-store-web/web-message-store.js +89 -0
  296. package/packages/mailx-store-web/web-message-store.js.map +1 -0
  297. package/packages/mailx-store-web/web-message-store.ts +97 -0
  298. package/packages/mailx-store-web/web-service.d.ts +111 -0
  299. package/packages/mailx-store-web/web-service.d.ts.map +1 -0
  300. package/packages/mailx-store-web/web-service.js +542 -0
  301. package/packages/mailx-store-web/web-service.js.map +1 -0
  302. package/packages/mailx-store-web/web-service.ts +616 -0
  303. package/packages/mailx-store-web/web-settings.d.ts +83 -0
  304. package/packages/mailx-store-web/web-settings.d.ts.map +1 -0
  305. package/packages/mailx-store-web/web-settings.js +491 -0
  306. package/packages/mailx-store-web/web-settings.js.map +1 -0
  307. package/packages/mailx-store-web/web-settings.ts +522 -0
  308. package/packages/mailx-store-web/worker-bundle.js +6838 -0
  309. package/packages/mailx-store-web/worker-entry.d.ts +8 -0
  310. package/packages/mailx-store-web/worker-entry.d.ts.map +1 -0
  311. package/packages/mailx-store-web/worker-entry.js +187 -0
  312. package/packages/mailx-store-web/worker-entry.js.map +1 -0
  313. package/packages/mailx-store-web/worker-entry.ts +215 -0
  314. package/packages/mailx-store-web/worker-tcp-transport.d.ts +28 -0
  315. package/packages/mailx-store-web/worker-tcp-transport.d.ts.map +1 -0
  316. package/packages/mailx-store-web/worker-tcp-transport.js +98 -0
  317. package/packages/mailx-store-web/worker-tcp-transport.js.map +1 -0
  318. package/packages/mailx-store-web/worker-tcp-transport.ts +101 -0
  319. package/packages/mailx-types/.gitattributes +10 -0
  320. package/packages/mailx-types/index.d.ts +319 -0
  321. package/packages/mailx-types/index.d.ts.map +1 -0
  322. package/packages/mailx-types/index.js +243 -0
  323. package/packages/mailx-types/index.js.map +1 -0
  324. package/packages/mailx-types/index.ts +498 -0
  325. package/packages/mailx-types/package.json +16 -0
  326. package/packages/mailx-types/tsconfig.json +9 -0
  327. package/packages/mailx-types/tsconfig.tsbuildinfo +1 -0
  328. package/todo.json +13 -0
  329. package/tsconfig.base.json +31 -0
  330. package/tsconfig.json +9 -0
@@ -0,0 +1,25 @@
1
+ /**
2
+ * JSON-RPC dispatcher for MailxService.
3
+ * Maps mailxapi action names to MailxService method calls.
4
+ * Used by msger's bidirectional IPC (Phase 3) and can also
5
+ * serve as a stdio JSON-RPC interface for testing.
6
+ */
7
+ type ServiceLike = Record<string, (...args: any[]) => any>;
8
+ export interface RpcRequest {
9
+ _action: string;
10
+ _cbid: string;
11
+ [key: string]: any;
12
+ }
13
+ export interface RpcResponse {
14
+ _cbid: string;
15
+ result?: any;
16
+ error?: string;
17
+ }
18
+ export interface RpcEvent {
19
+ _event: string;
20
+ [key: string]: any;
21
+ }
22
+ /** Dispatch an incoming mailxapi call to the appropriate MailxService method */
23
+ export declare function dispatch(svc: ServiceLike, req: RpcRequest): Promise<RpcResponse>;
24
+ export {};
25
+ //# sourceMappingURL=jsonrpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAE3D,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,gFAAgF;AAChF,wBAAsB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAQtF"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * JSON-RPC dispatcher for MailxService.
3
+ * Maps mailxapi action names to MailxService method calls.
4
+ * Used by msger's bidirectional IPC (Phase 3) and can also
5
+ * serve as a stdio JSON-RPC interface for testing.
6
+ */
7
+ import { readFileSync } from "node:fs";
8
+ import { join, dirname } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const rootPkg = JSON.parse(readFileSync(join(__dirname, "..", "..", "package.json"), "utf-8"));
12
+ /** Dispatch an incoming mailxapi call to the appropriate MailxService method */
13
+ export async function dispatch(svc, req) {
14
+ const { _action, _cbid, ...params } = req;
15
+ try {
16
+ const result = await dispatchAction(svc, _action, params);
17
+ return { _cbid, result };
18
+ }
19
+ catch (e) {
20
+ return { _cbid, error: e.message || String(e) };
21
+ }
22
+ }
23
+ async function dispatchAction(svc, action, p) {
24
+ switch (action) {
25
+ // Accounts
26
+ case "getAccounts":
27
+ return svc.getAccounts();
28
+ case "getFolders":
29
+ return svc.getFolders(p.accountId);
30
+ // Messages
31
+ case "getMessages":
32
+ return svc.getMessages(p.accountId, p.folderId, p.page, p.pageSize, p.sort, p.sortDir, p.search, p.flaggedOnly);
33
+ case "getUnifiedInbox":
34
+ return svc.getUnifiedInbox(p.page || 1, p.pageSize || 50);
35
+ case "getMessage":
36
+ return svc.getMessage(p.accountId, p.uid, p.allowRemote, p.folderId);
37
+ // Flags & actions
38
+ case "updateFlags":
39
+ await svc.updateFlags(p.accountId, p.uid, p.flags);
40
+ return { ok: true };
41
+ case "deleteMessage":
42
+ await svc.deleteMessage(p.accountId, p.uid);
43
+ return { ok: true };
44
+ case "deleteMessages":
45
+ await svc.deleteMessages(p.accountId, p.uids);
46
+ return { ok: true, count: p.uids.length };
47
+ case "undeleteMessage":
48
+ await svc.undeleteMessage(p.accountId, p.uid, p.folderId);
49
+ return { ok: true };
50
+ case "moveMessage":
51
+ await svc.moveMessage(p.accountId, p.uid, p.targetFolderId, p.targetAccountId);
52
+ return { ok: true };
53
+ case "moveMessages":
54
+ await svc.moveMessages(p.accountId, p.uids, p.targetFolderId);
55
+ return { ok: true, count: p.uids.length };
56
+ case "markAsSpamMessages":
57
+ return await svc.markAsSpamMessages(p.accountId, p.uids);
58
+ // Folders
59
+ case "markFolderRead":
60
+ svc.markFolderRead(p.folderId);
61
+ return { ok: true };
62
+ case "createFolder":
63
+ await svc.createFolder(p.accountId, p.parentPath, p.name);
64
+ return { ok: true };
65
+ case "renameFolder":
66
+ await svc.renameFolder(p.accountId, p.folderId, p.newName);
67
+ return { ok: true };
68
+ case "deleteFolder":
69
+ await svc.deleteFolder(p.accountId, p.folderId);
70
+ return { ok: true };
71
+ case "emptyFolder":
72
+ await svc.emptyFolder(p.accountId, p.folderId);
73
+ return { ok: true };
74
+ // Compose. sendMessage validates synchronously (fast — regex check on
75
+ // recipient strings), then writes to disk synchronously inside the
76
+ // service. Validation errors come back immediately to the user; once
77
+ // we've ACK'd, the message is durable on disk and the worker drains it.
78
+ // The whole call should be sub-100ms; if it ever isn't, the [send]
79
+ // timing log shows which step ate the budget.
80
+ case "sendMessage":
81
+ await svc.send(p);
82
+ return { ok: true };
83
+ case "saveDraft":
84
+ return svc.saveDraft(p.accountId, p.subject, p.bodyHtml, p.bodyText, p.to, p.cc, p.previousDraftUid, p.draftId);
85
+ case "deleteDraft":
86
+ await svc.deleteDraft(p.accountId, p.draftUid, p.draftId);
87
+ return { ok: true };
88
+ // Sync
89
+ case "syncAll":
90
+ await svc.syncAll();
91
+ return { ok: true };
92
+ case "syncAccount":
93
+ await svc.syncAccount(p.accountId);
94
+ return { ok: true };
95
+ case "getSyncPending":
96
+ return svc.getSyncPending();
97
+ case "getDiagnostics":
98
+ return svc.getDiagnostics();
99
+ case "getPrimaryAccount":
100
+ return svc.getPrimaryAccount(p?.feature);
101
+ // Calendar / Tasks: two-way cache. Reads return local immediately
102
+ // and kick a background refresh that emits updates when done.
103
+ case "getCalendarEvents":
104
+ return await svc.getCalendarEvents(p.fromMs, p.toMs);
105
+ case "createCalendarEvent":
106
+ return { uuid: await svc.createCalendarEventLocal(p) };
107
+ case "updateCalendarEvent":
108
+ await svc.updateCalendarEventLocal(p.uuid, p.patch);
109
+ return { ok: true };
110
+ case "deleteCalendarEvent":
111
+ await svc.deleteCalendarEventLocal(p.uuid);
112
+ return { ok: true };
113
+ case "getTasks":
114
+ return await svc.getTasks(!!p.includeCompleted);
115
+ case "createTask":
116
+ return { uuid: await svc.createTaskLocal(p) };
117
+ case "updateTask":
118
+ await svc.updateTaskLocal(p.uuid, p.patch);
119
+ return { ok: true };
120
+ case "deleteTask":
121
+ await svc.deleteTaskLocal(p.uuid);
122
+ return { ok: true };
123
+ case "drainStoreSync":
124
+ await svc.drainStoreSync();
125
+ return { ok: true };
126
+ case "recordSpamReport":
127
+ return await svc.recordSpamReport(p.accountId, p.uid, p.folderId);
128
+ case "getOutboxStatus":
129
+ return svc.getOutboxStatus();
130
+ case "listQueuedOutgoing":
131
+ return svc.listQueuedOutgoing();
132
+ case "cancelQueuedOutgoing":
133
+ return svc.cancelQueuedOutgoing(p.path);
134
+ case "reauthenticate":
135
+ return { ok: await svc.reauthenticate(p.accountId) };
136
+ case "reauthGoogleScopes":
137
+ return svc.reauthGoogleScopes();
138
+ // Search & contacts
139
+ case "searchMessages":
140
+ return svc.search(p.query, p.page, p.pageSize, p.scope, p.accountId, p.folderId);
141
+ case "searchContacts":
142
+ return svc.searchContacts(p.query);
143
+ case "hasCcHistoryTo":
144
+ return { hasCc: svc.hasCcHistoryTo(p.email) };
145
+ case "hasBccHistoryTo":
146
+ return { hasBcc: svc.hasBccHistoryTo(p.email) };
147
+ case "addContact":
148
+ return { ok: svc.addContact(p.name, p.email) };
149
+ case "listContacts":
150
+ return svc.listContacts(p.query || "", p.page || 1, p.pageSize || 100);
151
+ case "upsertContact":
152
+ return svc.upsertContact(p.name, p.email);
153
+ case "deleteContact":
154
+ return svc.deleteContact(p.email);
155
+ case "addPreferredContact":
156
+ await svc.addPreferredContact({ name: p.name, email: p.email, source: p.source, organization: p.organization });
157
+ return { ok: true };
158
+ case "addToDenylist":
159
+ await svc.addToDenylist(p.email);
160
+ return { ok: true };
161
+ case "loadContactsConfig":
162
+ return { result: await svc.loadContactsConfig() };
163
+ case "openLocalPath":
164
+ return await svc.openLocalPath(p.which);
165
+ case "getThreadMessages":
166
+ return svc.getThreadMessages(p.accountId, p.threadId);
167
+ case "readJsoncFile":
168
+ return { content: await svc.readJsoncFile(p.name) };
169
+ case "writeJsoncFile":
170
+ await svc.writeJsoncFile(p.name, p.content);
171
+ return { ok: true };
172
+ case "formatJsonc":
173
+ return { content: await svc.formatJsonc(p.content) };
174
+ case "readConfigHelp":
175
+ return { content: await svc.readConfigHelp(p.name) };
176
+ case "unsubscribeOneClick":
177
+ return await svc.unsubscribeOneClick(p.url);
178
+ case "openInWord":
179
+ return await svc.openInWord(p.editId, p.html);
180
+ case "closeWordEdit":
181
+ return await svc.closeWordEdit(p.editId);
182
+ // Client-side tracing — lets webview / iframe code ship events to the
183
+ // Node log so a "compose→send→vanished" report can be diagnosed without
184
+ // opening devtools. Every call shows up as `[client] <tag> <data>` in
185
+ // the main log. Keep it on the top of the switch so it's cheap + first
186
+ // to dispatch.
187
+ case "logClientEvent":
188
+ console.log(` [client] ${p.tag || "?"}${p.data ? " " + JSON.stringify(p.data).slice(0, 400) : ""}`);
189
+ return { ok: true };
190
+ // Settings
191
+ case "getSettings":
192
+ return svc.getSettings();
193
+ case "saveSettingsData":
194
+ svc.saveSettings(p);
195
+ return { ok: true };
196
+ case "allowRemoteContent":
197
+ svc.allowRemoteContent(p.type, p.value);
198
+ return { ok: true };
199
+ case "flagSenderOrDomain":
200
+ return await svc.flagSenderOrDomain(p.type, p.value);
201
+ case "getVersion": {
202
+ try {
203
+ const settings = svc.getSettings();
204
+ const storage = svc.getStorageInfo();
205
+ return { version: rootPkg.version || "dev", theme: settings.ui?.theme || "system", storage };
206
+ }
207
+ catch (e) {
208
+ console.error(` [jsonrpc] getVersion error: ${e.message}`);
209
+ return { version: rootPkg.version || "dev", theme: "system", storage: {} };
210
+ }
211
+ }
212
+ // Autocomplete
213
+ case "autocomplete":
214
+ return svc.autocomplete(p);
215
+ case "getAutocompleteSettings":
216
+ return svc.getAutocompleteSettings();
217
+ case "saveAutocompleteSettings":
218
+ svc.saveAutocompleteSettings(p);
219
+ return { ok: true };
220
+ // AI transform (translate / proofread / summarize) — gated by per-feature
221
+ // toggles in autocomplete settings, both default false.
222
+ case "aiTransform":
223
+ return svc.aiTransform(p);
224
+ // Attachments
225
+ case "getAttachment": {
226
+ const att = await svc.getAttachment(p.accountId, p.uid, p.attachmentId, p.folderId);
227
+ return { content: att.content.toString("base64"), contentType: att.contentType, filename: att.filename };
228
+ }
229
+ // Setup & Repair
230
+ case "setupAccount":
231
+ return svc.setupAccount(p.name, p.email, p.password);
232
+ case "repairAccounts":
233
+ return svc.repairAccounts();
234
+ default:
235
+ throw new Error(`Unknown action: ${action}`);
236
+ }
237
+ }
238
+ //# sourceMappingURL=jsonrpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["jsonrpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,268 @@
1
+ /**
2
+ * JSON-RPC dispatcher for MailxService.
3
+ * Maps mailxapi action names to MailxService method calls.
4
+ * Used by msger's bidirectional IPC (Phase 3) and can also
5
+ * serve as a stdio JSON-RPC interface for testing.
6
+ */
7
+
8
+ import { readFileSync } from "node:fs";
9
+ import { join, dirname } from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const rootPkg = JSON.parse(readFileSync(join(__dirname, "..", "..", "package.json"), "utf-8"));
14
+
15
+ // Accept any object with the right methods — avoids type conflicts from separate declarations
16
+ type ServiceLike = Record<string, (...args: any[]) => any>;
17
+
18
+ export interface RpcRequest {
19
+ _action: string;
20
+ _cbid: string;
21
+ [key: string]: any;
22
+ }
23
+
24
+ export interface RpcResponse {
25
+ _cbid: string;
26
+ result?: any;
27
+ error?: string;
28
+ }
29
+
30
+ export interface RpcEvent {
31
+ _event: string;
32
+ [key: string]: any;
33
+ }
34
+
35
+ /** Dispatch an incoming mailxapi call to the appropriate MailxService method */
36
+ export async function dispatch(svc: ServiceLike, req: RpcRequest): Promise<RpcResponse> {
37
+ const { _action, _cbid, ...params } = req;
38
+ try {
39
+ const result = await dispatchAction(svc, _action, params);
40
+ return { _cbid, result };
41
+ } catch (e: any) {
42
+ return { _cbid, error: e.message || String(e) };
43
+ }
44
+ }
45
+
46
+ async function dispatchAction(svc: ServiceLike, action: string, p: Record<string, any>): Promise<any> {
47
+ switch (action) {
48
+ // Accounts
49
+ case "getAccounts":
50
+ return svc.getAccounts();
51
+ case "getFolders":
52
+ return svc.getFolders(p.accountId);
53
+
54
+ // Messages
55
+ case "getMessages":
56
+ return svc.getMessages(p.accountId, p.folderId, p.page, p.pageSize, p.sort, p.sortDir, p.search, p.flaggedOnly);
57
+ case "getUnifiedInbox":
58
+ return svc.getUnifiedInbox(p.page || 1, p.pageSize || 50);
59
+ case "getMessage":
60
+ return svc.getMessage(p.accountId, p.uid, p.allowRemote, p.folderId);
61
+
62
+ // Flags & actions
63
+ case "updateFlags":
64
+ await svc.updateFlags(p.accountId, p.uid, p.flags);
65
+ return { ok: true };
66
+ case "deleteMessage":
67
+ await svc.deleteMessage(p.accountId, p.uid);
68
+ return { ok: true };
69
+ case "deleteMessages":
70
+ await svc.deleteMessages(p.accountId, p.uids);
71
+ return { ok: true, count: p.uids.length };
72
+ case "undeleteMessage":
73
+ await svc.undeleteMessage(p.accountId, p.uid, p.folderId);
74
+ return { ok: true };
75
+ case "moveMessage":
76
+ await svc.moveMessage(p.accountId, p.uid, p.targetFolderId, p.targetAccountId);
77
+ return { ok: true };
78
+ case "moveMessages":
79
+ await svc.moveMessages(p.accountId, p.uids, p.targetFolderId);
80
+ return { ok: true, count: p.uids.length };
81
+ case "markAsSpamMessages":
82
+ return await svc.markAsSpamMessages(p.accountId, p.uids);
83
+
84
+ // Folders
85
+ case "markFolderRead":
86
+ svc.markFolderRead(p.folderId);
87
+ return { ok: true };
88
+ case "createFolder":
89
+ await svc.createFolder(p.accountId, p.parentPath, p.name);
90
+ return { ok: true };
91
+ case "renameFolder":
92
+ await svc.renameFolder(p.accountId, p.folderId, p.newName);
93
+ return { ok: true };
94
+ case "deleteFolder":
95
+ await svc.deleteFolder(p.accountId, p.folderId);
96
+ return { ok: true };
97
+ case "emptyFolder":
98
+ await svc.emptyFolder(p.accountId, p.folderId);
99
+ return { ok: true };
100
+
101
+ // Compose. sendMessage validates synchronously (fast — regex check on
102
+ // recipient strings), then writes to disk synchronously inside the
103
+ // service. Validation errors come back immediately to the user; once
104
+ // we've ACK'd, the message is durable on disk and the worker drains it.
105
+ // The whole call should be sub-100ms; if it ever isn't, the [send]
106
+ // timing log shows which step ate the budget.
107
+ case "sendMessage":
108
+ await svc.send(p);
109
+ return { ok: true };
110
+ case "saveDraft":
111
+ return svc.saveDraft(p.accountId, p.subject, p.bodyHtml, p.bodyText, p.to, p.cc, p.previousDraftUid, p.draftId);
112
+ case "deleteDraft":
113
+ await svc.deleteDraft(p.accountId, p.draftUid, p.draftId);
114
+ return { ok: true };
115
+
116
+ // Sync
117
+ case "syncAll":
118
+ await svc.syncAll();
119
+ return { ok: true };
120
+ case "syncAccount":
121
+ await svc.syncAccount(p.accountId);
122
+ return { ok: true };
123
+ case "getSyncPending":
124
+ return svc.getSyncPending();
125
+ case "getDiagnostics":
126
+ return svc.getDiagnostics();
127
+ case "getPrimaryAccount":
128
+ return svc.getPrimaryAccount(p?.feature);
129
+
130
+ // Calendar / Tasks: two-way cache. Reads return local immediately
131
+ // and kick a background refresh that emits updates when done.
132
+ case "getCalendarEvents":
133
+ return await svc.getCalendarEvents(p.fromMs, p.toMs);
134
+ case "createCalendarEvent":
135
+ return { uuid: await svc.createCalendarEventLocal(p) };
136
+ case "updateCalendarEvent":
137
+ await svc.updateCalendarEventLocal(p.uuid, p.patch); return { ok: true };
138
+ case "deleteCalendarEvent":
139
+ await svc.deleteCalendarEventLocal(p.uuid); return { ok: true };
140
+ case "getTasks":
141
+ return await svc.getTasks(!!p.includeCompleted);
142
+ case "createTask":
143
+ return { uuid: await svc.createTaskLocal(p) };
144
+ case "updateTask":
145
+ await svc.updateTaskLocal(p.uuid, p.patch); return { ok: true };
146
+ case "deleteTask":
147
+ await svc.deleteTaskLocal(p.uuid); return { ok: true };
148
+ case "drainStoreSync":
149
+ await svc.drainStoreSync(); return { ok: true };
150
+ case "recordSpamReport":
151
+ return await svc.recordSpamReport(p.accountId, p.uid, p.folderId);
152
+ case "getOutboxStatus":
153
+ return svc.getOutboxStatus();
154
+ case "listQueuedOutgoing":
155
+ return svc.listQueuedOutgoing();
156
+ case "cancelQueuedOutgoing":
157
+ return svc.cancelQueuedOutgoing(p.path);
158
+ case "reauthenticate":
159
+ return { ok: await svc.reauthenticate(p.accountId) };
160
+ case "reauthGoogleScopes":
161
+ return svc.reauthGoogleScopes();
162
+
163
+ // Search & contacts
164
+ case "searchMessages":
165
+ return svc.search(p.query, p.page, p.pageSize, p.scope, p.accountId, p.folderId);
166
+ case "searchContacts":
167
+ return svc.searchContacts(p.query);
168
+ case "hasCcHistoryTo":
169
+ return { hasCc: svc.hasCcHistoryTo(p.email) };
170
+ case "hasBccHistoryTo":
171
+ return { hasBcc: svc.hasBccHistoryTo(p.email) };
172
+ case "addContact":
173
+ return { ok: svc.addContact(p.name, p.email) };
174
+ case "listContacts":
175
+ return svc.listContacts(p.query || "", p.page || 1, p.pageSize || 100);
176
+ case "upsertContact":
177
+ return svc.upsertContact(p.name, p.email);
178
+ case "deleteContact":
179
+ return svc.deleteContact(p.email);
180
+ case "addPreferredContact":
181
+ await svc.addPreferredContact({ name: p.name, email: p.email, source: p.source, organization: p.organization });
182
+ return { ok: true };
183
+ case "addToDenylist":
184
+ await svc.addToDenylist(p.email);
185
+ return { ok: true };
186
+ case "loadContactsConfig":
187
+ return { result: await svc.loadContactsConfig() };
188
+ case "openLocalPath":
189
+ return await svc.openLocalPath(p.which);
190
+ case "getThreadMessages":
191
+ return svc.getThreadMessages(p.accountId, p.threadId);
192
+ case "readJsoncFile":
193
+ return { content: await svc.readJsoncFile(p.name) };
194
+ case "writeJsoncFile":
195
+ await svc.writeJsoncFile(p.name, p.content);
196
+ return { ok: true };
197
+ case "formatJsonc":
198
+ return { content: await svc.formatJsonc(p.content) };
199
+ case "readConfigHelp":
200
+ return { content: await svc.readConfigHelp(p.name) };
201
+ case "unsubscribeOneClick":
202
+ return await svc.unsubscribeOneClick(p.url);
203
+ case "openInWord":
204
+ return await svc.openInWord(p.editId, p.html);
205
+ case "closeWordEdit":
206
+ return await svc.closeWordEdit(p.editId);
207
+
208
+ // Client-side tracing — lets webview / iframe code ship events to the
209
+ // Node log so a "compose→send→vanished" report can be diagnosed without
210
+ // opening devtools. Every call shows up as `[client] <tag> <data>` in
211
+ // the main log. Keep it on the top of the switch so it's cheap + first
212
+ // to dispatch.
213
+ case "logClientEvent":
214
+ console.log(` [client] ${p.tag || "?"}${p.data ? " " + JSON.stringify(p.data).slice(0, 400) : ""}`);
215
+ return { ok: true };
216
+
217
+ // Settings
218
+ case "getSettings":
219
+ return svc.getSettings();
220
+ case "saveSettingsData":
221
+ svc.saveSettings(p);
222
+ return { ok: true };
223
+ case "allowRemoteContent":
224
+ svc.allowRemoteContent(p.type, p.value);
225
+ return { ok: true };
226
+ case "flagSenderOrDomain":
227
+ return await svc.flagSenderOrDomain(p.type, p.value);
228
+ case "getVersion": {
229
+ try {
230
+ const settings = svc.getSettings();
231
+ const storage = svc.getStorageInfo();
232
+ return { version: rootPkg.version || "dev", theme: settings.ui?.theme || "system", storage };
233
+ } catch (e: any) {
234
+ console.error(` [jsonrpc] getVersion error: ${e.message}`);
235
+ return { version: rootPkg.version || "dev", theme: "system", storage: {} };
236
+ }
237
+ }
238
+
239
+ // Autocomplete
240
+ case "autocomplete":
241
+ return svc.autocomplete(p as any);
242
+ case "getAutocompleteSettings":
243
+ return svc.getAutocompleteSettings();
244
+ case "saveAutocompleteSettings":
245
+ svc.saveAutocompleteSettings(p);
246
+ return { ok: true };
247
+
248
+ // AI transform (translate / proofread / summarize) — gated by per-feature
249
+ // toggles in autocomplete settings, both default false.
250
+ case "aiTransform":
251
+ return svc.aiTransform(p as any);
252
+
253
+ // Attachments
254
+ case "getAttachment": {
255
+ const att = await svc.getAttachment(p.accountId, p.uid, p.attachmentId, p.folderId);
256
+ return { content: att.content.toString("base64"), contentType: att.contentType, filename: att.filename };
257
+ }
258
+
259
+ // Setup & Repair
260
+ case "setupAccount":
261
+ return svc.setupAccount(p.name, p.email, p.password);
262
+ case "repairAccounts":
263
+ return svc.repairAccounts();
264
+
265
+ default:
266
+ throw new Error(`Unknown action: ${action}`);
267
+ }
268
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@bobfrankston/mailx-service",
3
+ "version": "0.1.1",
4
+ "type": "module",
5
+ "main": "index.js",
6
+ "types": "index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc"
9
+ },
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@bobfrankston/mailx-types": "file:../mailx-types",
13
+ "@bobfrankston/mailx-store": "file:../mailx-store",
14
+ "@bobfrankston/mailx-imap": "file:../mailx-imap",
15
+ "@bobfrankston/mailx-settings": "file:../mailx-settings",
16
+ "mailparser": "^3.7.2"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/BobFrankston/mailx.git"
21
+ }
22
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": ".",
5
+ "rootDir": "."
6
+ },
7
+ "include": ["*.ts"],
8
+ "exclude": ["node_modules", "prev", "cruft", "tests"]
9
+ }
@@ -0,0 +1,10 @@
1
+ # Force LF line endings for all text files
2
+ * text=auto eol=lf
3
+
4
+ # Ensure these are always LF
5
+ *.ts text eol=lf
6
+ *.js text eol=lf
7
+ *.json text eol=lf
8
+ *.md text eol=lf
9
+ *.yml text eol=lf
10
+ *.yaml text eol=lf
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Cloud storage for mailx settings — Google Drive API (drive.file scope).
3
+ *
4
+ * Uses a single app-owned "mailx" folder on Drive, accessed by folder ID.
5
+ * The drive.file scope only sees files/folders created by this OAuth client,
6
+ * which prevents conflicts with existing folders of the same name.
7
+ * All machines using the same OAuth client ID share the same folder.
8
+ *
9
+ * ── Restoring removed providers ──
10
+ * OneDrive (removed 2026-04-06): Required microsoft-credentials.json in ~/.mailx/,
11
+ * MS_SCOPES = "https://graph.microsoft.com/Files.ReadWrite offline_access",
12
+ * authenticateOAuth with tokenDir ~/.mailx/tokens/microsoft/.
13
+ * Read/write via Graph API: GET/PUT https://graph.microsoft.com/v1.0/me/drive/root:/{path}:/content
14
+ * Azure AD app registration needed: https://portal.azure.com → App registrations → Desktop app
15
+ *
16
+ * Dropbox (removed 2026-04-06): Never implemented — placeholder only.
17
+ * Would need Dropbox OAuth app, token management, and Dropbox API v2 calls.
18
+ */
19
+ /** Find the settings folder on GDrive, or create a flat "mailx" folder.
20
+ * Supports nested paths from config (e.g. "home/.mailx") by walking each
21
+ * segment. Falls back to the folderId in config if set, so a stale ID that
22
+ * points to the wrong folder gets corrected on next lookup. */
23
+ export declare function gDriveFindOrCreateFolder(): Promise<string | null>;
24
+ export type CloudProvider = "gdrive" | "google" | "local";
25
+ export interface CloudFile {
26
+ /** Read a file. For gdrive, path is just the filename (folder ID is implicit). */
27
+ read(filePath: string): Promise<string | null>;
28
+ /** Write a file. For gdrive, path is just the filename. Throws on failure with a descriptive error. */
29
+ write(filePath: string, content: string): Promise<void>;
30
+ /** Check if a file exists. */
31
+ exists(filePath: string): Promise<boolean>;
32
+ }
33
+ /**
34
+ * Get a cloud file provider. For gdrive, pass the folder ID.
35
+ * Files are stored flat in the folder (no subdirectory navigation).
36
+ */
37
+ export declare function getCloudProvider(provider: string, folderId?: string): CloudFile | null;
38
+ /** Fetch the authenticated Google user's profile (name + email) via the People API.
39
+ * Caller must supply an OAuth access token whose scopes include `contacts.readonly`
40
+ * or `userinfo.profile`. The Drive token (drive.file) does NOT have the right scope
41
+ * on its own — use the Gmail/IMAP OAuth token instead (mailx-imap's
42
+ * ImapManager.getOAuthToken). Returns null on failure. */
43
+ export declare function getGoogleProfile(token: string): Promise<{
44
+ name?: string;
45
+ email?: string;
46
+ } | null>;
47
+ //# sourceMappingURL=cloud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["cloud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAyLH;;;gEAGgE;AAChE,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6CvE;AA4ED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,SAAS;IACtB,kFAAkF;IAClF,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,uGAAuG;IACvG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,8BAA8B;IAC9B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAuBtF;AAED;;;;2DAI2D;AAC3D,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBvG"}