@bobfrankston/mailx 1.0.9 → 1.0.13

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 (246) hide show
  1. package/bin/mailx.js +47 -29
  2. package/bin/postinstall.js +41 -0
  3. package/client/app.js +93 -13
  4. package/client/components/folder-tree.js +84 -3
  5. package/client/components/message-list.js +134 -8
  6. package/client/components/message-viewer.js +130 -13
  7. package/client/compose/compose.html +4 -4
  8. package/client/compose/compose.js +53 -34
  9. package/client/index.html +33 -9
  10. package/client/lib/api-client.js +102 -30
  11. package/client/lib/mailxapi.js +123 -0
  12. package/client/package.json +5 -1
  13. package/client/styles/components.css +188 -15
  14. package/client/styles/layout.css +2 -1
  15. package/killmail.cmd +6 -0
  16. package/launch.ps1 +48 -3
  17. package/launcher/bin/mailx-app.exe +0 -0
  18. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Breadcrumbs +0 -0
  19. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Crashpad/metadata +0 -0
  20. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Crashpad/settings.dat +0 -0
  21. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Crashpad/throttle_store.dat +1 -0
  22. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/CrashpadMetrics-active.pma +0 -0
  23. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/BrowsingTopicsSiteData +0 -0
  24. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Cache/No_Vary_Search/journal.baj +1 -0
  25. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/DIPS +0 -0
  26. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/DashTrackerDatabase +0 -0
  27. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/EdgeJourneys/EdgeJourneys.db +0 -0
  28. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Extension Rules/LOCK +0 -0
  29. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Extension Rules/LOG +3 -0
  30. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Extension Rules/MANIFEST-000001 +0 -0
  31. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Extension Scripts/LOCK +0 -0
  32. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Extension Scripts/LOG +3 -0
  33. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Extension Scripts/MANIFEST-000001 +0 -0
  34. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Extension State/LOCK +0 -0
  35. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Extension State/LOG +3 -0
  36. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Extension State/MANIFEST-000001 +0 -0
  37. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/ExtensionActivityComp +0 -0
  38. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/ExtensionActivityEdge +0 -0
  39. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Favicons +0 -0
  40. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/History +0 -0
  41. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/History-journal +0 -0
  42. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/IndexedDB/devtools_devtools_0.indexeddb.leveldb/LOCK +0 -0
  43. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/IndexedDB/devtools_devtools_0.indexeddb.leveldb/LOG +3 -0
  44. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/IndexedDB/devtools_devtools_0.indexeddb.leveldb/MANIFEST-000001 +0 -0
  45. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Local Storage/leveldb/LOCK +0 -0
  46. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Local Storage/leveldb/LOG +3 -0
  47. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Local Storage/leveldb/MANIFEST-000001 +0 -0
  48. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Login Data +0 -0
  49. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Login Data For Account +0 -0
  50. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Network/Cookies +0 -0
  51. NEL +0 -0
  52. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Network/Trust Tokens +0 -0
  53. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Network Action Predictor +0 -0
  54. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Preferences +1 -0
  55. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Safe Browsing Network/Safe Browsing Cookies +0 -0
  56. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/ServerCertificate +0 -0
  57. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Session Storage/LOCK +0 -0
  58. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Session Storage/LOG +3 -0
  59. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Session Storage/MANIFEST-000001 +0 -0
  60. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Shared Dictionary/db +0 -0
  61. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/SharedStorage +0 -0
  62. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Shortcuts +0 -0
  63. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Site Characteristics Database/LOCK +0 -0
  64. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Site Characteristics Database/LOG +3 -0
  65. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Site Characteristics Database/MANIFEST-000001 +0 -0
  66. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/LOCK +0 -0
  67. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/LOG +3 -0
  68. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/MANIFEST-000001 +0 -0
  69. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Top Sites +0 -0
  70. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Vpn Tokens +0 -0
  71. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Web Data +0 -0
  72. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/Web Data-journal +0 -0
  73. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/WebStorage/QuotaManager +0 -0
  74. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/WebStorage/QuotaManager-journal +0 -0
  75. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/heavy_ad_intervention_opt_out.db +0 -0
  76. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/shared_proto_db/LOCK +0 -0
  77. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/shared_proto_db/LOG +3 -0
  78. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/shared_proto_db/MANIFEST-000001 +0 -0
  79. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/LOCK +0 -0
  80. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/LOG +3 -0
  81. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/MANIFEST-000001 +0 -0
  82. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/DeferredBrowserMetrics/BrowserMetrics-69CAD063-BE24.pma +0 -0
  83. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Local State +1 -0
  84. package/launcher/bin/mailx-app.exe.WebView2/EBWebView/Variations +1 -0
  85. package/launcher/bin/mailx-app.old.exe +0 -0
  86. package/launcher/mailx.ico +0 -0
  87. package/npmg.bat +6 -0
  88. package/package.json +9 -3
  89. package/packages/mailx-api/index.js +79 -26
  90. package/packages/mailx-api/package.json +5 -1
  91. package/packages/mailx-compose/package.json +5 -1
  92. package/packages/mailx-core/index.d.ts +129 -0
  93. package/packages/mailx-core/index.js +323 -0
  94. package/packages/mailx-core/ipc.d.ts +13 -0
  95. package/packages/mailx-core/ipc.js +56 -0
  96. package/packages/mailx-core/package.json +18 -0
  97. package/packages/mailx-imap/index.d.ts +5 -1
  98. package/packages/mailx-imap/index.js +76 -14
  99. package/packages/mailx-imap/package.json +5 -1
  100. package/packages/mailx-send/package.json +12 -2
  101. package/packages/mailx-server/index.js +42 -31
  102. package/packages/mailx-server/package.json +5 -2
  103. package/packages/mailx-settings/index.d.ts +1 -1
  104. package/packages/mailx-settings/index.js +21 -12
  105. package/packages/mailx-settings/package.json +5 -1
  106. package/packages/mailx-store/db.d.ts +5 -1
  107. package/packages/mailx-store/db.js +64 -12
  108. package/packages/mailx-store/file-store.d.ts +2 -8
  109. package/packages/mailx-store/file-store.js +7 -31
  110. package/packages/mailx-store/package.json +5 -1
  111. package/packages/mailx-types/index.d.ts +3 -1
  112. package/packages/mailx-types/package.json +6 -2
  113. package/.tswalk.json +0 -3366
  114. package/mailx.json +0 -9
  115. package/packages/mailx-api/node_modules/nodemailer/.ncurc.js +0 -9
  116. package/packages/mailx-api/node_modules/nodemailer/.prettierignore +0 -8
  117. package/packages/mailx-api/node_modules/nodemailer/.prettierrc +0 -12
  118. package/packages/mailx-api/node_modules/nodemailer/.prettierrc.js +0 -10
  119. package/packages/mailx-api/node_modules/nodemailer/.release-please-config.json +0 -9
  120. package/packages/mailx-api/node_modules/nodemailer/LICENSE +0 -16
  121. package/packages/mailx-api/node_modules/nodemailer/README.md +0 -86
  122. package/packages/mailx-api/node_modules/nodemailer/SECURITY.txt +0 -22
  123. package/packages/mailx-api/node_modules/nodemailer/eslint.config.js +0 -88
  124. package/packages/mailx-api/node_modules/nodemailer/lib/addressparser/index.js +0 -383
  125. package/packages/mailx-api/node_modules/nodemailer/lib/base64/index.js +0 -139
  126. package/packages/mailx-api/node_modules/nodemailer/lib/dkim/index.js +0 -253
  127. package/packages/mailx-api/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
  128. package/packages/mailx-api/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
  129. package/packages/mailx-api/node_modules/nodemailer/lib/dkim/sign.js +0 -117
  130. package/packages/mailx-api/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
  131. package/packages/mailx-api/node_modules/nodemailer/lib/fetch/index.js +0 -280
  132. package/packages/mailx-api/node_modules/nodemailer/lib/json-transport/index.js +0 -82
  133. package/packages/mailx-api/node_modules/nodemailer/lib/mail-composer/index.js +0 -629
  134. package/packages/mailx-api/node_modules/nodemailer/lib/mailer/index.js +0 -441
  135. package/packages/mailx-api/node_modules/nodemailer/lib/mailer/mail-message.js +0 -316
  136. package/packages/mailx-api/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
  137. package/packages/mailx-api/node_modules/nodemailer/lib/mime-funcs/mime-types.js +0 -2113
  138. package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/index.js +0 -1316
  139. package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/last-newline.js +0 -33
  140. package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/le-unix.js +0 -43
  141. package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/le-windows.js +0 -52
  142. package/packages/mailx-api/node_modules/nodemailer/lib/nodemailer.js +0 -157
  143. package/packages/mailx-api/node_modules/nodemailer/lib/punycode/index.js +0 -460
  144. package/packages/mailx-api/node_modules/nodemailer/lib/qp/index.js +0 -227
  145. package/packages/mailx-api/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
  146. package/packages/mailx-api/node_modules/nodemailer/lib/ses-transport/index.js +0 -234
  147. package/packages/mailx-api/node_modules/nodemailer/lib/shared/index.js +0 -754
  148. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
  149. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
  150. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1870
  151. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-pool/index.js +0 -652
  152. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +0 -259
  153. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-transport/index.js +0 -421
  154. package/packages/mailx-api/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
  155. package/packages/mailx-api/node_modules/nodemailer/lib/well-known/index.js +0 -47
  156. package/packages/mailx-api/node_modules/nodemailer/lib/well-known/services.json +0 -611
  157. package/packages/mailx-api/node_modules/nodemailer/lib/xoauth2/index.js +0 -427
  158. package/packages/mailx-api/node_modules/nodemailer/package.json +0 -47
  159. package/packages/mailx-imap/node_modules/nodemailer/.ncurc.js +0 -9
  160. package/packages/mailx-imap/node_modules/nodemailer/.prettierignore +0 -8
  161. package/packages/mailx-imap/node_modules/nodemailer/.prettierrc +0 -12
  162. package/packages/mailx-imap/node_modules/nodemailer/.prettierrc.js +0 -10
  163. package/packages/mailx-imap/node_modules/nodemailer/.release-please-config.json +0 -9
  164. package/packages/mailx-imap/node_modules/nodemailer/LICENSE +0 -16
  165. package/packages/mailx-imap/node_modules/nodemailer/README.md +0 -86
  166. package/packages/mailx-imap/node_modules/nodemailer/SECURITY.txt +0 -22
  167. package/packages/mailx-imap/node_modules/nodemailer/eslint.config.js +0 -88
  168. package/packages/mailx-imap/node_modules/nodemailer/lib/addressparser/index.js +0 -383
  169. package/packages/mailx-imap/node_modules/nodemailer/lib/base64/index.js +0 -139
  170. package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/index.js +0 -253
  171. package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
  172. package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
  173. package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/sign.js +0 -117
  174. package/packages/mailx-imap/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
  175. package/packages/mailx-imap/node_modules/nodemailer/lib/fetch/index.js +0 -280
  176. package/packages/mailx-imap/node_modules/nodemailer/lib/json-transport/index.js +0 -82
  177. package/packages/mailx-imap/node_modules/nodemailer/lib/mail-composer/index.js +0 -629
  178. package/packages/mailx-imap/node_modules/nodemailer/lib/mailer/index.js +0 -441
  179. package/packages/mailx-imap/node_modules/nodemailer/lib/mailer/mail-message.js +0 -316
  180. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
  181. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-funcs/mime-types.js +0 -2113
  182. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/index.js +0 -1316
  183. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/last-newline.js +0 -33
  184. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/le-unix.js +0 -43
  185. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/le-windows.js +0 -52
  186. package/packages/mailx-imap/node_modules/nodemailer/lib/nodemailer.js +0 -157
  187. package/packages/mailx-imap/node_modules/nodemailer/lib/punycode/index.js +0 -460
  188. package/packages/mailx-imap/node_modules/nodemailer/lib/qp/index.js +0 -227
  189. package/packages/mailx-imap/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
  190. package/packages/mailx-imap/node_modules/nodemailer/lib/ses-transport/index.js +0 -234
  191. package/packages/mailx-imap/node_modules/nodemailer/lib/shared/index.js +0 -754
  192. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
  193. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
  194. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1870
  195. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-pool/index.js +0 -652
  196. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +0 -259
  197. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-transport/index.js +0 -421
  198. package/packages/mailx-imap/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
  199. package/packages/mailx-imap/node_modules/nodemailer/lib/well-known/index.js +0 -47
  200. package/packages/mailx-imap/node_modules/nodemailer/lib/well-known/services.json +0 -611
  201. package/packages/mailx-imap/node_modules/nodemailer/lib/xoauth2/index.js +0 -427
  202. package/packages/mailx-imap/node_modules/nodemailer/package.json +0 -47
  203. package/packages/mailx-send/node_modules/nodemailer/.ncurc.js +0 -9
  204. package/packages/mailx-send/node_modules/nodemailer/.prettierignore +0 -8
  205. package/packages/mailx-send/node_modules/nodemailer/.prettierrc +0 -12
  206. package/packages/mailx-send/node_modules/nodemailer/.prettierrc.js +0 -10
  207. package/packages/mailx-send/node_modules/nodemailer/.release-please-config.json +0 -9
  208. package/packages/mailx-send/node_modules/nodemailer/LICENSE +0 -16
  209. package/packages/mailx-send/node_modules/nodemailer/README.md +0 -86
  210. package/packages/mailx-send/node_modules/nodemailer/SECURITY.txt +0 -22
  211. package/packages/mailx-send/node_modules/nodemailer/eslint.config.js +0 -88
  212. package/packages/mailx-send/node_modules/nodemailer/lib/addressparser/index.js +0 -383
  213. package/packages/mailx-send/node_modules/nodemailer/lib/base64/index.js +0 -139
  214. package/packages/mailx-send/node_modules/nodemailer/lib/dkim/index.js +0 -253
  215. package/packages/mailx-send/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
  216. package/packages/mailx-send/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
  217. package/packages/mailx-send/node_modules/nodemailer/lib/dkim/sign.js +0 -117
  218. package/packages/mailx-send/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
  219. package/packages/mailx-send/node_modules/nodemailer/lib/fetch/index.js +0 -280
  220. package/packages/mailx-send/node_modules/nodemailer/lib/json-transport/index.js +0 -82
  221. package/packages/mailx-send/node_modules/nodemailer/lib/mail-composer/index.js +0 -629
  222. package/packages/mailx-send/node_modules/nodemailer/lib/mailer/index.js +0 -441
  223. package/packages/mailx-send/node_modules/nodemailer/lib/mailer/mail-message.js +0 -316
  224. package/packages/mailx-send/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
  225. package/packages/mailx-send/node_modules/nodemailer/lib/mime-funcs/mime-types.js +0 -2113
  226. package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/index.js +0 -1316
  227. package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/last-newline.js +0 -33
  228. package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/le-unix.js +0 -43
  229. package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/le-windows.js +0 -52
  230. package/packages/mailx-send/node_modules/nodemailer/lib/nodemailer.js +0 -157
  231. package/packages/mailx-send/node_modules/nodemailer/lib/punycode/index.js +0 -460
  232. package/packages/mailx-send/node_modules/nodemailer/lib/qp/index.js +0 -227
  233. package/packages/mailx-send/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
  234. package/packages/mailx-send/node_modules/nodemailer/lib/ses-transport/index.js +0 -234
  235. package/packages/mailx-send/node_modules/nodemailer/lib/shared/index.js +0 -754
  236. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
  237. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
  238. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1870
  239. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-pool/index.js +0 -652
  240. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +0 -259
  241. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-transport/index.js +0 -421
  242. package/packages/mailx-send/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
  243. package/packages/mailx-send/node_modules/nodemailer/lib/well-known/index.js +0 -47
  244. package/packages/mailx-send/node_modules/nodemailer/lib/well-known/services.json +0 -611
  245. package/packages/mailx-send/node_modules/nodemailer/lib/xoauth2/index.js +0 -427
  246. package/packages/mailx-send/node_modules/nodemailer/package.json +0 -47
