@withbuddi/buddi 0.1.0-pre.29 → 0.1.0-pre.30

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 (455) 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/args.d.ts +6 -1
  4. package/node_modules/@buddi/cli/dist/args.d.ts.map +1 -1
  5. package/node_modules/@buddi/cli/dist/args.js +7 -2
  6. package/node_modules/@buddi/cli/dist/args.js.map +1 -1
  7. package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -1
  8. package/node_modules/@buddi/cli/dist/commands.js +13 -3
  9. package/node_modules/@buddi/cli/dist/commands.js.map +1 -1
  10. package/node_modules/@buddi/cli/dist/doctor-probes.d.ts.map +1 -1
  11. package/node_modules/@buddi/cli/dist/doctor-probes.js +2 -1
  12. package/node_modules/@buddi/cli/dist/doctor-probes.js.map +1 -1
  13. package/node_modules/@buddi/cli/dist/jobs-cmd.d.ts +4 -0
  14. package/node_modules/@buddi/cli/dist/jobs-cmd.d.ts.map +1 -1
  15. package/node_modules/@buddi/cli/dist/jobs-cmd.js +53 -4
  16. package/node_modules/@buddi/cli/dist/jobs-cmd.js.map +1 -1
  17. package/node_modules/@buddi/cli/dist/main.d.ts.map +1 -1
  18. package/node_modules/@buddi/cli/dist/main.js +5 -1
  19. package/node_modules/@buddi/cli/dist/main.js.map +1 -1
  20. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  21. package/node_modules/@buddi/core/dist/lock.d.ts +8 -2
  22. package/node_modules/@buddi/core/dist/lock.d.ts.map +1 -1
  23. package/node_modules/@buddi/core/dist/lock.js +20 -5
  24. package/node_modules/@buddi/core/dist/lock.js.map +1 -1
  25. package/node_modules/@buddi/core/dist/pages.d.ts +3 -1
  26. package/node_modules/@buddi/core/dist/pages.d.ts.map +1 -1
  27. package/node_modules/@buddi/core/dist/pages.js +6 -1
  28. package/node_modules/@buddi/core/dist/pages.js.map +1 -1
  29. package/node_modules/@buddi/core/dist/plugin/index.d.ts +1 -1
  30. package/node_modules/@buddi/core/dist/plugin/index.d.ts.map +1 -1
  31. package/node_modules/@buddi/core/dist/plugin/index.js.map +1 -1
  32. package/node_modules/@buddi/core/dist/plugin/version.d.ts +1 -1
  33. package/node_modules/@buddi/core/dist/plugin/version.js +1 -1
  34. package/node_modules/@buddi/core/dist/queue/failures.d.ts +84 -0
  35. package/node_modules/@buddi/core/dist/queue/failures.d.ts.map +1 -0
  36. package/node_modules/@buddi/core/dist/queue/failures.js +195 -0
  37. package/node_modules/@buddi/core/dist/queue/failures.js.map +1 -0
  38. package/node_modules/@buddi/core/dist/queue/index.d.ts +1 -0
  39. package/node_modules/@buddi/core/dist/queue/index.d.ts.map +1 -1
  40. package/node_modules/@buddi/core/dist/queue/index.js +1 -0
  41. package/node_modules/@buddi/core/dist/queue/index.js.map +1 -1
  42. package/node_modules/@buddi/core/dist/queue/jobs.d.ts +39 -3
  43. package/node_modules/@buddi/core/dist/queue/jobs.d.ts.map +1 -1
  44. package/node_modules/@buddi/core/dist/queue/jobs.js +54 -4
  45. package/node_modules/@buddi/core/dist/queue/jobs.js.map +1 -1
  46. package/node_modules/@buddi/core/dist/queue/types.d.ts +20 -0
  47. package/node_modules/@buddi/core/dist/queue/types.d.ts.map +1 -1
  48. package/node_modules/@buddi/core/dist/queue/types.js +17 -0
  49. package/node_modules/@buddi/core/dist/queue/types.js.map +1 -1
  50. package/node_modules/@buddi/core/dist/secrets/settings.d.ts.map +1 -1
  51. package/node_modules/@buddi/core/dist/secrets/settings.js +23 -3
  52. package/node_modules/@buddi/core/dist/secrets/settings.js.map +1 -1
  53. package/node_modules/@buddi/core/dist/sentinels/digest.d.ts +8 -1
  54. package/node_modules/@buddi/core/dist/sentinels/digest.d.ts.map +1 -1
  55. package/node_modules/@buddi/core/dist/sentinels/digest.js +10 -3
  56. package/node_modules/@buddi/core/dist/sentinels/digest.js.map +1 -1
  57. package/node_modules/@buddi/core/dist/sentinels/index.d.ts +1 -0
  58. package/node_modules/@buddi/core/dist/sentinels/index.d.ts.map +1 -1
  59. package/node_modules/@buddi/core/dist/sentinels/index.js +1 -0
  60. package/node_modules/@buddi/core/dist/sentinels/index.js.map +1 -1
  61. package/node_modules/@buddi/core/dist/sentinels/mutes.d.ts +51 -0
  62. package/node_modules/@buddi/core/dist/sentinels/mutes.d.ts.map +1 -0
  63. package/node_modules/@buddi/core/dist/sentinels/mutes.js +86 -0
  64. package/node_modules/@buddi/core/dist/sentinels/mutes.js.map +1 -0
  65. package/node_modules/@buddi/core/dist/sentinels/run.d.ts +14 -4
  66. package/node_modules/@buddi/core/dist/sentinels/run.d.ts.map +1 -1
  67. package/node_modules/@buddi/core/dist/sentinels/run.js +64 -20
  68. package/node_modules/@buddi/core/dist/sentinels/run.js.map +1 -1
  69. package/node_modules/@buddi/core/dist/sentinels/types.d.ts +152 -2
  70. package/node_modules/@buddi/core/dist/sentinels/types.d.ts.map +1 -1
  71. package/node_modules/@buddi/core/dist/sentinels/types.js +126 -2
  72. package/node_modules/@buddi/core/dist/sentinels/types.js.map +1 -1
  73. package/node_modules/@buddi/core/dist/views.d.ts +112 -112
  74. package/node_modules/@buddi/core/dist/views.d.ts.map +1 -1
  75. package/node_modules/@buddi/core/dist/views.js +2 -0
  76. package/node_modules/@buddi/core/dist/views.js.map +1 -1
  77. package/node_modules/@buddi/core/migrations/066_alert_decisions.sql +45 -0
  78. package/node_modules/@buddi/core/migrations/067_job_acknowledged.sql +21 -0
  79. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  80. package/node_modules/@buddi/gateway/dist/chat/conversations.d.ts.map +1 -1
  81. package/node_modules/@buddi/gateway/dist/chat/conversations.js +8 -2
  82. package/node_modules/@buddi/gateway/dist/chat/conversations.js.map +1 -1
  83. package/node_modules/@buddi/gateway/dist/missions/execute.d.ts.map +1 -1
  84. package/node_modules/@buddi/gateway/dist/missions/execute.js +36 -2
  85. package/node_modules/@buddi/gateway/dist/missions/execute.js.map +1 -1
  86. package/node_modules/@buddi/gateway/dist/missions/goals.d.ts +12 -1
  87. package/node_modules/@buddi/gateway/dist/missions/goals.d.ts.map +1 -1
  88. package/node_modules/@buddi/gateway/dist/missions/goals.js +21 -1
  89. package/node_modules/@buddi/gateway/dist/missions/goals.js.map +1 -1
  90. package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.d.ts +3 -0
  91. package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.d.ts.map +1 -1
  92. package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.js +4 -1
  93. package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.js.map +1 -1
  94. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.d.ts +17 -0
  95. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  96. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js +27 -0
  97. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js.map +1 -1
  98. package/node_modules/@buddi/gateway/dist/web/alerts.d.ts +179 -0
  99. package/node_modules/@buddi/gateway/dist/web/alerts.d.ts.map +1 -0
  100. package/node_modules/@buddi/gateway/dist/web/alerts.js +363 -0
  101. package/node_modules/@buddi/gateway/dist/web/alerts.js.map +1 -0
  102. package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts.map +1 -1
  103. package/node_modules/@buddi/gateway/dist/web/api-routes.js +45 -6
  104. package/node_modules/@buddi/gateway/dist/web/api-routes.js.map +1 -1
  105. package/node_modules/@buddi/gateway/dist/web/chat.d.ts +1 -0
  106. package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
  107. package/node_modules/@buddi/gateway/dist/web/chat.js +4 -3
  108. package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
  109. package/node_modules/@buddi/gateway/dist/web/lock.d.ts +7 -4
  110. package/node_modules/@buddi/gateway/dist/web/lock.d.ts.map +1 -1
  111. package/node_modules/@buddi/gateway/dist/web/lock.js +20 -14
  112. package/node_modules/@buddi/gateway/dist/web/lock.js.map +1 -1
  113. package/node_modules/@buddi/gateway/dist/web/plugins.d.ts.map +1 -1
  114. package/node_modules/@buddi/gateway/dist/web/plugins.js +17 -3
  115. package/node_modules/@buddi/gateway/dist/web/plugins.js.map +1 -1
  116. package/node_modules/@buddi/gateway/dist/web/read.d.ts +52 -26
  117. package/node_modules/@buddi/gateway/dist/web/read.d.ts.map +1 -1
  118. package/node_modules/@buddi/gateway/dist/web/read.js +52 -36
  119. package/node_modules/@buddi/gateway/dist/web/read.js.map +1 -1
  120. package/node_modules/@buddi/gateway/dist/web/secrets.d.ts +61 -1
  121. package/node_modules/@buddi/gateway/dist/web/secrets.d.ts.map +1 -1
  122. package/node_modules/@buddi/gateway/dist/web/secrets.js +111 -3
  123. package/node_modules/@buddi/gateway/dist/web/secrets.js.map +1 -1
  124. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  125. package/node_modules/@buddi/gateway/dist/web/server.js +125 -9
  126. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  127. package/node_modules/@buddi/gateway/dist/web/widgets.d.ts +1 -0
  128. package/node_modules/@buddi/gateway/dist/web/widgets.d.ts.map +1 -1
  129. package/node_modules/@buddi/gateway/dist/web/widgets.js +6 -1
  130. package/node_modules/@buddi/gateway/dist/web/widgets.js.map +1 -1
  131. package/node_modules/@buddi/gateway/dist/web/write.d.ts +23 -0
  132. package/node_modules/@buddi/gateway/dist/web/write.d.ts.map +1 -1
  133. package/node_modules/@buddi/gateway/dist/web/write.js +46 -1
  134. package/node_modules/@buddi/gateway/dist/web/write.js.map +1 -1
  135. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  136. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  137. package/node_modules/@buddi/runtime/dist/anthropic.d.ts +6 -0
  138. package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
  139. package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
  140. package/node_modules/@buddi/runtime/dist/openai.d.ts +34 -1
  141. package/node_modules/@buddi/runtime/dist/openai.d.ts.map +1 -1
  142. package/node_modules/@buddi/runtime/dist/openai.js +66 -12
  143. package/node_modules/@buddi/runtime/dist/openai.js.map +1 -1
  144. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  145. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  146. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  147. package/node_modules/@buddi/tool-email/dist/agent.js +1 -1
  148. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.d.ts +8 -0
  149. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.d.ts.map +1 -1
  150. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.js +59 -4
  151. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.js.map +1 -1
  152. package/node_modules/@buddi/tool-email/dist/mail.d.ts +42 -0
  153. package/node_modules/@buddi/tool-email/dist/mail.d.ts.map +1 -1
  154. package/node_modules/@buddi/tool-email/dist/mail.js +116 -0
  155. package/node_modules/@buddi/tool-email/dist/mail.js.map +1 -1
  156. package/node_modules/@buddi/tool-email/dist/mailbox/select.d.ts +6 -0
  157. package/node_modules/@buddi/tool-email/dist/mailbox/select.d.ts.map +1 -1
  158. package/node_modules/@buddi/tool-email/dist/mailbox/select.js +11 -0
  159. package/node_modules/@buddi/tool-email/dist/mailbox/select.js.map +1 -1
  160. package/node_modules/@buddi/tool-email/dist/metrics.d.ts +5 -6
  161. package/node_modules/@buddi/tool-email/dist/metrics.d.ts.map +1 -1
  162. package/node_modules/@buddi/tool-email/dist/metrics.js +4 -5
  163. package/node_modules/@buddi/tool-email/dist/metrics.js.map +1 -1
  164. package/node_modules/@buddi/tool-email/dist/needs-you.d.ts +58 -0
  165. package/node_modules/@buddi/tool-email/dist/needs-you.d.ts.map +1 -0
  166. package/node_modules/@buddi/tool-email/dist/needs-you.js +97 -0
  167. package/node_modules/@buddi/tool-email/dist/needs-you.js.map +1 -0
  168. package/node_modules/@buddi/tool-email/dist/pages/descriptors.d.ts.map +1 -1
  169. package/node_modules/@buddi/tool-email/dist/pages/descriptors.js +110 -78
  170. package/node_modules/@buddi/tool-email/dist/pages/descriptors.js.map +1 -1
  171. package/node_modules/@buddi/tool-email/dist/pages/drafts-tools.d.ts +2 -2
  172. package/node_modules/@buddi/tool-email/dist/pages/queries.d.ts +7 -0
  173. package/node_modules/@buddi/tool-email/dist/pages/queries.d.ts.map +1 -1
  174. package/node_modules/@buddi/tool-email/dist/pages/queries.js +31 -3
  175. package/node_modules/@buddi/tool-email/dist/pages/queries.js.map +1 -1
  176. package/node_modules/@buddi/tool-email/dist/ports.d.ts +8 -0
  177. package/node_modules/@buddi/tool-email/dist/ports.d.ts.map +1 -1
  178. package/node_modules/@buddi/tool-email/dist/ports.js.map +1 -1
  179. package/node_modules/@buddi/tool-email/dist/sentinels/suspicious-sender.d.ts.map +1 -1
  180. package/node_modules/@buddi/tool-email/dist/sentinels/suspicious-sender.js +4 -1
  181. package/node_modules/@buddi/tool-email/dist/sentinels/suspicious-sender.js.map +1 -1
  182. package/node_modules/@buddi/tool-email/dist/sentinels/waiting-on-me.d.ts +18 -21
  183. package/node_modules/@buddi/tool-email/dist/sentinels/waiting-on-me.d.ts.map +1 -1
  184. package/node_modules/@buddi/tool-email/dist/sentinels/waiting-on-me.js +39 -63
  185. package/node_modules/@buddi/tool-email/dist/sentinels/waiting-on-me.js.map +1 -1
  186. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.d.ts.map +1 -1
  187. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.js +3 -2
  188. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.js.map +1 -1
  189. package/node_modules/@buddi/tool-email/dist/suspicions-store.d.ts +6 -0
  190. package/node_modules/@buddi/tool-email/dist/suspicions-store.d.ts.map +1 -1
  191. package/node_modules/@buddi/tool-email/dist/suspicions-store.js +16 -1
  192. package/node_modules/@buddi/tool-email/dist/suspicions-store.js.map +1 -1
  193. package/node_modules/@buddi/tool-email/dist/threads.d.ts +17 -2
  194. package/node_modules/@buddi/tool-email/dist/threads.d.ts.map +1 -1
  195. package/node_modules/@buddi/tool-email/dist/threads.js +35 -14
  196. package/node_modules/@buddi/tool-email/dist/threads.js.map +1 -1
  197. package/node_modules/@buddi/tool-email/dist/tools/mailbox.d.ts +3 -0
  198. package/node_modules/@buddi/tool-email/dist/tools/mailbox.d.ts.map +1 -1
  199. package/node_modules/@buddi/tool-email/dist/tools/mailbox.js +5 -0
  200. package/node_modules/@buddi/tool-email/dist/tools/mailbox.js.map +1 -1
  201. package/node_modules/@buddi/tool-email/dist/tools/threads.d.ts +7 -3
  202. package/node_modules/@buddi/tool-email/dist/tools/threads.d.ts.map +1 -1
  203. package/node_modules/@buddi/tool-email/dist/tools/threads.js +18 -5
  204. package/node_modules/@buddi/tool-email/dist/tools/threads.js.map +1 -1
  205. package/node_modules/@buddi/tool-email/dist/watchers.d.ts +91 -7
  206. package/node_modules/@buddi/tool-email/dist/watchers.d.ts.map +1 -1
  207. package/node_modules/@buddi/tool-email/dist/watchers.js +164 -1
  208. package/node_modules/@buddi/tool-email/dist/watchers.js.map +1 -1
  209. package/node_modules/@buddi/tool-email/dist/widgets.d.ts +3 -2
  210. package/node_modules/@buddi/tool-email/dist/widgets.d.ts.map +1 -1
  211. package/node_modules/@buddi/tool-email/dist/widgets.js +2 -2
  212. package/node_modules/@buddi/tool-email/dist/widgets.js.map +1 -1
  213. package/node_modules/@buddi/tool-email/migrations/023_attention.sql +100 -0
  214. package/node_modules/@buddi/tool-email/migrations/024_auth_domain.sql +9 -0
  215. package/node_modules/@buddi/tool-email/migrations/025_thread_ignore.sql +77 -0
  216. package/node_modules/@buddi/tool-email/package.json +1 -1
  217. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  218. package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
  219. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  220. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  221. package/node_modules/ip-address/README.md +34 -34
  222. package/node_modules/ip-address/dist/ipv4.js +7 -0
  223. package/node_modules/ip-address/dist/ipv4.js.map +1 -1
  224. package/node_modules/ip-address/package.json +1 -1
  225. package/package.json +2 -2
  226. package/packages/cli/dist/.tsbuildinfo +1 -1
  227. package/packages/cli/dist/args.d.ts +6 -1
  228. package/packages/cli/dist/args.d.ts.map +1 -1
  229. package/packages/cli/dist/args.js +7 -2
  230. package/packages/cli/dist/args.js.map +1 -1
  231. package/packages/cli/dist/commands.d.ts.map +1 -1
  232. package/packages/cli/dist/commands.js +13 -3
  233. package/packages/cli/dist/commands.js.map +1 -1
  234. package/packages/cli/dist/doctor-probes.d.ts.map +1 -1
  235. package/packages/cli/dist/doctor-probes.js +2 -1
  236. package/packages/cli/dist/doctor-probes.js.map +1 -1
  237. package/packages/cli/dist/jobs-cmd.d.ts +4 -0
  238. package/packages/cli/dist/jobs-cmd.d.ts.map +1 -1
  239. package/packages/cli/dist/jobs-cmd.js +53 -4
  240. package/packages/cli/dist/jobs-cmd.js.map +1 -1
  241. package/packages/cli/dist/main.d.ts.map +1 -1
  242. package/packages/cli/dist/main.js +5 -1
  243. package/packages/cli/dist/main.js.map +1 -1
  244. package/packages/core/dist/.tsbuildinfo +1 -1
  245. package/packages/core/dist/lock.d.ts +8 -2
  246. package/packages/core/dist/lock.d.ts.map +1 -1
  247. package/packages/core/dist/lock.js +20 -5
  248. package/packages/core/dist/lock.js.map +1 -1
  249. package/packages/core/dist/pages.d.ts +3 -1
  250. package/packages/core/dist/pages.d.ts.map +1 -1
  251. package/packages/core/dist/pages.js +6 -1
  252. package/packages/core/dist/pages.js.map +1 -1
  253. package/packages/core/dist/plugin/index.d.ts +1 -1
  254. package/packages/core/dist/plugin/index.d.ts.map +1 -1
  255. package/packages/core/dist/plugin/index.js.map +1 -1
  256. package/packages/core/dist/plugin/version.d.ts +1 -1
  257. package/packages/core/dist/plugin/version.js +1 -1
  258. package/packages/core/dist/queue/failures.d.ts +84 -0
  259. package/packages/core/dist/queue/failures.d.ts.map +1 -0
  260. package/packages/core/dist/queue/failures.js +195 -0
  261. package/packages/core/dist/queue/failures.js.map +1 -0
  262. package/packages/core/dist/queue/index.d.ts +1 -0
  263. package/packages/core/dist/queue/index.d.ts.map +1 -1
  264. package/packages/core/dist/queue/index.js +1 -0
  265. package/packages/core/dist/queue/index.js.map +1 -1
  266. package/packages/core/dist/queue/jobs.d.ts +39 -3
  267. package/packages/core/dist/queue/jobs.d.ts.map +1 -1
  268. package/packages/core/dist/queue/jobs.js +54 -4
  269. package/packages/core/dist/queue/jobs.js.map +1 -1
  270. package/packages/core/dist/queue/types.d.ts +20 -0
  271. package/packages/core/dist/queue/types.d.ts.map +1 -1
  272. package/packages/core/dist/queue/types.js +17 -0
  273. package/packages/core/dist/queue/types.js.map +1 -1
  274. package/packages/core/dist/secrets/settings.d.ts.map +1 -1
  275. package/packages/core/dist/secrets/settings.js +23 -3
  276. package/packages/core/dist/secrets/settings.js.map +1 -1
  277. package/packages/core/dist/sentinels/digest.d.ts +8 -1
  278. package/packages/core/dist/sentinels/digest.d.ts.map +1 -1
  279. package/packages/core/dist/sentinels/digest.js +10 -3
  280. package/packages/core/dist/sentinels/digest.js.map +1 -1
  281. package/packages/core/dist/sentinels/index.d.ts +1 -0
  282. package/packages/core/dist/sentinels/index.d.ts.map +1 -1
  283. package/packages/core/dist/sentinels/index.js +1 -0
  284. package/packages/core/dist/sentinels/index.js.map +1 -1
  285. package/packages/core/dist/sentinels/mutes.d.ts +51 -0
  286. package/packages/core/dist/sentinels/mutes.d.ts.map +1 -0
  287. package/packages/core/dist/sentinels/mutes.js +86 -0
  288. package/packages/core/dist/sentinels/mutes.js.map +1 -0
  289. package/packages/core/dist/sentinels/run.d.ts +14 -4
  290. package/packages/core/dist/sentinels/run.d.ts.map +1 -1
  291. package/packages/core/dist/sentinels/run.js +64 -20
  292. package/packages/core/dist/sentinels/run.js.map +1 -1
  293. package/packages/core/dist/sentinels/types.d.ts +152 -2
  294. package/packages/core/dist/sentinels/types.d.ts.map +1 -1
  295. package/packages/core/dist/sentinels/types.js +126 -2
  296. package/packages/core/dist/sentinels/types.js.map +1 -1
  297. package/packages/core/dist/views.d.ts +112 -112
  298. package/packages/core/dist/views.d.ts.map +1 -1
  299. package/packages/core/dist/views.js +2 -0
  300. package/packages/core/dist/views.js.map +1 -1
  301. package/packages/core/migrations/066_alert_decisions.sql +45 -0
  302. package/packages/core/migrations/067_job_acknowledged.sql +21 -0
  303. package/packages/gateway/dist/.tsbuildinfo +1 -1
  304. package/packages/gateway/dist/chat/conversations.d.ts.map +1 -1
  305. package/packages/gateway/dist/chat/conversations.js +8 -2
  306. package/packages/gateway/dist/chat/conversations.js.map +1 -1
  307. package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
  308. package/packages/gateway/dist/missions/execute.js +36 -2
  309. package/packages/gateway/dist/missions/execute.js.map +1 -1
  310. package/packages/gateway/dist/missions/goals.d.ts +12 -1
  311. package/packages/gateway/dist/missions/goals.d.ts.map +1 -1
  312. package/packages/gateway/dist/missions/goals.js +21 -1
  313. package/packages/gateway/dist/missions/goals.js.map +1 -1
  314. package/packages/gateway/dist/missions/sentinel-wake.d.ts +3 -0
  315. package/packages/gateway/dist/missions/sentinel-wake.d.ts.map +1 -1
  316. package/packages/gateway/dist/missions/sentinel-wake.js +4 -1
  317. package/packages/gateway/dist/missions/sentinel-wake.js.map +1 -1
  318. package/packages/gateway/dist/surfaces/offered-actions.d.ts +17 -0
  319. package/packages/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  320. package/packages/gateway/dist/surfaces/offered-actions.js +27 -0
  321. package/packages/gateway/dist/surfaces/offered-actions.js.map +1 -1
  322. package/packages/gateway/dist/web/alerts.d.ts +179 -0
  323. package/packages/gateway/dist/web/alerts.d.ts.map +1 -0
  324. package/packages/gateway/dist/web/alerts.js +363 -0
  325. package/packages/gateway/dist/web/alerts.js.map +1 -0
  326. package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
  327. package/packages/gateway/dist/web/api-routes.js +45 -6
  328. package/packages/gateway/dist/web/api-routes.js.map +1 -1
  329. package/packages/gateway/dist/web/chat.d.ts +1 -0
  330. package/packages/gateway/dist/web/chat.d.ts.map +1 -1
  331. package/packages/gateway/dist/web/chat.js +4 -3
  332. package/packages/gateway/dist/web/chat.js.map +1 -1
  333. package/packages/gateway/dist/web/lock.d.ts +7 -4
  334. package/packages/gateway/dist/web/lock.d.ts.map +1 -1
  335. package/packages/gateway/dist/web/lock.js +20 -14
  336. package/packages/gateway/dist/web/lock.js.map +1 -1
  337. package/packages/gateway/dist/web/plugins.d.ts.map +1 -1
  338. package/packages/gateway/dist/web/plugins.js +17 -3
  339. package/packages/gateway/dist/web/plugins.js.map +1 -1
  340. package/packages/gateway/dist/web/read.d.ts +52 -26
  341. package/packages/gateway/dist/web/read.d.ts.map +1 -1
  342. package/packages/gateway/dist/web/read.js +52 -36
  343. package/packages/gateway/dist/web/read.js.map +1 -1
  344. package/packages/gateway/dist/web/secrets.d.ts +61 -1
  345. package/packages/gateway/dist/web/secrets.d.ts.map +1 -1
  346. package/packages/gateway/dist/web/secrets.js +111 -3
  347. package/packages/gateway/dist/web/secrets.js.map +1 -1
  348. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  349. package/packages/gateway/dist/web/server.js +125 -9
  350. package/packages/gateway/dist/web/server.js.map +1 -1
  351. package/packages/gateway/dist/web/widgets.d.ts +1 -0
  352. package/packages/gateway/dist/web/widgets.d.ts.map +1 -1
  353. package/packages/gateway/dist/web/widgets.js +6 -1
  354. package/packages/gateway/dist/web/widgets.js.map +1 -1
  355. package/packages/gateway/dist/web/write.d.ts +23 -0
  356. package/packages/gateway/dist/web/write.d.ts.map +1 -1
  357. package/packages/gateway/dist/web/write.js +46 -1
  358. package/packages/gateway/dist/web/write.js.map +1 -1
  359. package/packages/install/dist/.tsbuildinfo +1 -1
  360. package/packages/runtime/dist/.tsbuildinfo +1 -1
  361. package/packages/runtime/dist/anthropic.d.ts +6 -0
  362. package/packages/runtime/dist/anthropic.d.ts.map +1 -1
  363. package/packages/runtime/dist/anthropic.js.map +1 -1
  364. package/packages/runtime/dist/openai.d.ts +34 -1
  365. package/packages/runtime/dist/openai.d.ts.map +1 -1
  366. package/packages/runtime/dist/openai.js +66 -12
  367. package/packages/runtime/dist/openai.js.map +1 -1
  368. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  369. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  370. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  371. package/packages/tools/email/dist/agent.js +1 -1
  372. package/packages/tools/email/dist/imap/imapflow-client.d.ts +8 -0
  373. package/packages/tools/email/dist/imap/imapflow-client.d.ts.map +1 -1
  374. package/packages/tools/email/dist/imap/imapflow-client.js +59 -4
  375. package/packages/tools/email/dist/imap/imapflow-client.js.map +1 -1
  376. package/packages/tools/email/dist/mail.d.ts +42 -0
  377. package/packages/tools/email/dist/mail.d.ts.map +1 -1
  378. package/packages/tools/email/dist/mail.js +116 -0
  379. package/packages/tools/email/dist/mail.js.map +1 -1
  380. package/packages/tools/email/dist/mailbox/select.d.ts +6 -0
  381. package/packages/tools/email/dist/mailbox/select.d.ts.map +1 -1
  382. package/packages/tools/email/dist/mailbox/select.js +11 -0
  383. package/packages/tools/email/dist/mailbox/select.js.map +1 -1
  384. package/packages/tools/email/dist/metrics.d.ts +5 -6
  385. package/packages/tools/email/dist/metrics.d.ts.map +1 -1
  386. package/packages/tools/email/dist/metrics.js +4 -5
  387. package/packages/tools/email/dist/metrics.js.map +1 -1
  388. package/packages/tools/email/dist/needs-you.d.ts +58 -0
  389. package/packages/tools/email/dist/needs-you.d.ts.map +1 -0
  390. package/packages/tools/email/dist/needs-you.js +97 -0
  391. package/packages/tools/email/dist/needs-you.js.map +1 -0
  392. package/packages/tools/email/dist/pages/descriptors.d.ts.map +1 -1
  393. package/packages/tools/email/dist/pages/descriptors.js +110 -78
  394. package/packages/tools/email/dist/pages/descriptors.js.map +1 -1
  395. package/packages/tools/email/dist/pages/drafts-tools.d.ts +2 -2
  396. package/packages/tools/email/dist/pages/queries.d.ts +7 -0
  397. package/packages/tools/email/dist/pages/queries.d.ts.map +1 -1
  398. package/packages/tools/email/dist/pages/queries.js +31 -3
  399. package/packages/tools/email/dist/pages/queries.js.map +1 -1
  400. package/packages/tools/email/dist/ports.d.ts +8 -0
  401. package/packages/tools/email/dist/ports.d.ts.map +1 -1
  402. package/packages/tools/email/dist/ports.js.map +1 -1
  403. package/packages/tools/email/dist/sentinels/suspicious-sender.d.ts.map +1 -1
  404. package/packages/tools/email/dist/sentinels/suspicious-sender.js +4 -1
  405. package/packages/tools/email/dist/sentinels/suspicious-sender.js.map +1 -1
  406. package/packages/tools/email/dist/sentinels/waiting-on-me.d.ts +18 -21
  407. package/packages/tools/email/dist/sentinels/waiting-on-me.d.ts.map +1 -1
  408. package/packages/tools/email/dist/sentinels/waiting-on-me.js +39 -63
  409. package/packages/tools/email/dist/sentinels/waiting-on-me.js.map +1 -1
  410. package/packages/tools/email/dist/sources/inbox-poll.d.ts.map +1 -1
  411. package/packages/tools/email/dist/sources/inbox-poll.js +3 -2
  412. package/packages/tools/email/dist/sources/inbox-poll.js.map +1 -1
  413. package/packages/tools/email/dist/suspicions-store.d.ts +6 -0
  414. package/packages/tools/email/dist/suspicions-store.d.ts.map +1 -1
  415. package/packages/tools/email/dist/suspicions-store.js +16 -1
  416. package/packages/tools/email/dist/suspicions-store.js.map +1 -1
  417. package/packages/tools/email/dist/threads.d.ts +17 -2
  418. package/packages/tools/email/dist/threads.d.ts.map +1 -1
  419. package/packages/tools/email/dist/threads.js +35 -14
  420. package/packages/tools/email/dist/threads.js.map +1 -1
  421. package/packages/tools/email/dist/tools/mailbox.d.ts +3 -0
  422. package/packages/tools/email/dist/tools/mailbox.d.ts.map +1 -1
  423. package/packages/tools/email/dist/tools/mailbox.js +5 -0
  424. package/packages/tools/email/dist/tools/mailbox.js.map +1 -1
  425. package/packages/tools/email/dist/tools/threads.d.ts +7 -3
  426. package/packages/tools/email/dist/tools/threads.d.ts.map +1 -1
  427. package/packages/tools/email/dist/tools/threads.js +18 -5
  428. package/packages/tools/email/dist/tools/threads.js.map +1 -1
  429. package/packages/tools/email/dist/watchers.d.ts +91 -7
  430. package/packages/tools/email/dist/watchers.d.ts.map +1 -1
  431. package/packages/tools/email/dist/watchers.js +164 -1
  432. package/packages/tools/email/dist/watchers.js.map +1 -1
  433. package/packages/tools/email/dist/widgets.d.ts +3 -2
  434. package/packages/tools/email/dist/widgets.d.ts.map +1 -1
  435. package/packages/tools/email/dist/widgets.js +2 -2
  436. package/packages/tools/email/dist/widgets.js.map +1 -1
  437. package/packages/tools/email/migrations/023_attention.sql +100 -0
  438. package/packages/tools/email/migrations/024_auth_domain.sql +9 -0
  439. package/packages/tools/email/migrations/025_thread_ignore.sql +77 -0
  440. package/packages/tools/email/package.json +1 -1
  441. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  442. package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
  443. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  444. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  445. package/packages/web/dist/assets/earth-2560-Ce3xs8Cb.webp +0 -0
  446. package/packages/web/dist/assets/earth-phone-BqC7cDhk.webp +0 -0
  447. package/packages/web/dist/assets/index-WS4UjGsy.js +129 -0
  448. package/packages/web/dist/assets/index-Zrt_o2UG.css +1 -0
  449. package/packages/web/dist/assets/{lottie_light-Cdn77Osu.js → lottie_light-Ls7i1ATS.js} +1 -1
  450. package/packages/web/dist/build.json +1 -1
  451. package/packages/web/dist/index.html +2 -2
  452. package/packages/web/dist/precache.json +4 -4
  453. package/packages/web/dist/sw.js +3 -2
  454. package/packages/web/dist/assets/index-D8_tmf2k.js +0 -131
  455. package/packages/web/dist/assets/index-DYQyioa6.css +0 -1
