@withbuddi/buddi 0.1.0-pre.44 → 0.1.0-pre.46

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 (492) hide show
  1. package/extension/background.js +157 -1
  2. package/extension/manifest.json +5 -2
  3. package/extension/popup.html +4 -0
  4. package/extension/popup.js +18 -0
  5. package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
  6. package/node_modules/@buddi/cli/dist/mcp/tools.d.ts +3 -8
  7. package/node_modules/@buddi/cli/dist/mcp/tools.d.ts.map +1 -1
  8. package/node_modules/@buddi/cli/dist/mcp/tools.js +22 -4
  9. package/node_modules/@buddi/cli/dist/mcp/tools.js.map +1 -1
  10. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  11. package/node_modules/@buddi/core/dist/artifacts/orphans.d.ts +6 -4
  12. package/node_modules/@buddi/core/dist/artifacts/orphans.d.ts.map +1 -1
  13. package/node_modules/@buddi/core/dist/artifacts/orphans.js +10 -3
  14. package/node_modules/@buddi/core/dist/artifacts/orphans.js.map +1 -1
  15. package/node_modules/@buddi/core/dist/groups.d.ts +0 -9
  16. package/node_modules/@buddi/core/dist/groups.d.ts.map +1 -1
  17. package/node_modules/@buddi/core/dist/groups.js +13 -1
  18. package/node_modules/@buddi/core/dist/groups.js.map +1 -1
  19. package/node_modules/@buddi/core/dist/pages.d.ts +24 -1
  20. package/node_modules/@buddi/core/dist/pages.d.ts.map +1 -1
  21. package/node_modules/@buddi/core/dist/pages.js +61 -1
  22. package/node_modules/@buddi/core/dist/pages.js.map +1 -1
  23. package/node_modules/@buddi/core/dist/pending-input.d.ts +13 -2
  24. package/node_modules/@buddi/core/dist/pending-input.d.ts.map +1 -1
  25. package/node_modules/@buddi/core/dist/pending-input.js +57 -12
  26. package/node_modules/@buddi/core/dist/pending-input.js.map +1 -1
  27. package/node_modules/@buddi/core/dist/plugin/version.d.ts +1 -1
  28. package/node_modules/@buddi/core/dist/plugin/version.js +1 -1
  29. package/node_modules/@buddi/core/dist/tools.d.ts +6 -1
  30. package/node_modules/@buddi/core/dist/tools.d.ts.map +1 -1
  31. package/node_modules/@buddi/core/dist/tools.js.map +1 -1
  32. package/node_modules/@buddi/core/dist/web-settings.d.ts +8 -0
  33. package/node_modules/@buddi/core/dist/web-settings.d.ts.map +1 -1
  34. package/node_modules/@buddi/core/dist/web-settings.js +14 -0
  35. package/node_modules/@buddi/core/dist/web-settings.js.map +1 -1
  36. package/node_modules/@buddi/core/migrations/078_pending_input_files.sql +8 -0
  37. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  38. package/node_modules/@buddi/gateway/dist/agents/agent-intro.d.ts +31 -0
  39. package/node_modules/@buddi/gateway/dist/agents/agent-intro.d.ts.map +1 -0
  40. package/node_modules/@buddi/gateway/dist/agents/agent-intro.js +116 -0
  41. package/node_modules/@buddi/gateway/dist/agents/agent-intro.js.map +1 -0
  42. package/node_modules/@buddi/gateway/dist/agents/delegation.d.ts +10 -0
  43. package/node_modules/@buddi/gateway/dist/agents/delegation.d.ts.map +1 -1
  44. package/node_modules/@buddi/gateway/dist/agents/delegation.js +18 -1
  45. package/node_modules/@buddi/gateway/dist/agents/delegation.js.map +1 -1
  46. package/node_modules/@buddi/gateway/dist/agents/platform.d.ts +14 -1
  47. package/node_modules/@buddi/gateway/dist/agents/platform.d.ts.map +1 -1
  48. package/node_modules/@buddi/gateway/dist/agents/platform.js +44 -11
  49. package/node_modules/@buddi/gateway/dist/agents/platform.js.map +1 -1
  50. package/node_modules/@buddi/gateway/dist/bootstrap.d.ts.map +1 -1
  51. package/node_modules/@buddi/gateway/dist/bootstrap.js +2 -0
  52. package/node_modules/@buddi/gateway/dist/bootstrap.js.map +1 -1
  53. package/node_modules/@buddi/gateway/dist/browser-host.d.ts.map +1 -1
  54. package/node_modules/@buddi/gateway/dist/browser-host.js +1 -0
  55. package/node_modules/@buddi/gateway/dist/browser-host.js.map +1 -1
  56. package/node_modules/@buddi/gateway/dist/edition-origin.d.ts +57 -0
  57. package/node_modules/@buddi/gateway/dist/edition-origin.d.ts.map +1 -0
  58. package/node_modules/@buddi/gateway/dist/edition-origin.js +156 -0
  59. package/node_modules/@buddi/gateway/dist/edition-origin.js.map +1 -0
  60. package/node_modules/@buddi/gateway/dist/system-context.d.ts +9 -0
  61. package/node_modules/@buddi/gateway/dist/system-context.d.ts.map +1 -1
  62. package/node_modules/@buddi/gateway/dist/system-context.js +28 -2
  63. package/node_modules/@buddi/gateway/dist/system-context.js.map +1 -1
  64. package/node_modules/@buddi/gateway/dist/telegram/approvals.d.ts +6 -0
  65. package/node_modules/@buddi/gateway/dist/telegram/approvals.d.ts.map +1 -1
  66. package/node_modules/@buddi/gateway/dist/telegram/approvals.js +10 -2
  67. package/node_modules/@buddi/gateway/dist/telegram/approvals.js.map +1 -1
  68. package/node_modules/@buddi/gateway/dist/telegram/main.d.ts.map +1 -1
  69. package/node_modules/@buddi/gateway/dist/telegram/main.js +10 -3
  70. package/node_modules/@buddi/gateway/dist/telegram/main.js.map +1 -1
  71. package/node_modules/@buddi/gateway/dist/telegram/outbound.d.ts +9 -0
  72. package/node_modules/@buddi/gateway/dist/telegram/outbound.d.ts.map +1 -1
  73. package/node_modules/@buddi/gateway/dist/telegram/outbound.js +43 -0
  74. package/node_modules/@buddi/gateway/dist/telegram/outbound.js.map +1 -1
  75. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts +2 -0
  76. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
  77. package/node_modules/@buddi/gateway/dist/telegram/surface.js +2 -1
  78. package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
  79. package/node_modules/@buddi/gateway/dist/tips/engine.d.ts +32 -0
  80. package/node_modules/@buddi/gateway/dist/tips/engine.d.ts.map +1 -1
  81. package/node_modules/@buddi/gateway/dist/tips/engine.js +69 -0
  82. package/node_modules/@buddi/gateway/dist/tips/engine.js.map +1 -1
  83. package/node_modules/@buddi/gateway/dist/tips/route.d.ts +1 -3
  84. package/node_modules/@buddi/gateway/dist/tips/route.d.ts.map +1 -1
  85. package/node_modules/@buddi/gateway/dist/tips/route.js +54 -30
  86. package/node_modules/@buddi/gateway/dist/tips/route.js.map +1 -1
  87. package/node_modules/@buddi/gateway/dist/web/agent-offers.d.ts +10 -1
  88. package/node_modules/@buddi/gateway/dist/web/agent-offers.d.ts.map +1 -1
  89. package/node_modules/@buddi/gateway/dist/web/agent-offers.js +14 -1
  90. package/node_modules/@buddi/gateway/dist/web/agent-offers.js.map +1 -1
  91. package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts.map +1 -1
  92. package/node_modules/@buddi/gateway/dist/web/api-routes.js +38 -7
  93. package/node_modules/@buddi/gateway/dist/web/api-routes.js.map +1 -1
  94. package/node_modules/@buddi/gateway/dist/web/approval-ask.d.ts +16 -0
  95. package/node_modules/@buddi/gateway/dist/web/approval-ask.d.ts.map +1 -0
  96. package/node_modules/@buddi/gateway/dist/web/approval-ask.js +51 -0
  97. package/node_modules/@buddi/gateway/dist/web/approval-ask.js.map +1 -0
  98. package/node_modules/@buddi/gateway/dist/web/attention.d.ts +37 -0
  99. package/node_modules/@buddi/gateway/dist/web/attention.d.ts.map +1 -1
  100. package/node_modules/@buddi/gateway/dist/web/attention.js +54 -10
  101. package/node_modules/@buddi/gateway/dist/web/attention.js.map +1 -1
  102. package/node_modules/@buddi/gateway/dist/web/canvas-tabs.d.ts +41 -0
  103. package/node_modules/@buddi/gateway/dist/web/canvas-tabs.d.ts.map +1 -0
  104. package/node_modules/@buddi/gateway/dist/web/canvas-tabs.js +68 -0
  105. package/node_modules/@buddi/gateway/dist/web/canvas-tabs.js.map +1 -0
  106. package/node_modules/@buddi/gateway/dist/web/chat.d.ts +6 -9
  107. package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
  108. package/node_modules/@buddi/gateway/dist/web/chat.js +37 -19
  109. package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
  110. package/node_modules/@buddi/gateway/dist/web/extension.d.ts +11 -1
  111. package/node_modules/@buddi/gateway/dist/web/extension.d.ts.map +1 -1
  112. package/node_modules/@buddi/gateway/dist/web/extension.js +51 -0
  113. package/node_modules/@buddi/gateway/dist/web/extension.js.map +1 -1
  114. package/node_modules/@buddi/gateway/dist/web/live.d.ts +7 -0
  115. package/node_modules/@buddi/gateway/dist/web/live.d.ts.map +1 -1
  116. package/node_modules/@buddi/gateway/dist/web/live.js +12 -0
  117. package/node_modules/@buddi/gateway/dist/web/live.js.map +1 -1
  118. package/node_modules/@buddi/gateway/dist/web/pages.d.ts.map +1 -1
  119. package/node_modules/@buddi/gateway/dist/web/pages.js +10 -1
  120. package/node_modules/@buddi/gateway/dist/web/pages.js.map +1 -1
  121. package/node_modules/@buddi/gateway/dist/web/server.d.ts +0 -4
  122. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  123. package/node_modules/@buddi/gateway/dist/web/server.js +102 -7
  124. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  125. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  126. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  127. package/node_modules/@buddi/runtime/dist/codex-direct.d.ts +1 -1
  128. package/node_modules/@buddi/runtime/dist/codex-direct.js +1 -1
  129. package/node_modules/@buddi/runtime/dist/grounding.d.ts +54 -0
  130. package/node_modules/@buddi/runtime/dist/grounding.d.ts.map +1 -0
  131. package/node_modules/@buddi/runtime/dist/grounding.js +158 -0
  132. package/node_modules/@buddi/runtime/dist/grounding.js.map +1 -0
  133. package/node_modules/@buddi/runtime/dist/index.d.ts +1 -0
  134. package/node_modules/@buddi/runtime/dist/index.d.ts.map +1 -1
  135. package/node_modules/@buddi/runtime/dist/index.js +1 -0
  136. package/node_modules/@buddi/runtime/dist/index.js.map +1 -1
  137. package/node_modules/@buddi/runtime/dist/loop.d.ts +19 -0
  138. package/node_modules/@buddi/runtime/dist/loop.d.ts.map +1 -1
  139. package/node_modules/@buddi/runtime/dist/loop.js +123 -13
  140. package/node_modules/@buddi/runtime/dist/loop.js.map +1 -1
  141. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  142. package/node_modules/@buddi/tool-artifacts/dist/extract.d.ts +6 -0
  143. package/node_modules/@buddi/tool-artifacts/dist/extract.d.ts.map +1 -1
  144. package/node_modules/@buddi/tool-artifacts/dist/extract.js +6 -0
  145. package/node_modules/@buddi/tool-artifacts/dist/extract.js.map +1 -1
  146. package/node_modules/@buddi/tool-artifacts/dist/tools/artifacts.d.ts +1 -0
  147. package/node_modules/@buddi/tool-artifacts/dist/tools/artifacts.d.ts.map +1 -1
  148. package/node_modules/@buddi/tool-artifacts/dist/tools/artifacts.js +30 -8
  149. package/node_modules/@buddi/tool-artifacts/dist/tools/artifacts.js.map +1 -1
  150. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  151. package/node_modules/@buddi/tool-browser/dist/controller.d.ts +25 -0
  152. package/node_modules/@buddi/tool-browser/dist/controller.d.ts.map +1 -1
  153. package/node_modules/@buddi/tool-browser/dist/controller.js +25 -1
  154. package/node_modules/@buddi/tool-browser/dist/controller.js.map +1 -1
  155. package/node_modules/@buddi/tool-browser/dist/downloads.d.ts +138 -0
  156. package/node_modules/@buddi/tool-browser/dist/downloads.d.ts.map +1 -0
  157. package/node_modules/@buddi/tool-browser/dist/downloads.js +529 -0
  158. package/node_modules/@buddi/tool-browser/dist/downloads.js.map +1 -0
  159. package/node_modules/@buddi/tool-browser/dist/driver.d.ts +17 -1
  160. package/node_modules/@buddi/tool-browser/dist/driver.d.ts.map +1 -1
  161. package/node_modules/@buddi/tool-browser/dist/driver.js +48 -0
  162. package/node_modules/@buddi/tool-browser/dist/driver.js.map +1 -1
  163. package/node_modules/@buddi/tool-browser/dist/extension.d.ts +23 -0
  164. package/node_modules/@buddi/tool-browser/dist/extension.d.ts.map +1 -1
  165. package/node_modules/@buddi/tool-browser/dist/extension.js +20 -0
  166. package/node_modules/@buddi/tool-browser/dist/extension.js.map +1 -1
  167. package/node_modules/@buddi/tool-browser/dist/host.d.ts +3 -1
  168. package/node_modules/@buddi/tool-browser/dist/host.d.ts.map +1 -1
  169. package/node_modules/@buddi/tool-browser/dist/host.js +9 -2
  170. package/node_modules/@buddi/tool-browser/dist/host.js.map +1 -1
  171. package/node_modules/@buddi/tool-browser/dist/index.d.ts +7 -3
  172. package/node_modules/@buddi/tool-browser/dist/index.d.ts.map +1 -1
  173. package/node_modules/@buddi/tool-browser/dist/index.js +5 -3
  174. package/node_modules/@buddi/tool-browser/dist/index.js.map +1 -1
  175. package/node_modules/@buddi/tool-browser/dist/service.d.ts +28 -0
  176. package/node_modules/@buddi/tool-browser/dist/service.d.ts.map +1 -1
  177. package/node_modules/@buddi/tool-browser/dist/service.js +58 -1
  178. package/node_modules/@buddi/tool-browser/dist/service.js.map +1 -1
  179. package/node_modules/@buddi/tool-browser/dist/settings.d.ts +8 -0
  180. package/node_modules/@buddi/tool-browser/dist/settings.d.ts.map +1 -1
  181. package/node_modules/@buddi/tool-browser/dist/settings.js +9 -0
  182. package/node_modules/@buddi/tool-browser/dist/settings.js.map +1 -1
  183. package/node_modules/@buddi/tool-browser/dist/types.d.ts +31 -24
  184. package/node_modules/@buddi/tool-browser/dist/types.d.ts.map +1 -1
  185. package/node_modules/@buddi/tool-browser/dist/types.js.map +1 -1
  186. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  187. package/node_modules/@buddi/tool-email/dist/agent.d.ts +6 -1
  188. package/node_modules/@buddi/tool-email/dist/agent.d.ts.map +1 -1
  189. package/node_modules/@buddi/tool-email/dist/agent.js +6 -1
  190. package/node_modules/@buddi/tool-email/dist/agent.js.map +1 -1
  191. package/node_modules/@buddi/tool-email/dist/imap/fake.d.ts +8 -0
  192. package/node_modules/@buddi/tool-email/dist/imap/fake.d.ts.map +1 -1
  193. package/node_modules/@buddi/tool-email/dist/imap/fake.js +15 -0
  194. package/node_modules/@buddi/tool-email/dist/imap/fake.js.map +1 -1
  195. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.d.ts.map +1 -1
  196. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.js +26 -17
  197. package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.js.map +1 -1
  198. package/node_modules/@buddi/tool-email/dist/index.d.ts +5 -1
  199. package/node_modules/@buddi/tool-email/dist/index.d.ts.map +1 -1
  200. package/node_modules/@buddi/tool-email/dist/index.js +11 -3
  201. package/node_modules/@buddi/tool-email/dist/index.js.map +1 -1
  202. package/node_modules/@buddi/tool-email/dist/mail.d.ts.map +1 -1
  203. package/node_modules/@buddi/tool-email/dist/mail.js +4 -1
  204. package/node_modules/@buddi/tool-email/dist/mail.js.map +1 -1
  205. package/node_modules/@buddi/tool-email/dist/pages/index.d.ts +2 -1
  206. package/node_modules/@buddi/tool-email/dist/pages/index.d.ts.map +1 -1
  207. package/node_modules/@buddi/tool-email/dist/pages/index.js +2 -2
  208. package/node_modules/@buddi/tool-email/dist/pages/index.js.map +1 -1
  209. package/node_modules/@buddi/tool-email/dist/pages/queries.d.ts +3 -2
  210. package/node_modules/@buddi/tool-email/dist/pages/queries.d.ts.map +1 -1
  211. package/node_modules/@buddi/tool-email/dist/pages/queries.js +19 -7
  212. package/node_modules/@buddi/tool-email/dist/pages/queries.js.map +1 -1
  213. package/node_modules/@buddi/tool-email/dist/ports.d.ts +15 -0
  214. package/node_modules/@buddi/tool-email/dist/ports.d.ts.map +1 -1
  215. package/node_modules/@buddi/tool-email/dist/ports.js.map +1 -1
  216. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.d.ts +9 -1
  217. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.d.ts.map +1 -1
  218. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.js +1 -0
  219. package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.js.map +1 -1
  220. package/node_modules/@buddi/tool-email/dist/text-cleanup.d.ts +69 -0
  221. package/node_modules/@buddi/tool-email/dist/text-cleanup.d.ts.map +1 -0
  222. package/node_modules/@buddi/tool-email/dist/text-cleanup.js +96 -0
  223. package/node_modules/@buddi/tool-email/dist/text-cleanup.js.map +1 -0
  224. package/node_modules/@buddi/tool-email/dist/text.d.ts +29 -0
  225. package/node_modules/@buddi/tool-email/dist/text.d.ts.map +1 -0
  226. package/node_modules/@buddi/tool-email/dist/text.js +153 -0
  227. package/node_modules/@buddi/tool-email/dist/text.js.map +1 -0
  228. package/node_modules/@buddi/tool-email/dist/worker.d.ts +64 -0
  229. package/node_modules/@buddi/tool-email/dist/worker.d.ts.map +1 -0
  230. package/node_modules/@buddi/tool-email/dist/worker.js +123 -0
  231. package/node_modules/@buddi/tool-email/dist/worker.js.map +1 -0
  232. package/node_modules/@buddi/tool-email/migrations/028_reading.sql +5 -2
  233. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  234. package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
  235. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  236. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  237. package/node_modules/marked/bin/main.js +1 -1
  238. package/node_modules/marked/lib/marked.d.ts +7 -0
  239. package/node_modules/marked/lib/marked.esm.js +14 -14
  240. package/node_modules/marked/lib/marked.esm.js.map +3 -3
  241. package/node_modules/marked/lib/marked.umd.js +19 -19
  242. package/node_modules/marked/lib/marked.umd.js.map +3 -3
  243. package/node_modules/marked/man/marked.1 +1 -1
  244. package/node_modules/marked/package.json +1 -1
  245. package/node_modules/nanoid/README.md +3 -3
  246. package/node_modules/nanoid/index.browser.js +4 -5
  247. package/node_modules/nanoid/index.d.ts +3 -3
  248. package/node_modules/nanoid/index.js +2 -3
  249. package/node_modules/nanoid/nanoid.js +1 -1
  250. package/node_modules/nanoid/package.json +2 -2
  251. package/node_modules/nanoid/url-alphabet/index.js +1 -1
  252. package/package.json +2 -2
  253. package/packages/cli/dist/.tsbuildinfo +1 -1
  254. package/packages/cli/dist/mcp/tools.d.ts +3 -8
  255. package/packages/cli/dist/mcp/tools.d.ts.map +1 -1
  256. package/packages/cli/dist/mcp/tools.js +22 -4
  257. package/packages/cli/dist/mcp/tools.js.map +1 -1
  258. package/packages/core/dist/.tsbuildinfo +1 -1
  259. package/packages/core/dist/artifacts/orphans.d.ts +6 -4
  260. package/packages/core/dist/artifacts/orphans.d.ts.map +1 -1
  261. package/packages/core/dist/artifacts/orphans.js +10 -3
  262. package/packages/core/dist/artifacts/orphans.js.map +1 -1
  263. package/packages/core/dist/groups.d.ts +0 -9
  264. package/packages/core/dist/groups.d.ts.map +1 -1
  265. package/packages/core/dist/groups.js +13 -1
  266. package/packages/core/dist/groups.js.map +1 -1
  267. package/packages/core/dist/pages.d.ts +24 -1
  268. package/packages/core/dist/pages.d.ts.map +1 -1
  269. package/packages/core/dist/pages.js +61 -1
  270. package/packages/core/dist/pages.js.map +1 -1
  271. package/packages/core/dist/pending-input.d.ts +13 -2
  272. package/packages/core/dist/pending-input.d.ts.map +1 -1
  273. package/packages/core/dist/pending-input.js +57 -12
  274. package/packages/core/dist/pending-input.js.map +1 -1
  275. package/packages/core/dist/plugin/version.d.ts +1 -1
  276. package/packages/core/dist/plugin/version.js +1 -1
  277. package/packages/core/dist/tools.d.ts +6 -1
  278. package/packages/core/dist/tools.d.ts.map +1 -1
  279. package/packages/core/dist/tools.js.map +1 -1
  280. package/packages/core/dist/web-settings.d.ts +8 -0
  281. package/packages/core/dist/web-settings.d.ts.map +1 -1
  282. package/packages/core/dist/web-settings.js +14 -0
  283. package/packages/core/dist/web-settings.js.map +1 -1
  284. package/packages/core/migrations/078_pending_input_files.sql +8 -0
  285. package/packages/gateway/dist/.tsbuildinfo +1 -1
  286. package/packages/gateway/dist/agents/agent-intro.d.ts +31 -0
  287. package/packages/gateway/dist/agents/agent-intro.d.ts.map +1 -0
  288. package/packages/gateway/dist/agents/agent-intro.js +116 -0
  289. package/packages/gateway/dist/agents/agent-intro.js.map +1 -0
  290. package/packages/gateway/dist/agents/delegation.d.ts +10 -0
  291. package/packages/gateway/dist/agents/delegation.d.ts.map +1 -1
  292. package/packages/gateway/dist/agents/delegation.js +18 -1
  293. package/packages/gateway/dist/agents/delegation.js.map +1 -1
  294. package/packages/gateway/dist/agents/platform.d.ts +14 -1
  295. package/packages/gateway/dist/agents/platform.d.ts.map +1 -1
  296. package/packages/gateway/dist/agents/platform.js +44 -11
  297. package/packages/gateway/dist/agents/platform.js.map +1 -1
  298. package/packages/gateway/dist/bootstrap.d.ts.map +1 -1
  299. package/packages/gateway/dist/bootstrap.js +2 -0
  300. package/packages/gateway/dist/bootstrap.js.map +1 -1
  301. package/packages/gateway/dist/browser-host.d.ts.map +1 -1
  302. package/packages/gateway/dist/browser-host.js +1 -0
  303. package/packages/gateway/dist/browser-host.js.map +1 -1
  304. package/packages/gateway/dist/edition-origin.d.ts +57 -0
  305. package/packages/gateway/dist/edition-origin.d.ts.map +1 -0
  306. package/packages/gateway/dist/edition-origin.js +156 -0
  307. package/packages/gateway/dist/edition-origin.js.map +1 -0
  308. package/packages/gateway/dist/system-context.d.ts +9 -0
  309. package/packages/gateway/dist/system-context.d.ts.map +1 -1
  310. package/packages/gateway/dist/system-context.js +28 -2
  311. package/packages/gateway/dist/system-context.js.map +1 -1
  312. package/packages/gateway/dist/telegram/approvals.d.ts +6 -0
  313. package/packages/gateway/dist/telegram/approvals.d.ts.map +1 -1
  314. package/packages/gateway/dist/telegram/approvals.js +10 -2
  315. package/packages/gateway/dist/telegram/approvals.js.map +1 -1
  316. package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
  317. package/packages/gateway/dist/telegram/main.js +10 -3
  318. package/packages/gateway/dist/telegram/main.js.map +1 -1
  319. package/packages/gateway/dist/telegram/outbound.d.ts +9 -0
  320. package/packages/gateway/dist/telegram/outbound.d.ts.map +1 -1
  321. package/packages/gateway/dist/telegram/outbound.js +43 -0
  322. package/packages/gateway/dist/telegram/outbound.js.map +1 -1
  323. package/packages/gateway/dist/telegram/surface.d.ts +2 -0
  324. package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
  325. package/packages/gateway/dist/telegram/surface.js +2 -1
  326. package/packages/gateway/dist/telegram/surface.js.map +1 -1
  327. package/packages/gateway/dist/tips/engine.d.ts +32 -0
  328. package/packages/gateway/dist/tips/engine.d.ts.map +1 -1
  329. package/packages/gateway/dist/tips/engine.js +69 -0
  330. package/packages/gateway/dist/tips/engine.js.map +1 -1
  331. package/packages/gateway/dist/tips/route.d.ts +1 -3
  332. package/packages/gateway/dist/tips/route.d.ts.map +1 -1
  333. package/packages/gateway/dist/tips/route.js +54 -30
  334. package/packages/gateway/dist/tips/route.js.map +1 -1
  335. package/packages/gateway/dist/web/agent-offers.d.ts +10 -1
  336. package/packages/gateway/dist/web/agent-offers.d.ts.map +1 -1
  337. package/packages/gateway/dist/web/agent-offers.js +14 -1
  338. package/packages/gateway/dist/web/agent-offers.js.map +1 -1
  339. package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
  340. package/packages/gateway/dist/web/api-routes.js +38 -7
  341. package/packages/gateway/dist/web/api-routes.js.map +1 -1
  342. package/packages/gateway/dist/web/approval-ask.d.ts +16 -0
  343. package/packages/gateway/dist/web/approval-ask.d.ts.map +1 -0
  344. package/packages/gateway/dist/web/approval-ask.js +51 -0
  345. package/packages/gateway/dist/web/approval-ask.js.map +1 -0
  346. package/packages/gateway/dist/web/attention.d.ts +37 -0
  347. package/packages/gateway/dist/web/attention.d.ts.map +1 -1
  348. package/packages/gateway/dist/web/attention.js +54 -10
  349. package/packages/gateway/dist/web/attention.js.map +1 -1
  350. package/packages/gateway/dist/web/canvas-tabs.d.ts +41 -0
  351. package/packages/gateway/dist/web/canvas-tabs.d.ts.map +1 -0
  352. package/packages/gateway/dist/web/canvas-tabs.js +68 -0
  353. package/packages/gateway/dist/web/canvas-tabs.js.map +1 -0
  354. package/packages/gateway/dist/web/chat.d.ts +6 -9
  355. package/packages/gateway/dist/web/chat.d.ts.map +1 -1
  356. package/packages/gateway/dist/web/chat.js +37 -19
  357. package/packages/gateway/dist/web/chat.js.map +1 -1
  358. package/packages/gateway/dist/web/extension.d.ts +11 -1
  359. package/packages/gateway/dist/web/extension.d.ts.map +1 -1
  360. package/packages/gateway/dist/web/extension.js +51 -0
  361. package/packages/gateway/dist/web/extension.js.map +1 -1
  362. package/packages/gateway/dist/web/live.d.ts +7 -0
  363. package/packages/gateway/dist/web/live.d.ts.map +1 -1
  364. package/packages/gateway/dist/web/live.js +12 -0
  365. package/packages/gateway/dist/web/live.js.map +1 -1
  366. package/packages/gateway/dist/web/pages.d.ts.map +1 -1
  367. package/packages/gateway/dist/web/pages.js +10 -1
  368. package/packages/gateway/dist/web/pages.js.map +1 -1
  369. package/packages/gateway/dist/web/server.d.ts +0 -4
  370. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  371. package/packages/gateway/dist/web/server.js +102 -7
  372. package/packages/gateway/dist/web/server.js.map +1 -1
  373. package/packages/install/dist/.tsbuildinfo +1 -1
  374. package/packages/runtime/dist/.tsbuildinfo +1 -1
  375. package/packages/runtime/dist/codex-direct.d.ts +1 -1
  376. package/packages/runtime/dist/codex-direct.js +1 -1
  377. package/packages/runtime/dist/grounding.d.ts +54 -0
  378. package/packages/runtime/dist/grounding.d.ts.map +1 -0
  379. package/packages/runtime/dist/grounding.js +158 -0
  380. package/packages/runtime/dist/grounding.js.map +1 -0
  381. package/packages/runtime/dist/index.d.ts +1 -0
  382. package/packages/runtime/dist/index.d.ts.map +1 -1
  383. package/packages/runtime/dist/index.js +1 -0
  384. package/packages/runtime/dist/index.js.map +1 -1
  385. package/packages/runtime/dist/loop.d.ts +19 -0
  386. package/packages/runtime/dist/loop.d.ts.map +1 -1
  387. package/packages/runtime/dist/loop.js +123 -13
  388. package/packages/runtime/dist/loop.js.map +1 -1
  389. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  390. package/packages/tools/artifacts/dist/extract.d.ts +6 -0
  391. package/packages/tools/artifacts/dist/extract.d.ts.map +1 -1
  392. package/packages/tools/artifacts/dist/extract.js +6 -0
  393. package/packages/tools/artifacts/dist/extract.js.map +1 -1
  394. package/packages/tools/artifacts/dist/tools/artifacts.d.ts +1 -0
  395. package/packages/tools/artifacts/dist/tools/artifacts.d.ts.map +1 -1
  396. package/packages/tools/artifacts/dist/tools/artifacts.js +30 -8
  397. package/packages/tools/artifacts/dist/tools/artifacts.js.map +1 -1
  398. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  399. package/packages/tools/browser/dist/controller.d.ts +25 -0
  400. package/packages/tools/browser/dist/controller.d.ts.map +1 -1
  401. package/packages/tools/browser/dist/controller.js +25 -1
  402. package/packages/tools/browser/dist/controller.js.map +1 -1
  403. package/packages/tools/browser/dist/downloads.d.ts +138 -0
  404. package/packages/tools/browser/dist/downloads.d.ts.map +1 -0
  405. package/packages/tools/browser/dist/downloads.js +529 -0
  406. package/packages/tools/browser/dist/downloads.js.map +1 -0
  407. package/packages/tools/browser/dist/driver.d.ts +17 -1
  408. package/packages/tools/browser/dist/driver.d.ts.map +1 -1
  409. package/packages/tools/browser/dist/driver.js +48 -0
  410. package/packages/tools/browser/dist/driver.js.map +1 -1
  411. package/packages/tools/browser/dist/extension.d.ts +23 -0
  412. package/packages/tools/browser/dist/extension.d.ts.map +1 -1
  413. package/packages/tools/browser/dist/extension.js +20 -0
  414. package/packages/tools/browser/dist/extension.js.map +1 -1
  415. package/packages/tools/browser/dist/host.d.ts +3 -1
  416. package/packages/tools/browser/dist/host.d.ts.map +1 -1
  417. package/packages/tools/browser/dist/host.js +9 -2
  418. package/packages/tools/browser/dist/host.js.map +1 -1
  419. package/packages/tools/browser/dist/index.d.ts +7 -3
  420. package/packages/tools/browser/dist/index.d.ts.map +1 -1
  421. package/packages/tools/browser/dist/index.js +5 -3
  422. package/packages/tools/browser/dist/index.js.map +1 -1
  423. package/packages/tools/browser/dist/service.d.ts +28 -0
  424. package/packages/tools/browser/dist/service.d.ts.map +1 -1
  425. package/packages/tools/browser/dist/service.js +58 -1
  426. package/packages/tools/browser/dist/service.js.map +1 -1
  427. package/packages/tools/browser/dist/settings.d.ts +8 -0
  428. package/packages/tools/browser/dist/settings.d.ts.map +1 -1
  429. package/packages/tools/browser/dist/settings.js +9 -0
  430. package/packages/tools/browser/dist/settings.js.map +1 -1
  431. package/packages/tools/browser/dist/types.d.ts +31 -24
  432. package/packages/tools/browser/dist/types.d.ts.map +1 -1
  433. package/packages/tools/browser/dist/types.js.map +1 -1
  434. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  435. package/packages/tools/email/dist/agent.d.ts +6 -1
  436. package/packages/tools/email/dist/agent.d.ts.map +1 -1
  437. package/packages/tools/email/dist/agent.js +6 -1
  438. package/packages/tools/email/dist/agent.js.map +1 -1
  439. package/packages/tools/email/dist/imap/fake.d.ts +8 -0
  440. package/packages/tools/email/dist/imap/fake.d.ts.map +1 -1
  441. package/packages/tools/email/dist/imap/fake.js +15 -0
  442. package/packages/tools/email/dist/imap/fake.js.map +1 -1
  443. package/packages/tools/email/dist/imap/imapflow-client.d.ts.map +1 -1
  444. package/packages/tools/email/dist/imap/imapflow-client.js +26 -17
  445. package/packages/tools/email/dist/imap/imapflow-client.js.map +1 -1
  446. package/packages/tools/email/dist/index.d.ts +5 -1
  447. package/packages/tools/email/dist/index.d.ts.map +1 -1
  448. package/packages/tools/email/dist/index.js +11 -3
  449. package/packages/tools/email/dist/index.js.map +1 -1
  450. package/packages/tools/email/dist/mail.d.ts.map +1 -1
  451. package/packages/tools/email/dist/mail.js +4 -1
  452. package/packages/tools/email/dist/mail.js.map +1 -1
  453. package/packages/tools/email/dist/pages/index.d.ts +2 -1
  454. package/packages/tools/email/dist/pages/index.d.ts.map +1 -1
  455. package/packages/tools/email/dist/pages/index.js +2 -2
  456. package/packages/tools/email/dist/pages/index.js.map +1 -1
  457. package/packages/tools/email/dist/pages/queries.d.ts +3 -2
  458. package/packages/tools/email/dist/pages/queries.d.ts.map +1 -1
  459. package/packages/tools/email/dist/pages/queries.js +19 -7
  460. package/packages/tools/email/dist/pages/queries.js.map +1 -1
  461. package/packages/tools/email/dist/ports.d.ts +15 -0
  462. package/packages/tools/email/dist/ports.d.ts.map +1 -1
  463. package/packages/tools/email/dist/ports.js.map +1 -1
  464. package/packages/tools/email/dist/sources/inbox-poll.d.ts +9 -1
  465. package/packages/tools/email/dist/sources/inbox-poll.d.ts.map +1 -1
  466. package/packages/tools/email/dist/sources/inbox-poll.js +1 -0
  467. package/packages/tools/email/dist/sources/inbox-poll.js.map +1 -1
  468. package/packages/tools/email/dist/text-cleanup.d.ts +69 -0
  469. package/packages/tools/email/dist/text-cleanup.d.ts.map +1 -0
  470. package/packages/tools/email/dist/text-cleanup.js +96 -0
  471. package/packages/tools/email/dist/text-cleanup.js.map +1 -0
  472. package/packages/tools/email/dist/text.d.ts +29 -0
  473. package/packages/tools/email/dist/text.d.ts.map +1 -0
  474. package/packages/tools/email/dist/text.js +153 -0
  475. package/packages/tools/email/dist/text.js.map +1 -0
  476. package/packages/tools/email/dist/worker.d.ts +64 -0
  477. package/packages/tools/email/dist/worker.d.ts.map +1 -0
  478. package/packages/tools/email/dist/worker.js +123 -0
  479. package/packages/tools/email/dist/worker.js.map +1 -0
  480. package/packages/tools/email/migrations/028_reading.sql +5 -2
  481. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  482. package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
  483. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  484. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  485. package/packages/web/dist/assets/index-C2yWZED2.css +1 -0
  486. package/packages/web/dist/assets/index-CIhME8Ui.js +150 -0
  487. package/packages/web/dist/assets/{lottie_light-DnYl9yaP.js → lottie_light-CVXFbeEK.js} +1 -1
  488. package/packages/web/dist/build.json +1 -1
  489. package/packages/web/dist/index.html +2 -2
  490. package/packages/web/dist/precache.json +4 -4
  491. package/packages/web/dist/assets/index-C1sRt7zd.js +0 -149
  492. package/packages/web/dist/assets/index-CdZpSJ4_.css +0 -1