package/killmail.cmd ADDED
@@ -0,0 +1,6 @@
1
+ @echo off
2
+ REM Kill mailx server (port 9333) and launcher window
3
+ REM Safe: only kills mailx processes, never all node.exe
4
+
5
+ taskkill /F /IM mailx-app.exe >nul 2>&1 && echo Killed mailx-app.exe || echo mailx-app.exe not running
6
+ killport 9333
package/launch.ps1 CHANGED
@@ -1,19 +1,64 @@
1
1
  # Launch mailx email client
2
2
  #
3
- # Usage: launch.ps1 [-dev] [-prod] [-restart]
3
+ # Usage: launch.ps1 [-dev] [-prod] [-restart] [-clear]
4
4
  # -dev (default) Start server with --watch for auto-restart on file changes
5
5
  # -prod Start server without --watch
6
6
  # -restart Kill existing server on port 9333 before starting
7
+ # -clear Clear WebView2 cache before launching (fixes blank window issues)
7
8
  #
8
9
  # The launcher starts the Node server (if not running) and opens a WebView2 window.
9
10
  # Server: http://localhost:9333
10
11
  # Log: mailx.log
11
12
  # Data: ~/.mailx/ (DB, store, settings pointer)
12
13
 
13
- $exe = "$PSScriptRoot\launcher\target\debug\mailx-app.exe"
14
+ # Clear WebView2 cache if requested
15
+ if ("-clear" -in $args) {
16
+ $wv2dir = "$PSScriptRoot\launcher\bin\mailx-app.exe.WebView2"
17
+ if (Test-Path $wv2dir) {
18
+ Write-Host "Clearing WebView2 cache..."
19
+ Remove-Item -Recurse -Force $wv2dir
20
+ }
21
+ # Remove -clear from args passed to exe
22
+ $args = $args | Where-Object { $_ -ne "-clear" }
23
+ }
24
+
25
+ # Check if mailx-app is already running
26
+ $existing = Get-Process -Name "mailx-app" -ErrorAction SilentlyContinue
27
+ if ($existing -and ("-restart" -notin $args)) {
28
+ Write-Host "mailx is already running (PID $($existing.Id)). Use -restart to force."
29
+ # Try to bring the existing window to front
30
+ Add-Type @"
31
+ using System;
32
+ using System.Runtime.InteropServices;
33
+ public class Win32 {
34
+ [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd);
35
+ [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
36
+ }
37
+ "@
38
+ $hwnd = $existing.MainWindowHandle
39
+ if ($hwnd -ne [IntPtr]::Zero) {
40
+ [Win32]::ShowWindow($hwnd, 9) | Out-Null # SW_RESTORE
41
+ [Win32]::SetForegroundWindow($hwnd) | Out-Null
42
+ }
43
+ exit 0
44
+ }
45
+
46
+ # Copy latest release build to bin/ if newer
47
+ $release = "$PSScriptRoot\launcher\target\release\mailx-app.exe"
48
+ $bin = "$PSScriptRoot\launcher\bin\mailx-app.exe"
49
+ if ((Test-Path $release) -and (Test-Path $bin)) {
50
+ if ((Get-Item $release).LastWriteTime -gt (Get-Item $bin).LastWriteTime) {
51
+ Write-Host "Updating launcher binary..."
52
+ Copy-Item $release $bin -Force -ErrorAction SilentlyContinue
53
+ }
54
+ }
14
55
 
56
+ # Try pre-built binary first, then release, then debug
57
+ $exe = $bin
58
+ if (-not (Test-Path $exe)) { $exe = $release }
59
+ if (-not (Test-Path $exe)) { $exe = "$PSScriptRoot\launcher\target\debug\mailx-app.exe" }
15
60
  if (-not (Test-Path $exe)) {
16
- Write-Host "Launcher not built. Run: launcher\build.cmd"
61
+ Write-Host "Launcher not found. Run: launcher\build.cmd"
17
62
  exit 1
18
63
  }
19
64
 
Binary file
@@ -0,0 +1,3 @@
1
+ 2026/03/30-12:46:48.817 6494 Reusing MANIFEST Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Extension Rules/MANIFEST-000001
2
+ 2026/03/30-12:46:48.821 6494 Recovering log #3
3
+ 2026/03/30-12:46:48.823 6494 Reusing old log Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Extension Rules/000003.log
@@ -0,0 +1,3 @@
1
+ 2026/03/30-12:46:49.347 6494 Reusing MANIFEST Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Extension Scripts/MANIFEST-000001
2
+ 2026/03/30-12:46:49.351 6494 Recovering log #3
3
+ 2026/03/30-12:46:49.353 6494 Reusing old log Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Extension Scripts/000003.log
@@ -0,0 +1,3 @@
1
+ 2026/03/30-12:46:49.520 6494 Reusing MANIFEST Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Extension State/MANIFEST-000001
2
+ 2026/03/30-12:46:49.525 6494 Recovering log #3
3
+ 2026/03/30-12:46:49.529 6494 Reusing old log Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Extension State/000003.log
@@ -0,0 +1,3 @@
1
+ 2026/03/30-13:02:28.120 1a28 Reusing MANIFEST Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\IndexedDB\devtools_devtools_0.indexeddb.leveldb/MANIFEST-000001
2
+ 2026/03/30-13:02:28.168 1a28 Recovering log #3
3
+ 2026/03/30-13:02:28.190 1a28 Reusing old log Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\IndexedDB\devtools_devtools_0.indexeddb.leveldb/000003.log
@@ -0,0 +1,3 @@
1
+ 2026/03/30-12:46:49.225 c2c Reusing MANIFEST Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
2
+ 2026/03/30-12:46:49.311 c2c Recovering log #3
3
+ 2026/03/30-12:46:49.348 c2c Reusing old log Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log
NEL ADDED
Binary file
@@ -0,0 +1 @@
1
+ {"aadc_info":{"age_group":0},"accessibility":{"captions":{"headless_caption_enabled":false}},"account_tracker_service_last_update":"13419318241229246","autocomplete":{"retention_policy_last_version":146},"autofill":{"edge_autofill_advanced_ml_enabled":true,"edge_autofill_purge_low_quality_profiles_by_timeline":false,"last_version_deduped":146},"bookmark":{"storage_computation_last_update":"13419318240722474"},"browser":{"app_window_placement":{"EdgeDevToolsApp":{"always_on_top":false,"bottom":1379,"left":1117,"maximized":false,"right":2917,"top":198,"work_area_bottom":1680,"work_area_left":0,"work_area_right":4096,"work_area_top":0}},"available_dark_theme_options":"All","recent_theme_color_list":[4293914607.0,4293914607.0,4293914607.0,4293914607.0,4293914607.0],"show_toolbar_edge_generic_sidebar_button":false,"user_level_features_context":{}},"browser_content_container_height":1143,"browser_content_container_width":1785,"browser_content_container_x":0,"browser_content_container_y":30,"collections":{"prism_collections":{"policy":{"cached":0}}},"commerce_daily_metrics_last_update_time":"13419318240723076","countryid_at_install":21843,"credentials_enable_service":false,"devtools":{"last_open_timestamp":"13419363747302","preferences":{"closeable-tabs":"{\"security\":true,\"heap-profiler\":true,\"resources\":true,\"lighthouse\":true,\"welcome\":true,\"timeline\":true,\"network\":true,\"cssoverview\":true,\"issues-pane\":true}","cloud-release-notes":"{\"edgeVersion\":146,\"shouldOpenWelcome\":false,\"help\":[{\"title\":\"DevTools documentation\",\"linkId\":\"2196640\",\"localizedAnnouncementKey\":\"helpCard1\",\"iconName\":\"edge-documentation_book_filled\"},{\"title\":\"Overview of all tools\",\"linkId\":\"2196549\",\"localizedAnnouncementKey\":\"helpCard2\",\"iconName\":\"edge-developer-resources\"},{\"title\":\"Use Copilot to explain Console errors\",\"linkId\":\"2257416\",\"localizedAnnouncementKey\":\"helpCard3\",\"iconName\":\"edge-copilot\"},{\"title\":\"Videos about web development with Microsoft Edge\",\"linkId\":\"2196701\",\"localizedAnnouncementKey\":\"helpCard5\",\"iconName\":\"edge-run_command\"},{\"title\":\"Accessibility testing features\",\"linkId\":\"2196801\",\"localizedAnnouncementKey\":\"helpCard6\",\"iconName\":\"edge-documentation_book_filled\"},{\"title\":\"Use the Console tool to track down problems\",\"linkId\":\"2196702\",\"localizedAnnouncementKey\":\"helpCard7\",\"iconName\":\"edge-console\"},{\"title\":\"Modify and debug JS with the Sources tool\",\"linkId\":\"2196900\",\"localizedAnnouncementKey\":\"helpCard8\",\"iconName\":\"edge-sources\"},{\"title\":\"Find source files for a page using the search tool\",\"linkId\":\"2196802\",\"localizedAnnouncementKey\":\"helpCard9\",\"iconName\":\"edge-sources-search-sources-tab\"},{\"title\":\"Microsoft Edge DevTools for Visual Studio Code\",\"linkId\":\"2196901\",\"localizedAnnouncementKey\":\"helpCard10\",\"iconName\":\"edge-help_tooltips\"}],\"releaseNotes\":[],\"header\":{\"localizedKey\":\"highlightsFromTheLatestMicrosoft\",\"title\":\"What's New\"},\"learnHeader\":{\"localizedKey\":\"learnHeader\",\"title\":\"Learn\"},\"allAnnouncementsLinkText\":{\"localizedKey\":\"allAnnouncementsLinkText\",\"title\":\"View all\"},\"whatsNewVideo\":{\"title\":\"What's New in DevTools 115 - 125\",\"subtitle\":\"Check out our video series on the latest and greatest features in DevTools!\",\"linkId\":\"26zDq9Xhz7k\",\"imageName\":\"whats-new-115-125-thumbnail.jpg\",\"imageAltText\":\"A title card for the Microsoft Edge: What's New in DevTools 115 - 125 video\",\"localizedKey\":\"whatsNewVideo\"},\"viewAllLinkId\":\"2353607\",\"localized\":{\"en-US\":{\"panels/edge_welcome/ReleaseNotes.ts | helpCard1\":{\"message\":\"DevTools documentation\",\"description\":\"Title of a help link in a list of help section.\"},\"panels/edge_welcome/ReleaseNotes.ts | helpCard2\":{\"message\":\"Overview of all tools\",\"description\":\"Title of a help link in a list of help section.\"},\"panels/edge_welcome/ReleaseNotes.ts | helpCard3\":{\"message\":\"Use Copilot to explain Console errors\",\"description\":\"Title of a help link in a list of help section.\"},\"panels/edge_welcome/ReleaseNotes.ts | helpCard5\":{\"message\":\"Videos about web development with Microsoft Edge\",\"description\":\"Title of a help link in a list of help section.\"},\"panels/edge_welcome/ReleaseNotes.ts | helpCard6\":{\"message\":\"Accessibility testing features\",\"description\":\"Title of a help link in a list of help section.\"},\"panels/edge_welcome/ReleaseNotes.ts | helpCard7\":{\"message\":\"Use the Console tool to track down problems\",\"description\":\"Title of a help link in a list of help section.\"},\"panels/edge_welcome/ReleaseNotes.ts | helpCard8\":{\"message\":\"Modify and debug JS with the Sources tool\",\"description\":\"Title of a help link in a list of help section.\"},\"panels/edge_welcome/ReleaseNotes.ts | helpCard9\":{\"message\":\"Find source files for a page using the search tool\",\"description\":\"Title of a help link in a list of help section.\"},\"panels/edge_welcome/ReleaseNotes.ts | helpCard10\":{\"message\":\"Microsoft Edge DevTools for Visual Studio Code\",\"description\":\"Title of a help link in a list of help section.\"},\"panels/edge_welcome/ReleaseNotes.ts | learnHeader\":{\"message\":\"Learn\",\"description\":\"Title text of a header bar in the welcome tool.\"},\"panels/edge_welcome/ReleaseNotes.ts | allAnnouncementsLinkText\":{\"message\":\"View all\",\"description\":\"Title text of a header bar in the welcome tool.\"},\"panels/edge_welcome/ReleaseNotes.ts | highlightsFromTheLatestMicrosoft\":{\"message\":\"What's New\",\"description\":\"Title text of a header bar in the welcome tool.\"},\"panels/edge_welcome/ReleaseNotes.ts | whatsNewVideo\":{\"message\":\"What's New in DevTools 115 - 125\",\"description\":\"Title of a video summarizing the latest release, shown next to a description, above a list of release notes.\"},\"panels/edge_welcome/ReleaseNotes.ts | whatsNewVideoDescription\":{\"message\":\"Check out our video series on the latest and greatest features in DevTools!\",\"description\":\"Description of a video link providing further details\"}}}}","console.sidebar-selected-filter":"\"message\"","console.sidebar.width":"{\"vertical\":{\"size\":0,\"showMode\":\"OnlyMain\"}}","edge-inspector.actions-tab-split-view-state":"{\"vertical\":{\"size\":0,\"showMode\":\"Both\"},\"horizontal\":{\"size\":30,\"showMode\":\"Both\"}}","elements.styles.sidebar.width":"{\"vertical\":{\"size\":0,\"showMode\":\"OnlyMain\"}}","inspector.drawer-split-view-state":"{\"horizontal\":{\"size\":0,\"showMode\":\"Both\"}}","inspectorVersion":"40","last-open-view-in-drawer":"\"console\"","panel-selected-tab":"\"elements\"","release-note-version-seen":"146","styles-pane-sidebar-tab-order":"{\"styles\":10,\"computed\":20}","tools-used":"{\"welcome\":1774878404111,\"console-view\":1774890147737,\"elements\":1774890147986}"},"synced_preferences_sync_disabled":{"adorner-settings":"[{\"adorner\":\"ad\",\"isEnabled\":true},{\"adorner\":\"container\",\"isEnabled\":true},{\"adorner\":\"flex\",\"isEnabled\":true},{\"adorner\":\"grid\",\"isEnabled\":true},{\"adorner\":\"grid-lanes\",\"isEnabled\":true},{\"adorner\":\"media\",\"isEnabled\":false},{\"adorner\":\"popover\",\"isEnabled\":true},{\"adorner\":\"reveal\",\"isEnabled\":true},{\"adorner\":\"scroll\",\"isEnabled\":true},{\"adorner\":\"scroll-snap\",\"isEnabled\":true},{\"adorner\":\"slot\",\"isEnabled\":true},{\"adorner\":\"view-source\",\"isEnabled\":true},{\"adorner\":\"starting-style\",\"isEnabled\":true},{\"adorner\":\"subgrid\",\"isEnabled\":true},{\"adorner\":\"top-layer\",\"isEnabled\":true}]","syncedInspectorVersion":"40"}},"edge":{"bookmarks":{"last_dup_info_record_time":"13419318250728140"},"msa_sso_info":{"allow_for_non_msa_profile":true},"profile_sso_info":{"is_msa_first_profile":true,"msa_sso_algo_state":1},"services":{"signin_scoped_device_id":"58f4690e-1674-401c-bb70-661276e077e6"}},"edge_journeys":{"latest_journeys_count":0},"edge_pinning_campaign":{"precomputed_campaign_data":{}},"edge_rewards":{"cache_data":"CAA=","coachmark_promotions":{},"hva_promotions":[],"hva_webui_action_status_dict":{},"refresh_status_muted_until":"13419923040552290"},"edge_ux_config":{"assignmentcontext":"","dataversion":"0","experimentvariables":{},"flights":{}},"edge_vpn":{"available":true},"edge_wallet":{"passwords":{"password_lost_report_date":"13419318270567466"}},"enterprise_profile_guid":"9ab61e7a-49cb-4cfc-b317-a850e236bb51","extension":{"installed_extension_count":2},"extensions":{"alerts":{"initialized":true},"chrome_url_overrides":{},"last_chrome_version":"146.0.3856.84","microsoft_install_signature":{"expire_date":"2026-06-22","ids":["cgjgjfacjflmgphhhepmbhhbgjieaecn","kfbdpdaobnofkbopebjglnaadopfikhh"],"invalid_ids":[],"salt":"cMEpJmVtBsNmQpFLUZRCOHsVinrGvb4WNRnK2ph3+5o=","signature":"nKoQkD9GBx7Bhyd7Blowo9FUbdSqstdLH6WKwpO50N+4P2mc1j/FHCj/a2Y1Xty6smkgzgEMegS3sTGCKWLcS8GFXZk3k6WNdio174K9zuNGlFcxDSbMqFfIfa7siTmGZE/O/dRNdw7QcOUtKjBJnLzsq+dRtnSssMrPwRoXNNGLwFFB7McFrsdNDPJkcVwloFAmVdkJZxtgM+0+4Wp6VbMLi6hDJRthncydRfiz5ZjgnN3//T5HlMCTTmw4lmjBwztI+HhcIq0t7AxdHRzxvMfhCd245kB63xOsBoxHuVCoyZ9hLSp2CXGpF9aFfe5pOURhMLAIddF3DJEb3rpTcg==","signature_format_version":2,"timestamp":"13419363761233040"},"pdf_upsell_triggered":false,"pinned_extension_migration":true,"pinned_extensions":[]},"fsd":{"retention_policy_last_version":146},"gaia_cookie":{"periodic_report_time_2":"13419318240551913"},"intl":{"selected_languages":"en-US,en"},"language_dwell_time_average":{"en":65.90909090909092},"language_model_counters":{"en":1},"language_usage_count":{"en":11},"media":{"engagement":{"schema_version":5}},"migrated_user_scripts_toggle":true,"muid":{"last_sync":"13419318240722745","values_seen":[]},"optimization_guide":{"hintsfetcher":{"hosts_successfully_fetched":{}},"previously_registered_optimization_types":{"ABOUT_THIS_SITE":true,"AUTOFILL_ACTOR_IFRAME_ORIGIN_ALLOWLIST":true,"GLIC_ACTION_PAGE_BLOCK":true,"HISTORY_CLUSTERS":true,"LOADING_PREDICTOR":true,"MERCHANT_TRUST_SIGNALS_V2":true,"PAGE_ENTITIES":true,"PRICE_INSIGHTS":true,"PRICE_TRACKING":true,"SALIENT_IMAGE":true,"SAVED_TAB_GROUP":true,"SHOPPING_DISCOUNTS":true,"SHOPPING_PAGE_TYPES":true,"V8_COMPILE_HINTS":true}},"password_manager":{"account_store_backup_password_cleaning_last_timestamp":"13419319349909375","account_store_migrated_to_os_crypt_async":true,"profile_store_backup_password_cleaning_last_timestamp":"13419319349910008","profile_store_migrated_to_os_crypt_async":true},"personalization_data_consent":{"personalization_in_context_consent_can_prompt":true,"personalization_in_context_count":0},"prefs":{"tracked_preferences_reset":["schedule_to_flush_to_disk","extensions.settings.cgjgjfacjflmgphhhepmbhhbgjieaecn","extensions.settings.dgiklkfkllikcanfonkcabmbdfmgleag","extensions.settings.kfbdpdaobnofkbopebjglnaadopfikhh","extensions.settings.mhjfbmdgcfjbbpaeojofohoefgiehjai","prefs.preference_reset_time"]},"privacy_sandbox":{"first_party_sets_data_access_allowed_initialized":true},"profile":{"avatar_index":20,"background_password_check":{"check_fri_weight":9,"check_interval":"2592000000000","check_mon_weight":6,"check_sat_weight":6,"check_sun_weight":6,"check_thu_weight":9,"check_tue_weight":9,"check_wed_weight":9,"next_check_time":"13420790644643520"},"content_settings":{"exceptions":{"3pcd_heuristics_grants":{},"abusive_notification_permissions":{},"access_to_get_all_screens_media_in_session":{},"anti_abuse":{},"app_banner":{},"ar":{},"are_suspicious_notifications_allowlisted_by_user":{},"auto_picture_in_picture":{},"auto_select_certificate":{},"automatic_downloads":{},"automatic_fullscreen":{},"autoplay":{},"background_sync":{},"bluetooth_chooser_data":{},"bluetooth_guard":{},"bluetooth_scanning":{},"camera_pan_tilt_zoom":{},"captured_surface_control":{},"clear_browsing_data_cookies_exceptions":{},"client_hints":{},"clipboard":{},"controlled_frame":{},"cookie_controls_metadata":{"file:///*,*":{"last_modified":"13419318242086815","setting":{}},"http://localhost,*":{"last_modified":"13419362809428426","setting":{}}},"cookies":{},"direct_sockets":{},"direct_sockets_private_network_access":{},"display_media_system_audio":{},"disruptive_notification_permissions":{},"durable_storage":{},"edge_ad_targeting":{},"edge_ad_targeting_data":{},"edge_all_file_read_access":{},"edge_browser_action":{},"edge_sdsm":{},"edge_split_screen":{},"edge_tech_scam_detection":{},"edge_u2f_api_request":{},"edge_user_agent_token":{},"fedcm_idp_registration":{},"fedcm_idp_signin":{},"fedcm_share":{},"file_system_access_chooser_data":{},"file_system_access_extended_permission":{},"file_system_access_restore_permission":{},"file_system_last_picked_directory":{},"file_system_read_guard":{},"file_system_write_guard":{},"formfill_metadata":{},"geolocation":{},"geolocation_with_options":{},"hand_tracking":{},"has_migrated_local_network_access":true,"hid_chooser_data":{},"hid_guard":{},"http_allowed":{},"https_enforced":{},"idle_detection":{},"images":{},"important_site_info":{},"initialized_translations":{},"intent_picker_auto_display":{},"javascript":{},"javascript_jit":{},"javascript_optimizer":{},"keyboard_lock":{},"legacy_cookie_access":{},"legacy_cookie_scope":{},"local_fonts":{},"local_network":{},"local_network_access":{},"loopback_network":{},"media_engagement":{"http://localhost:9333,*":{"expiration":"13427154500064324","last_modified":"13419378500064331","lifetime":"7776000000000","setting":{"hasHighScore":false,"lastMediaPlaybackTime":0.0,"mediaPlaybacks":0,"visits":10}}},"media_stream_camera":{},"media_stream_mic":{},"midi_sysex":{},"mixed_script":{},"nfc_devices":{},"notification_interactions":{},"notification_permission_review":{},"notifications":{},"ondevice_languages_downloaded":{},"password_protection":{},"payment_handler":{},"permission_actions_history":{},"permission_autoblocking_data":{},"permission_autorevocation_data":{},"pointer_lock":{},"popups":{},"protected_media_identifier":{},"protocol_handler":{},"reduced_accept_language":{},"safe_browsing_url_check_data":{},"secure_network":{},"secure_network_sites":{},"sensors":{},"serial_chooser_data":{},"serial_guard":{},"site_engagement":{"http://localhost:9333,*":{"last_modified":"13419363934922476","setting":{"lastEngagementTime":1.3419363934922464e+16,"lastShortcutLaunchTime":0.0,"pointsAddedToday":15.0,"rawScore":14.961}}},"sleeping_tabs":{},"sound":{},"speaker_selection":{},"ssl_cert_decisions":{},"storage_access":{},"storage_access_header_origin_trial":{},"subresource_filter":{},"subresource_filter_data":{},"suspicious_notification_ids":{},"suspicious_notification_show_original":{},"top_level_storage_access":{},"trackers":{},"trackers_data":{"https://files.constantcontact.com:443,*":{"last_modified":"13419351842036927","setting":{"count":2}},"https://imgssl.constantcontact.com:443,*":{"last_modified":"13419351842037372","setting":{"count":2}},"https://lrsut8qab.cc.rs6.net:443,*":{"last_modified":"13419351842028969","setting":{"count":2}},"https://msedgedevtools.microsoft.com:443,*":{"last_modified":"13419352005728057","setting":{"count":1}},"https://web-extract.constantcontact.com:443,*":{"last_modified":"13419351842037223","setting":{"count":2}}},"tracking_org_exceptions":{},"tracking_org_relationships":{},"typosquatting":{},"unused_site_permissions":{},"usb_chooser_data":{},"usb_guard":{},"vr":{},"web_app_installation":{},"webid_api":{},"webid_auto_reauthn":{},"window_placement":{}},"pref_version":1},"created_by_version":"146.0.3856.84","creation_time":"13419318240457630","default_content_setting_values":{"has_migrated_local_network_access":true},"edge_password_is_using_new_login_db_path":false,"edge_password_login_db_path_flip_flop_count":0,"edge_profile_id":"bffda019-ba0e-4159-8935-f883a0b1dcc1","edge_user_with_non_zero_passwords":false,"exit_type":"Normal","has_seen_signin_fre":false,"is_relative_to_aad":true,"last_engagement_time":"13419363934922463","last_time_obsolete_http_credentials_removed":1774845749.909482,"last_time_password_store_metrics_reported":1774844670.566023,"managed_user_id":"","name":"Profile 1","network_pbs":{},"observed_session_time":{"feedback_rating_in_product_help_observed_session_time_key_146.0.3856.84":720.0},"password_hash_data_list":[],"signin_fre_seen_time":"13419318240535888","were_old_google_logins_removed":true},"reset_prepopulated_engines":false,"safety_hub":{"unused_site_permissions_revocation":{"migration_completed":true}},"saved_tab_groups":{"did_enable_shared_tab_groups_in_last_session":false,"specifics_to_data_migration":true},"sessions":{"event_log":[{"did_schedule_command":false,"first_session_service":true,"tab_count":0,"time":"13419320672328210","type":2,"window_count":0},{"crashed":false,"time":"13419347087152422","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":0,"time":"13419347563521548","type":2,"window_count":0},{"crashed":false,"time":"13419347571574489","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":0,"time":"13419347579717250","type":2,"window_count":0},{"crashed":false,"time":"13419347685023530","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":0,"time":"13419347720306874","type":2,"window_count":0},{"crashed":false,"time":"13419348253502621","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":0,"time":"13419351181305067","type":2,"window_count":0},{"crashed":false,"time":"13419351333000803","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":0,"time":"13419351744186923","type":2,"window_count":0},{"crashed":false,"time":"13419351750736506","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":1,"time":"13419352025755988","type":2,"window_count":1},{"crashed":false,"time":"13419356442725023","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":0,"time":"13419356690352810","type":2,"window_count":0},{"crashed":false,"time":"13419361210207579","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":0,"time":"13419362137248419","type":2,"window_count":0},{"crashed":false,"time":"13419362808673195","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":1,"time":"13419378500107201","type":2,"window_count":1}],"session_data_status":3},"signin":{"accounts_metadata_dict":{},"allowed":true},"spellcheck":{"dictionaries":["en-US"]},"syncing_theme_prefs_migrated_to_non_syncing":true,"total_passwords_available_for_account":0,"total_passwords_available_for_profile":0,"translate_site_blacklist":[],"translate_site_blocklist_with_time":{},"typosquatting":{"allowlist_migration_done":true},"user_experience_metrics":{"personalization_data_consent_enabled_last_known_value":false},"variations":{"state_reset_on_profile_load":{"timestamp":"13419362808648180"}},"webrtc":{"udp_port_range":"0-0"}}
@@ -0,0 +1,3 @@
1
+ 2026/03/30-12:46:49.611 c2c Reusing MANIFEST Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
2
+ 2026/03/30-12:46:49.624 c2c Recovering log #3
3
+ 2026/03/30-12:46:49.650 c2c Reusing old log Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Session Storage/000003.log
@@ -0,0 +1,3 @@
1
+ 2026/03/30-12:46:48.771 2750 Reusing MANIFEST Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
2
+ 2026/03/30-12:46:48.815 2750 Recovering log #3
3
+ 2026/03/30-12:46:48.817 2750 Reusing old log Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Site Characteristics Database/000003.log
@@ -0,0 +1,3 @@
1
+ 2026/03/30-12:46:48.772 7358 Reusing MANIFEST Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001
2
+ 2026/03/30-12:46:48.805 7358 Recovering log #3
3
+ 2026/03/30-12:46:48.814 7358 Reusing old log Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/000003.log
@@ -0,0 +1,3 @@
1
+ 2026/03/30-12:46:49.521 1a28 Reusing MANIFEST Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\shared_proto_db/MANIFEST-000001
2
+ 2026/03/30-12:46:49.564 1a28 Recovering log #3
3
+ 2026/03/30-12:46:49.567 1a28 Reusing old log Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\shared_proto_db/000003.log
@@ -0,0 +1,3 @@
1
+ 2026/03/30-12:46:49.348 1a28 Reusing MANIFEST Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\shared_proto_db\metadata/MANIFEST-000001
2
+ 2026/03/30-12:46:49.360 1a28 Recovering log #3
3
+ 2026/03/30-12:46:49.363 1a28 Reusing old log Y:\dev\email\mailx\launcher\bin\mailx-app.exe.WebView2\EBWebView\Default\shared_proto_db\metadata/000003.log
@@ -0,0 +1 @@
1
+ {"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"7c4MOFhKIeI="},"breadcrumbs":{"enabled":true,"enabled_time":"13419318240448488"},"cloned_install":{"count":2,"first_timestamp":"1774887609","last_timestamp":"1774889208","session_start_last_detection_timestamp":"1774889208"},"default_browser":{"browser_name_enum":13},"desktop_session_duration_tracker":{"last_session_end_timestamp":"1774904900"},"domain_actions_config":"H4sIAAAAAAAAAK2abY/bNhKA/8rCuA9JEWudpE3ucgiCIJdDCzRokEvRA7o9Y0SOpYlJDpekLGmb/PcDbXljx5LW1PZDNmsunxm+DIczQ/85E1IveYPOkcTZiz9nYK0iAYHY+NmL37sGlEvLikQ7ezH7xaj2bWPZ43sF7QcE2c4ezSRrIDN7MfOKTJEJ1rMvj0bp30jihgwewoGrLGymkBoayRoziVNoyMXkIW+ySOBUXsHzjMIUslmRodBOVVxDEGXYZIKbqSKoMBQwbDLHBTo/VUyuKhSV20RJvoQ6EzBFTImKmmxDEjk4NlNHIxwFdMRGlGAMqqlyTIBQRpOcuj9cW4ceTfBWVZMXd1M2E49UWalqqlawNruuSKxLVHaqkH+RL1+bti7Rdav4x6PZliXcOScDGgddUmht/GNsctumOIQT4kBxB9y2RHUbdJ7YzF48/vJoJliiSHSXP5LEd6sfcSPeRDrNdYzAhkxAI3l0YU75bo6HjT3T1HFllmQUGUy9Hmz4pQrf2kLhQGtwasxbnYC+BIeWyYRp1FyuUkDDcVqZ53MBRZux033Sn1crEhOIp89+mAxlWoDPtD8bNijdtHkZHLrG+lcuoX9A0D7TJBx7Xk00h6w6exUEa80mGi674lyoxjyrSwg+cgkjFGxJcdKkQHKetEXgRAZ09ojAbCBpCmBFlTQDUYIDEdClDKuEUNg0NQoqiSk6+Ottcx4hES1QiqFEYiys6AU84jrTQ9HtMJKihiBtIqhwg0ZB7jM622sWqMlQVjAXo1HzCTgWpp501uDWgm2bsPUaQ5LR68qtUsS3hswnSCDM303CunJIO00WnVXYxAwiAeKkLesC2F28kKLGkdcpS3VdkVJ5mhO9rtEkqHCoeYNZfvbpcJWpodVJJ91XhhPG5FsTSvQECXYSsAmCXcCk81Rvs6IUouWx7OGk+w1YSlOwvzcnhQWB1oHX41nFDuoJj2PkHZYrUgHdks2SV6ulrymI8rwY+c1Owr+3Ao58xPFUBgZ2jJ+MD4VNjNnfKyDzEZvw64effUyNjtJAMAVXwd/psUelxLv7fhK8AjFynY2yKxCYM0/Fa9wOfypMDY1UI0bh6+vJWvOxAz7OspPRc4/UHEb5UFMYdRajtCQv2MnRE9AnoMts3755Hxu2PULX4/SMkFSJZ6SrLzhcUYPy7bu3Rzc1hlUsPg3O+Bzah0oSjyz6qBBdeRIZaLjZlr6yT/YvEFKt7y/k3pMZKumeLwEHEr/zJazcfSWQubeEgXQ5YTMG6qpJ25nlU9bijmeBUZYtGpKCjUERYpYNN5XDGnNPAf2ujjDgKPrk7uuC+0bdU+kjDQUuNRSGVu3SYYFNor9QXKM/qnnEhuy7/vljDi3p4ii52jUNEcIBFV6RP46JbluHuKBvjny1vhnsCa7A46Bp2zLUP899jPSPqpT7tiHGkgkOj+dAmSUTZz5oLdEgAuTqqFrs0NMNuoxDp3IQB3K5yb+xcQGiHAlNNBpw8mhDhTTZrlmMXlZ7S9iAquLnq6tXcaQvH2j5uVEPL3afmkYdFqi/GsQe83P14OpKfvfwws/V42eLxWH3I2vYE8uni0XzdLG4usoulo+fLBbNPxaL7BDbGcNtfy23XRt13GlvB/t+//vbxaua5Mso8rDjgQHsu/5TQ/MjUlGGl7vBx4bfSIay+3xxKODAGvYCLp88fdZcXlw+j/8d9j20gX3nBxolVfqziiP+3HgNSj28vCirAo/YWwO41fKK9LJ++fzJ4qL79fH33x/N7ev+3yp7t1P2n6jl889R5cPLi/9uf7k89SjblHaJjVXsYtZwz6L6Ey1NSgWVdDH3c+3NPLpwWIMGukGZIqLH654H5mSKOTZ2yAn0E0nZaR0fDcl7nKMFVxgcvLH78kiJFlNKLcIhBJyWeEpcoZHoHNxwUror0VNh0E1Uy6YAJ01aii0rsY7/Ck6h7s62ehiHOI8/BCo196woAKUVYrvs8mwj2/X3rZHd4UtRRgXPa3Q5ggu0RnW+2khy/gmDt1WehFnHK0rTZB1rTiCMDxDf6lKWQpFZoyRzvprUhzMN9rrC4Zimp3TaJWRnA1Pf5sBanyU/BFo0DkjF8iAkvTFxFXIHd4RHfbXeBtXYVwhOK4sITpSZgU2ax+i4FkpO8hkT33rXvKEkPxPtO15H2zspajvbQnxgBwUmb7bfiIT3V98Ww9FyXzFXlPGxstp+E+jeldAzibvqO3/d22gLWieXnUOV9jjaFXQzhWn3nAUX4oWayvmSbZY/yaeAtWPWyaDCAkRbIqhQpribHJTCELwoK4VzRqdoHe/J8ux9JwXGr9sUpRoKEnMVk4a76vM/mcN8nrx+28XXH1uLu78fxPC3qkaI3op/5dEtoYhF/7S4/U3pWOOvr4/CDsd1VwmfPZpZCOVSw/bp4PfZpQCH6ObSIWh0l/H7Y5ezP3oXrk+2J1VyhSHgPJ64QQvpY3Wb1e3N+BetDrhuDVEW+JHXaD6gVSBQozlM307XssZ8Gb9ps+pWLvWpwrG2J7G/QylprEDfSwVUWDiwJRlJI0+/p3QgjZ5XO277c9uSIsJWvkRTxBslddhRleHaYJ2kcZskcWXZODCUStYlK/Sssa1GosN+FvxaAamkJY6cB605p9Eno14QRQUb8kkKq5vM2yoYWm8X1lUpCo3cfpM2bZCKtAUnCEaeiPtRyxtwaHidOEz0ASTwaBn3lGTVWFiTD2Ay9lkQZx+T+AWR1G1glTi8rYU15HMwYw98J5yuQgVqVRmZgaTQQk5OgQBLIX1Hznhh7OXOyLj6QY3eoynGgqOfjGBNpngDSh1vS8+36YZe2vbKO39vd58PbtVvtHT9qGtdith80H0n8LWR/dxO/hKMXH4j4vgi+fJ/9taiTbswAAA=","edge":{"manageability":{"edge_last_active_time":"13419363938345282"},"mitigation_manager":{"renderer_app_container_compatible_count":2},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_ci":{"metrics_bookmark":"\u003CBookmarkList>\r\n\u003C/BookmarkList>","num_healthy_browsers_since_failure":11},"hardware_acceleration_mode_previous":true,"identity_combined_status":{"aad":1,"ad":1},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"network_time":{"network_time_mapping":{"local":1.774889210469219e+12,"network":1.774889209e+12,"ticks":389793160044.0,"uncertainty":1670502.0}},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"146.0.3856.84","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAC0g/etA6mdQoRB8Y26qq2iEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAAA9rSRW+YKTbrF6NK7S3kM3w1+SLuyByQiLzPCuZbuVngAAAAAOgAAAAAIAACAAAAC2bKLzX0jHLKi46EZPdOcY5tFSF2ClCOT8Pg/9oyYhajAAAACKxk2GXcVpE66fqz/wUzBNLlJubzWPN0LSSnsgIhgMJRJ5h+bstyCZaKBl2Yrz6IVAAAAAjg4cdfPEdGkoRiwsWGjGrYrxiJF+c124E3EQo5rfdRXBwdgo+UxHhnI29Wh9rqGBnLk9jkcSB5Ez1aTi3ypfvg=="},"performance_intervention":{"last_daily_sample":"13419318240613691"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13419318240445758"},"profile":{"info_cache":{"Default":{"active_time":1774904899.912184,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_non_signin_profile_type":1,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"enterprise_label":"","force_signin_profile_locked":false,"gaia_given_name":"","gaia_id":"","gaia_name":"","hosted_domain":"","is_consented_primary_account":false,"is_ephemeral":false,"is_glic_eligible":false,"is_managed":0,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":[],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13419318240199996","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"guided_switch_pref":[],"multiple_profiles_with_same_account":false},"edge_sso_info":{"msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"146.0.3856.84","signin_last_updated_time":1774844640.597125},"sentinel_creation_time":"0","session_id_generator_last_value":"746888710","signin":{"active_accounts_last_emitted":"13419318240192557"},"startup_boost":{"last_browser_open_time":"13419378500242261"},"subresource_filter":{"ruleset_version":{"checksum":860988201,"content":"10.34.0.81","format":37}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13419318240385917","max_tabs_per_window":1,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":2,"window_count_max":2},"telemetry_client":{"cloned_install":{"user_data_dir_id":8554438},"governance":{"last_dma_change_date":"13419318240365580","last_known_cps":0},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVdlYlZpZXdcQXBwbGljYXRpb25cMTQ2LjAuMzg1Ni44NFx0ZWxjbGllbnQuZGxs","sample_id":83918884},"uninstall_metrics":{"installation_date2":"1774844639"},"updateclientdata":{"apps":{"eeobbhfgfagbclfofmgbdfoicabjdbkn":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.0.0.10"},"efniojlnjndmcbiieegkicadnoecjjef":{"cohort":"","cohortname":"","installdate":-1},"fgbafbciocncjfbbonhocjaohoknlaco":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"2026.3.23.1"},"fppmbhmldokgmleojlplaaodlkibgikh":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.15.0.1"},"jbfaflocpnkhbgcijpkiafdpbjkedane":{"cohort":"","cohortname":"","installdate":-1},"kpfehajjjbbcifeehjgfgnabifknmdad":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"120.0.6050.0"},"laoigpblnllgcgjnjnllmfolckpjlhki":{"cohort":"","cohortname":"","installdate":-1},"ndikpojcjlepofdkaaldkinkjbeeebkl":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"10.34.0.81"},"oankkpibpaokgecfckkdkgaoafllipag":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"6498.2025.9.4"},"ohckeflnhegojcjlcpbfpciadgikcohk":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"0.0.1.7"},"ojblfafjmiikbkepnnolpgbbhejhlcim":{"cohort":"","cohortname":"","installdate":-1},"pghocgajpebopihickglahgebcmkcekh":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"3.0.0.16"}}},"updateclientlastupdatecheckerror":0,"updateclientlastupdatecheckerrorcategory":0,"updateclientlastupdatecheckerrorextracode1":0,"user_experience_metrics":{"chrome_download_action_count":0,"client_id2":"{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}C:\\Users\\Bob1s:EEEB1F6B-87F7-49E6-AC8C-6EC5664175F4","client_id_timestamp":"1774889208","diagnostics":{"last_data_collection_level_on_launch":3},"initial_logs2":[],"last_seen":{"CrashpadMetrics":"13419356689716854"},"limited_entropy_randomization_source":"48F5D1E845C6D0986EF5D1C4E653D4A0","log_finalized_record_id":6,"log_record_id":4,"low_entropy_source3":5854,"machine_id":13342739,"ongoing_logs2":[],"payload_counter":4,"pseudo_low_entropy_source":5891,"reporting_enabled":true,"reset_client_id_deterministic":true,"reset_metrics_ids":true,"session_id":15,"stability":{"browser_last_live_timestamp":"13419378500278531","exited_cleanly":true,"saved_system_profile":"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","saved_system_profile_hash":"4F774B8A2088F0FC422A3318EFB264565CF7AC21","stats_buildtime":"1774479459","stats_version":"146.0.3856.84-64","system_crash_count":0},"unsent_log_metadata":{"initial_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0},"ongoing_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0}}},"variations":{"state_reset":{"timestamp":"13419362808428996"}},"variations_compressed_seed":"H4sIAAAAAAAAAJVWbW/iOBD+K5W/XlzFeYfTfWh5aVHLLltgW+m2qkwypN46Nms7UK7iv58cUwq9ou7xAWXGzzPzzHjs5AX1OmPUfkEdzkCYjhRzVtaKGibFdFFQA70lCGMRXeCGXsuyJ+iMQ4Hac8o1eKhfcz4Gc3ylr+BXDSJfozbx/Y2Hes85rwvoPRtQgnKXdFDogbiWJWobVYOHnPdalhOqSjCojaAo4UEbmwPZKEUJDmTVXTHOxytm8scuNXSq+JBVMFkvYEQVrcCAGinQoJZNaZZRMG1D9YGaWoFG7b/Rb1HvNx7qOu61zCn/AmYl1dNZnoPWnUfIn45EP4LWTcTVMhhTUczk8xH2QEtODWxBUAzmVpzel9NnHMZrbaDaC8+ZNkdCvsd3mYLcSLUeGHAjcM6li+DqsrncJt9+D86KglkM5SMlLd1uARQT4FCBUWubFMT7nJW+hdl3BqvP+TbbuMgfXcZj4ewYWFQD/zYddCxw8bpzFvSCBK0AtVH+SIUAjjy0pLy2nj7aeLtlWMj8cW8x9N1vH6PAKCp0xUwzhw9SPKyYggfDKpC1eagY50xDLkWh90IFNooV+HUJSrECpldDfayi6VN1IZf2aIgcru323XtHKmrArzEb6FvOIcuV1HJuTvtMaTOiyqy303djD6Q2N6BrbjzikfjPQ3nNoT8q0K2ecS5Xn8lroJ8KvIXZuZIrDep0pKSRs3p+Or0anrrhHCk5Zxw83+r8DZKhRp9ey3JsqDKe70X/h9SR1YKDgYbnmrKbyJFcjKldbv6ZKI81qC9VDjvaDu2hStsLDbSZCjaXquoybRSb1fYcXDJtZKlodbyfpZL1ItjJOBiw/SktYE5rbi4s/CP0Abh+qo6GvN9sL9pmhG5q8Xbh9qqFWX+89N+WAMxVjppoYygrEGZ3DfeVFIaBOqsLBiK3mb9IYYUMzwZnnKM2al4nyEO3t71Dh84X89p6/Oa5rKkqXo0lqOZxGCZxRyo4ZHakMCDMGNSS5aDf5YHZ3eTQdc5EeeixpR96dlM21Tb31r/x0CXQotnJF9Sb0BK10Q80uvtjOVGdbt2/e5r+XEyTX0GvXo78afzPMF1cRDc/Z+TbZby6en766wey+Z4XrOkmGkrhnYT+yZCqk8APkhOStqOkHbVOLoaTprZaGLXuyMI2czpGHrLjXeutp7mMXl+wg67TZb8C0AjfYJLGJE58TDDxGtvPgjhtbOvo4igIswwHOEGH7+Atu0VaSYRDHDt2GiZxRHD8aockjjKCCc6cHUeEpAQnuLW1gyzwfRziyNmEhHFIcLRdT7IojXALk8CZJPATHEQ4CJ3tJyTFGQ6c9igO0xBnOEvRx2PsNPtpnCUxjnCG3s/ntiiSpCTExMfEd7KiNPRJ8lYGiVutLMbktUxCwhaJcRC7rtkkrSwMI0xw4pQmfpphgsOdle7YiZ9lASbY1RiFfhbsGhoFaWSjBGiz+Re/tfIzvQkAAA==","variations_country":"US","variations_crash_streak":0,"variations_failed_to_fetch_seed_streak":0,"variations_google_groups":{"Default":[]},"variations_last_fetch_time":"13419362811355811","variations_last_runtime_fetch_time":"13419362811356285","variations_permanent_consistency_country":["146.0.3856.84","US"],"variations_runtime_compressed_seed":"H4sIAAAAAAAAAG2PQWvCQBCF/8ucM7izs9nsBnqKEQs92LRCoPaQdrcq1ihJRI3kvxez7a3H730P3swNskP9tV0/TltIYYEFkrAsVYyEkqIQGC0UEnIycmJYaCQkE5C1HDFYzaRjVCj1iDFLxSgxSCWEZeQ/ySZRChO0wTIZa1FaVNZGC5wiUWw0KZSofi9hk2iBEklABLlb++JUd9u9D09AeoN8f+yu/xpfVx/ffuar7tT4FtI38L75hPdhiGDuK+eb9l7LDqe6a67ZwXlIYflyH3qt1pDCCub9ZXeekWqfeXnZlMXONZvqMjlO3LnP+lJuS1clPH/KC/OwAhiGH4atSSVfAQAA","variations_runtime_config_ids":"P-R-1093245-1-21,P-R-108604-1-37,P-R-78306-1-18,P-R-73626-1-17,P-R-63165-4-26,P-R-53243-2-7,P-R-40093-3-26,P-R-38744-7-97,P-R-31899-29-499,P-D-1158614-2-4,P-R-1038760-2-10","variations_seed_client_version_at_store":"146.0.3856.84","variations_seed_date":"13419362809000000","variations_seed_milestone":146,"variations_seed_runtime_etag":"\"HzxkwF14sQ3UxhXRkdrhax/p/dwzCzX2iXda73HLER8=\"","variations_seed_runtime_serial_number":"\"HzxkwF14sQ3UxhXRkdrhax/p/dwzCzX2iXda73HLER8=\"","variations_seed_serial_number":"\"PX+vTrCDuFXkUjpU6q2EuvP0U5zM7pG4Rjb1QH5wKxk=\"","variations_seed_signature":"","was":{"restarted":false}}
@@ -0,0 +1 @@
1
+ {"user_experience_metrics.stability.exited_cleanly":true,"variations_crash_streak":0}
Binary file
Binary file
package/npmg.bat ADDED
@@ -0,0 +1,6 @@
1
+ cls
2
+ killport 9333
3
+ taskKill /im mailx-app.exe /f /t
4
+ npmglobalize.ps1 -cleanup
5
+ npmglobalize.ps1
6
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/mailx",
3
- "version": "1.0.9",
3
+ "version": "1.0.13",
4
4
  "description": "Local-first email client with IMAP sync and standalone native app",
5
5
  "type": "module",
6
6
  "main": "bin/mailx.js",
@@ -16,7 +16,8 @@
16
16
  "watch": "tsc -w",
17
17
  "start": "node --watch packages/mailx-server/index.js",
18
18
  "start:prod": "node packages/mailx-server/index.js",
19
- "release": "npmglobalize"
19
+ "release": "npmglobalize",
20
+ "postinstall": "node bin/postinstall.js"
20
21
  },
21
22
  "dependencies": {
22
23
  "@bobfrankston/iflow": "^1.0.2",
@@ -53,6 +54,11 @@
53
54
  "@bobfrankston/oauthsupport": "file:../../projects/oauth/oauthsupport",
54
55
  "@bobfrankston/certsupport": "file:../../projects/nodejs/certsupport",
55
56
  "mailparser": "^3.7.2",
56
- "quill": "^2.0.3"
57
+ "quill": "^2.0.3",
58
+ "express": "^4.21.0",
59
+ "nodemailer": "^7.0.0",
60
+ "ws": "^8.18.0",
61
+ "jsonc-parser": "^3.3.1",
62
+ "better-sqlite3": "^11.7.0"
57
63
  }
58
64
  }