@@ -61,11 +61,12 @@ import { mlxhBaseUrl, probeMlxh } from '../mlxh.js';
61
61
  import { OnboardingRefusal, WEB_ONBOARDING_STEPS, WEB_ONBOARDING_SURFACE, claimOpeningTurn, createFirstAgent, probeOllama, readOnboarding, rebindBrain, updateFirstAgent, withFirstRunFacts, readFirstAgentPersona } from './onboarding.js';
62
62
  import { TakeOnRefusal, readTakeOn, startTakeOn } from './take-on.js';
63
63
  import { TelegramWebError, saveTelegramToken, telegramBot, telegramDevices, telegramPairing, telegramStatus, unpairTelegramDevice, } from './telegram.js';
64
- import { PAGE_ROUTE, sendPageFile, actOnPage, listPageDescriptors, runPageQuery, } from './pages.js';
64
+ import { PAGE_ROUTE, sendPageFile, actOnPage, actRateLimited, listPageDescriptors, runPageQuery, } from './pages.js';
65
65
  import { listSecrets, secretUses, secretsAct } from './secrets.js';
66
66
  import { sayRoute, transcribeRoute } from './speech.js';
67
67
  import { createServer } from 'node:http';
68
- import { getAction, idleRolloverMs, inRecovery, listPendingActions, isJobState, parseAgentFile, setSentinelEnabled, snoozeFinding } from '@buddi/core';
68
+ import { getAction, idleRolloverMs, inRecovery, listMissions, listPendingActions, isJobState, parseAgentFile, setSentinelEnabled, snoozeFinding, snoozeFindings, unmuteFindings } from '@buddi/core';
69
+ import { actOnAlerts, askPrompt, findingsForAsk, muteAlert } from './alerts.js';
69
70
  import { connectionsOf } from '@buddi/tool-mcp';