@@ -0,0 +1,158 @@
1
+ /**
2
+ * The grounding guard's eye: does a reply name sources it never read?
3
+ *
4
+ * An owner asked the concierge about a headline in today's news; it answered
5
+ * at length, citing CBS, AP, NPR and a law school, with no tool call at all.
6
+ * Every citation was invented. The prompt already says not to (the grounding
7
+ * lines in every agent's platform context); this is the deterministic check
8
+ * behind it, run by the loop on the final text of a turn that read nothing.
9
+ *
10
+ * Biased hard toward precision, because a false positive costs the owner a
11
+ * second model call and, worse, a "not checked" flag on an honest answer:
12
+ *
13
+ * - an outlet or a domain counts only where it is *cited* — in parentheses,
14
+ * after "according to" / "selon" / "d'après" / "per" / "via", before
15
+ * "reports" / "said" / "writes", or as a markdown link. "The BBC is a
16
+ * broadcaster" is a mention, not a citation, and so is a bare link ("open
17
+ * https://github.com"): a bare link only backs up markers or a "Sources:"
18
+ * line, it never counts as a source on its own;
19
+ * - one citation is not enough on its own: it takes two distinct sources, or
20
+ * one (or a bare link) with numbered markers ([1]) or a "Sources:" line;
21
+ * - an outlet and its own domain ("Reuters", "reuters.com") are one source;
22
+ * - a source the conversation already holds (the owner named it, a tool
23
+ * returned it earlier) is not counted;
24
+ * - code is ignored, and so is an email address.
25
+ *
26
+ * Figures alone are never a signal: "it costs about €20" is how people talk.
27
+ */
28
+ /** What the model is told when it cited sources without reading anything. */
29
+ export const GROUNDING_RETRY_TEXT = 'You cited sources without reading anything. Verify with your tools or a colleague, or remove the claims.';
30
+ /** The muted line the surfaces draw under a reply the guard could not get checked. */
31
+ export const UNCHECKED_LINE = 'Answered from memory, not checked';
32
+ /**
33
+ * News outlets and agencies a model reaches for when it invents a citation.
34
+ * Not a directory: the names that showed up in fabricated answers, and their
35
+ * neighbours. Matched case-sensitively, so "AP" is the agency and "ap" is not.
36
+ */
37
+ const OUTLETS = [
38
+ 'Associated Press', 'AP', 'Reuters', 'AFP', 'Agence France-Presse', 'Bloomberg',
39
+ 'BBC', 'CNN', 'CBS', 'NBC', 'ABC News', 'NPR', 'PBS', 'Fox News', 'MSNBC', 'CNBC',
40
+ 'New York Times', 'NYT', 'Washington Post', 'Wall Street Journal', 'WSJ', 'USA Today',
41
+ 'Los Angeles Times', 'The Guardian', 'Financial Times', 'The Economist', 'Politico', 'Axios',
42
+ 'The Atlantic', 'The Hill', 'Al Jazeera', 'Sky News', 'The Telegraph', 'The Times', 'Forbes',
43
+ 'TechCrunch', 'The Verge', 'Le Monde', 'Le Figaro', 'Libération', 'Les Echos', 'France 24',
44
+ 'franceinfo', 'Le Parisien', 'RFI', 'Der Spiegel', 'El País', 'Deutsche Welle', 'Euronews',
45
+ 'Jeune Afrique', 'Nikkei', 'South China Morning Post',
46
+ ];
47
+ const TLDS = 'com|org|net|gov|edu|int|news|info|co\\.uk|org\\.uk|ac\\.uk|fr|de|es|it|ch|be|ca|au|uk|eu|tv|us|ng|tg|sn|ci|za|ke|jp|in';
48
+ /** A host name, with or without a scheme. Not preceded by `@` (an email) or a word character. */
49
+ const DOMAIN = new RegExp(`(?<![@\\w.-])(?:https?://)?(?:www\\.)?((?:[a-z0-9-]+\\.)+(?:${TLDS}))(?![\\w-])`, 'gi');
50
+ const URL = /https?:\/\/[^\s)>\]]+/gi;
51
+ const ATTRIBUTION = /\b(?:[Aa]ccording to|[Ss]elon|[Dd]['’]apr[eè]s|[Aa]s reported by|[Rr]eported by|[Cc]ited by)\s+(?:the\s+|l[ae]\s+|les\s+|l['’])?([A-Z][\p{L}&.'’-]*(?:\s+(?:of\s+|de\s+|du\s+|for\s+)?[A-Z][\p{L}&.'’-]*){0,4})/gu;
52
+ /** Right before a citation: "according to", "per", "via", "source:". */
53
+ const BEFORE = /(?:according to|selon|d['’]apr[eè]s|as reported by|reported by|cited by|\bper|\bvia|sources?\s*:)\s+(?:the\s+|l[ae]\s+|les\s+)?$/i;
54
+ /** Right after one: "reports", "said", "writes". */
55
+ const AFTER = /^['’]?s?\s+(?:has\s+|have\s+|had\s+)?(?:reports?|reported|reporting|said|says|wrote|writes|notes?|noted|confirmed|found|revealed|rapporte|indique|affirme|écrit|a rapporté|a indiqué)\b/i;
56
+ const MARKER = /\[(\d{1,2})\](?!\()|[¹²³⁴⁵⁶⁷⁸⁹]/g;
57
+ const SOURCES_LINE = /^\s*(?:[*_#>-]+\s*)?(?:Sources?|R[ée]f[ée]rences?|References)\s*(?:[*_]+)?\s*:/im;
58
+ /** Code is not prose: a fenced block or inline code never cites anything. */
59
+ function stripCode(text) {
60
+ return text.replace(/```[\s\S]*?```/g, ' ').replace(/`[^`\n]*`/g, ' ');
61
+ }
62
+ const norm = (token) => token.normalize('NFKD').replace(/[̀-ͯ]/g, '').toLowerCase().replace(/^www\./, '').replace(/^the\s+/, '').trim();
63
+ const escape = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
64
+ const compact = (name) => norm(name).replace(/[^a-z0-9]/g, '');
65
+ /** Each outlet under the keys its own domain is likely to carry: "reuters", "cbsnews", "theguardian". */
66
+ const OUTLET_KEYS = new Map(OUTLETS.flatMap((outlet) => {
67
+ const key = compact(outlet);
68
+ const raw = outlet.normalize('NFKD').replace(/[̀-ͯ]/g, '').toLowerCase().replace(/[^a-z0-9]/g, '');
69
+ return [...new Set([key, `${key}news`, raw, `${raw}news`])].map((k) => [k, norm(outlet)]);
70
+ }));
71
+ const TLD_SUFFIX = new RegExp(`\\.(?:${TLDS})$`, 'i');
72
+ /** The outlet a host belongs to ("www.reuters.com" → "reuters"), or the host itself. */
73
+ function sourceOfHost(host) {
74
+ const label = norm(host).replace(TLD_SUFFIX, '').split('.').pop() ?? '';
75
+ return OUTLET_KEYS.get(label) ?? host;
76
+ }
77
+ /** Is the occurrence at [start, end) in a citation position? */
78
+ function cited(text, start, end) {
79
+ const before = text.slice(Math.max(0, start - 40), start);
80
+ if (BEFORE.test(before))
81
+ return true;
82
+ if (AFTER.test(text.slice(end, end + 40)))
83
+ return true;
84
+ // Inside a short parenthesis: "(CBS News, Oct 3)", "(reuters.com)".
85
+ const open = text.lastIndexOf('(', start);
86
+ if (open !== -1 && start - open <= 60 && !text.slice(open, start).includes(')')) {
87
+ const close = text.indexOf(')', end);
88
+ if (close !== -1 && close - end <= 60 && !text.slice(end, close).includes('('))
89
+ return true;
90
+ }
91
+ // A markdown link's label: "[CBS News](https://…)".
92
+ const bracket = text.lastIndexOf('[', start);
93
+ if (bracket !== -1 && start - bracket <= 80 && !text.slice(bracket, start).includes(']')) {
94
+ const shut = text.indexOf('](', end);
95
+ if (shut !== -1 && shut - end <= 80 && !text.slice(end, shut).includes('['))
96
+ return true;
97
+ }
98
+ return false;
99
+ }
100
+ /**
101
+ * The citation signals in a reply. `known` is everything the conversation
102
+ * already held before this answer (the owner's words, earlier tool results,
103
+ * earlier replies): a source found there is not counted.
104
+ */
105
+ export function citationSignals(reply, known = '') {
106
+ const text = stripCode(reply);
107
+ const found = new Set();
108
+ const bare = new Set();
109
+ const add = (token, into = found) => {
110
+ const n = norm(token);
111
+ if (n.length >= 2)
112
+ into.add(n);
113
+ };
114
+ for (const outlet of OUTLETS) {
115
+ const re = new RegExp(`(?<![\\p{L}\\p{N}])${escape(outlet)}(?:\\s+News)?(?![\\p{L}\\p{N}])`, 'gu');
116
+ for (const m of text.matchAll(re)) {
117
+ if (cited(text, m.index, m.index + m[0].length))
118
+ add(outlet);
119
+ }
120
+ }
121
+ for (const m of text.matchAll(URL)) {
122
+ const host = /^https?:\/\/(?:www\.)?([^/:?#]+)/i.exec(m[0])?.[1];
123
+ if (host)
124
+ add(sourceOfHost(host), cited(text, m.index, m.index + m[0].length) ? found : bare);
125
+ }
126
+ for (const m of text.matchAll(DOMAIN)) {
127
+ if (cited(text, m.index, m.index + m[0].length))
128
+ add(sourceOfHost(m[1]));
129
+ }
130
+ for (const m of text.matchAll(ATTRIBUTION)) {
131
+ const name = m[1].replace(/[.,;:'’]+$/, '');
132
+ // An outlet already counted under its own name is one source, not two.
133
+ const outlet = OUTLETS.find((o) => name === o || name.startsWith(`${o} `));
134
+ add(outlet ?? name);
135
+ }
136
+ const held = known.normalize('NFKD').replace(/[̀-ͯ]/g, '').toLowerCase();
137
+ const unheld = (token) => !new RegExp(`(?<![\\p{L}\\p{N}])${escape(token)}(?![\\p{L}\\p{N}])`, 'u').test(held);
138
+ const sources = [...found].filter(unheld);
139
+ const links = [...bare].filter((token) => !found.has(token) && unheld(token));
140
+ const markers = new Set();
141
+ for (const m of text.matchAll(MARKER))
142
+ markers.add(m[1] ?? m[0]);
143
+ return { sources, links, markers: markers.size, sourcesLine: SOURCES_LINE.test(text) };
144
+ }
145
+ /**
146
+ * Does this reply cite sources the conversation never read? The loop asks
147
+ * only for the final text of a turn in which nothing was read — no tool call,
148
+ * no delegation, no native search — so "cites" here means "invented".
149
+ */
150
+ export function citesUnread(reply, known = '') {
151
+ const s = citationSignals(reply, known);
152
+ if (s.sources.length >= 2)
153
+ return true;
154
+ if (s.sources.length + s.links.length >= 1 && (s.markers >= 1 || s.sourcesLine))
155
+ return true;
156
+ return s.markers >= 2 && s.sourcesLine;
157
+ }
158
+ //# sourceMappingURL=grounding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grounding.js","sourceRoot":"","sources":["../src/grounding.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ export * from './rate-limit.js';
8
8
  export * from './transport.js';
9
9
  export * from './attachments.js';
10
10
  export * from './loop.js';
11
+ export * from './grounding.js';
11
12
  export * from './delegate.js';
12
13
  export * from './projection.js';
13
14
  export * from './context-window.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAE5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACnJ,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAE5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACnJ,cAAc,qBAAqB,CAAC"}
@@ -8,6 +8,7 @@ export * from './rate-limit.js';
8
8
  export * from './transport.js';
9
9
  export * from './attachments.js';
10
10
  export * from './loop.js';
11
+ export * from './grounding.js';
11
12
  export * from './delegate.js';
12
13
  export * from './projection.js';
13
14
  export * from './context-window.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,yEAAyE;AACzE,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAAwB,MAAM,sBAAsB,CAAC;AACnJ,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,yEAAyE;AACzE,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAAwB,MAAM,sBAAsB,CAAC;AACnJ,cAAc,qBAAqB,CAAC"}
@@ -76,6 +76,13 @@ export interface RunAgentOptions {
76
76
  * is `onText`.
77
77
  */
78
78
  onDelta?: (delta: CompletionDelta) => void;
79
+ /**
80
+ * The words streamed through `onDelta` for the turn just written are
81
+ * withdrawn: the grounding guard held that answer back (it cited sources
82
+ * nothing in the run had read) and the model is answering again. A surface
83
+ * drawing the live text clears it; nothing of it was stored. Never awaited.
84
+ */
85
+ onRetract?: () => void;
79
86
  /**
80
87
  * Whether a run that runs out of budget says so in the transcript. Default
81
88
  * true — the owner is owed the sentence.
@@ -213,6 +220,12 @@ export interface Interjection {
213
220
  /** Whoever queued it knows it by this. The loop only hands it back. */
214
221
  id?: string;
215
222
  text: string;
223
+ /**
224
+ * Files the owner sent with it. Hydrated when the loop takes the line — the
225
+ * bytes go to the model in the same tool-results turn as the words — and
226
+ * stored as references, the way an opening turn's files are.
227
+ */
228
+ attachments?: readonly AttachmentRef[];
216
229
  }
217
230
  /**
218
231
  * Where a run hears about what the owner said while it worked.
@@ -312,6 +325,12 @@ export interface RunResult {
312
325
  usage: Usage;
313
326
  /** Set only when `stopped === 'awaiting-approval'`. */
314
327
  pendingActionId?: string;
328
+ /**
329
+ * The grounding guard's verdict: the answer cited sources, nothing in the
330
+ * run read anything, and asked once to verify it still did not. It was
331
+ * delivered all the same, and the surfaces draw `UNCHECKED_LINE` under it.
332
+ */
333
+ unchecked?: boolean;
315
334
  /**
316
335
  * What this run actually ran on (docs/architecture.md, "Runtime provider port").
317
336
  * Pinned provider, pinned model, credential kind — plus the concrete model
@@ -1 +1 @@
1
- {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../src/loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../src/loop.ts"],"names":[],"mappings":"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"}
@@ -13,8 +13,9 @@ import { APPROVAL_RESUME_SPEAKER, DELEGATE_TOOL_NAME, SYSTEM_TOOLS, collectUntru
13
13
  import { primeSecretScrubber, scrubDeep, scrubText } from '@buddi/core';
14
14
  import { ProviderError, isThinkingBlock } from './anthropic.js';
15
15
  import { NATIVE_SEARCH_SYSTEM_NOTE, planNativeSearch } from './search.js';
16
+ import { GROUNDING_RETRY_TEXT, citationSignals, citesUnread } from './grounding.js';
16
17
  import { compactObservations } from './projection.js';
17
- import { degradeMessages, DEFAULT_CAPABILITIES, } from './capabilities.js';
18
+ import { degradeContent, degradeMessages, DEFAULT_CAPABILITIES, } from './capabilities.js';
18
19
  import { assertAttachmentCount, hydrateContent, hydrateMessages, toArtifactRefBlocks, } from './attachments.js';
19
20
  /**
20
21
  * The in-memory queue a surface with no durable store of its own hands to a
@@ -527,7 +528,13 @@ async function runAgentOnce(opts) {
527
528
  const memory = opts.memoryPreamble ? await opts.memoryPreamble(agent.id) : '';
528
529
  // The run's own agent and grant go along: a paragraph that is only for an
529
530
  // agent holding certain tools (the learning one) is decided by the grant.
530
- const platformContext = await ctx.systemContext?.({ agentId: agent.id, tools: tools.map((t) => t.name) });
531
+ // The owner's words ride along, so the context can name a story of today's
532
+ // edition the message is about (the gateway's edition origin line).
533
+ const platformContext = await ctx.systemContext?.({
534
+ agentId: agent.id,
535
+ tools: tools.map((t) => t.name),
536
+ ...(userMessage !== undefined ? { message: userMessage } : {}),
537
+ });
531
538
  const system = composeSystem(agent.systemPrompt, [opts.systemSuffix, platformContext?.prompt].filter(Boolean).join('\n\n'), memory, opts.surface, search.enabled ? NATIVE_SEARCH_SYSTEM_NOTE : undefined);
532
539
  // Provenance for every tool call this run makes. The caller's context is not
533
540
  // mutated: it is shared across runs, and a run's identity is its own.
@@ -568,8 +575,10 @@ async function runAgentOnce(opts) {
568
575
  const history = compactObservations(opts.transcript ? await opts.transcript.load() : await loadMessages(pool, conversationId));
569
576
  // Stored history carries artifact_ref blocks; the provider needs the bytes.
570
577
  const replayed = await hydrateMessages(history, opts.loadArtifact);
578
+ // Files sent with no words: the turn is the files alone. Providers refuse an
579
+ // empty text block, and each file already carries its own note to the model.
571
580
  const userBlocks = [
572
- { type: 'text', text: openingText },
581
+ ...(openingText.trim() === '' && attachments.length > 0 ? [] : [{ type: 'text', text: openingText }]),
573
582
  ...toArtifactRefBlocks(attachments),
574
583
  ];
575
584
  const sentUserBlocks = await hydrateContent(userBlocks, opts.loadArtifact, {
@@ -668,6 +677,19 @@ async function runAgentOnce(opts) {
668
677
  let waitingForOwner = false;
669
678
  /** Turns spent only on own-budget tools: not counted against maxTurns. */
670
679
  let exemptTurns = 0;
680
+ /**
681
+ * The grounding guard (docs/system-context.md, Grounding). `read` turns true
682
+ * at the first tool call or delegation that came back successfully, or the
683
+ * first native search of the run. A call that was unknown, refused,
684
+ * truncated, failed or still waits on the owner read nothing; until
685
+ * something did, an answer that cites sources cited them from memory. `regrounded`:
686
+ * that answer was held back once and the model asked to verify.
687
+ */
688
+ let read = false;
689
+ let regrounded = false;
690
+ /** The answer the guard held back, delivered (flagged) if the retry says nothing. */
691
+ let heldBack;
692
+ let unchecked = false;
671
693
  /**
672
694
  * What the owner added, leased for the step that has not happened yet.
673
695
  *
@@ -759,7 +781,6 @@ async function runAgentOnce(opts) {
759
781
  // What is *sent back* keeps the provider's own blocks — a paused turn is
760
782
  // only continuable with them. What is *stored* does not: see `persistable`.
761
783
  messages.push({ role: 'assistant', content: assistantContent });
762
- await persistMessage(pool, conversationId, 'assistant', persistable(assistantContent), opts.transcript?.speaker);
763
784
  // The audit line for a search nobody dispatched. Written before the run can
764
785
  // end, and before the next request, so the order in the log is the order it
765
786
  // happened in.
@@ -780,7 +801,59 @@ async function runAgentOnce(opts) {
780
801
  }
781
802
  }
782
803
  const toolUses = assistantContent.filter((b) => b.type === 'tool_use');
783
- const turnText = textOf(assistantContent);
804
+ let turnText = textOf(assistantContent);
805
+ let delivered = assistantContent;
806
+ if ((res.searches?.length ?? 0) > 0)
807
+ read = true;
808
+ /*
809
+ * The grounding guard. A final answer, in a run that read nothing — no
810
+ * tool, no colleague, no search, not a decided approval coming back — that
811
+ * names sources the conversation never held was written from memory. It is
812
+ * not delivered: not stored, not said, its streamed words withdrawn. The
813
+ * model is told so once, in a turn the transcript does not keep, and
814
+ * answers again. A second answer that still reads nothing is delivered
815
+ * with the run marked `unchecked`, which the surfaces draw as a quiet
816
+ * line under it. `citesUnread` is precision-first; see grounding.ts.
817
+ */
818
+ const finalAnswer = toolUses.length === 0 && res.stopReason !== 'pause_turn' && res.stopReason !== 'max_tokens';
819
+ if (finalAnswer && !read && resume === undefined && !waitingForOwner && (turnText !== '' || regrounded)) {
820
+ if (regrounded) {
821
+ unchecked = true;
822
+ // A retry that said nothing: the held-back answer goes out, flagged,
823
+ // rather than an empty reply.
824
+ if (turnText === '' && heldBack) {
825
+ delivered = heldBack.content;
826
+ turnText = heldBack.text;
827
+ }
828
+ await appendEvent(pool, 'run.grounding', { stage: 'unchecked', agentId: agent.id, ...(opts.runId ? { runId: opts.runId } : {}) }, conversationId);
829
+ }
830
+ else {
831
+ // What the agent legitimately carries counts as held too: its own
832
+ // prompt, its memory notes, the platform context it was given.
833
+ const known = [knownText(messages.slice(0, -1)), agent.systemPrompt, memory, platformContext?.prompt ?? ''].join('\n');
834
+ if (citesUnread(turnText, known)) {
835
+ regrounded = true;
836
+ const budgetLeft = turns - exemptTurns < agent.maxTurns && turns < agent.maxTurns + MAX_EXEMPT_TURNS;
837
+ await appendEvent(pool, 'run.grounding', {
838
+ stage: budgetLeft ? 'retried' : 'unchecked',
839
+ agentId: agent.id,
840
+ sources: citationSignals(turnText, known).sources.slice(0, 8),
841
+ ...(opts.runId ? { runId: opts.runId } : {}),
842
+ }, conversationId);
843
+ if (budgetLeft) {
844
+ heldBack = { content: assistantContent, text: turnText };
845
+ try {
846
+ opts.onRetract?.();
847
+ }
848
+ catch { /* a surface's drawing never decides a run */ }
849
+ messages.push({ role: 'user', content: [{ type: 'text', text: GROUNDING_RETRY_TEXT }] });
850
+ continue;
851
+ }
852
+ unchecked = true;
853
+ }
854
+ }
855
+ }
856
+ await persistMessage(pool, conversationId, 'assistant', persistable(delivered), opts.transcript?.speaker);
784
857
  if (turnText) {
785
858
  spoken.push({ text: turnText, beforeToolCall: toolUses.length > 0 });
786
859
  await opts.onText?.(turnText);
@@ -872,6 +945,8 @@ async function runAgentOnce(opts) {
872
945
  catch { /* a surface's drawing never decides a run */ }
873
946
  }
874
947
  if (outcome.ok) {
948
+ // Something came back: from here on the run has read (the guard).
949
+ read = true;
875
950
  if (registry.waitsForOwner(call.name, outcome.output))
876
951
  waitingForOwner = true;
877
952
  // A tool that declares it saves files, and names them in its output,
@@ -968,17 +1043,30 @@ async function runAgentOnce(opts) {
968
1043
  if (toolUses.length > 0 && toolUses.every((call) => registry.hasOwnBudget(call.name)))
969
1044
  exemptTurns++;
970
1045
  const lastTurn = turns - exemptTurns >= agent.maxTurns || turns >= agent.maxTurns + MAX_EXEMPT_TURNS || pendingActionId !== undefined || ctx.signal?.aborted === true;
971
- const leased = lastTurn ? [] : ((await opts.interjections?.lease()) ?? []).filter((item) => item.text.trim() !== '');
1046
+ const leased = lastTurn ? [] : ((await opts.interjections?.lease()) ?? [])
1047
+ .filter((item) => item.text.trim() !== '' || (item.attachments?.length ?? 0) > 0);
972
1048
  // What the model is shown, and what the transcript keeps: the framing is
973
1049
  // for the model — the record holds the owner's own words.
974
- const spokenBlocks = leased.length === 0
975
- ? []
976
- : [{ type: 'text', text: interjectionText(leased.map((item) => item.text)) }];
977
- const storedBlocks = leased.length === 0
978
- ? []
979
- : [{ type: 'text', text: leased.map((item) => item.text.trim()).join('\n\n') }];
1050
+ const said = leased.map((item) => item.text).filter((text) => text.trim() !== '');
1051
+ // Files that came with them: references in the record, the bytes (or the
1052
+ // note, for what a model cannot look at) in what is sent. Never capped
1053
+ // into a failure here — each file was accepted when it was uploaded, and
1054
+ // a run must not die between two tool calls over one; an oversize one
1055
+ // goes as a placeholder, the way a replayed one does.
1056
+ const leasedRefs = toArtifactRefBlocks(leased.flatMap((item) => item.attachments ?? []));
1057
+ const sentRefs = leasedRefs.length === 0 ? [] : degradeContent(await hydrateContent(leasedRefs, opts.loadArtifact), capabilities);
1058
+ const spokenBlocks = [
1059
+ ...(said.length === 0 ? [] : [{ type: 'text', text: interjectionText(said) }]),
1060
+ ...sentRefs,
1061
+ ];
1062
+ const storedBlocks = [
1063
+ ...(said.length === 0 ? [] : [{ type: 'text', text: said.map((text) => text.trim()).join('\n\n') }]),
1064
+ ...leasedRefs,
1065
+ ];
1066
+ const uploaded = leased.flatMap((item) => item.attachments ?? [])
1067
+ .map((a) => ({ artifactId: a.artifactId, kind: 'uploaded', agentId: null }));
980
1068
  messages.push({ role: 'user', content: [...results, ...spokenBlocks] });
981
- const turnMessageId = await persistMessage(pool, conversationId, 'user', [...results, ...storedBlocks], opts.transcript?.speaker, produced);
1069
+ const turnMessageId = await persistMessage(pool, conversationId, 'user', [...results, ...storedBlocks], opts.transcript?.speaker, [...produced, ...uploaded]);
982
1070
  if (leased.length > 0) {
983
1071
  inFlight = leased;
984
1072
  inFlightMessageId = turnMessageId;
@@ -1069,6 +1157,8 @@ async function runAgentOnce(opts) {
1069
1157
  ...(opts.surface ? { surface: opts.surface.id } : {}),
1070
1158
  ...(opts.runId ? { runId: opts.runId } : {}),
1071
1159
  ...(pendingActionId ? { actionId: pendingActionId } : {}),
1160
+ // Delivered from memory after the grounding guard asked for a check.
1161
+ ...(unchecked ? { unchecked: true } : {}),
1072
1162
  }, conversationId);
1073
1163
  return {
1074
1164
  text: joinSpoken(spoken),
@@ -1077,6 +1167,26 @@ async function runAgentOnce(opts) {
1077
1167
  usage,
1078
1168
  snapshot,
1079
1169
  ...(pendingActionId ? { pendingActionId } : {}),
1170
+ ...(unchecked ? { unchecked: true } : {}),
1080
1171
  };
1081
1172
  }
1173
+ /**
1174
+ * Everything the conversation held before an answer, as one string, for the
1175
+ * grounding guard: a source the owner named, or a tool returned earlier, is
1176
+ * not one the answer invented.
1177
+ */
1178
+ function knownText(messages) {
1179
+ const parts = [];
1180
+ for (const message of messages) {
1181
+ for (const block of message.content) {
1182
+ if (block.type === 'text')
1183
+ parts.push(block.text);
1184
+ else if (block.type === 'tool_result')
1185
+ parts.push(typeof block.content === 'string' ? block.content : JSON.stringify(block.content));
1186
+ else if (block.type === 'tool_use')
1187
+ parts.push(JSON.stringify(block.input));
1188
+ }
1189
+ }
1190
+ return parts.join('\n');
1191
+ }
1082
1192
  //# sourceMappingURL=loop.js.map