@withbuddi/buddi 0.1.0-pre.26 → 0.1.0-pre.28

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 (818) hide show
  1. package/extension/manifest.json +2 -2
  2. package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
  3. package/node_modules/@buddi/cli/dist/commands.d.ts +10 -0
  4. package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -1
  5. package/node_modules/@buddi/cli/dist/commands.js +237 -18
  6. package/node_modules/@buddi/cli/dist/commands.js.map +1 -1
  7. package/node_modules/@buddi/cli/dist/doctor-probes.d.ts.map +1 -1
  8. package/node_modules/@buddi/cli/dist/doctor-probes.js +10 -8
  9. package/node_modules/@buddi/cli/dist/doctor-probes.js.map +1 -1
  10. package/node_modules/@buddi/cli/dist/doctor.d.ts +28 -0
  11. package/node_modules/@buddi/cli/dist/doctor.d.ts.map +1 -1
  12. package/node_modules/@buddi/cli/dist/doctor.js +36 -0
  13. package/node_modules/@buddi/cli/dist/doctor.js.map +1 -1
  14. package/node_modules/@buddi/cli/dist/mcp/tools.d.ts.map +1 -1
  15. package/node_modules/@buddi/cli/dist/mcp/tools.js +3 -2
  16. package/node_modules/@buddi/cli/dist/mcp/tools.js.map +1 -1
  17. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  18. package/node_modules/@buddi/core/dist/agents/catalog.d.ts +3 -0
  19. package/node_modules/@buddi/core/dist/agents/catalog.d.ts.map +1 -1
  20. package/node_modules/@buddi/core/dist/agents/catalog.js +1 -0
  21. package/node_modules/@buddi/core/dist/agents/catalog.js.map +1 -1
  22. package/node_modules/@buddi/core/dist/agents/edit.d.ts +3 -0
  23. package/node_modules/@buddi/core/dist/agents/edit.d.ts.map +1 -1
  24. package/node_modules/@buddi/core/dist/agents/edit.js +3 -1
  25. package/node_modules/@buddi/core/dist/agents/edit.js.map +1 -1
  26. package/node_modules/@buddi/core/dist/agents/frontmatter.d.ts +10 -0
  27. package/node_modules/@buddi/core/dist/agents/frontmatter.d.ts.map +1 -1
  28. package/node_modules/@buddi/core/dist/agents/frontmatter.js +7 -0
  29. package/node_modules/@buddi/core/dist/agents/frontmatter.js.map +1 -1
  30. package/node_modules/@buddi/core/dist/agents/idle-rollover.d.ts +20 -0
  31. package/node_modules/@buddi/core/dist/agents/idle-rollover.d.ts.map +1 -0
  32. package/node_modules/@buddi/core/dist/agents/idle-rollover.js +30 -0
  33. package/node_modules/@buddi/core/dist/agents/idle-rollover.js.map +1 -0
  34. package/node_modules/@buddi/core/dist/agents/index.d.ts +1 -0
  35. package/node_modules/@buddi/core/dist/agents/index.d.ts.map +1 -1
  36. package/node_modules/@buddi/core/dist/agents/index.js +1 -0
  37. package/node_modules/@buddi/core/dist/agents/index.js.map +1 -1
  38. package/node_modules/@buddi/core/dist/backup/dump.d.ts +9 -0
  39. package/node_modules/@buddi/core/dist/backup/dump.d.ts.map +1 -1
  40. package/node_modules/@buddi/core/dist/backup/dump.js +10 -1
  41. package/node_modules/@buddi/core/dist/backup/dump.js.map +1 -1
  42. package/node_modules/@buddi/core/dist/backup/index.d.ts +1 -0
  43. package/node_modules/@buddi/core/dist/backup/index.d.ts.map +1 -1
  44. package/node_modules/@buddi/core/dist/backup/index.js +1 -0
  45. package/node_modules/@buddi/core/dist/backup/index.js.map +1 -1
  46. package/node_modules/@buddi/core/dist/backup/load.d.ts +18 -0
  47. package/node_modules/@buddi/core/dist/backup/load.d.ts.map +1 -1
  48. package/node_modules/@buddi/core/dist/backup/load.js +3 -2
  49. package/node_modules/@buddi/core/dist/backup/load.js.map +1 -1
  50. package/node_modules/@buddi/core/dist/backup/pending.d.ts +114 -0
  51. package/node_modules/@buddi/core/dist/backup/pending.d.ts.map +1 -0
  52. package/node_modules/@buddi/core/dist/backup/pending.js +392 -0
  53. package/node_modules/@buddi/core/dist/backup/pending.js.map +1 -0
  54. package/node_modules/@buddi/core/dist/backup/restore.d.ts +3 -1
  55. package/node_modules/@buddi/core/dist/backup/restore.d.ts.map +1 -1
  56. package/node_modules/@buddi/core/dist/backup/restore.js +55 -2
  57. package/node_modules/@buddi/core/dist/backup/restore.js.map +1 -1
  58. package/node_modules/@buddi/core/dist/feedback/index.d.ts +108 -0
  59. package/node_modules/@buddi/core/dist/feedback/index.d.ts.map +1 -0
  60. package/node_modules/@buddi/core/dist/feedback/index.js +160 -0
  61. package/node_modules/@buddi/core/dist/feedback/index.js.map +1 -0
  62. package/node_modules/@buddi/core/dist/home.d.ts +24 -0
  63. package/node_modules/@buddi/core/dist/home.d.ts.map +1 -1
  64. package/node_modules/@buddi/core/dist/home.js +3 -0
  65. package/node_modules/@buddi/core/dist/home.js.map +1 -1
  66. package/node_modules/@buddi/core/dist/host/build.d.ts.map +1 -1
  67. package/node_modules/@buddi/core/dist/host/build.js +28 -1
  68. package/node_modules/@buddi/core/dist/host/build.js.map +1 -1
  69. package/node_modules/@buddi/core/dist/host/types.d.ts +29 -2
  70. package/node_modules/@buddi/core/dist/host/types.d.ts.map +1 -1
  71. package/node_modules/@buddi/core/dist/index.d.ts +1 -0
  72. package/node_modules/@buddi/core/dist/index.d.ts.map +1 -1
  73. package/node_modules/@buddi/core/dist/index.js +1 -0
  74. package/node_modules/@buddi/core/dist/index.js.map +1 -1
  75. package/node_modules/@buddi/core/dist/learning/policies.d.ts +7 -1
  76. package/node_modules/@buddi/core/dist/learning/policies.d.ts.map +1 -1
  77. package/node_modules/@buddi/core/dist/learning/policies.js +4 -1
  78. package/node_modules/@buddi/core/dist/learning/policies.js.map +1 -1
  79. package/node_modules/@buddi/core/dist/learning/store.d.ts +29 -1
  80. package/node_modules/@buddi/core/dist/learning/store.d.ts.map +1 -1
  81. package/node_modules/@buddi/core/dist/learning/store.js +33 -8
  82. package/node_modules/@buddi/core/dist/learning/store.js.map +1 -1
  83. package/node_modules/@buddi/core/dist/learning/types.d.ts +24 -1
  84. package/node_modules/@buddi/core/dist/learning/types.d.ts.map +1 -1
  85. package/node_modules/@buddi/core/dist/learning/types.js +6 -0
  86. package/node_modules/@buddi/core/dist/learning/types.js.map +1 -1
  87. package/node_modules/@buddi/core/dist/owner.d.ts +2 -1
  88. package/node_modules/@buddi/core/dist/owner.d.ts.map +1 -1
  89. package/node_modules/@buddi/core/dist/owner.js.map +1 -1
  90. package/node_modules/@buddi/core/dist/pages.d.ts +27 -0
  91. package/node_modules/@buddi/core/dist/pages.d.ts.map +1 -1
  92. package/node_modules/@buddi/core/dist/pages.js +24 -3
  93. package/node_modules/@buddi/core/dist/pages.js.map +1 -1
  94. package/node_modules/@buddi/core/dist/plugin/index.d.ts +7 -6
  95. package/node_modules/@buddi/core/dist/plugin/index.d.ts.map +1 -1
  96. package/node_modules/@buddi/core/dist/plugin/index.js +1 -1
  97. package/node_modules/@buddi/core/dist/plugin/index.js.map +1 -1
  98. package/node_modules/@buddi/core/dist/plugin/version.d.ts +1 -1
  99. package/node_modules/@buddi/core/dist/plugin/version.js +1 -1
  100. package/node_modules/@buddi/core/dist/postgres/binaries.d.ts +3 -1
  101. package/node_modules/@buddi/core/dist/postgres/binaries.d.ts.map +1 -1
  102. package/node_modules/@buddi/core/dist/postgres/binaries.js +15 -23
  103. package/node_modules/@buddi/core/dist/postgres/binaries.js.map +1 -1
  104. package/node_modules/@buddi/core/dist/postgres/cluster.js +1 -1
  105. package/node_modules/@buddi/core/dist/postgres/cluster.js.map +1 -1
  106. package/node_modules/@buddi/core/dist/postgres/index.d.ts +1 -0
  107. package/node_modules/@buddi/core/dist/postgres/index.d.ts.map +1 -1
  108. package/node_modules/@buddi/core/dist/postgres/index.js +1 -0
  109. package/node_modules/@buddi/core/dist/postgres/index.js.map +1 -1
  110. package/node_modules/@buddi/core/dist/postgres/links.d.ts +15 -0
  111. package/node_modules/@buddi/core/dist/postgres/links.d.ts.map +1 -0
  112. package/node_modules/@buddi/core/dist/postgres/links.js +98 -0
  113. package/node_modules/@buddi/core/dist/postgres/links.js.map +1 -0
  114. package/node_modules/@buddi/core/dist/registry.d.ts +10 -1
  115. package/node_modules/@buddi/core/dist/registry.d.ts.map +1 -1
  116. package/node_modules/@buddi/core/dist/registry.js +13 -0
  117. package/node_modules/@buddi/core/dist/registry.js.map +1 -1
  118. package/node_modules/@buddi/core/dist/sources/index.d.ts +1 -0
  119. package/node_modules/@buddi/core/dist/sources/index.d.ts.map +1 -1
  120. package/node_modules/@buddi/core/dist/sources/index.js +1 -0
  121. package/node_modules/@buddi/core/dist/sources/index.js.map +1 -1
  122. package/node_modules/@buddi/core/dist/sources/watch.d.ts +37 -0
  123. package/node_modules/@buddi/core/dist/sources/watch.d.ts.map +1 -0
  124. package/node_modules/@buddi/core/dist/sources/watch.js +81 -0
  125. package/node_modules/@buddi/core/dist/sources/watch.js.map +1 -0
  126. package/node_modules/@buddi/core/dist/tools.d.ts +47 -0
  127. package/node_modules/@buddi/core/dist/tools.d.ts.map +1 -1
  128. package/node_modules/@buddi/core/dist/tools.js.map +1 -1
  129. package/node_modules/@buddi/core/migrations/055_pending_plugin_data.sql +24 -0
  130. package/node_modules/@buddi/core/migrations/056_dashboard_sessions.sql +37 -0
  131. package/node_modules/@buddi/core/migrations/057_proposal_decided_by.sql +34 -0
  132. package/node_modules/@buddi/core/migrations/058_message_feedback.sql +50 -0
  133. package/node_modules/@buddi/core/package.json +4 -0
  134. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  135. package/node_modules/@buddi/gateway/dist/agents/learning-digest.d.ts +7 -1
  136. package/node_modules/@buddi/gateway/dist/agents/learning-digest.d.ts.map +1 -1
  137. package/node_modules/@buddi/gateway/dist/agents/learning-digest.js +29 -3
  138. package/node_modules/@buddi/gateway/dist/agents/learning-digest.js.map +1 -1
  139. package/node_modules/@buddi/gateway/dist/agents/platform-files.d.ts +2 -0
  140. package/node_modules/@buddi/gateway/dist/agents/platform-files.d.ts.map +1 -1
  141. package/node_modules/@buddi/gateway/dist/agents/platform-files.js +2 -0
  142. package/node_modules/@buddi/gateway/dist/agents/platform-files.js.map +1 -1
  143. package/node_modules/@buddi/gateway/dist/agents/platform.d.ts +20 -0
  144. package/node_modules/@buddi/gateway/dist/agents/platform.d.ts.map +1 -1
  145. package/node_modules/@buddi/gateway/dist/agents/platform.js +46 -3
  146. package/node_modules/@buddi/gateway/dist/agents/platform.js.map +1 -1
  147. package/node_modules/@buddi/gateway/dist/agents-cli.d.ts +1 -1
  148. package/node_modules/@buddi/gateway/dist/agents-cli.d.ts.map +1 -1
  149. package/node_modules/@buddi/gateway/dist/agents-cli.js +12 -2
  150. package/node_modules/@buddi/gateway/dist/agents-cli.js.map +1 -1
  151. package/node_modules/@buddi/gateway/dist/chat/session.d.ts.map +1 -1
  152. package/node_modules/@buddi/gateway/dist/chat/session.js +2 -1
  153. package/node_modules/@buddi/gateway/dist/chat/session.js.map +1 -1
  154. package/node_modules/@buddi/gateway/dist/mcp/requests.d.ts.map +1 -1
  155. package/node_modules/@buddi/gateway/dist/mcp/requests.js +1 -0
  156. package/node_modules/@buddi/gateway/dist/mcp/requests.js.map +1 -1
  157. package/node_modules/@buddi/gateway/dist/plugins/approve.d.ts.map +1 -1
  158. package/node_modules/@buddi/gateway/dist/plugins/approve.js +13 -2
  159. package/node_modules/@buddi/gateway/dist/plugins/approve.js.map +1 -1
  160. package/node_modules/@buddi/gateway/dist/plugins/migrate.d.ts.map +1 -1
  161. package/node_modules/@buddi/gateway/dist/plugins/migrate.js +11 -1
  162. package/node_modules/@buddi/gateway/dist/plugins/migrate.js.map +1 -1
  163. package/node_modules/@buddi/gateway/dist/plugins/paths.d.ts +14 -0
  164. package/node_modules/@buddi/gateway/dist/plugins/paths.d.ts.map +1 -1
  165. package/node_modules/@buddi/gateway/dist/plugins/paths.js +27 -1
  166. package/node_modules/@buddi/gateway/dist/plugins/paths.js.map +1 -1
  167. package/node_modules/@buddi/gateway/dist/plugins/stage.d.ts +27 -3
  168. package/node_modules/@buddi/gateway/dist/plugins/stage.d.ts.map +1 -1
  169. package/node_modules/@buddi/gateway/dist/plugins/stage.js +35 -5
  170. package/node_modules/@buddi/gateway/dist/plugins/stage.js.map +1 -1
  171. package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts +4 -0
  172. package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts.map +1 -1
  173. package/node_modules/@buddi/gateway/dist/plugins-cli.js +42 -9
  174. package/node_modules/@buddi/gateway/dist/plugins-cli.js.map +1 -1
  175. package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
  176. package/node_modules/@buddi/gateway/dist/serve.js +14 -2
  177. package/node_modules/@buddi/gateway/dist/serve.js.map +1 -1
  178. package/node_modules/@buddi/gateway/dist/surfaces/browser-continuation.d.ts +2 -1
  179. package/node_modules/@buddi/gateway/dist/surfaces/browser-continuation.d.ts.map +1 -1
  180. package/node_modules/@buddi/gateway/dist/surfaces/browser-continuation.js +8 -5
  181. package/node_modules/@buddi/gateway/dist/surfaces/browser-continuation.js.map +1 -1
  182. package/node_modules/@buddi/gateway/dist/surfaces/browser-handoff.d.ts +27 -4
  183. package/node_modules/@buddi/gateway/dist/surfaces/browser-handoff.d.ts.map +1 -1
  184. package/node_modules/@buddi/gateway/dist/surfaces/browser-handoff.js +57 -7
  185. package/node_modules/@buddi/gateway/dist/surfaces/browser-handoff.js.map +1 -1
  186. package/node_modules/@buddi/gateway/dist/surfaces/carry-over.d.ts +89 -0
  187. package/node_modules/@buddi/gateway/dist/surfaces/carry-over.d.ts.map +1 -0
  188. package/node_modules/@buddi/gateway/dist/surfaces/carry-over.js +172 -0
  189. package/node_modules/@buddi/gateway/dist/surfaces/carry-over.js.map +1 -0
  190. package/node_modules/@buddi/gateway/dist/surfaces/conversation-lifetime.d.ts +5 -2
  191. package/node_modules/@buddi/gateway/dist/surfaces/conversation-lifetime.d.ts.map +1 -1
  192. package/node_modules/@buddi/gateway/dist/surfaces/conversation-lifetime.js +5 -2
  193. package/node_modules/@buddi/gateway/dist/surfaces/conversation-lifetime.js.map +1 -1
  194. package/node_modules/@buddi/gateway/dist/telegram/api.d.ts +34 -2
  195. package/node_modules/@buddi/gateway/dist/telegram/api.d.ts.map +1 -1
  196. package/node_modules/@buddi/gateway/dist/telegram/api.js +15 -2
  197. package/node_modules/@buddi/gateway/dist/telegram/api.js.map +1 -1
  198. package/node_modules/@buddi/gateway/dist/telegram/env-owner.d.ts +30 -0
  199. package/node_modules/@buddi/gateway/dist/telegram/env-owner.d.ts.map +1 -0
  200. package/node_modules/@buddi/gateway/dist/telegram/env-owner.js +45 -0
  201. package/node_modules/@buddi/gateway/dist/telegram/env-owner.js.map +1 -0
  202. package/node_modules/@buddi/gateway/dist/telegram/main.d.ts +0 -2
  203. package/node_modules/@buddi/gateway/dist/telegram/main.d.ts.map +1 -1
  204. package/node_modules/@buddi/gateway/dist/telegram/main.js +20 -25
  205. package/node_modules/@buddi/gateway/dist/telegram/main.js.map +1 -1
  206. package/node_modules/@buddi/gateway/dist/telegram/notify.d.ts.map +1 -1
  207. package/node_modules/@buddi/gateway/dist/telegram/notify.js +1 -1
  208. package/node_modules/@buddi/gateway/dist/telegram/notify.js.map +1 -1
  209. package/node_modules/@buddi/gateway/dist/telegram/outbound.d.ts +2 -2
  210. package/node_modules/@buddi/gateway/dist/telegram/outbound.d.ts.map +1 -1
  211. package/node_modules/@buddi/gateway/dist/telegram/outbound.js +12 -3
  212. package/node_modules/@buddi/gateway/dist/telegram/outbound.js.map +1 -1
  213. package/node_modules/@buddi/gateway/dist/telegram/reactions.d.ts +45 -0
  214. package/node_modules/@buddi/gateway/dist/telegram/reactions.d.ts.map +1 -0
  215. package/node_modules/@buddi/gateway/dist/telegram/reactions.js +97 -0
  216. package/node_modules/@buddi/gateway/dist/telegram/reactions.js.map +1 -0
  217. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts +27 -1
  218. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
  219. package/node_modules/@buddi/gateway/dist/telegram/surface.js +186 -12
  220. package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
  221. package/node_modules/@buddi/gateway/dist/web/agents.d.ts +7 -1
  222. package/node_modules/@buddi/gateway/dist/web/agents.d.ts.map +1 -1
  223. package/node_modules/@buddi/gateway/dist/web/agents.js +32 -2
  224. package/node_modules/@buddi/gateway/dist/web/agents.js.map +1 -1
  225. package/node_modules/@buddi/gateway/dist/web/chat.d.ts +10 -3
  226. package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
  227. package/node_modules/@buddi/gateway/dist/web/chat.js +18 -5
  228. package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
  229. package/node_modules/@buddi/gateway/dist/web/plugins.d.ts +6 -1
  230. package/node_modules/@buddi/gateway/dist/web/plugins.d.ts.map +1 -1
  231. package/node_modules/@buddi/gateway/dist/web/plugins.js +31 -2
  232. package/node_modules/@buddi/gateway/dist/web/plugins.js.map +1 -1
  233. package/node_modules/@buddi/gateway/dist/web/proposals.d.ts +21 -0
  234. package/node_modules/@buddi/gateway/dist/web/proposals.d.ts.map +1 -1
  235. package/node_modules/@buddi/gateway/dist/web/proposals.js +50 -1
  236. package/node_modules/@buddi/gateway/dist/web/proposals.js.map +1 -1
  237. package/node_modules/@buddi/gateway/dist/web/read.d.ts +23 -0
  238. package/node_modules/@buddi/gateway/dist/web/read.d.ts.map +1 -1
  239. package/node_modules/@buddi/gateway/dist/web/read.js +36 -1
  240. package/node_modules/@buddi/gateway/dist/web/read.js.map +1 -1
  241. package/node_modules/@buddi/gateway/dist/web/recovery.d.ts +40 -2
  242. package/node_modules/@buddi/gateway/dist/web/recovery.d.ts.map +1 -1
  243. package/node_modules/@buddi/gateway/dist/web/recovery.js +215 -18
  244. package/node_modules/@buddi/gateway/dist/web/recovery.js.map +1 -1
  245. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  246. package/node_modules/@buddi/gateway/dist/web/server.js +87 -29
  247. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  248. package/node_modules/@buddi/gateway/dist/web/sessions.d.ts +81 -7
  249. package/node_modules/@buddi/gateway/dist/web/sessions.d.ts.map +1 -1
  250. package/node_modules/@buddi/gateway/dist/web/sessions.js +242 -24
  251. package/node_modules/@buddi/gateway/dist/web/sessions.js.map +1 -1
  252. package/node_modules/@buddi/gateway/dist/web/signed-out.d.ts +46 -0
  253. package/node_modules/@buddi/gateway/dist/web/signed-out.d.ts.map +1 -0
  254. package/node_modules/@buddi/gateway/dist/web/signed-out.js +99 -0
  255. package/node_modules/@buddi/gateway/dist/web/signed-out.js.map +1 -0
  256. package/node_modules/@buddi/gateway/dist/web/tailscale.d.ts +13 -0
  257. package/node_modules/@buddi/gateway/dist/web/tailscale.d.ts.map +1 -1
  258. package/node_modules/@buddi/gateway/dist/web/tailscale.js +12 -0
  259. package/node_modules/@buddi/gateway/dist/web/tailscale.js.map +1 -1
  260. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  261. package/node_modules/@buddi/install/dist/backup.d.ts +18 -0
  262. package/node_modules/@buddi/install/dist/backup.d.ts.map +1 -1
  263. package/node_modules/@buddi/install/dist/backup.js +39 -2
  264. package/node_modules/@buddi/install/dist/backup.js.map +1 -1
  265. package/node_modules/@buddi/install/dist/kept-data.d.ts +20 -0
  266. package/node_modules/@buddi/install/dist/kept-data.d.ts.map +1 -0
  267. package/node_modules/@buddi/install/dist/kept-data.js +34 -0
  268. package/node_modules/@buddi/install/dist/kept-data.js.map +1 -0
  269. package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
  270. package/node_modules/@buddi/install/dist/launcher.js +17 -3
  271. package/node_modules/@buddi/install/dist/launcher.js.map +1 -1
  272. package/node_modules/@buddi/install/dist/postgres-check.d.ts +18 -0
  273. package/node_modules/@buddi/install/dist/postgres-check.d.ts.map +1 -0
  274. package/node_modules/@buddi/install/dist/postgres-check.js +66 -0
  275. package/node_modules/@buddi/install/dist/postgres-check.js.map +1 -0
  276. package/node_modules/@buddi/install/dist/upgrade.d.ts +3 -0
  277. package/node_modules/@buddi/install/dist/upgrade.d.ts.map +1 -1
  278. package/node_modules/@buddi/install/dist/upgrade.js +30 -0
  279. package/node_modules/@buddi/install/dist/upgrade.js.map +1 -1
  280. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  281. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  282. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  283. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  284. package/node_modules/@buddi/tool-email/dist/agent.d.ts.map +1 -1
  285. package/node_modules/@buddi/tool-email/dist/agent.js +11 -0
  286. package/node_modules/@buddi/tool-email/dist/agent.js.map +1 -1
  287. package/node_modules/@buddi/tool-email/dist/imap/fake.d.ts +89 -3
  288. package/node_modules/@buddi/tool-email/dist/imap/fake.d.ts.map +1 -1
  289. package/node_modules/@buddi/tool-email/dist/imap/fake.js +234 -4
  290. package/node_modules/@buddi/tool-email/dist/imap/fake.js.map +1 -1
  291. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.d.ts +14 -1
  292. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.d.ts.map +1 -1
  293. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.js +157 -2
  294. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.js.map +1 -1
  295. package/node_modules/@buddi/tool-email/dist/index.d.ts +14 -2
  296. package/node_modules/@buddi/tool-email/dist/index.d.ts.map +1 -1
  297. package/node_modules/@buddi/tool-email/dist/index.js +23 -4
  298. package/node_modules/@buddi/tool-email/dist/index.js.map +1 -1
  299. package/node_modules/@buddi/tool-email/dist/logins.d.ts +24 -0
  300. package/node_modules/@buddi/tool-email/dist/logins.d.ts.map +1 -0
  301. package/node_modules/@buddi/tool-email/dist/logins.js +35 -0
  302. package/node_modules/@buddi/tool-email/dist/logins.js.map +1 -0
  303. package/node_modules/@buddi/tool-email/dist/mail.d.ts +14 -0
  304. package/node_modules/@buddi/tool-email/dist/mail.d.ts.map +1 -1
  305. package/node_modules/@buddi/tool-email/dist/mail.js +23 -0
  306. package/node_modules/@buddi/tool-email/dist/mail.js.map +1 -1
  307. package/node_modules/@buddi/tool-email/dist/mailbox/actions.d.ts +205 -0
  308. package/node_modules/@buddi/tool-email/dist/mailbox/actions.d.ts.map +1 -0
  309. package/node_modules/@buddi/tool-email/dist/mailbox/actions.js +662 -0
  310. package/node_modules/@buddi/tool-email/dist/mailbox/actions.js.map +1 -0
  311. package/node_modules/@buddi/tool-email/dist/mailbox/arrival.d.ts +61 -0
  312. package/node_modules/@buddi/tool-email/dist/mailbox/arrival.d.ts.map +1 -0
  313. package/node_modules/@buddi/tool-email/dist/mailbox/arrival.js +153 -0
  314. package/node_modules/@buddi/tool-email/dist/mailbox/arrival.js.map +1 -0
  315. package/node_modules/@buddi/tool-email/dist/mailbox/select.d.ts +53 -0
  316. package/node_modules/@buddi/tool-email/dist/mailbox/select.d.ts.map +1 -0
  317. package/node_modules/@buddi/tool-email/dist/mailbox/select.js +117 -0
  318. package/node_modules/@buddi/tool-email/dist/mailbox/select.js.map +1 -0
  319. package/node_modules/@buddi/tool-email/dist/pages/accounts.d.ts +37 -1
  320. package/node_modules/@buddi/tool-email/dist/pages/accounts.d.ts.map +1 -1
  321. package/node_modules/@buddi/tool-email/dist/pages/accounts.js +104 -2
  322. package/node_modules/@buddi/tool-email/dist/pages/accounts.js.map +1 -1
  323. package/node_modules/@buddi/tool-email/dist/pages/descriptors.d.ts.map +1 -1
  324. package/node_modules/@buddi/tool-email/dist/pages/descriptors.js +142 -0
  325. package/node_modules/@buddi/tool-email/dist/pages/descriptors.js.map +1 -1
  326. package/node_modules/@buddi/tool-email/dist/pages/drafts-tools.d.ts +2 -2
  327. package/node_modules/@buddi/tool-email/dist/pages/format.d.ts +1 -12
  328. package/node_modules/@buddi/tool-email/dist/pages/format.d.ts.map +1 -1
  329. package/node_modules/@buddi/tool-email/dist/pages/format.js +17 -0
  330. package/node_modules/@buddi/tool-email/dist/pages/format.js.map +1 -1
  331. package/node_modules/@buddi/tool-email/dist/pages/index.d.ts.map +1 -1
  332. package/node_modules/@buddi/tool-email/dist/pages/index.js +5 -1
  333. package/node_modules/@buddi/tool-email/dist/pages/index.js.map +1 -1
  334. package/node_modules/@buddi/tool-email/dist/pages/policies-tools.d.ts +7 -0
  335. package/node_modules/@buddi/tool-email/dist/pages/policies-tools.d.ts.map +1 -1
  336. package/node_modules/@buddi/tool-email/dist/pages/policies-tools.js +11 -2
  337. package/node_modules/@buddi/tool-email/dist/pages/policies-tools.js.map +1 -1
  338. package/node_modules/@buddi/tool-email/dist/pages/queries.d.ts +16 -0
  339. package/node_modules/@buddi/tool-email/dist/pages/queries.d.ts.map +1 -1
  340. package/node_modules/@buddi/tool-email/dist/pages/queries.js +154 -3
  341. package/node_modules/@buddi/tool-email/dist/pages/queries.js.map +1 -1
  342. package/node_modules/@buddi/tool-email/dist/policies/auto.d.ts +133 -0
  343. package/node_modules/@buddi/tool-email/dist/policies/auto.d.ts.map +1 -0
  344. package/node_modules/@buddi/tool-email/dist/policies/auto.js +241 -0
  345. package/node_modules/@buddi/tool-email/dist/policies/auto.js.map +1 -0
  346. package/node_modules/@buddi/tool-email/dist/policies/gate.d.ts +34 -10
  347. package/node_modules/@buddi/tool-email/dist/policies/gate.d.ts.map +1 -1
  348. package/node_modules/@buddi/tool-email/dist/policies/gate.js +27 -12
  349. package/node_modules/@buddi/tool-email/dist/policies/gate.js.map +1 -1
  350. package/node_modules/@buddi/tool-email/dist/policies/learn.d.ts +26 -18
  351. package/node_modules/@buddi/tool-email/dist/policies/learn.d.ts.map +1 -1
  352. package/node_modules/@buddi/tool-email/dist/policies/learn.js +36 -10
  353. package/node_modules/@buddi/tool-email/dist/policies/learn.js.map +1 -1
  354. package/node_modules/@buddi/tool-email/dist/policies/learned.d.ts +25 -2
  355. package/node_modules/@buddi/tool-email/dist/policies/learned.d.ts.map +1 -1
  356. package/node_modules/@buddi/tool-email/dist/policies/learned.js +47 -5
  357. package/node_modules/@buddi/tool-email/dist/policies/learned.js.map +1 -1
  358. package/node_modules/@buddi/tool-email/dist/policies/store.d.ts +8 -2
  359. package/node_modules/@buddi/tool-email/dist/policies/store.d.ts.map +1 -1
  360. package/node_modules/@buddi/tool-email/dist/policies/store.js +19 -5
  361. package/node_modules/@buddi/tool-email/dist/policies/store.js.map +1 -1
  362. package/node_modules/@buddi/tool-email/dist/ports.d.ts +79 -0
  363. package/node_modules/@buddi/tool-email/dist/ports.d.ts.map +1 -1
  364. package/node_modules/@buddi/tool-email/dist/ports.js +6 -0
  365. package/node_modules/@buddi/tool-email/dist/ports.js.map +1 -1
  366. package/node_modules/@buddi/tool-email/dist/rows.d.ts.map +1 -1
  367. package/node_modules/@buddi/tool-email/dist/rows.js +3 -1
  368. package/node_modules/@buddi/tool-email/dist/rows.js.map +1 -1
  369. package/node_modules/@buddi/tool-email/dist/sources/idle.d.ts +90 -0
  370. package/node_modules/@buddi/tool-email/dist/sources/idle.d.ts.map +1 -0
  371. package/node_modules/@buddi/tool-email/dist/sources/idle.js +250 -0
  372. package/node_modules/@buddi/tool-email/dist/sources/idle.js.map +1 -0
  373. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.d.ts +12 -1
  374. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.d.ts.map +1 -1
  375. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.js +280 -134
  376. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.js.map +1 -1
  377. package/node_modules/@buddi/tool-email/dist/tools/mailbox.d.ts +108 -0
  378. package/node_modules/@buddi/tool-email/dist/tools/mailbox.d.ts.map +1 -0
  379. package/node_modules/@buddi/tool-email/dist/tools/mailbox.js +359 -0
  380. package/node_modules/@buddi/tool-email/dist/tools/mailbox.js.map +1 -0
  381. package/node_modules/@buddi/tool-email/dist/tools/policies.d.ts +8 -2
  382. package/node_modules/@buddi/tool-email/dist/tools/policies.d.ts.map +1 -1
  383. package/node_modules/@buddi/tool-email/dist/tools/policies.js +43 -3
  384. package/node_modules/@buddi/tool-email/dist/tools/policies.js.map +1 -1
  385. package/node_modules/@buddi/tool-email/dist/tools/read.d.ts +2 -2
  386. package/node_modules/@buddi/tool-email/dist/tools/triage.d.ts.map +1 -1
  387. package/node_modules/@buddi/tool-email/dist/tools/triage.js +10 -4
  388. package/node_modules/@buddi/tool-email/dist/tools/triage.js.map +1 -1
  389. package/node_modules/@buddi/tool-email/migrations/017_mailbox_actions.sql +60 -0
  390. package/node_modules/@buddi/tool-email/migrations/018_learned_auto.sql +30 -0
  391. package/node_modules/@buddi/tool-email/migrations/019_arrival_pending.sql +26 -0
  392. package/node_modules/@buddi/tool-email/package.json +3 -2
  393. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  394. package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
  395. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  396. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  397. package/node_modules/imapflow/CHANGELOG.md +14 -0
  398. package/node_modules/imapflow/dist/cjs/commands/fetch.js +1 -1
  399. package/node_modules/imapflow/dist/cjs/imap-flow.d.ts +2 -0
  400. package/node_modules/imapflow/dist/cjs/imap-flow.js +14 -1
  401. package/node_modules/imapflow/dist/cjs/package-info.d.ts +1 -1
  402. package/node_modules/imapflow/dist/cjs/package-info.js +1 -1
  403. package/node_modules/imapflow/dist/cjs/tools.d.ts +2 -1
  404. package/node_modules/imapflow/dist/cjs/tools.js +8 -6
  405. package/node_modules/imapflow/dist/cjs/types.d.ts +9 -1
  406. package/node_modules/imapflow/dist/esm/commands/fetch.js +1 -1
  407. package/node_modules/imapflow/dist/esm/imap-flow.d.ts +2 -0
  408. package/node_modules/imapflow/dist/esm/imap-flow.js +14 -1
  409. package/node_modules/imapflow/dist/esm/package-info.d.ts +1 -1
  410. package/node_modules/imapflow/dist/esm/package-info.js +1 -1
  411. package/node_modules/imapflow/dist/esm/tools.d.ts +2 -1
  412. package/node_modules/imapflow/dist/esm/tools.js +8 -6
  413. package/node_modules/imapflow/dist/esm/types.d.ts +9 -1
  414. package/node_modules/imapflow/package.json +4 -4
  415. package/package.json +2 -2
  416. package/packages/cli/dist/.tsbuildinfo +1 -1
  417. package/packages/cli/dist/commands.d.ts +10 -0
  418. package/packages/cli/dist/commands.d.ts.map +1 -1
  419. package/packages/cli/dist/commands.js +237 -18
  420. package/packages/cli/dist/commands.js.map +1 -1
  421. package/packages/cli/dist/doctor-probes.d.ts.map +1 -1
  422. package/packages/cli/dist/doctor-probes.js +10 -8
  423. package/packages/cli/dist/doctor-probes.js.map +1 -1
  424. package/packages/cli/dist/doctor.d.ts +28 -0
  425. package/packages/cli/dist/doctor.d.ts.map +1 -1
  426. package/packages/cli/dist/doctor.js +36 -0
  427. package/packages/cli/dist/doctor.js.map +1 -1
  428. package/packages/cli/dist/mcp/tools.d.ts.map +1 -1
  429. package/packages/cli/dist/mcp/tools.js +3 -2
  430. package/packages/cli/dist/mcp/tools.js.map +1 -1
  431. package/packages/core/dist/.tsbuildinfo +1 -1
  432. package/packages/core/dist/agents/catalog.d.ts +3 -0
  433. package/packages/core/dist/agents/catalog.d.ts.map +1 -1
  434. package/packages/core/dist/agents/catalog.js +1 -0
  435. package/packages/core/dist/agents/catalog.js.map +1 -1
  436. package/packages/core/dist/agents/edit.d.ts +3 -0
  437. package/packages/core/dist/agents/edit.d.ts.map +1 -1
  438. package/packages/core/dist/agents/edit.js +3 -1
  439. package/packages/core/dist/agents/edit.js.map +1 -1
  440. package/packages/core/dist/agents/frontmatter.d.ts +10 -0
  441. package/packages/core/dist/agents/frontmatter.d.ts.map +1 -1
  442. package/packages/core/dist/agents/frontmatter.js +7 -0
  443. package/packages/core/dist/agents/frontmatter.js.map +1 -1
  444. package/packages/core/dist/agents/idle-rollover.d.ts +20 -0
  445. package/packages/core/dist/agents/idle-rollover.d.ts.map +1 -0
  446. package/packages/core/dist/agents/idle-rollover.js +30 -0
  447. package/packages/core/dist/agents/idle-rollover.js.map +1 -0
  448. package/packages/core/dist/agents/index.d.ts +1 -0
  449. package/packages/core/dist/agents/index.d.ts.map +1 -1
  450. package/packages/core/dist/agents/index.js +1 -0
  451. package/packages/core/dist/agents/index.js.map +1 -1
  452. package/packages/core/dist/backup/dump.d.ts +9 -0
  453. package/packages/core/dist/backup/dump.d.ts.map +1 -1
  454. package/packages/core/dist/backup/dump.js +10 -1
  455. package/packages/core/dist/backup/dump.js.map +1 -1
  456. package/packages/core/dist/backup/index.d.ts +1 -0
  457. package/packages/core/dist/backup/index.d.ts.map +1 -1
  458. package/packages/core/dist/backup/index.js +1 -0
  459. package/packages/core/dist/backup/index.js.map +1 -1
  460. package/packages/core/dist/backup/load.d.ts +18 -0
  461. package/packages/core/dist/backup/load.d.ts.map +1 -1
  462. package/packages/core/dist/backup/load.js +3 -2
  463. package/packages/core/dist/backup/load.js.map +1 -1
  464. package/packages/core/dist/backup/pending.d.ts +114 -0
  465. package/packages/core/dist/backup/pending.d.ts.map +1 -0
  466. package/packages/core/dist/backup/pending.js +392 -0
  467. package/packages/core/dist/backup/pending.js.map +1 -0
  468. package/packages/core/dist/backup/restore.d.ts +3 -1
  469. package/packages/core/dist/backup/restore.d.ts.map +1 -1
  470. package/packages/core/dist/backup/restore.js +55 -2
  471. package/packages/core/dist/backup/restore.js.map +1 -1
  472. package/packages/core/dist/feedback/index.d.ts +108 -0
  473. package/packages/core/dist/feedback/index.d.ts.map +1 -0
  474. package/packages/core/dist/feedback/index.js +160 -0
  475. package/packages/core/dist/feedback/index.js.map +1 -0
  476. package/packages/core/dist/home.d.ts +24 -0
  477. package/packages/core/dist/home.d.ts.map +1 -1
  478. package/packages/core/dist/home.js +3 -0
  479. package/packages/core/dist/home.js.map +1 -1
  480. package/packages/core/dist/host/build.d.ts.map +1 -1
  481. package/packages/core/dist/host/build.js +28 -1
  482. package/packages/core/dist/host/build.js.map +1 -1
  483. package/packages/core/dist/host/types.d.ts +29 -2
  484. package/packages/core/dist/host/types.d.ts.map +1 -1
  485. package/packages/core/dist/index.d.ts +1 -0
  486. package/packages/core/dist/index.d.ts.map +1 -1
  487. package/packages/core/dist/index.js +1 -0
  488. package/packages/core/dist/index.js.map +1 -1
  489. package/packages/core/dist/learning/policies.d.ts +7 -1
  490. package/packages/core/dist/learning/policies.d.ts.map +1 -1
  491. package/packages/core/dist/learning/policies.js +4 -1
  492. package/packages/core/dist/learning/policies.js.map +1 -1
  493. package/packages/core/dist/learning/store.d.ts +29 -1
  494. package/packages/core/dist/learning/store.d.ts.map +1 -1
  495. package/packages/core/dist/learning/store.js +33 -8
  496. package/packages/core/dist/learning/store.js.map +1 -1
  497. package/packages/core/dist/learning/types.d.ts +24 -1
  498. package/packages/core/dist/learning/types.d.ts.map +1 -1
  499. package/packages/core/dist/learning/types.js +6 -0
  500. package/packages/core/dist/learning/types.js.map +1 -1
  501. package/packages/core/dist/owner.d.ts +2 -1
  502. package/packages/core/dist/owner.d.ts.map +1 -1
  503. package/packages/core/dist/owner.js.map +1 -1
  504. package/packages/core/dist/pages.d.ts +27 -0
  505. package/packages/core/dist/pages.d.ts.map +1 -1
  506. package/packages/core/dist/pages.js +24 -3
  507. package/packages/core/dist/pages.js.map +1 -1
  508. package/packages/core/dist/plugin/index.d.ts +7 -6
  509. package/packages/core/dist/plugin/index.d.ts.map +1 -1
  510. package/packages/core/dist/plugin/index.js +1 -1
  511. package/packages/core/dist/plugin/index.js.map +1 -1
  512. package/packages/core/dist/plugin/version.d.ts +1 -1
  513. package/packages/core/dist/plugin/version.js +1 -1
  514. package/packages/core/dist/postgres/binaries.d.ts +3 -1
  515. package/packages/core/dist/postgres/binaries.d.ts.map +1 -1
  516. package/packages/core/dist/postgres/binaries.js +15 -23
  517. package/packages/core/dist/postgres/binaries.js.map +1 -1
  518. package/packages/core/dist/postgres/cluster.js +1 -1
  519. package/packages/core/dist/postgres/cluster.js.map +1 -1
  520. package/packages/core/dist/postgres/index.d.ts +1 -0
  521. package/packages/core/dist/postgres/index.d.ts.map +1 -1
  522. package/packages/core/dist/postgres/index.js +1 -0
  523. package/packages/core/dist/postgres/index.js.map +1 -1
  524. package/packages/core/dist/postgres/links.d.ts +15 -0
  525. package/packages/core/dist/postgres/links.d.ts.map +1 -0
  526. package/packages/core/dist/postgres/links.js +98 -0
  527. package/packages/core/dist/postgres/links.js.map +1 -0
  528. package/packages/core/dist/registry.d.ts +10 -1
  529. package/packages/core/dist/registry.d.ts.map +1 -1
  530. package/packages/core/dist/registry.js +13 -0
  531. package/packages/core/dist/registry.js.map +1 -1
  532. package/packages/core/dist/sources/index.d.ts +1 -0
  533. package/packages/core/dist/sources/index.d.ts.map +1 -1
  534. package/packages/core/dist/sources/index.js +1 -0
  535. package/packages/core/dist/sources/index.js.map +1 -1
  536. package/packages/core/dist/sources/watch.d.ts +37 -0
  537. package/packages/core/dist/sources/watch.d.ts.map +1 -0
  538. package/packages/core/dist/sources/watch.js +81 -0
  539. package/packages/core/dist/sources/watch.js.map +1 -0
  540. package/packages/core/dist/tools.d.ts +47 -0
  541. package/packages/core/dist/tools.d.ts.map +1 -1
  542. package/packages/core/dist/tools.js.map +1 -1
  543. package/packages/core/migrations/055_pending_plugin_data.sql +24 -0
  544. package/packages/core/migrations/056_dashboard_sessions.sql +37 -0
  545. package/packages/core/migrations/057_proposal_decided_by.sql +34 -0
  546. package/packages/core/migrations/058_message_feedback.sql +50 -0
  547. package/packages/core/package.json +4 -0
  548. package/packages/gateway/dist/.tsbuildinfo +1 -1
  549. package/packages/gateway/dist/agents/learning-digest.d.ts +7 -1
  550. package/packages/gateway/dist/agents/learning-digest.d.ts.map +1 -1
  551. package/packages/gateway/dist/agents/learning-digest.js +29 -3
  552. package/packages/gateway/dist/agents/learning-digest.js.map +1 -1
  553. package/packages/gateway/dist/agents/platform-files.d.ts +2 -0
  554. package/packages/gateway/dist/agents/platform-files.d.ts.map +1 -1
  555. package/packages/gateway/dist/agents/platform-files.js +2 -0
  556. package/packages/gateway/dist/agents/platform-files.js.map +1 -1
  557. package/packages/gateway/dist/agents/platform.d.ts +20 -0
  558. package/packages/gateway/dist/agents/platform.d.ts.map +1 -1
  559. package/packages/gateway/dist/agents/platform.js +46 -3
  560. package/packages/gateway/dist/agents/platform.js.map +1 -1
  561. package/packages/gateway/dist/agents-cli.d.ts +1 -1
  562. package/packages/gateway/dist/agents-cli.d.ts.map +1 -1
  563. package/packages/gateway/dist/agents-cli.js +12 -2
  564. package/packages/gateway/dist/agents-cli.js.map +1 -1
  565. package/packages/gateway/dist/chat/session.d.ts.map +1 -1
  566. package/packages/gateway/dist/chat/session.js +2 -1
  567. package/packages/gateway/dist/chat/session.js.map +1 -1
  568. package/packages/gateway/dist/mcp/requests.d.ts.map +1 -1
  569. package/packages/gateway/dist/mcp/requests.js +1 -0
  570. package/packages/gateway/dist/mcp/requests.js.map +1 -1
  571. package/packages/gateway/dist/plugins/approve.d.ts.map +1 -1
  572. package/packages/gateway/dist/plugins/approve.js +13 -2
  573. package/packages/gateway/dist/plugins/approve.js.map +1 -1
  574. package/packages/gateway/dist/plugins/migrate.d.ts.map +1 -1
  575. package/packages/gateway/dist/plugins/migrate.js +11 -1
  576. package/packages/gateway/dist/plugins/migrate.js.map +1 -1
  577. package/packages/gateway/dist/plugins/paths.d.ts +14 -0
  578. package/packages/gateway/dist/plugins/paths.d.ts.map +1 -1
  579. package/packages/gateway/dist/plugins/paths.js +27 -1
  580. package/packages/gateway/dist/plugins/paths.js.map +1 -1
  581. package/packages/gateway/dist/plugins/stage.d.ts +27 -3
  582. package/packages/gateway/dist/plugins/stage.d.ts.map +1 -1
  583. package/packages/gateway/dist/plugins/stage.js +35 -5
  584. package/packages/gateway/dist/plugins/stage.js.map +1 -1
  585. package/packages/gateway/dist/plugins-cli.d.ts +4 -0
  586. package/packages/gateway/dist/plugins-cli.d.ts.map +1 -1
  587. package/packages/gateway/dist/plugins-cli.js +42 -9
  588. package/packages/gateway/dist/plugins-cli.js.map +1 -1
  589. package/packages/gateway/dist/serve.d.ts.map +1 -1
  590. package/packages/gateway/dist/serve.js +14 -2
  591. package/packages/gateway/dist/serve.js.map +1 -1
  592. package/packages/gateway/dist/surfaces/browser-continuation.d.ts +2 -1
  593. package/packages/gateway/dist/surfaces/browser-continuation.d.ts.map +1 -1
  594. package/packages/gateway/dist/surfaces/browser-continuation.js +8 -5
  595. package/packages/gateway/dist/surfaces/browser-continuation.js.map +1 -1
  596. package/packages/gateway/dist/surfaces/browser-handoff.d.ts +27 -4
  597. package/packages/gateway/dist/surfaces/browser-handoff.d.ts.map +1 -1
  598. package/packages/gateway/dist/surfaces/browser-handoff.js +57 -7
  599. package/packages/gateway/dist/surfaces/browser-handoff.js.map +1 -1
  600. package/packages/gateway/dist/surfaces/carry-over.d.ts +89 -0
  601. package/packages/gateway/dist/surfaces/carry-over.d.ts.map +1 -0
  602. package/packages/gateway/dist/surfaces/carry-over.js +172 -0
  603. package/packages/gateway/dist/surfaces/carry-over.js.map +1 -0
  604. package/packages/gateway/dist/surfaces/conversation-lifetime.d.ts +5 -2
  605. package/packages/gateway/dist/surfaces/conversation-lifetime.d.ts.map +1 -1
  606. package/packages/gateway/dist/surfaces/conversation-lifetime.js +5 -2
  607. package/packages/gateway/dist/surfaces/conversation-lifetime.js.map +1 -1
  608. package/packages/gateway/dist/telegram/api.d.ts +34 -2
  609. package/packages/gateway/dist/telegram/api.d.ts.map +1 -1
  610. package/packages/gateway/dist/telegram/api.js +15 -2
  611. package/packages/gateway/dist/telegram/api.js.map +1 -1
  612. package/packages/gateway/dist/telegram/env-owner.d.ts +30 -0
  613. package/packages/gateway/dist/telegram/env-owner.d.ts.map +1 -0
  614. package/packages/gateway/dist/telegram/env-owner.js +45 -0
  615. package/packages/gateway/dist/telegram/env-owner.js.map +1 -0
  616. package/packages/gateway/dist/telegram/main.d.ts +0 -2
  617. package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
  618. package/packages/gateway/dist/telegram/main.js +20 -25
  619. package/packages/gateway/dist/telegram/main.js.map +1 -1
  620. package/packages/gateway/dist/telegram/notify.d.ts.map +1 -1
  621. package/packages/gateway/dist/telegram/notify.js +1 -1
  622. package/packages/gateway/dist/telegram/notify.js.map +1 -1
  623. package/packages/gateway/dist/telegram/outbound.d.ts +2 -2
  624. package/packages/gateway/dist/telegram/outbound.d.ts.map +1 -1
  625. package/packages/gateway/dist/telegram/outbound.js +12 -3
  626. package/packages/gateway/dist/telegram/outbound.js.map +1 -1
  627. package/packages/gateway/dist/telegram/reactions.d.ts +45 -0
  628. package/packages/gateway/dist/telegram/reactions.d.ts.map +1 -0
  629. package/packages/gateway/dist/telegram/reactions.js +97 -0
  630. package/packages/gateway/dist/telegram/reactions.js.map +1 -0
  631. package/packages/gateway/dist/telegram/surface.d.ts +27 -1
  632. package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
  633. package/packages/gateway/dist/telegram/surface.js +186 -12
  634. package/packages/gateway/dist/telegram/surface.js.map +1 -1
  635. package/packages/gateway/dist/web/agents.d.ts +7 -1
  636. package/packages/gateway/dist/web/agents.d.ts.map +1 -1
  637. package/packages/gateway/dist/web/agents.js +32 -2
  638. package/packages/gateway/dist/web/agents.js.map +1 -1
  639. package/packages/gateway/dist/web/chat.d.ts +10 -3
  640. package/packages/gateway/dist/web/chat.d.ts.map +1 -1
  641. package/packages/gateway/dist/web/chat.js +18 -5
  642. package/packages/gateway/dist/web/chat.js.map +1 -1
  643. package/packages/gateway/dist/web/plugins.d.ts +6 -1
  644. package/packages/gateway/dist/web/plugins.d.ts.map +1 -1
  645. package/packages/gateway/dist/web/plugins.js +31 -2
  646. package/packages/gateway/dist/web/plugins.js.map +1 -1
  647. package/packages/gateway/dist/web/proposals.d.ts +21 -0
  648. package/packages/gateway/dist/web/proposals.d.ts.map +1 -1
  649. package/packages/gateway/dist/web/proposals.js +50 -1
  650. package/packages/gateway/dist/web/proposals.js.map +1 -1
  651. package/packages/gateway/dist/web/read.d.ts +23 -0
  652. package/packages/gateway/dist/web/read.d.ts.map +1 -1
  653. package/packages/gateway/dist/web/read.js +36 -1
  654. package/packages/gateway/dist/web/read.js.map +1 -1
  655. package/packages/gateway/dist/web/recovery.d.ts +40 -2
  656. package/packages/gateway/dist/web/recovery.d.ts.map +1 -1
  657. package/packages/gateway/dist/web/recovery.js +215 -18
  658. package/packages/gateway/dist/web/recovery.js.map +1 -1
  659. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  660. package/packages/gateway/dist/web/server.js +87 -29
  661. package/packages/gateway/dist/web/server.js.map +1 -1
  662. package/packages/gateway/dist/web/sessions.d.ts +81 -7
  663. package/packages/gateway/dist/web/sessions.d.ts.map +1 -1
  664. package/packages/gateway/dist/web/sessions.js +242 -24
  665. package/packages/gateway/dist/web/sessions.js.map +1 -1
  666. package/packages/gateway/dist/web/signed-out.d.ts +46 -0
  667. package/packages/gateway/dist/web/signed-out.d.ts.map +1 -0
  668. package/packages/gateway/dist/web/signed-out.js +99 -0
  669. package/packages/gateway/dist/web/signed-out.js.map +1 -0
  670. package/packages/gateway/dist/web/tailscale.d.ts +13 -0
  671. package/packages/gateway/dist/web/tailscale.d.ts.map +1 -1
  672. package/packages/gateway/dist/web/tailscale.js +12 -0
  673. package/packages/gateway/dist/web/tailscale.js.map +1 -1
  674. package/packages/install/dist/.tsbuildinfo +1 -1
  675. package/packages/install/dist/backup.d.ts +18 -0
  676. package/packages/install/dist/backup.d.ts.map +1 -1
  677. package/packages/install/dist/backup.js +39 -2
  678. package/packages/install/dist/backup.js.map +1 -1
  679. package/packages/install/dist/kept-data.d.ts +20 -0
  680. package/packages/install/dist/kept-data.d.ts.map +1 -0
  681. package/packages/install/dist/kept-data.js +34 -0
  682. package/packages/install/dist/kept-data.js.map +1 -0
  683. package/packages/install/dist/launcher.d.ts.map +1 -1
  684. package/packages/install/dist/launcher.js +17 -3
  685. package/packages/install/dist/launcher.js.map +1 -1
  686. package/packages/install/dist/postgres-check.d.ts +18 -0
  687. package/packages/install/dist/postgres-check.d.ts.map +1 -0
  688. package/packages/install/dist/postgres-check.js +66 -0
  689. package/packages/install/dist/postgres-check.js.map +1 -0
  690. package/packages/install/dist/upgrade.d.ts +3 -0
  691. package/packages/install/dist/upgrade.d.ts.map +1 -1
  692. package/packages/install/dist/upgrade.js +30 -0
  693. package/packages/install/dist/upgrade.js.map +1 -1
  694. package/packages/runtime/dist/.tsbuildinfo +1 -1
  695. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  696. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  697. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  698. package/packages/tools/email/dist/agent.d.ts.map +1 -1
  699. package/packages/tools/email/dist/agent.js +11 -0
  700. package/packages/tools/email/dist/agent.js.map +1 -1
  701. package/packages/tools/email/dist/imap/fake.d.ts +89 -3
  702. package/packages/tools/email/dist/imap/fake.d.ts.map +1 -1
  703. package/packages/tools/email/dist/imap/fake.js +234 -4
  704. package/packages/tools/email/dist/imap/fake.js.map +1 -1
  705. package/packages/tools/email/dist/imap/imapflow-client.d.ts +14 -1
  706. package/packages/tools/email/dist/imap/imapflow-client.d.ts.map +1 -1
  707. package/packages/tools/email/dist/imap/imapflow-client.js +157 -2
  708. package/packages/tools/email/dist/imap/imapflow-client.js.map +1 -1
  709. package/packages/tools/email/dist/index.d.ts +14 -2
  710. package/packages/tools/email/dist/index.d.ts.map +1 -1
  711. package/packages/tools/email/dist/index.js +23 -4
  712. package/packages/tools/email/dist/index.js.map +1 -1
  713. package/packages/tools/email/dist/logins.d.ts +24 -0
  714. package/packages/tools/email/dist/logins.d.ts.map +1 -0
  715. package/packages/tools/email/dist/logins.js +35 -0
  716. package/packages/tools/email/dist/logins.js.map +1 -0
  717. package/packages/tools/email/dist/mail.d.ts +14 -0
  718. package/packages/tools/email/dist/mail.d.ts.map +1 -1
  719. package/packages/tools/email/dist/mail.js +23 -0
  720. package/packages/tools/email/dist/mail.js.map +1 -1
  721. package/packages/tools/email/dist/mailbox/actions.d.ts +205 -0
  722. package/packages/tools/email/dist/mailbox/actions.d.ts.map +1 -0
  723. package/packages/tools/email/dist/mailbox/actions.js +662 -0
  724. package/packages/tools/email/dist/mailbox/actions.js.map +1 -0
  725. package/packages/tools/email/dist/mailbox/arrival.d.ts +61 -0
  726. package/packages/tools/email/dist/mailbox/arrival.d.ts.map +1 -0
  727. package/packages/tools/email/dist/mailbox/arrival.js +153 -0
  728. package/packages/tools/email/dist/mailbox/arrival.js.map +1 -0
  729. package/packages/tools/email/dist/mailbox/select.d.ts +53 -0
  730. package/packages/tools/email/dist/mailbox/select.d.ts.map +1 -0
  731. package/packages/tools/email/dist/mailbox/select.js +117 -0
  732. package/packages/tools/email/dist/mailbox/select.js.map +1 -0
  733. package/packages/tools/email/dist/pages/accounts.d.ts +37 -1
  734. package/packages/tools/email/dist/pages/accounts.d.ts.map +1 -1
  735. package/packages/tools/email/dist/pages/accounts.js +104 -2
  736. package/packages/tools/email/dist/pages/accounts.js.map +1 -1
  737. package/packages/tools/email/dist/pages/descriptors.d.ts.map +1 -1
  738. package/packages/tools/email/dist/pages/descriptors.js +142 -0
  739. package/packages/tools/email/dist/pages/descriptors.js.map +1 -1
  740. package/packages/tools/email/dist/pages/drafts-tools.d.ts +2 -2
  741. package/packages/tools/email/dist/pages/format.d.ts +1 -12
  742. package/packages/tools/email/dist/pages/format.d.ts.map +1 -1
  743. package/packages/tools/email/dist/pages/format.js +17 -0
  744. package/packages/tools/email/dist/pages/format.js.map +1 -1
  745. package/packages/tools/email/dist/pages/index.d.ts.map +1 -1
  746. package/packages/tools/email/dist/pages/index.js +5 -1
  747. package/packages/tools/email/dist/pages/index.js.map +1 -1
  748. package/packages/tools/email/dist/pages/policies-tools.d.ts +7 -0
  749. package/packages/tools/email/dist/pages/policies-tools.d.ts.map +1 -1
  750. package/packages/tools/email/dist/pages/policies-tools.js +11 -2
  751. package/packages/tools/email/dist/pages/policies-tools.js.map +1 -1
  752. package/packages/tools/email/dist/pages/queries.d.ts +16 -0
  753. package/packages/tools/email/dist/pages/queries.d.ts.map +1 -1
  754. package/packages/tools/email/dist/pages/queries.js +154 -3
  755. package/packages/tools/email/dist/pages/queries.js.map +1 -1
  756. package/packages/tools/email/dist/policies/auto.d.ts +133 -0
  757. package/packages/tools/email/dist/policies/auto.d.ts.map +1 -0
  758. package/packages/tools/email/dist/policies/auto.js +241 -0
  759. package/packages/tools/email/dist/policies/auto.js.map +1 -0
  760. package/packages/tools/email/dist/policies/gate.d.ts +34 -10
  761. package/packages/tools/email/dist/policies/gate.d.ts.map +1 -1
  762. package/packages/tools/email/dist/policies/gate.js +27 -12
  763. package/packages/tools/email/dist/policies/gate.js.map +1 -1
  764. package/packages/tools/email/dist/policies/learn.d.ts +26 -18
  765. package/packages/tools/email/dist/policies/learn.d.ts.map +1 -1
  766. package/packages/tools/email/dist/policies/learn.js +36 -10
  767. package/packages/tools/email/dist/policies/learn.js.map +1 -1
  768. package/packages/tools/email/dist/policies/learned.d.ts +25 -2
  769. package/packages/tools/email/dist/policies/learned.d.ts.map +1 -1
  770. package/packages/tools/email/dist/policies/learned.js +47 -5
  771. package/packages/tools/email/dist/policies/learned.js.map +1 -1
  772. package/packages/tools/email/dist/policies/store.d.ts +8 -2
  773. package/packages/tools/email/dist/policies/store.d.ts.map +1 -1
  774. package/packages/tools/email/dist/policies/store.js +19 -5
  775. package/packages/tools/email/dist/policies/store.js.map +1 -1
  776. package/packages/tools/email/dist/ports.d.ts +79 -0
  777. package/packages/tools/email/dist/ports.d.ts.map +1 -1
  778. package/packages/tools/email/dist/ports.js +6 -0
  779. package/packages/tools/email/dist/ports.js.map +1 -1
  780. package/packages/tools/email/dist/rows.d.ts.map +1 -1
  781. package/packages/tools/email/dist/rows.js +3 -1
  782. package/packages/tools/email/dist/rows.js.map +1 -1
  783. package/packages/tools/email/dist/sources/idle.d.ts +90 -0
  784. package/packages/tools/email/dist/sources/idle.d.ts.map +1 -0
  785. package/packages/tools/email/dist/sources/idle.js +250 -0
  786. package/packages/tools/email/dist/sources/idle.js.map +1 -0
  787. package/packages/tools/email/dist/sources/inbox-poll.d.ts +12 -1
  788. package/packages/tools/email/dist/sources/inbox-poll.d.ts.map +1 -1
  789. package/packages/tools/email/dist/sources/inbox-poll.js +280 -134
  790. package/packages/tools/email/dist/sources/inbox-poll.js.map +1 -1
  791. package/packages/tools/email/dist/tools/mailbox.d.ts +108 -0
  792. package/packages/tools/email/dist/tools/mailbox.d.ts.map +1 -0
  793. package/packages/tools/email/dist/tools/mailbox.js +359 -0
  794. package/packages/tools/email/dist/tools/mailbox.js.map +1 -0
  795. package/packages/tools/email/dist/tools/policies.d.ts +8 -2
  796. package/packages/tools/email/dist/tools/policies.d.ts.map +1 -1
  797. package/packages/tools/email/dist/tools/policies.js +43 -3
  798. package/packages/tools/email/dist/tools/policies.js.map +1 -1
  799. package/packages/tools/email/dist/tools/read.d.ts +2 -2
  800. package/packages/tools/email/dist/tools/triage.d.ts.map +1 -1
  801. package/packages/tools/email/dist/tools/triage.js +10 -4
  802. package/packages/tools/email/dist/tools/triage.js.map +1 -1
  803. package/packages/tools/email/migrations/017_mailbox_actions.sql +60 -0
  804. package/packages/tools/email/migrations/018_learned_auto.sql +30 -0
  805. package/packages/tools/email/migrations/019_arrival_pending.sql +26 -0
  806. package/packages/tools/email/package.json +3 -2
  807. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  808. package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
  809. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  810. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  811. package/packages/web/dist/assets/index-CKuhKCWw.js +131 -0
  812. package/packages/web/dist/assets/index-DsK8UWCJ.css +1 -0
  813. package/packages/web/dist/assets/{lottie_light-7wQnGwdw.js → lottie_light-CSeMXM8D.js} +1 -1
  814. package/packages/web/dist/build.json +1 -1
  815. package/packages/web/dist/index.html +2 -2
  816. package/packages/web/dist/precache.json +4 -4
  817. package/packages/web/dist/assets/index-BxbiKNMS.css +0 -1
  818. package/packages/web/dist/assets/index-Rrze3bGo.js +0 -130
