@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
@@ -1 +1 @@
1
- {"version":3,"file":"sentinel-wake.js","sourceRoot":"","sources":["../../src/missions/sentinel-wake.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sentinel-wake.js","sourceRoot":"","sources":["../../src/missions/sentinel-wake.ts"],"names":[],"mappings":"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"}
@@ -104,6 +104,23 @@ export declare const OFFER_TURN_SPEAKER_PREFIX = "offer:";
104
104
  export declare function offerTurnSpeaker(label: string): string;
105
105
  /** The label behind such a stamp, or null when the turn is an ordinary one. */
106
106
  export declare function offerTurnLabel(speaker: string | null | undefined): string | null;
107
+ /**
108
+ * The speaker on a turn whose words are an agent-only brief: Alerts' "Ask"
109
+ * hands the agent the finding's full brief, while the owner only pressed a
110
+ * button about one line. Unlike a chip's sentence, which is the owner's to
111
+ * read, the brief never leaves the gateway — every transcript reader replaces
112
+ * the turn's words with the label (`visibleTurnBlocks`), so no web or MCP
113
+ * payload carries it. The model's own history is untouched.
114
+ */
115
+ export declare const BRIEF_TURN_SPEAKER_PREFIX = "brief:";
116
+ export declare function briefTurnSpeaker(label: string): string;
117
+ /** The label behind a brief turn's stamp, or null for any other turn. */
118
+ export declare function briefTurnLabel(speaker: string | null | undefined): string | null;
119
+ /**
120
+ * What a reader may show of a stored turn: its blocks, except a brief turn's,
121
+ * which become the one line the owner pressed.
122
+ */
123
+ export declare function visibleTurnBlocks(speaker: string | null | undefined, blocks: Array<Record<string, any>>): Array<Record<string, any>>;
107
124
  /**
108
125
  * Retire what the previous turn of this conversation offered.
109
126
  *
@@ -1 +1 @@
1
- {"version":3,"file":"offered-actions.d.ts","sourceRoot":"","sources":["../../src/surfaces/offered-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,OAAO,EAML,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,aAAa,CAAC;AAGrB;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAElD,4EAA4E;AAC5E,eAAO,MAAM,UAAU,uBAAuB,CAAC;AAE/C,6EAA6E;AAC7E,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAAiB,CAAC;AAE3D,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AA6BD,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,CAyBnE;AAED,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,QAgBrB,CAAC;AAMZ;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAElD,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIhF;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,SAAS,EACf,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,IAAI,EACT,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC3B,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE;IACL,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,GACA,OAAO,CAAC,KAAK,EAAE,CAAC,CAclB"}
1
+ {"version":3,"file":"offered-actions.d.ts","sourceRoot":"","sources":["../../src/surfaces/offered-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,OAAO,EAML,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,aAAa,CAAC;AAGrB;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAElD,4EAA4E;AAC5E,eAAO,MAAM,UAAU,uBAAuB,CAAC;AAE/C,6EAA6E;AAC7E,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAAiB,CAAC;AAE3D,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AA6BD,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,CAyBnE;AAED,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,QAgBrB,CAAC;AAMZ;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAElD,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIhF;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIhF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAGpI;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,SAAS,EACf,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,IAAI,EACT,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC3B,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE;IACL,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,GACA,OAAO,CAAC,KAAK,EAAE,CAAC,CAclB"}
@@ -165,6 +165,33 @@ export function offerTurnLabel(speaker) {
165
165
  const label = speaker.slice(OFFER_TURN_SPEAKER_PREFIX.length).trim();
166
166
  return label === '' ? null : label;
167
167
  }
168
+ /**
169
+ * The speaker on a turn whose words are an agent-only brief: Alerts' "Ask"
170
+ * hands the agent the finding's full brief, while the owner only pressed a
171
+ * button about one line. Unlike a chip's sentence, which is the owner's to
172
+ * read, the brief never leaves the gateway — every transcript reader replaces
173
+ * the turn's words with the label (`visibleTurnBlocks`), so no web or MCP
174
+ * payload carries it. The model's own history is untouched.
175
+ */
176
+ export const BRIEF_TURN_SPEAKER_PREFIX = 'brief:';
177
+ export function briefTurnSpeaker(label) {
178
+ return `${BRIEF_TURN_SPEAKER_PREFIX}${label.trim()}`;
179
+ }
180
+ /** The label behind a brief turn's stamp, or null for any other turn. */
181
+ export function briefTurnLabel(speaker) {
182
+ if (typeof speaker !== 'string' || !speaker.startsWith(BRIEF_TURN_SPEAKER_PREFIX))
183
+ return null;
184
+ const label = speaker.slice(BRIEF_TURN_SPEAKER_PREFIX.length).trim();
185
+ return label === '' ? null : label;
186
+ }
187
+ /**
188
+ * What a reader may show of a stored turn: its blocks, except a brief turn's,
189
+ * which become the one line the owner pressed.
190
+ */
191
+ export function visibleTurnBlocks(speaker, blocks) {
192
+ const label = briefTurnLabel(speaker);
193
+ return label === null ? blocks : [{ type: 'text', text: label }];
194
+ }
168
195
  /* ------------------------------------------------------------------ *
169
196
  * What a surface does with it
170
197
  * ------------------------------------------------------------------ */
@@ -1 +1 @@
1
- {"version":3,"file":"offered-actions.js","sourceRoot":"","sources":["../../src/surfaces/offered-actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"offered-actions.js","sourceRoot":"","sources":["../../src/surfaces/offered-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Alerts: decisions, not chores (docs/dashboard.md, "Alerts").
3
+ *
4
+ * What the watchers found, shaped for the owner. Three rules, and every
5
+ * surface that lists findings — the Alerts page, Home's Needs you — reads them
6
+ * from here so none of them can drift:
7
+ *
8
+ * 1. **Only the owner's line is ever sent.** A finding's `detail` is the agent
9
+ * brief, written for a model; it never leaves this file. A finding without
10
+ * an owner line shows its title.
11
+ * 2. **Only decisions are listed.** An `info` finding goes to the recap
12
+ * silently: it is counted in one line ("12 notes saved for Friday's
13
+ * recap") and listed only in that line's preview.
14
+ * 3. **Repeats are one row.** Open findings of the same watcher and kind are
15
+ * one group, titled by the watcher's group spec, with the subjects inside.
16
+ *
17
+ * Every row carries the actions its findings declared (host API 1.23), shaped
18
+ * so the page can only ask for what was declared: a `run` or a `fill` is named
19
+ * by finding key and action index, and resolved again here before anything
20
+ * runs.
21
+ */
22
+ import { type CoreToolContext, type PluginManifest, type SentinelFinding, type ToolRegistry } from '@buddi/core';
23
+ import type { Pool } from 'pg';
24
+ export interface AlertItemView {
25
+ key: string;
26
+ /** The owner's line (or the title). Never the brief. */
27
+ line: string;
28
+ subject: {
29
+ id: string;
30
+ label: string;
31
+ } | null;
32
+ /** Beside the subject inside a group: its last value ("2,340.00 USD on 2026-09-14"), else its line. */
33
+ note: string;
34
+ firstSeenAt: string;
35
+ /**
36
+ * Inside a group of many: what this one finding offers that the group
37
+ * cannot offer for all — its own `run` actions (Send, Discard) and its own
38
+ * `open` when the group's items differ. Absent on a row of one, whose
39
+ * actions are the group's.
40
+ */
41
+ actions?: AlertActionView[];
42
+ }
43
+ export type AlertActionView = {
44
+ kind: 'open';
45
+ label: string;
46
+ plugin: string | null;
47
+ page?: string;
48
+ item?: string;
49
+ place?: 'files';
50
+ } | {
51
+ kind: 'run';
52
+ label: string;
53
+ key: string;
54
+ index: number;
55
+ confirm?: string;
56
+ tone?: 'danger';
57
+ } | {
58
+ kind: 'fill';
59
+ label: string;
60
+ title: string;
61
+ fields: Array<{
62
+ key: string;
63
+ index: number;
64
+ label: string;
65
+ type: 'number' | 'text' | 'date';
66
+ value: string | number | null;
67
+ hint: string | null;
68
+ }>;
69
+ } | {
70
+ kind: 'ask';
71
+ label: string | null;
72
+ } | {
73
+ kind: 'dismiss';
74
+ label: string;
75
+ };
76
+ export interface AlertGroupView {
77
+ /** `<sentinel>:<kind>` for a group, the finding's key for a single one. */
78
+ id: string;
79
+ sentinelId: string;
80
+ /** The plugin that ships the watcher, when it is installed. */
81
+ plugin: string | null;
82
+ kind: string;
83
+ /** The row's words: the owner line, or the group's title. */
84
+ title: string;
85
+ /** The group's owner line under the title, when the watcher wrote one. */
86
+ line: string | null;
87
+ urgent: boolean;
88
+ since: string;
89
+ /** Who answers for it: Ask goes there. Null: the wake mission's agent. */
90
+ agentId: string | null;
91
+ keys: string[];
92
+ items: AlertItemView[];
93
+ actions: AlertActionView[];
94
+ /** What "Stop telling me this" silences: one subject, or the whole kind. */
95
+ stop: {
96
+ scope: 'subject' | 'kind';
97
+ label: string;
98
+ };
99
+ snoozedUntil: string | null;
100
+ resolvedAt: string | null;
101
+ }
102
+ export interface AlertsView {
103
+ /** Urgent, open, not snoozed, not silenced: the decisions. */
104
+ open: AlertGroupView[];
105
+ /** Urgent ones the owner put off ("Not now") or set aside ("Not needed"). */
106
+ snoozed: AlertGroupView[];
107
+ /** What stopped being true lately. */
108
+ resolved: AlertGroupView[];
109
+ /** The notes waiting for the recap: a count, when, and the preview's groups. */
110
+ recap: {
111
+ count: number;
112
+ missionId: string | null;
113
+ nextAt: string | null;
114
+ groups: AlertGroupView[];
115
+ };
116
+ /** "Stop telling me this", as Settings → Watchers lists them. */
117
+ mutes: Array<{
118
+ id: string;
119
+ sentinelId: string;
120
+ label: string;
121
+ createdAt: string;
122
+ }>;
123
+ }
124
+ /** Which plugin ships each watcher. */
125
+ export declare function sentinelPlugins(manifests: readonly PluginManifest[]): Map<string, string>;
126
+ /**
127
+ * The owner's line for a surface: the plugin's own fences round quoted mail
128
+ * (`<<<QUOTED MAIL …>>>`) are for a model reading it, not for a person, so a
129
+ * surface draws the words without them. The finding keeps them for the agent.
130
+ */
131
+ export declare function plainLine(f: {
132
+ ownerLine?: string | null;
133
+ title: string;
134
+ }): string;
135
+ /** One row per watcher and kind; a fact on its own is a row of one. */
136
+ export declare function groupFindings(findings: readonly SentinelFinding[], plugins: ReadonlyMap<string, string>): AlertGroupView[];
137
+ /** The decisions alone: what the Alerts page lists and Home's Needs you counts. */
138
+ export declare function readAlertDecisions(pool: Pool, registry: ToolRegistry, now: Date): Promise<AlertGroupView[]>;
139
+ export declare function readAlerts(pool: Pool, registry: ToolRegistry, now: Date): Promise<AlertsView>;
140
+ export type AlertReply = {
141
+ status: number;
142
+ body: unknown;
143
+ };
144
+ /**
145
+ * "Stop telling me this" on a row. A finding with a subject silences that
146
+ * subject; a group, or a finding about nothing in particular, its whole kind.
147
+ * `group` says which the page drew.
148
+ */
149
+ export declare function muteAlert(pool: Pool, body: Record<string, unknown>, now: Date): Promise<AlertReply>;
150
+ export interface AlertActDeps {
151
+ pool: Pool;
152
+ registry: ToolRegistry;
153
+ ctx: CoreToolContext;
154
+ now: () => Date;
155
+ }
156
+ /** At most this many entries in one act: a quick form of every balance, not a script. */
157
+ export declare const ALERT_ACT_MAX = 50;
158
+ /**
159
+ * Run what a finding declared: a `run`, or a `fill` with the value the owner
160
+ * typed. The page names a finding key and an action index, never a tool, so
161
+ * it can only run what the watcher put on the row — and only a tool of the
162
+ * plugin that ships the watcher. A gated tool answers its approval, exactly
163
+ * as from the plugin's own page.
164
+ */
165
+ export declare function actOnAlerts(deps: AlertActDeps, body: Record<string, unknown>, session: {
166
+ via?: string;
167
+ }): Promise<AlertReply>;
168
+ /**
169
+ * "Ask <agent>": a turn with the agent that answers for the findings. The
170
+ * thread shows the owner's line as what he asked about; the agent reads the
171
+ * findings — brief, data and all — inside the watcher fence, the way a wake
172
+ * hands them over.
173
+ */
174
+ export declare function askPrompt(findings: readonly SentinelFinding[]): {
175
+ label: string;
176
+ prompt: string;
177
+ };
178
+ export declare function findingsForAsk(pool: Pool, keys: readonly string[]): Promise<SentinelFinding[]>;
179
+ //# sourceMappingURL=alerts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/web/alerts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,363 @@
1
+ /**
2
+ * Alerts: decisions, not chores (docs/dashboard.md, "Alerts").
3
+ *
4
+ * What the watchers found, shaped for the owner. Three rules, and every
5
+ * surface that lists findings — the Alerts page, Home's Needs you — reads them
6
+ * from here so none of them can drift:
7
+ *
8
+ * 1. **Only the owner's line is ever sent.** A finding's `detail` is the agent
9
+ * brief, written for a model; it never leaves this file. A finding without
10
+ * an owner line shows its title.
11
+ * 2. **Only decisions are listed.** An `info` finding goes to the recap
12
+ * silently: it is counted in one line ("12 notes saved for Friday's
13
+ * recap") and listed only in that line's preview.
14
+ * 3. **Repeats are one row.** Open findings of the same watcher and kind are
15
+ * one group, titled by the watcher's group spec, with the subjects inside.
16
+ *
17
+ * Every row carries the actions its findings declared (host API 1.23), shaped
18
+ * so the page can only ask for what was declared: a `run` or a `fill` is named
19
+ * by finding key and action index, and resolved again here before anything
20
+ * runs.
21
+ */
22
+ import { OWNER_AGENT_ID, getActiveSchedule, isMuted, isSnoozed, muteFindings, nextAfter, ownerLineOf, sentinelMutes, SENTINEL_FINDING_COLUMNS, toSentinelFinding, } from '@buddi/core';
23
+ import { recapMissionId } from '../missions/recap.js';
24
+ import { renderFindings } from '../missions/sentinel-wake.js';
25
+ /** Which plugin ships each watcher. */
26
+ export function sentinelPlugins(manifests) {
27
+ const out = new Map();
28
+ for (const m of manifests)
29
+ for (const s of m.sentinels ?? [])
30
+ out.set(s.id, m.name);
31
+ return out;
32
+ }
33
+ /**
34
+ * The owner's line for a surface: the plugin's own fences round quoted mail
35
+ * (`<<<QUOTED MAIL …>>>`) are for a model reading it, not for a person, so a
36
+ * surface draws the words without them. The finding keeps them for the agent.
37
+ */
38
+ export function plainLine(f) {
39
+ return unfenced(ownerLineOf(f));
40
+ }
41
+ function unfenced(text) {
42
+ return text.replace(/<<<[^<>]*>>>/g, '').replace(/\s+/g, ' ').trim();
43
+ }
44
+ function groupKey(f) {
45
+ return `${f.sentinelId}:${f.kind}`;
46
+ }
47
+ function fill(template, count) {
48
+ return template.split('{count}').join(String(count));
49
+ }
50
+ /** The action a single finding offers, as the page draws it. */
51
+ function actionView(f, a, index, plugin) {
52
+ switch (a.kind) {
53
+ case 'open':
54
+ return { kind: 'open', label: a.label, plugin, ...(a.page ? { page: a.page } : {}), ...(a.item ? { item: a.item } : {}), ...(a.place ? { place: a.place } : {}) };
55
+ case 'run':
56
+ return { kind: 'run', label: a.label, key: f.key, index, ...(a.confirm ? { confirm: a.confirm } : {}), ...(a.tone ? { tone: a.tone } : {}) };
57
+ case 'fill':
58
+ return {
59
+ kind: 'fill',
60
+ label: a.label,
61
+ title: a.title ?? a.label,
62
+ fields: [{ key: f.key, index, label: a.field.label, type: a.field.type, value: a.field.value ?? null, hint: a.field.hint ?? null }],
63
+ };
64
+ case 'ask':
65
+ return { kind: 'ask', label: a.label ?? null };
66
+ case 'dismiss':
67
+ return { kind: 'dismiss', label: a.label };
68
+ }
69
+ }
70
+ /**
71
+ * A group's actions, from its first finding's: what makes sense for many at
72
+ * once. A `fill` gathers a field from every finding that offers the same tool
73
+ * — one quick form for nine balances. An `open` stays when every finding opens
74
+ * the same page (without an item when the items differ). A `run` is about one
75
+ * thing, so a group never offers it; each finding keeps its own on its row
76
+ * inside the group (`itemActions`).
77
+ */
78
+ function groupActions(findings, plugin) {
79
+ const first = findings[0];
80
+ if (findings.length === 1) {
81
+ const own = first.actions.map((a, i) => actionView(first, a, i, plugin));
82
+ return own.length > 0 ? own : [{ kind: 'ask', label: null }];
83
+ }
84
+ const out = [];
85
+ first.actions.forEach((a) => {
86
+ if (a.kind === 'run')
87
+ return;
88
+ if (a.kind === 'fill') {
89
+ const fields = [];
90
+ for (const f of findings) {
91
+ const index = f.actions.findIndex((x) => x.kind === 'fill' && x.tool === a.tool);
92
+ const own = f.actions[index];
93
+ if (own === undefined || own.kind !== 'fill')
94
+ continue;
95
+ fields.push({ key: f.key, index, label: own.field.label, type: own.field.type, value: own.field.value ?? null, hint: own.field.hint ?? null });
96
+ }
97
+ out.push({ kind: 'fill', label: a.groupLabel ?? a.label, title: a.title ?? a.groupLabel ?? a.label, fields });
98
+ return;
99
+ }
100
+ if (a.kind === 'open') {
101
+ const same = findings.every((f) => f.actions.some((x) => x.kind === 'open' && x.page === a.page && x.place === a.place));
102
+ if (!same)
103
+ return;
104
+ const oneItem = findings.every((f) => f.actions.some((x) => x.kind === 'open' && x.item === a.item));
105
+ out.push({ kind: 'open', label: a.label, plugin, ...(a.page ? { page: a.page } : {}), ...(oneItem && a.item ? { item: a.item } : {}), ...(a.place ? { place: a.place } : {}) });
106
+ return;
107
+ }
108
+ out.push(actionView(first, a, 0, plugin));
109
+ });
110
+ return out.length > 0 ? out : [{ kind: 'ask', label: null }];
111
+ }
112
+ /**
113
+ * One finding's own actions inside a group of many: every `run`, by its own
114
+ * key and index, and an `open` that names its own item when the group's
115
+ * opens could not (`groupActions` drops the item when they differ).
116
+ */
117
+ function itemActions(f, group, plugin) {
118
+ const out = [];
119
+ f.actions.forEach((a, index) => {
120
+ if (a.kind === 'run')
121
+ out.push(actionView(f, a, index, plugin));
122
+ if (a.kind === 'open' && a.item) {
123
+ const covered = group.some((g) => g.kind === 'open' && g.page === a.page && g.place === a.place && g.item === a.item);
124
+ if (!covered)
125
+ out.push(actionView(f, a, index, plugin));
126
+ }
127
+ });
128
+ return out;
129
+ }
130
+ /** One row per watcher and kind; a fact on its own is a row of one. */
131
+ export function groupFindings(findings, plugins) {
132
+ const buckets = new Map();
133
+ for (const f of findings) {
134
+ const key = groupKey(f);
135
+ const list = buckets.get(key);
136
+ if (list)
137
+ list.push(f);
138
+ else
139
+ buckets.set(key, [f]);
140
+ }
141
+ const groups = [];
142
+ for (const list of buckets.values()) {
143
+ list.sort((a, b) => a.firstSeenAt.getTime() - b.firstSeenAt.getTime() || a.key.localeCompare(b.key));
144
+ const first = list[0];
145
+ const plugin = plugins.get(first.sentinelId) ?? null;
146
+ const many = list.length > 1;
147
+ const spec = list.find((f) => f.group !== null)?.group ?? null;
148
+ const title = !many
149
+ ? plainLine(first)
150
+ : spec
151
+ ? fill(spec.title, list.length)
152
+ : `${plainLine(first)} — and ${list.length - 1} more like it`;
153
+ const line = many && spec?.ownerLine ? fill(spec.ownerLine, list.length) : null;
154
+ const subject = !many ? first.subject : null;
155
+ const actions = groupActions(list, plugin);
156
+ groups.push({
157
+ id: many ? groupKey(first) : first.key,
158
+ sentinelId: first.sentinelId,
159
+ plugin,
160
+ kind: first.kind,
161
+ title,
162
+ line,
163
+ urgent: list.some((f) => f.severity === 'urgent'),
164
+ since: first.firstSeenAt.toISOString(),
165
+ agentId: list.find((f) => f.agentId !== null)?.agentId ?? null,
166
+ keys: list.map((f) => f.key),
167
+ items: list.map((f) => {
168
+ const fillAction = f.actions.find((a) => a.kind === 'fill');
169
+ const hint = fillAction?.kind === 'fill' ? fillAction.field.hint : undefined;
170
+ const own = many ? itemActions(f, actions, plugin) : [];
171
+ return {
172
+ key: f.key,
173
+ line: plainLine(f),
174
+ subject: f.subject ? { id: f.subject.id, label: unfenced(f.subject.label) } : null,
175
+ note: hint ?? plainLine(f),
176
+ firstSeenAt: f.firstSeenAt.toISOString(),
177
+ ...(own.length > 0 ? { actions: own } : {}),
178
+ };
179
+ }),
180
+ actions,
181
+ stop: subject
182
+ ? { scope: 'subject', label: `${unfenced(subject.label)}: ${plainLine(first)}` }
183
+ : { scope: 'kind', label: title },
184
+ snoozedUntil: list.map((f) => f.snoozedUntil).find((d) => d !== null)?.toISOString() ?? null,
185
+ resolvedAt: list.every((f) => f.resolvedAt !== null) ? list[list.length - 1].resolvedAt.toISOString() : null,
186
+ });
187
+ }
188
+ // Urgent first, then the longest waiting.
189
+ groups.sort((a, b) => Number(b.urgent) - Number(a.urgent) || a.since.localeCompare(b.since));
190
+ return groups;
191
+ }
192
+ async function loadFindings(pool, where, params = []) {
193
+ const { rows } = await pool.query(`select ${SENTINEL_FINDING_COLUMNS} from core.sentinel_findings where ${where}`, params);
194
+ return rows.map(toSentinelFinding);
195
+ }
196
+ function notMuted(mutes) {
197
+ return (f) => !isMuted(mutes, f.sentinelId, f.kind, f.subject?.id ?? null);
198
+ }
199
+ /** The decisions alone: what the Alerts page lists and Home's Needs you counts. */
200
+ export async function readAlertDecisions(pool, registry, now) {
201
+ const mutes = await sentinelMutes(pool);
202
+ const open = await loadFindings(pool, `resolved_at is null and severity = 'urgent'`);
203
+ const live = open.filter(notMuted(mutes)).filter((f) => !isSnoozed(f, now));
204
+ return groupFindings(live, sentinelPlugins(registry.manifests()));
205
+ }
206
+ /** When the recap runs next, if a plugin ships one and it is on. */
207
+ async function nextRecap(pool, manifests, now) {
208
+ const missionId = recapMissionId(manifests) ?? null;
209
+ if (missionId === null)
210
+ return { missionId, nextAt: null };
211
+ const { rows } = await pool.query(`select enabled from core.missions where id = $1`, [missionId]);
212
+ if (rows[0]?.enabled !== true)
213
+ return { missionId, nextAt: null };
214
+ const spec = await getActiveSchedule(pool, missionId).catch(() => null);
215
+ if (!spec)
216
+ return { missionId, nextAt: null };
217
+ const next = nextAfter(spec.cron, now, spec.timezone);
218
+ return { missionId, nextAt: next ? next.toISOString() : null };
219
+ }
220
+ export async function readAlerts(pool, registry, now) {
221
+ const manifests = registry.manifests();
222
+ const plugins = sentinelPlugins(manifests);
223
+ const mutes = await sentinelMutes(pool);
224
+ const shown = notMuted(mutes);
225
+ const urgentOpen = (await loadFindings(pool, `resolved_at is null and severity = 'urgent'`)).filter(shown);
226
+ const open = urgentOpen.filter((f) => !isSnoozed(f, now));
227
+ const snoozed = urgentOpen.filter((f) => isSnoozed(f, now));
228
+ const resolved = (await loadFindings(pool, `resolved_at is not null and resolved_at > $1 order by resolved_at desc limit 20`, [
229
+ new Date(now.getTime() - 7 * 86_400_000).toISOString(),
230
+ ])).filter(shown);
231
+ // The recap's notes: what is queued for it, in the owner's words.
232
+ const queued = await loadFindings(pool, `key in (select finding_key from core.digest_items where consumed_at is null)`);
233
+ const notes = queued.filter(shown);
234
+ const recap = await nextRecap(pool, manifests, now);
235
+ return {
236
+ open: groupFindings(open, plugins),
237
+ snoozed: groupFindings(snoozed, plugins),
238
+ resolved: groupFindings(resolved, plugins),
239
+ recap: { count: notes.length, ...recap, groups: groupFindings(notes, plugins) },
240
+ mutes: mutes.map((m) => ({ id: m.id, sentinelId: m.sentinelId, label: m.label, createdAt: m.createdAt.toISOString() })),
241
+ };
242
+ }
243
+ async function openFinding(pool, key) {
244
+ const [f] = await loadFindings(pool, `key = $1 and resolved_at is null`, [key]);
245
+ return f ?? null;
246
+ }
247
+ /**
248
+ * "Stop telling me this" on a row. A finding with a subject silences that
249
+ * subject; a group, or a finding about nothing in particular, its whole kind.
250
+ * `group` says which the page drew.
251
+ */
252
+ export async function muteAlert(pool, body, now) {
253
+ const key = typeof body.key === 'string' ? body.key : '';
254
+ const f = key ? await openFinding(pool, key) : null;
255
+ if (!f)
256
+ return { status: 404, body: { error: 'No open alert has that key.' } };
257
+ const scope = body.scope === 'kind' || f.subject === null ? 'kind' : 'subject';
258
+ const label = typeof body.label === 'string' && body.label.trim() !== ''
259
+ ? body.label.trim()
260
+ : scope === 'subject' && f.subject
261
+ ? `${f.subject.label}: ${plainLine(f)}`
262
+ : plainLine(f);
263
+ const mute = await muteFindings(pool, { sentinelId: f.sentinelId, kind: f.kind, subjectId: scope === 'subject' && f.subject ? f.subject.id : '', label }, now);
264
+ return { status: 200, body: { id: mute.id, label: mute.label } };
265
+ }
266
+ /** At most this many entries in one act: a quick form of every balance, not a script. */
267
+ export const ALERT_ACT_MAX = 50;
268
+ /**
269
+ * Run what a finding declared: a `run`, or a `fill` with the value the owner
270
+ * typed. The page names a finding key and an action index, never a tool, so
271
+ * it can only run what the watcher put on the row — and only a tool of the
272
+ * plugin that ships the watcher. A gated tool answers its approval, exactly
273
+ * as from the plugin's own page.
274
+ */
275
+ export async function actOnAlerts(deps, body, session) {
276
+ const entries = Array.isArray(body.entries) ? body.entries : null;
277
+ if (entries === null || entries.length === 0)
278
+ return { status: 400, body: { error: 'Send `{ entries: [{ key, action, value? }] }`.' } };
279
+ if (entries.length > ALERT_ACT_MAX)
280
+ return { status: 400, body: { error: `At most ${ALERT_ACT_MAX} at once.` } };
281
+ const plugins = sentinelPlugins(deps.registry.manifests());
282
+ const results = [];
283
+ for (const raw of entries) {
284
+ const entry = (raw ?? {});
285
+ const key = typeof entry.key === 'string' ? entry.key : '';
286
+ const index = typeof entry.action === 'number' && Number.isInteger(entry.action) ? entry.action : -1;
287
+ const f = key ? await openFinding(deps.pool, key) : null;
288
+ const action = f?.actions[index];
289
+ if (!f || !action || (action.kind !== 'run' && action.kind !== 'fill')) {
290
+ results.push({ key, error: 'That alert has no such action any more.' });
291
+ continue;
292
+ }
293
+ const plugin = plugins.get(f.sentinelId);
294
+ if (plugin === undefined || deps.registry.pluginOf(action.tool) !== plugin) {
295
+ results.push({ key, error: `${action.tool} is not a tool of the plugin that raised this alert.` });
296
+ continue;
297
+ }
298
+ const args = { ...(action.args ?? {}) };
299
+ if (action.kind === 'fill') {
300
+ const value = entry.value;
301
+ if (action.field.type === 'number') {
302
+ const n = typeof value === 'number' ? value : typeof value === 'string' && value.trim() !== '' ? Number(value.replace(/[,\s]/g, '')) : NaN;
303
+ if (!Number.isFinite(n)) {
304
+ results.push({ key, error: `${action.field.label}: a number, please.` });
305
+ continue;
306
+ }
307
+ args[action.field.name] = n;
308
+ }
309
+ else {
310
+ if (typeof value !== 'string' || value.trim() === '') {
311
+ results.push({ key, error: `${action.field.label}: nothing typed.` });
312
+ continue;
313
+ }
314
+ args[action.field.name] = value.trim();
315
+ }
316
+ }
317
+ const result = await deps.registry.invoke(action.tool, args, { ...deps.ctx, agentId: OWNER_AGENT_ID, now: deps.now }, { askOnly: session.via === 'token' });
318
+ if (result.ok)
319
+ results.push({ key, result: result.output });
320
+ else if (result.reason === 'approval-required')
321
+ results.push({ key, approvalId: result.actionId });
322
+ else if (result.reason === 'ask-only')
323
+ results.push({ key, error: `An API token cannot run ${action.tool}: it runs without an approval.` });
324
+ else
325
+ results.push({ key, error: result.message });
326
+ }
327
+ return { status: 200, body: { results } };
328
+ }
329
+ /**
330
+ * "Ask <agent>": a turn with the agent that answers for the findings. The
331
+ * thread shows the owner's line as what he asked about; the agent reads the
332
+ * findings — brief, data and all — inside the watcher fence, the way a wake
333
+ * hands them over.
334
+ */
335
+ export function askPrompt(findings) {
336
+ const payloads = findings.map((f) => ({
337
+ key: f.key,
338
+ sentinelId: f.sentinelId,
339
+ severity: f.severity,
340
+ title: f.title,
341
+ ...(f.ownerLine ? { ownerLine: f.ownerLine } : {}),
342
+ detail: f.detail,
343
+ agentId: f.agentId,
344
+ data: f.data ?? null,
345
+ }));
346
+ const label = findings.length === 1
347
+ ? `About: ${plainLine(findings[0])}`
348
+ : `About ${findings.length} alerts: ${plainLine(findings[0])}…`;
349
+ const prompt = [
350
+ findings.length === 1
351
+ ? 'The owner pressed "Ask" on this alert on his Alerts page. Check it with your own tools first, then tell him in a few plain sentences what it means and what you suggest — offer to do the part you can do.'
352
+ : 'The owner pressed "Ask" on these alerts, grouped on his Alerts page. Check them with your own tools first, then answer once, in a few plain sentences: what they mean together and what you suggest — offer to do the part you can do.',
353
+ '',
354
+ renderFindings(payloads),
355
+ ].join('\n');
356
+ return { label: label.length > 160 ? `${label.slice(0, 157)}…` : label, prompt };
357
+ }
358
+ export async function findingsForAsk(pool, keys) {
359
+ if (keys.length === 0)
360
+ return [];
361
+ return loadFindings(pool, `key = any($1::text[]) order by first_seen_at`, [[...keys].slice(0, ALERT_ACT_MAX)]);
362
+ }
363
+ //# sourceMappingURL=alerts.js.map