70
71
  import { CONNECTIONS_CALLBACK_PATH, connectionsRoute } from './connections.js';
71
72
  import { browserHost } from '../browser-host.js';
@@ -93,7 +94,7 @@ import { retryHref, sendSignedOut, wantsSignedOutPage } from './signed-out.js';
93
94
  import { extensionEndpoint } from './extension.js';
94
95
  import { REMOTE_HAND_SOCKET_PATH, RemoteHandEndpoint } from './remote-hand.js';
95
96
  import { csrfCookieName, CSRF_HEADER, sessionCookieName, requestPort, BodyTooLargeError, first, cookieHeader, parseCookies, parseUrl, readJsonBody, remoteKey, requestOrigin, requestScope, sendEmpty, sendJson, sendText, } from './http.js';
96
- import { boundedLimit, readAgents, readApprovals, readConversation, readConversations, readEventKinds, readEvents, readJobs, readMissions, readOverview, setGlanceHidden, readOffers, readReminders, readSentinels, toApprovalView, } from './read.js';
97
+ import { boundedLimit, readAgents, readApprovals, readConversation, readConversations, readEventKinds, readEvents, readJobs, readJobFailures, readMissions, readOverview, setGlanceHidden, readOffers, readReminders, readSentinels, toApprovalView, } from './read.js';
97
98
  import { RateLimiter, SessionStore, } from './sessions.js';