@@ -0,0 +1,241 @@
1
+ import { localDateString } from '@buddi/core/plugin';
2
+ import { isNoReplyAddress, normalizeAddress } from '../mail.js';
3
+ import { learnedKind, ruleOf, writeLearnedRule } from './learned.js';
4
+ import { policyForSender, revokePolicy, toPolicy, POLICY_COLUMNS } from './store.js';
5
+ /** The actions that only quiet a sender. */
6
+ export const QUIET_ACTIONS = ['ignore'];
7
+ /** The on-arrival actions a rule that keeps itself may carry. */
8
+ export const QUIET_ARRIVALS = ['archive', 'mark-read'];
9
+ /**
10
+ * May this rule keep itself, and why. Pure: the facts are read by the caller.
11
+ * Null is the answer far more often than not, and then it is a card.
12
+ */
13
+ export function mayKeepItself(input) {
14
+ if (input.ownerHasWritten)
15
+ return null;
16
+ if (input.scope !== 'sender')
17
+ return null;
18
+ if (!QUIET_ACTIONS.includes(input.action))
19
+ return null;
20
+ const arrival = input.params?.onArrival;
21
+ if (arrival && !QUIET_ARRIVALS.includes(arrival.kind))
22
+ return null;
23
+ if (input.bulk)
24
+ return 'bulk';
25
+ if (input.trusted)
26
+ return 'track-record';
27
+ return null;
28
+ }
29
+ /**
30
+ * Is this sender's mail sent to many, in this account? A no-reply address, or
31
+ * any message from them that carried `List-Unsubscribe` / `Precedence: bulk`
32
+ * (`bulk`) or a `List-Id`.
33
+ */
34
+ export async function isBulkSender(db, accountId, address) {
35
+ const matcher = normalizeAddress(address);
36
+ if (matcher === '' || !accountId)
37
+ return false;
38
+ if (isNoReplyAddress(matcher))
39
+ return true;
40
+ const { rows } = await db.query(`select exists (
41
+ select 1 from email.messages m
42
+ where m.account_id = $2::uuid and m.direction = 'in'
43
+ and email.address_of(m.from_addr) = $1
44
+ and (m.bulk or m.list_id is not null)
45
+ ) as bulk`, [matcher, accountId]);
46
+ return rows[0]?.bulk === true;
47
+ }
48
+ /**
49
+ * Has the owner ever sent mail to this address, from **any** mailbox? Stricter
50
+ * than the per-account veto on proposals: a rule that keeps itself does not
51
+ * get the benefit of a history split across accounts.
52
+ */
53
+ export async function ownerHasWrittenAnywhere(db, address) {
54
+ const matcher = normalizeAddress(address);
55
+ if (matcher === '')
56
+ return true;
57
+ const { rows } = await db.query(`select count(*)::int as n from email.messages m
58
+ where m.direction = 'out'
59
+ and (
60
+ exists (select 1 from jsonb_array_elements_text(m.to_addrs) as a(addr) where email.address_of(a.addr) = $1)
61
+ or exists (select 1 from jsonb_array_elements_text(m.cc) as a(addr) where email.address_of(a.addr) = $1)
62
+ )`, [matcher]);
63
+ return Number(rows[0]?.n ?? 0) > 0;
64
+ }
65
+ /**
66
+ * Propose the rule and keep it in one transaction: the card (never
67
+ * announced), the rule through the same apply as a kept card, and the card
68
+ * marked kept by `auto`. Returns the kept card, or null when the owner
69
+ * discarded the same rule in the last 90 days (then nothing happens at all)
70
+ * or the rule could not be written (then the caller proposes it as a card).
71
+ */
72
+ export async function keepLearnedItself(host, ask, reason, now, run) {
73
+ try {
74
+ return await host.db.transaction(async (tx) => {
75
+ const result = await host.proposals.proposePolicy(run, ask, tx, { announce: false });
76
+ const card = result.ok ? result.proposal : result.reason === 'already-open' ? result.existing : null;
77
+ if (!card)
78
+ return null;
79
+ return keepCardItself(host, tx, card, reason, now);
80
+ });
81
+ }
82
+ catch (err) {
83
+ if (err instanceof NotKept)
84
+ return null;
85
+ throw err;
86
+ }
87
+ }
88
+ class NotKept extends Error {
89
+ }
90
+ /** Write the rule an open card describes and mark the card kept by `auto`, inside `tx`. Throws `NotKept` to roll back. */
91
+ async function keepCardItself(host, tx, card, reason, now) {
92
+ const written = await writeLearnedRule(tx, card, now, { keptBy: 'auto', autoReason: reason });
93
+ if (!written.ok)
94
+ throw new NotKept(written.note);
95
+ const kept = await host.proposals.keepItself(card.id, tx);
96
+ if (!kept)
97
+ throw new NotKept('the card was decided meanwhile');
98
+ return kept;
99
+ }
100
+ /**
101
+ * The one-time sweep, run on every start and idempotent: every open email
102
+ * card that qualifies as bulk today is kept the same way, so the pile that
103
+ * was waiting before this build disappears into Learned. Only the `bulk`
104
+ * reason: the track record decides new rules, not ones already waiting.
105
+ * A sender with a live rule of any kind is left alone — that rule is the
106
+ * owner's. Returns how many were kept.
107
+ */
108
+ export async function sweepOpenBulkCards(host, now) {
109
+ const open = await host.proposals.listOpen();
110
+ let kept = 0;
111
+ for (const card of open) {
112
+ const rule = ruleOf(card.payload);
113
+ if (!rule.ok || !rule.accountId)
114
+ continue;
115
+ const ownerHasWritten = await ownerHasWrittenAnywhere(host.db, rule.matcher);
116
+ const bulk = rule.scope === 'sender' ? await isBulkSender(host.db, rule.accountId, rule.matcher) : false;
117
+ const reason = mayKeepItself({ scope: rule.scope, action: rule.action, params: rule.params, ownerHasWritten, bulk, trusted: false });
118
+ if (reason !== 'bulk')
119
+ continue;
120
+ if (await policyForSender(host.db, rule.matcher, rule.accountId))
121
+ continue;
122
+ try {
123
+ await host.db.transaction((tx) => keepCardItself(host, tx, card, reason, now));
124
+ kept += 1;
125
+ }
126
+ catch (err) {
127
+ if (!(err instanceof NotKept))
128
+ throw err;
129
+ }
130
+ }
131
+ return kept;
132
+ }
133
+ /** The kind an old card is, when it carries none (cards from before kinds). */
134
+ export function kindOfCard(card) {
135
+ if (typeof card.payload.kind === 'string' && card.payload.kind)
136
+ return card.payload.kind;
137
+ const params = (card.payload.params ?? {});
138
+ return learnedKind(String(card.payload.action ?? ''), params.category);
139
+ }
140
+ /* ------------------------------------------------------------------ *
141
+ * The owner hears about it once a day
142
+ * ------------------------------------------------------------------ */
143
+ /** The Mail page, where Learned lists them. */
144
+ export const LEARNED_ROUTE = '#/p/email/mail';
145
+ /** How many rules kept themselves on the owner's local day, by reason. Undone ones are not counted. */
146
+ export async function learnedOn(db, day, timezone) {
147
+ const { rows } = await db.query(`select count(*) filter (where auto_reason = 'bulk')::int as bulk,
148
+ count(*) filter (where auto_reason is distinct from 'bulk')::int as track
149
+ from email.policies
150
+ where kept_by = 'auto' and revoked_at is null
151
+ and (kept_at at time zone $2)::date = $1::date`, [day, timezone]);
152
+ return { bulk: Number(rows[0]?.bulk ?? 0), trackRecord: Number(rows[0]?.track ?? 0) };
153
+ }
154
+ function plural(n, one, many = `${one}s`) {
155
+ return `${n} ${n === 1 ? one : many}`;
156
+ }
157
+ /** "buddi learned 7 rules: quieted 5 newsletters and 2 senders — review". */
158
+ export function learnedLine(counts) {
159
+ const total = counts.bulk + counts.trackRecord;
160
+ if (total === 0)
161
+ return null;
162
+ const parts = [
163
+ counts.bulk > 0 ? plural(counts.bulk, 'newsletter') : null,
164
+ counts.trackRecord > 0 ? plural(counts.trackRecord, 'sender') : null,
165
+ ].filter((p) => p !== null);
166
+ return `buddi learned ${plural(total, 'rule')}: quieted ${parts.join(' and ')} — review`;
167
+ }
168
+ /**
169
+ * Tell the owner what kept itself today, in one line. Keyed per local day,
170
+ * so every call on the same day updates the one waiting line rather than
171
+ * adding another, at the `today` urgency (the end-of-day message). Nothing is
172
+ * sent when nothing kept itself. Never throws: the rules stand either way.
173
+ */
174
+ export async function tellOwnerLearned(host, now) {
175
+ const notify = host.owner.notify;
176
+ if (!notify)
177
+ return null;
178
+ try {
179
+ const timezone = host.owner.timezone || 'UTC';
180
+ const day = localDateString(now, timezone);
181
+ const title = learnedLine(await learnedOn(host.db, day, timezone));
182
+ if (!title)
183
+ return null;
184
+ await notify({
185
+ urgency: 'today',
186
+ title,
187
+ text: 'Each is under Learned on the Mail page, with Undo.',
188
+ link: { route: LEARNED_ROUTE },
189
+ dedupeKey: `learned:${day}`,
190
+ });
191
+ return title;
192
+ }
193
+ catch (err) {
194
+ console.error(`email: could not tell the owner what it learned: ${err instanceof Error ? err.message : String(err)}`);
195
+ return null;
196
+ }
197
+ }
198
+ /** The rules that kept themselves, newest first, undone ones included (they say so). */
199
+ export async function learnedRules(db, limit = 50) {
200
+ const { rows } = await db.query(`select ${POLICY_COLUMNS},
201
+ coalesce((select array_agg(a.id::text order by a.created_at desc)
202
+ from email.mailbox_actions a
203
+ where a.policy_id = p.id and a.kind <> 'undo' and a.undone_at is null), '{}') as arrival_changes
204
+ from email.policies p
205
+ where p.kept_by = 'auto'
206
+ order by p.kept_at desc nulls last, p.id desc
207
+ limit $1`, [limit]);
208
+ return rows.map((row) => {
209
+ const policy = toPolicy(row);
210
+ return {
211
+ id: policy.id,
212
+ accountId: policy.accountId,
213
+ matcher: policy.matcher,
214
+ action: policy.action,
215
+ params: policy.params,
216
+ autoReason: policy.autoReason ?? null,
217
+ keptAt: policy.keptAt ?? null,
218
+ revokedAt: policy.revokedAt,
219
+ proposalId: policy.proposalId ?? null,
220
+ arrivalChanges: Array.isArray(row.arrival_changes) ? row.arrival_changes.map(String) : [],
221
+ };
222
+ });
223
+ }
224
+ /**
225
+ * Undo a rule that kept itself: revoke it, and turn its card into the
226
+ * owner's discard — so the same rule is not learned again for 90 days and the
227
+ * kind's track record starts over. Returns the rule as it is now, or null.
228
+ */
229
+ export async function undoLearnedRule(host, id, now) {
230
+ const rules = await learnedRules(host.db, 500);
231
+ const rule = rules.find((r) => r.id === id);
232
+ if (!rule)
233
+ return null;
234
+ await host.db.transaction(async (tx) => {
235
+ await revokePolicy(tx, id, now);
236
+ if (rule.proposalId)
237
+ await host.proposals.takeBack(rule.proposalId, { reason: 'undone by the owner', within: tx });
238
+ });
239
+ return { ...rule, revokedAt: rule.revokedAt ?? now.toISOString() };
240
+ }
241
+ //# sourceMappingURL=auto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto.js","sourceRoot":"","sources":["../../src/policies/auto.ts"],"names":[],"mappings":"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"}
@@ -3,18 +3,28 @@ export type PolicyScope = (typeof POLICY_SCOPES)[number];
3
3
  export declare const POLICY_ACTIONS: readonly ["ignore", "archive", "label", "notify", "draft", "hand-to-agent", "wake"];