@@ -3,7 +3,7 @@
3
3
  * Express Router with all REST endpoints for the mailx client.
4
4
  */
5
5
  import { Router } from "express";
6
- import { loadSettings, saveSettings, loadAllowlist, saveAllowlist } from "@bobfrankston/mailx-settings";
6
+ import { loadSettings, saveSettings, loadAllowlist, saveAllowlist, getStorePath } from "@bobfrankston/mailx-settings";
7
7
  import { simpleParser } from "mailparser";
8
8
  /** Sanitize HTML email body — strip remote content (images, CSS, scripts, event handlers) */
9
9
  function sanitizeHtml(html) {
@@ -42,7 +42,13 @@ export function createApiRouter(db, imapManager) {
42
42
  // ── Accounts ──
43
43
  router.get("/accounts", (req, res) => {
44
44
  const accounts = db.getAccounts();
45
- res.json(accounts);
45
+ const settings = loadSettings();
46
+ // Merge settings flags
47
+ const enriched = accounts.map(a => {
48
+ const cfg = settings.accounts.find(s => s.id === a.id);
49
+ return { ...a, label: cfg?.label, defaultSend: cfg?.defaultSend || false };
50
+ });
51
+ res.json(enriched);
46
52
  });
47
53
  // ── Folders ──
48
54
  router.get("/folders/:accountId", (req, res) => {
@@ -54,22 +60,8 @@ export function createApiRouter(db, imapManager) {
54
60
  router.get("/messages/unified/inbox", (req, res) => {
55
61
  const page = Number(req.query.page) || 1;
56
62
  const pageSize = Number(req.query.pageSize) || 50;
57
- const accounts = db.getAccounts();
58
- let allItems = [];
59
- for (const account of accounts) {
60
- const folders = db.getFolders(account.id);
61
- const inbox = folders.find(f => f.specialUse === "inbox");
62
- if (!inbox)
63
- continue;
64
- const result = db.getMessages({ accountId: account.id, folderId: inbox.id, page: 1, pageSize: 10000 });
65
- allItems.push(...result.items);
66
- }
67
- // Sort by date descending
68
- allItems.sort((a, b) => b.date - a.date);
69
- const total = allItems.length;
70
- const offset = (page - 1) * pageSize;
71
- const items = allItems.slice(offset, offset + pageSize);
72
- res.json({ items, total, page, pageSize });
63
+ const result = db.getUnifiedInbox(page, pageSize);
64
+ res.json(result);
73
65
  });
74
66
  // Per-folder messages (after unified to avoid route conflict)
75
67
  router.get("/messages/:accountId/:folderId", (req, res) => {
@@ -88,7 +80,8 @@ export function createApiRouter(db, imapManager) {
88
80
  try {
89
81
  const { accountId, uid } = req.params;
90
82
  let allowRemote = req.query.allowRemote === "true";
91
- const envelope = db.getMessageByUid(accountId, Number(uid));
83
+ const folderId = req.query.folderId ? Number(req.query.folderId) : undefined;
84
+ const envelope = db.getMessageByUid(accountId, Number(uid), folderId);
92
85
  if (!envelope)
93
86
  return res.status(404).json({ error: "Message not found" });
94
87
  // Load body from store or fetch on demand from IMAP
@@ -132,12 +125,42 @@ export function createApiRouter(db, imapManager) {
132
125
  hasRemoteContent = result.hasRemoteContent;
133
126
  }
134
127
  }
128
+ // Build .eml file path
129
+ const storePath = getStorePath();
130
+ const emlPath = `${storePath}/${accountId}/${envelope.folderId}/${envelope.uid}.eml`;
131
+ // Extract useful headers (values may be strings or structured objects)
132
+ let deliveredTo = "";
133
+ let returnPath = "";
134
+ let listUnsubscribe = "";
135
+ if (raw) {
136
+ const parsed2 = await simpleParser(raw);
137
+ const hdr = (key) => {
138
+ const v = parsed2.headers.get(key);
139
+ if (!v)
140
+ return "";
141
+ if (typeof v === "string")
142
+ return v;
143
+ if (typeof v === "object" && "text" in v)
144
+ return v.text || "";
145
+ if (typeof v === "object" && "value" in v)
146
+ return String(v.value);
147
+ return String(v);
148
+ };
149
+ deliveredTo = hdr("delivered-to");
150
+ returnPath = hdr("return-path").replace(/[<>]/g, "");
151
+ listUnsubscribe = hdr("list-unsubscribe");
152
+ }
135
153
  const message = {
136
154
  ...envelope,
137
155
  bodyHtml,
138
156
  bodyText,
139
157
  hasRemoteContent,
140
- attachments
158
+ remoteAllowed: allowRemote,
159
+ attachments,
160
+ emlPath,
161
+ deliveredTo,
162
+ returnPath,
163
+ listUnsubscribe,
141
164
  };
142
165
  res.json(message);
143
166
  }
@@ -237,12 +260,16 @@ export function createApiRouter(db, imapManager) {
237
260
  const account = settings.accounts.find(a => a.id === msg.from);
238
261
  if (!account)
239
262
  return res.status(400).json({ error: `Unknown account: ${msg.from}` });
263
+ // Use custom From address if provided, otherwise account default
264
+ const fromHeader = msg.fromAddress || `${account.name} <${account.email}>`;
240
265
  // Build RFC 822 message
241
- const to = msg.to.map(a => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
242
- const cc = msg.cc?.map(a => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
243
- const bcc = msg.bcc?.map(a => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
266
+ const to = msg.to.map((a) => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
267
+ const cc = msg.cc?.map((a) => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
268
+ const bcc = msg.bcc?.map((a) => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
269
+ const body = msg.bodyHtml || msg.bodyText || "";
270
+ const bodyBase64 = Buffer.from(body, "utf-8").toString("base64").replace(/(.{76})/g, "$1\r\n");
244
271
  const headers = [
245
- `From: ${account.name} <${account.email}>`,
272
+ `From: ${fromHeader}`,
246
273
  `To: ${to}`,
247
274
  cc ? `Cc: ${cc}` : null,
248
275
  bcc ? `Bcc: ${bcc}` : null,
@@ -252,11 +279,12 @@ export function createApiRouter(db, imapManager) {
252
279
  msg.references?.length ? `References: ${msg.references.join(" ")}` : null,
253
280
  `MIME-Version: 1.0`,
254
281
  `Content-Type: text/html; charset=UTF-8`,
282
+ `Content-Transfer-Encoding: base64`,
255
283
  ].filter(h => h !== null).join("\r\n");
256
- const rawMessage = `${headers}\r\n\r\n${msg.bodyHtml || msg.bodyText || ""}`;
284
+ const rawMessage = `${headers}\r\n\r\n${bodyBase64}`;
257
285
  // Local-first: save to sync queue, worker will APPEND to Outbox and send
258
286
  imapManager.queueOutgoingLocal(account.id, rawMessage);
259
- console.log(` Queued locally: ${msg.subject} via ${account.id}`);
287
+ console.log(` Queued locally: ${msg.subject} via ${account.id} from ${fromHeader}`);
260
288
  // Record recipient addresses for autocomplete
261
289
  for (const addr of msg.to)
262
290
  db.recordSentAddress(addr.name, addr.address);
@@ -288,6 +316,31 @@ export function createApiRouter(db, imapManager) {
288
316
  res.status(500).json({ error: e.message });
289
317
  }
290
318
  });
319
+ // ── Move message to another folder ──
320
+ router.post("/message/:accountId/:uid/move", async (req, res) => {
321
+ try {
322
+ const { accountId, uid } = req.params;
323
+ const { targetFolderId, targetAccountId } = req.body;
324
+ if (targetFolderId == null)
325
+ return res.status(400).json({ error: "targetFolderId required" });
326
+ const envelope = db.getMessageByUid(accountId, Number(uid));
327
+ if (!envelope)
328
+ return res.status(404).json({ error: "Message not found" });
329
+ if (targetAccountId && targetAccountId !== accountId) {
330
+ // Cross-account move via iflow
331
+ await imapManager.moveMessageCrossAccount(accountId, envelope.uid, envelope.folderId, targetAccountId, targetFolderId);
332
+ }
333
+ else {
334
+ // Same-account move
335
+ await imapManager.moveMessage(accountId, envelope.uid, envelope.folderId, targetFolderId);
336
+ }
337
+ res.json({ ok: true });
338
+ }
339
+ catch (e) {
340
+ console.error(` Move error: ${e.message}`);
341
+ res.status(500).json({ error: e.message });
342
+ }
343
+ });
291
344
  // ── Undelete (move from Trash back to original folder) ──
292
345
  router.post("/message/:accountId/:uid/undelete", async (req, res) => {
293
346
  try {