98
99
  import { supervisorCall } from './service.js';
99
100
  import { backupJobRoute, createBackupRoute, discardUpload, listBackups, passphraseRoute, receiveUpload, restoreRoute, scheduleRoute, verifyBackupRoute, } from './backups.js';
@@ -111,14 +112,14 @@ import { currentVersion, upgradeJobRoute, upgradeRoute, versionCheckRoute, versi
111
112
  import { leaveRecoveryMode, readRecoveryView } from './recovery.js';
112
113
  import { readRail, setRailPageHidden } from './rail.js';
113
114
  import { BUILD_MISSING, serveAsset, serveShellAtRoot } from './static.js';
114
- import { StreamBudget, resumeCursor, streamConversation } from './stream.js';
115
+ import { StreamBudget, frame, resumeCursor, streamConversation } from './stream.js';
115
116
  import { ensureWebToken, verifyTicket } from './token.js';
116
117
  import { MAX_UPLOAD_BYTES, readUpload } from './upload.js';
117
118
  import { LOCKED_BODY, LockUnavailable, allowedWhileLocked, clientOf, createLock } from './lock.js';
118
119
  import { matchApiRoute, TOKEN_REFUSALS } from './api-routes.js';
119
120
  import { apiTokensRoute, bearerOf, verifyApiToken } from './api-tokens.js';
120
121
  import { LockImageRefusal, MAX_LOCK_IMAGE_BYTES, normaliseLockImage } from './lock-image.js';
121
- import { cancelJobFromWeb, cancelReminderFromWeb, decideApprovalFromWeb, retryJobFromWeb, setMissionEnabledFromWeb, setPausedFromWeb, setScheduleFromWeb, dismissOfferFromWeb, dismissOffersFromWeb, takeOfferFromWeb, } from './write.js';
122
+ import { cancelJobFromWeb, cancelReminderFromWeb, decideApprovalFromWeb, retryJobFromWeb, retryJobsFromWeb, dismissJobsFromWeb, undismissJobsFromWeb, setMissionEnabledFromWeb, setPausedFromWeb, setScheduleFromWeb, dismissOfferFromWeb, dismissOffersFromWeb, takeOfferFromWeb, } from './write.js';
122
123
  /** How often approvals past their expiry are swept, and waiting delegations told. */
123
124
  export const EXPIRY_SWEEP_MS = 60_000;
124
125
  /**
@@ -137,6 +138,16 @@ const WEB_CHATS = new WeakMap();
137
138
  * it down, and a caller that built a bare `createWebApp` is unaffected.
138
139
  */
139
140
  const PREVIEW_APPS = new WeakMap();
141
+ /**
142
+ * What a dashboard says to its open pages just before it closes: one
143
+ * `closing` frame on every live stream, naming the restart or stop the page
144
+ * itself asked for when it was one (`for`), so a page another device or the
145
+ * CLI restarted under draws "Restarting buddi" rather than errors, and
146
+ * reloads once the next process answers `/_buddi/ready` with a new `boot`.
147
+ */
148
+ const CLOSING_SAYS = new WeakMap();
149
+ /** How long a closing frame may take to reach the pages before the sockets go. */
150
+ const CLOSING_FLUSH_MS = 250;
140
151
  /** The chat surface this server is running, if any. */
141
152
  /** The most of a text file a preview shows; the download has the whole. */
142
153
  const PREVIEW_TEXT_BYTES = 100_000;
@@ -304,6 +315,14 @@ export function createWebApp(deps) {
304
315
  */
305
316
  const lock = createLock({ pool: deps.pool, sessions, now: deps.now, get timezone() { return deps.timezone; }, widgets, log });
306
317
  const openStreams = new Map();
318
+ /*
319
+ * This process's boot: answered by `/_buddi/ready`, so a page that watches a
320
+ * restart can tell the process that went from the one that came back.
321
+ * Random, and nothing else: it says which run this is, not when or where.
322
+ */
323
+ const boot = randomUUID();
324
+ /** Set when a page asked the supervisor to restart or stop this process: what the closing frame says. */
325
+ let goingAway;
307
326
  /*
308
327
  * The session a live API token acts through: minted on its first request,
309
328
  * kept in memory only, one per token (and scope), so a stream budget or a
@@ -572,6 +591,31 @@ export function createWebApp(deps) {
572
591
  if (chat)
573
592
  WEB_CHATS.set(server, chat);
574
593
  PREVIEW_APPS.set(server, previews);
594
+ CLOSING_SAYS.set(server, async () => {
595
+ const said = frame('closing', goingAway === undefined ? {} : { for: goingAway });
596
+ const flushed = [];
597
+ for (const { responses } of openStreams.values()) {
598
+ for (const res of responses) {
599
+ if (res.writableEnded || res.destroyed)
600
+ continue;
601
+ // Ended, not just written: an ended response is flushed before its
602
+ // socket goes, where a frame still queued would be dropped with it.
603
+ flushed.push(new Promise((resolve) => {
604
+ try {
605
+ res.end(said, () => resolve());
606
+ }
607
+ catch {
608
+ resolve();
609
+ }
610
+ }));
611
+ }
612
+ }
613
+ if (flushed.length === 0)
614
+ return;
615
+ let timer;
616
+ await Promise.race([Promise.all(flushed), new Promise((resolve) => { timer = setTimeout(resolve, CLOSING_FLUSH_MS); })]);
617
+ clearTimeout(timer);
618
+ });
575
619
  // "Your browser": the only path this server ever upgrades. Attached here
576
620
  // rather than in `startWebServer` so every caller, tests included, has it.
577
621
  extension.attach(server);
@@ -594,7 +638,7 @@ export function createWebApp(deps) {
594
638
  const challenge = url.searchParams.get('challenge') ?? '';
595
639
  if (!/^[a-f0-9]{64}$/.test(challenge))
596
640
  return sendEmpty(res, 400);
597
- return sendJson(res, 200, { proof: createHmac('sha256', deps.token).update(`buddi-ready-v1:${challenge}`).digest('hex') });
641
+ return sendJson(res, 200, { proof: createHmac('sha256', deps.token).update(`buddi-ready-v1:${challenge}`).digest('hex'), boot }, { 'Cache-Control': 'no-store' });
598
642
  }
599
643
  // A remote socket or proxy metadata can only earn remote access. It
600
644
  // decides how long a session minted now lives, and it must keep matching
@@ -1335,8 +1379,16 @@ export function createWebApp(deps) {
1335
1379
  kind: q.get('kind') ?? undefined,
1336
1380
  limit: boundedLimit(q.get('limit')),
1337
1381
  offset: Math.max(0, Math.min(Number(q.get('offset') ?? 0) || 0, 100_000)),
1382
+ failed: q.get('failed') === 'open' || q.get('failed') === 'dismissed' ? q.get('failed') : undefined,
1383
+ hideDismissed: q.get('dismissed') === '0',
1338
1384
  }));
1339
1385
  }
1386
+ // Failed jobs grouped by what broke them: the ones still asking, and
1387
+ // the dismissed ones (by the owner, or quiet after 14 days) apart.
1388
+ case '/api/jobs/failures': {
1389
+ const names = new Map(deps.catalog.list().map((a) => [a.id, a.name]));
1390
+ return sendJson(res, 200, await readJobFailures(deps.pool, now, (id) => names.get(id) ?? null));
1391
+ }
1340
1392
  case '/api/approvals': {
1341
1393
  const approvals = await readApprovals(deps.pool, now, boundedLimit(q.get('limit'), 50));
1342
1394
  return sendJson(res, 200, { pending: approvals.pending.map(a => ({ ...a, ...permissionScopes(a.tool) })),
@@ -1368,7 +1420,7 @@ export function createWebApp(deps) {
1368
1420
  reminders: await readReminders(deps.pool, boundedLimit(q.get('limit'))),
1369
1421
  });
1370
1422
  case '/api/sentinels':
1371
- return sendJson(res, 200, await readSentinels(deps.pool, deps.registry, boundedLimit(q.get('limit'), 50)));
1423
+ return sendJson(res, 200, await readSentinels(deps.pool, deps.registry, deps.now()));
1372
1424
  case '/api/chat/agents':
1373
1425
  return sendJson(res, 200, readChatAgents(deps.catalog, await avatarVersions(deps.pool)));
1374
1426
  // Which agents are waiting on the owner. One small query, and the only
@@ -2267,14 +2319,64 @@ export function createWebApp(deps) {
2267
2319
  return sendJson(res, 400, { error: 'Expected agentId and conversationId.' });
2268
2320
  return sendJson(res, 200, { stopped: host.stop(deps.ctx.ownerId, body.agentId, body.conversationId) });
2269
2321
  }
2322
+ /*
2323
+ * Alerts (alerts.ts): the owner's verbs on what the watchers found. Snooze
2324
+ * one ("Not now" for a week with `days`, "Not needed" without), several at
2325
+ * once (Clear all, and its Undo), silence a subject or a kind, run what a
2326
+ * finding declared, or ask the agent that answers for it.
2327
+ */
2270
2328
  const alert = /^\/api\/alerts\/([^/]+)\/snooze$/.exec(path);
2271
2329
  if (alert) {
2272
2330
  if (typeof body.snoozed !== 'boolean')
2273
2331
  return sendJson(res, 400, { error: '`snoozed` must be true or false' });
2274
- const finding = await snoozeFinding(deps.pool, decodeURIComponent(alert[1]), body.snoozed, deps.now());
2332
+ const days = typeof body.days === 'number' && Number.isFinite(body.days) && body.days > 0 && body.days <= 90 ? body.days : null;
2333
+ const until = body.snoozed && days !== null ? new Date(deps.now().getTime() + days * 86_400_000) : null;
2334
+ const finding = await snoozeFinding(deps.pool, decodeURIComponent(alert[1]), body.snoozed, deps.now(), until);
2275
2335
  if (!finding)
2276
2336
  return sendJson(res, 404, { error: 'No open alert has that key.' });
2277
- return sendJson(res, 200, { key: finding.key, snoozedAt: finding.snoozedAt ? finding.snoozedAt.toISOString() : null });
2337
+ return sendJson(res, 200, {
2338
+ key: finding.key,
2339
+ snoozedAt: finding.snoozedAt ? finding.snoozedAt.toISOString() : null,
2340
+ snoozedUntil: finding.snoozedUntil ? finding.snoozedUntil.toISOString() : null,
2341
+ });
2342
+ }
2343
+ if (path === '/api/alerts/snooze') {
2344
+ const keys = Array.isArray(body.keys) ? body.keys.filter((k) => typeof k === 'string').slice(0, 500) : null;
2345
+ if (keys === null || typeof body.snoozed !== 'boolean')
2346
+ return sendJson(res, 400, { error: 'Send `{ keys: string[], snoozed: boolean, days? }`.' });
2347
+ const days = typeof body.days === 'number' && Number.isFinite(body.days) && body.days > 0 && body.days <= 90 ? body.days : null;
2348
+ const until = body.snoozed && days !== null ? new Date(deps.now().getTime() + days * 86_400_000) : null;
2349
+ return sendJson(res, 200, { keys: await snoozeFindings(deps.pool, keys, body.snoozed, deps.now(), until) });
2350
+ }
2351
+ if (path === '/api/alerts/mute')
2352
+ return reply(res, await muteAlert(deps.pool, body, deps.now()));
2353
+ const unmute = /^\/api\/alerts\/mutes\/([^/]+)\/remove$/.exec(path);
2354
+ if (unmute) {
2355
+ const removed = await unmuteFindings(deps.pool, decodeURIComponent(unmute[1]));
2356
+ return removed ? sendJson(res, 200, { removed: true }) : sendJson(res, 404, { error: 'Nothing is silenced under that id.' });
2357
+ }
2358
+ if (path === '/api/alerts/act') {
2359
+ if (actRateLimited(session.id, deps.now().getTime()))
2360
+ return sendJson(res, 429, { error: 'Too many writes from this page. Wait a moment and try again.' });
2361
+ return reply(res, await actOnAlerts({ pool: deps.pool, registry: deps.registry, ctx: deps.ctx, now: deps.now }, body, session));
2362
+ }
2363
+ if (path === '/api/alerts/ask') {
2364
+ const keys = Array.isArray(body.keys) ? body.keys.filter((k) => typeof k === 'string') : [];
2365
+ const findings = await findingsForAsk(deps.pool, keys);
2366
+ if (findings.length === 0)
2367
+ return sendJson(res, 404, { error: 'No alert has those keys.' });
2368
+ if (!chat)
2369
+ return sendJson(res, 503, { error: 'Chat is not running in this process.' });
2370
+ // The agent that answers for them, else whoever runs the wake mission.
2371
+ const wake = (await listMissions(deps.pool)).find((m) => m.id === 'sentinel-wake');
2372
+ const agentId = findings.find((f) => f.agentId !== null && deps.catalog.get(f.agentId) !== undefined)?.agentId ?? wake?.agentId ?? null;
2373
+ if (agentId === null)
2374
+ return sendJson(res, 409, { error: 'No agent answers for this alert yet.' });
2375
+ const { label, prompt } = askPrompt(findings);
2376
+ const sent = await chat.send({ agentId, text: prompt, offer: { id: `alert:${findings[0].key}`.slice(0, 200), label, brief: true } });
2377
+ if (!sent.ok)
2378
+ return sendJson(res, sent.status, { error: sent.error });
2379
+ return sendJson(res, 200, { agentId, conversationId: sent.conversationId, runId: sent.runId });
2278
2380
  }
2279
2381
  /*
2280
2382
  * A watcher, switched off or back on. Off means it does not run: it raises
@@ -2530,8 +2632,10 @@ export function createWebApp(deps) {
2530
2632
  }
2531
2633
  const outcome = await leaveRecoveryMode({ pool: deps.pool, env: deps.env ?? process.env, log }, deps.ctx.ownerId, { dropPending: body.dropPending !== false, keepGrants: keep }, now);
2532
2634
  if (socket) {
2635
+ goingAway = 'restart';
2533
2636
  res.once('finish', () => {
2534
2637
  void supervisorCall(socket, '/restart', 'POST').catch((err) => {
2638
+ goingAway = undefined;
2535
2639
  log(`web: supervisor restart after leaving recovery failed: ${err instanceof Error ? err.message : String(err)}`);
2536
2640
  });
2537
2641
  });
@@ -2571,8 +2675,10 @@ export function createWebApp(deps) {
2571
2675
  return sendJson(res, 503, { error: 'The supervisor is not answering on its control socket. Run buddi in a terminal.' });
2572
2676
  }
2573
2677
  }
2678
+ goingAway = action === 'stop' ? 'stop' : 'restart';
2574
2679
  res.once('finish', () => {
2575
2680
  void supervisorCall(socket, `/${action}`, 'POST').catch((err) => {
2681
+ goingAway = undefined;
2576
2682
  log(`web: supervisor ${action} failed: ${err instanceof Error ? err.message : String(err)}`);
2577
2683
  });
2578
2684
  });
@@ -3013,6 +3119,14 @@ export function createWebApp(deps) {
3013
3119
  return sendJson(res, 400, { error: change });
3014
3120
  return finish(res, setAgentEngineFromWeb({ catalog: deps.catalog, env: deps.env ?? process.env }, decodeURIComponent(engine[1]), change));
3015
3121
  }
3122
+ // Failed jobs in bulk — by ids, by cause group, or every one still asking.
3123
+ // Dismiss keeps them on record and out of the footer's count.
3124
+ if (path === '/api/jobs/dismiss')
3125
+ return finish(res, await dismissJobsFromWeb(writeDeps, body));
3126
+ if (path === '/api/jobs/undismiss')
3127
+ return finish(res, await undismissJobsFromWeb(writeDeps, body));
3128
+ if (path === '/api/jobs/retry')
3129
+ return finish(res, await retryJobsFromWeb(writeDeps, body));
3016
3130
  const job = /^\/api\/jobs\/([^/]+)\/(retry|cancel)$/.exec(path);
3017
3131
  if (job) {
3018
3132
  const jobId = decodeURIComponent(job[1]);
@@ -3276,6 +3390,8 @@ export async function startWebServer(deps) {
3276
3390
  close: async () => {
3277
3391
  if (expirySweep)
3278
3392
  clearInterval(expirySweep);
3393
+ // Said before anything closes, while the streams can still carry it.
3394
+ await CLOSING_SAYS.get(server)?.();
3279
3395
  // Both listeners, both awaited. A preview socket still open is a port
3280
3396
  // still held, and the next thing to want it — the next test, the
3281
3397
  // gateway coming back up — finds it taken.