4
4
  export type PolicyAction = (typeof POLICY_ACTIONS)[number];
5
5
  export declare const POLICY_ORIGINS: readonly ["owner", "learned", "plugin"];
6
+ /** What a rule may do in the mailbox when a message it matches arrives. */
7
+ export declare const ARRIVAL_KINDS: readonly ["archive", "mark-read", "move"];
8
+ export type ArrivalKind = (typeof ARRIVAL_KINDS)[number];
9
+ export interface ArrivalAction {
10
+ kind: ArrivalKind;
11
+ /** `move`: the folder or Gmail label, by its server name. */
12
+ folder?: string;
13
+ }
14
+ /** The words a policy card and an approval use for an on-arrival action. */
15
+ export declare function arrivalWords(action: ArrivalAction | undefined | null): string | null;
6
16
  export type PolicyOrigin = (typeof POLICY_ORIGINS)[number];
7
17
  /**
8
- * Actions that need an IMAP write this client does not have.
18
+ * Actions that are vocabulary, not behaviour.
9
19
  *
10
- * `ImapClient` is a peek-only port by construction (`ports.ts`): reading mail
11
- * must not mutate it, and nothing in this build can set a flag or move a
12
- * message. So `archive` and `label` are part of the vocabulary — they are what
13
- * the owner will want, and refusing to *name* them would be a worse lie than
14
- * refusing to perform them — and both are refused at the point a policy is
15
- * created, with "not yet". Should a row carrying one reach the gate anyway
16
- * (written by an older build, or by hand), the gate refuses it and falls
17
- * through to a run rather than silently dropping the message.
20
+ * `archive` and `label` are what an owner might ask a rule to do, and refusing
21
+ * to *name* them would be a worse lie than refusing them. They are refused as
22
+ * a rule's action at the point a policy is created: a rule that should archive
23
+ * matching mail picks a real action and carries an on-arrival mailbox action
24
+ * (`params.onArrival`, carried out by `mailbox/arrival.ts`). Should a row
25
+ * carrying one reach the gate anyway (written by an older build, or by hand),
26
+ * the gate refuses it and falls through to a run rather than silently
27
+ * dropping the message.
18
28
  */
19
29
  export declare const UNIMPLEMENTED_ACTIONS: readonly PolicyAction[];
20
30
  export declare function isUnimplementedAction(action: PolicyAction): boolean;
@@ -31,6 +41,14 @@ export interface PolicyParams {
31
41
  /** `ignore`: the triage row written from the policy. */
32
42
  category?: string;
33
43
  urgency?: 'urgent' | 'normal' | 'low';
44
+ /**
45
+ * What the rule also does in the mailbox itself, the moment a matching
46
+ * message arrives: archive it, mark it read, or move it to a folder that
47
+ * already exists. Any action may carry one (an `ignore` that also
48
+ * archives is the common case). Applied by `mailbox/arrival.ts` after the
49
+ * gate, recorded on the undo trail like any other mailbox change.
50
+ */
51
+ onArrival?: ArrivalAction;
34
52
  /**
35
53
  * `thread` and `list-id`: the sender this policy was created about.
36
54
  *
@@ -57,8 +75,14 @@ export interface PolicyRecord {
57
75
  }>;
58
76
  createdAt: string | null;
59
77
  revokedAt: string | null;
60
- /** When the owner kept it from Settings → Proposals; null for any other rule. */
78
+ /** When it was kept from Settings → Proposals, or kept itself; null for any other rule. */
61
79
  keptAt?: string | null;
80
+ /** Who kept a learned rule: the owner, or the plugin itself under its own rule (`auto.ts`). */
81
+ keptBy?: 'owner' | 'auto' | null;
82
+ /** The `core.proposals` card it came from, when it came from one. */
83
+ proposalId?: string | null;
84
+ /** Why a rule kept itself: `bulk` or `track-record`. */
85
+ autoReason?: string | null;
62
86
  }
63
87
  /** Everything the gate is allowed to look at. Deliberately not the body. */
64
88
  export interface MessageHeader {
@@ -1 +1 @@
1
- {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/policies/gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/policies/gate.ts"],"names":[],"mappings":"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"}
@@ -16,9 +16,9 @@
16
16
  * What the gate never does:
17
17
  *
18
18
  * - It never reads a *proposed* policy. Everything learned is a proposal on
19
- * the settings page until the owner keeps it — promo included. Nothing
20
- * learned applies itself while the Sent folder is unsynced (docs/email.md
21
- * §3): "never replied" cannot be known from mail buddi has not read.
19
+ * the settings page until it is kept — by the owner, or by itself for the
20
+ * narrow class `auto.ts` allows (a quiet rule for a bulk sender the owner
21
+ * never wrote to). A kept row is a kept row either way.
22
22
  * - It never reads a revoked one. Revocation keeps the row as a record; it
23
23
  * does not keep its effect.
24
24
  * - It never trusts the message. A From header is forged as easily as it is
@@ -48,17 +48,32 @@ export const POLICY_ACTIONS = [
48
48
  'wake',
49
49
  ];
50
50
  export const POLICY_ORIGINS = ['owner', 'learned', 'plugin'];
51
+ /** What a rule may do in the mailbox when a message it matches arrives. */
52
+ export const ARRIVAL_KINDS = ['archive', 'mark-read', 'move'];
53
+ /** The words a policy card and an approval use for an on-arrival action. */
54
+ export function arrivalWords(action) {
55
+ if (!action)
56
+ return null;
57
+ switch (action.kind) {
58
+ case 'archive':
59
+ return 'archive it in your mailbox';
60
+ case 'mark-read':
61
+ return 'mark it read in your mailbox';
62
+ case 'move':
63
+ return `move it to ${action.folder ?? '(no folder named)'} in your mailbox`;
64
+ }
65
+ }
51
66
  /**
52
- * Actions that need an IMAP write this client does not have.
67
+ * Actions that are vocabulary, not behaviour.
53
68
  *
54
- * `ImapClient` is a peek-only port by construction (`ports.ts`): reading mail
55
- * must not mutate it, and nothing in this build can set a flag or move a
56
- * message. So `archive` and `label` are part of the vocabulary — they are what
57
- * the owner will want, and refusing to *name* them would be a worse lie than
58
- * refusing to perform them — and both are refused at the point a policy is
59
- * created, with "not yet". Should a row carrying one reach the gate anyway
60
- * (written by an older build, or by hand), the gate refuses it and falls
61
- * through to a run rather than silently dropping the message.
69
+ * `archive` and `label` are what an owner might ask a rule to do, and refusing
70
+ * to *name* them would be a worse lie than refusing them. They are refused as
71
+ * a rule's action at the point a policy is created: a rule that should archive
72
+ * matching mail picks a real action and carries an on-arrival mailbox action
73
+ * (`params.onArrival`, carried out by `mailbox/arrival.ts`). Should a row
74
+ * carrying one reach the gate anyway (written by an older build, or by hand),
75
+ * the gate refuses it and falls through to a run rather than silently
76
+ * dropping the message.
62
77
  */
63
78
  export const UNIMPLEMENTED_ACTIONS = ['archive', 'label'];
64
79
  export function isUnimplementedAction(action) {
@@ -1 +1 @@
1
- {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/policies/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAGhF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,OAAO;IACP,eAAe;IACf,MAAM;CACE,CAAC;AAGX,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAGtE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA4B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAEnF,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,OAAO,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AA2ED,4EAA4E;AAC5E,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,OAAO,CAAC,MAAoB,EAAE,MAAqB;IACjE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACjC,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACjD,OAAO,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC;QACzD,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,uEAAuE;YACvE,gEAAgE;YAChE,wEAAwE;YACxE,gEAAgE;YAChE,8DAA8D;YAC9D,iEAAiE;YACjE,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;YACtD,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,eAAe,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,MAAM,CAAC,MAAoB,EAAE,SAAyB;IACpE,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACnG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wDAAwD;AACxD,SAAS,UAAU,CAAC,CAAe,EAAE,CAAe;IAClD,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC9B,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,SAAS,oBAAoB,CAC3B,MAAoB,EACpB,MAAqB,EACrB,IAA6B;IAE7B,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC9D,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,QAAQ,KAAK,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,IAAI,CACd,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CACrG,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,QAAiC;IAEjC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACvF,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;aAChC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;aACpD,IAAI,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,OAAO;gBACL,MAAM;gBACN,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,IAAI;gBACb,MAAM,EACJ,UAAU,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,YAAY,MAAM,CAAC,MAAM,iBAAiB;oBAClF,kEAAkE;aACrE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM;YACN,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC;SACjC,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,6CAA6C;KACtD,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;IAClD,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,QAAQ;YACX,OAAO,wBAAwB,KAAK,mBAAmB,CAAC;QAC1D,KAAK,QAAQ;YACX,OAAO,aAAa,KAAK,iCAAiC,CAAC;QAC7D,KAAK,eAAe;YAClB,OAAO,aAAa,KAAK,0BAA0B,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,kBAAkB,GAAG,CAAC;QACpG,KAAK,OAAO;YACV,OAAO,aAAa,KAAK,2BAA2B,CAAC;QACvD,KAAK,MAAM;YACT,OAAO,aAAa,KAAK,kCAAkC,CAAC;QAC9D;YACE,OAAO,aAAa,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC;IACnD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/policies/gate.ts"],"names":[],"mappings":"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"}
@@ -9,16 +9,18 @@
9
9
  * sender judged promo, promo, reply-needed, promo is a sender the owner may
10
10
  * well hear from, and the run is counted from the newest verdict back, so
11
11
  * one dissenting judgement resets it.
12
- * - **Nothing applies itself.** A proposal is a card on the owner's
13
- * Settings → Proposals inbox (`core.proposals`, docs/learning.md §2
14
- * item 3), beside what the agents propose; this plugin writes no rule until
15
- * the owner keeps it there, and then writes it through its own apply
16
- * (`learned.ts`). The gate reads only kept rows. Promo is no exception. Since step 3 the
17
- * Sent folder is synced, so "the owner never wrote back" is read off his own
18
- * mail rather than inferred from drafts buddi sent — but a mailbox is synced
19
- * from *now*, not from its beginning, and a sender answered before buddi
20
- * arrived still looks unanswered. Silencing somebody on a history this
21
- * installation has only part of stays the owner's tap to make.
12
+ * - **A card, unless the rule only quiets a bulk sender.** A proposal is a
13
+ * card on the owner's Settings → Proposals inbox (`core.proposals`,
14
+ * docs/learning.md §2 item 3), beside what the agents propose; this plugin
15
+ * writes no rule until the owner keeps it there, and then writes it through
16
+ * its own apply (`learned.ts`). The gate reads only kept rows. The
17
+ * exception is `auto.ts`: a rule that only quiets a sender the owner never
18
+ * wrote to keeps itself when the sender's mail is bulk (List-Unsubscribe,
19
+ * List-Id, Precedence, a no-reply address) or the owner has kept five of
20
+ * its kind running. It is still recorded as a kept card, listed under
21
+ * Learned on the Mail page with Undo, and the owner hears about it once a
22
+ * day. Anyone else stays a card: a mailbox is synced from *now*, and a
23
+ * person answered before buddi arrived still looks unanswered.
22
24
  * - **The owner writing back vetoes silence.** Any proposal that would stop a
23
25
  * run is refused for a sender the owner has actually sent mail to. A person
24
26
  * who gets answers is not a newsletter, whatever the categories say.
@@ -29,8 +31,9 @@
29
31
  * The rule is a pure function; the query around it is the only database part.
30
32
  */
31
33
  import type { DbArea } from '@buddi/core/plugin';
32
- import type { ProposalsArea, Proposal as CoreProposal, ToolContext } from '@buddi/core/plugin';
34
+ import type { Proposal as CoreProposal, ToolContext } from '@buddi/core/plugin';
33
35
  import type { PolicyAction } from './gate.js';
36
+ import { type AutoHost, type AutoReason } from './auto.js';
34
37
  /** `ctx.buddi.db`, a transaction's handle, or anything that answers a query as they do. */
35
38
  type Db = Pick<DbArea, 'query'>;
36
39
  /** How many verdicts running make a pattern. Three: two is a coincidence. */
@@ -44,7 +47,9 @@ export interface Verdict {
44
47
  }
45
48
  export interface Proposal {
46
49
  action: PolicyAction;
47
- /** Always true today: nothing learned applies itself. See the module note. */
50
+ /** The rule's kind (`learned.ts`, `LEARNED_KIND_LABELS`). */
51
+ kind: 'quiet-promo-sender' | 'quiet-low-sender' | 'notify-sender';
52
+ /** True: the pure rule proposes. Whether it keeps itself is `auto.ts`'s, on facts read around it. */
48
53
  proposed: boolean;
49
54
  /** The verdicts it was learned from, newest first. */
50
55
  createdFrom: Array<{
@@ -112,17 +117,20 @@ export interface OwnerReplies {
112
117
  * out of the average rather than guessed at.
113
118
  */
114
119
  export declare function ownerReplies(db: Db, accountId: string, address: string): Promise<OwnerReplies>;
115
- /** What `learnFromVerdict` proposed: a new card on the owner's inbox. */
120
+ /** What `learnFromVerdict` learned: a new card on the owner's inbox, or a rule that kept itself. */
116
121
  export interface LearnedPolicy {
117
122
  proposal: CoreProposal;
118
123
  action: PolicyAction;
119
124
  matcher: string;
125
+ /** Set when the rule kept itself rather than waiting on a card, and why. */
126
+ keptItself: AutoReason | null;
120
127
  }
121
128
  /**
122
- * Called after a verdict is recorded. Proposes at most one rule on the
123
- * owner's Proposals inbox and returns it, or null when nothing was learned —
124
- * which is the usual answer. The rule itself is written only when the owner
125
- * keeps the card (`learned.ts`, `applyLearnedPolicy`).
129
+ * Called after a verdict is recorded. Learns at most one rule and returns it,
130
+ * or null when nothing was learned — which is the usual answer. The rule is a
131
+ * card the owner keeps (`learned.ts`, `applyLearnedPolicy`), unless it only
132
+ * quiets a sender `auto.ts` allows it to keep itself for; then it is written
133
+ * at once, recorded as kept by `auto`, and the owner's daily line is updated.
126
134
  *
127
135
  * A sender that already has a live policy learns nothing: whatever is there is
128
136
  * the owner's decision, and overwriting it would be this plugin arguing with
@@ -134,7 +142,7 @@ export interface LearnedPolicy {
134
142
  * untrusted, so the messages are the proposal's sources — by subject and
135
143
  * sender, never by body.
136
144
  */
137
- export declare function learnFromVerdict(db: Db, proposals: ProposalsArea, input: {
145
+ export declare function learnFromVerdict(host: AutoHost, input: {
138
146
  from: string;
139
147
  accountId: string;
140
148
  }, now: Date, run?: Pick<ToolContext, 'agentId' | 'conversationId' | 'toolUseId' | 'provenance'> | null): Promise<LearnedPolicy | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"learn.d.ts","sourceRoot":"","sources":["../../src/policies/learn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,IAAI,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAG/F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG9C,2FAA2F;AAC3F,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhC,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,WAAW,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,eAAe,EAAE,OAAO,GACvB,QAAQ,GAAG,IAAI,CA2CjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAA4B,GAClC,OAAO,CAAC,OAAO,EAAE,CAAC,CA0BpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAED,4EAA4E;AAC5E,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CA0CvB;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1C,GAAG,EAAE,IAAI,EACT,GAAG,GAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,gBAAgB,GAAG,WAAW,GAAG,YAAY,CAAC,GAAG,IAAW,GAC9F,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAiC/B"}
1
+ {"version":3,"file":"learn.d.ts","sourceRoot":"","sources":["../../src/policies/learn.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { normalizeAddress } from '../mail.js';
2
2
  import { policyForSender } from './store.js';
3
3
  import { learnedPolicyInput, mailSources } from './learned.js';
4
+ import { isBulkSender, keepLearnedItself, mayKeepItself, ownerHasWrittenAnywhere, tellOwnerLearned } from './auto.js';
4
5
  /** How many verdicts running make a pattern. Three: two is a coincidence. */
5
6
  export const CONSISTENT_VERDICTS = 3;
6
7
  /**
@@ -27,6 +28,7 @@ export function learnedProposal(verdicts, ownerHasReplied) {
27
28
  if (sameCategory && category === 'promo' && !ownerHasReplied) {
28
29
  return {
29
30
  action: 'ignore',
31
+ kind: 'quiet-promo-sender',
30
32
  proposed: true,
31
33
  createdFrom,
32
34
  why: `The last ${CONSISTENT_VERDICTS} messages from this sender were all marketing, and nothing here says you ever wrote back.`,
@@ -36,6 +38,7 @@ export function learnedProposal(verdicts, ownerHasReplied) {
36
38
  if (allLow && !ownerHasReplied) {
37
39
  return {
38
40
  action: 'ignore',
41
+ kind: 'quiet-low-sender',
39
42
  proposed: true,
40
43
  createdFrom,
41
44
  why: `The last ${CONSISTENT_VERDICTS} messages from this sender were all judged low — nothing is lost if you never read them.`,
@@ -45,6 +48,7 @@ export function learnedProposal(verdicts, ownerHasReplied) {
45
48
  if (sameCategory && (category === 'reply-needed' || category === 'relationship')) {
46
49
  return {
47
50
  action: 'notify',
51
+ kind: 'notify-sender',
48
52
  proposed: true,
49
53
  createdFrom,
50
54
  why: `The last ${CONSISTENT_VERDICTS} messages from this sender were all ${category}; a line when they write may be enough.`,
@@ -176,10 +180,11 @@ export async function ownerReplies(db, accountId, address) {
176
180
  };
177
181
  }
178
182
  /**
179
- * Called after a verdict is recorded. Proposes at most one rule on the
180
- * owner's Proposals inbox and returns it, or null when nothing was learned —
181
- * which is the usual answer. The rule itself is written only when the owner
182
- * keeps the card (`learned.ts`, `applyLearnedPolicy`).
183
+ * Called after a verdict is recorded. Learns at most one rule and returns it,
184
+ * or null when nothing was learned — which is the usual answer. The rule is a
185
+ * card the owner keeps (`learned.ts`, `applyLearnedPolicy`), unless it only
186
+ * quiets a sender `auto.ts` allows it to keep itself for; then it is written
187
+ * at once, recorded as kept by `auto`, and the owner's daily line is updated.
183
188
  *
184
189
  * A sender that already has a live policy learns nothing: whatever is there is
185
190
  * the owner's decision, and overwriting it would be this plugin arguing with
@@ -191,7 +196,8 @@ export async function ownerReplies(db, accountId, address) {
191
196
  * untrusted, so the messages are the proposal's sources — by subject and
192
197
  * sender, never by body.
193
198
  */
194
- export async function learnFromVerdict(db, proposals, input, now, run = null) {
199
+ export async function learnFromVerdict(host, input, now, run = null) {
200
+ const db = host.db;
195
201
  const address = normalizeAddress(input.from);
196
202
  // No account is no learning. A policy learned from "every mailbox" would be a
197
203
  // rule about mail it was never shown.
@@ -205,13 +211,14 @@ export async function learnFromVerdict(db, proposals, input, now, run = null) {
205
211
  const proposal = learnedProposal(verdicts, replied);
206
212
  if (!proposal)
207
213
  return null;
214
+ const params = proposal.action === 'ignore'
215
+ ? { category: verdicts[0]?.category ?? 'promo', urgency: 'low' }
216
+ : { note: proposal.why };
208
217
  const ask = await learnedPolicyInput(db, {
209
218
  accountId: input.accountId,
210
219
  sender: address,
211
220
  action: proposal.action,
212
- params: proposal.action === 'ignore'
213
- ? { category: verdicts[0]?.category ?? 'promo', urgency: 'low' }
214
- : { note: proposal.why },
221
+ params,
215
222
  verdicts: verdicts.slice(0, CONSISTENT_VERDICTS).map((v) => ({
216
223
  messageId: v.messageId,
217
224
  processingVersion: v.processingVersion,
@@ -220,10 +227,29 @@ export async function learnFromVerdict(db, proposals, input, now, run = null) {
220
227
  })),
221
228
  why: proposal.why,
222
229
  sources: await mailSources(db, proposal.createdFrom.map((v) => v.messageId)),
230
+ kind: proposal.kind,
223
231
  });
224
- const result = await proposals.proposePolicy(run, ask);
232
+ // Only a quiet rule is even asked about; the facts are read only then.
233
+ if (proposal.action === 'ignore') {
234
+ const reason = mayKeepItself({
235
+ scope: 'sender',
236
+ action: proposal.action,
237
+ params,
238
+ ownerHasWritten: replied || (await ownerHasWrittenAnywhere(db, address)),
239
+ bulk: await isBulkSender(db, input.accountId, address),
240
+ trusted: (await host.proposals.trackRecord(proposal.kind)).trusted,
241
+ });
242
+ if (reason) {
243
+ const kept = await keepLearnedItself(host, ask, reason, now, run);
244
+ if (kept) {
245
+ await tellOwnerLearned(host, now);
246
+ return { proposal: kept, action: proposal.action, matcher: address, keptItself: reason };
247
+ }
248
+ }
249
+ }
250
+ const result = await host.proposals.proposePolicy(run, ask);
225
251
  if (!result.ok)
226
252
  return null;
227
- return { proposal: result.proposal, action: proposal.action, matcher: address };
253
+ return { proposal: result.proposal, action: proposal.action, matcher: address, keptItself: null };
228
254
  }
229
255
  //# sourceMappingURL=learn.js.map