@withbuddi/buddi 0.1.0-pre.17 → 0.1.0-pre.19

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 (884) hide show
  1. package/README.md +29 -21
  2. package/extension/background.js +38 -7
  3. package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
  4. package/node_modules/@buddi/cli/dist/args.d.ts +16 -3
  5. package/node_modules/@buddi/cli/dist/args.d.ts.map +1 -1
  6. package/node_modules/@buddi/cli/dist/args.js +39 -89
  7. package/node_modules/@buddi/cli/dist/args.js.map +1 -1
  8. package/node_modules/@buddi/cli/dist/backup/index.d.ts +2 -0
  9. package/node_modules/@buddi/cli/dist/backup/index.d.ts.map +1 -1
  10. package/node_modules/@buddi/cli/dist/backup/index.js +13 -4
  11. package/node_modules/@buddi/cli/dist/backup/index.js.map +1 -1
  12. package/node_modules/@buddi/cli/dist/commands.d.ts +94 -0
  13. package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -0
  14. package/node_modules/@buddi/cli/dist/commands.js +1028 -0
  15. package/node_modules/@buddi/cli/dist/commands.js.map +1 -0
  16. package/node_modules/@buddi/cli/dist/dashboard-app.d.ts +6 -0
  17. package/node_modules/@buddi/cli/dist/dashboard-app.d.ts.map +1 -1
  18. package/node_modules/@buddi/cli/dist/dashboard-app.js +16 -1
  19. package/node_modules/@buddi/cli/dist/dashboard-app.js.map +1 -1
  20. package/node_modules/@buddi/cli/dist/doctor-probes.d.ts.map +1 -1
  21. package/node_modules/@buddi/cli/dist/doctor-probes.js +5 -2
  22. package/node_modules/@buddi/cli/dist/doctor-probes.js.map +1 -1
  23. package/node_modules/@buddi/cli/dist/doctor.d.ts +16 -0
  24. package/node_modules/@buddi/cli/dist/doctor.d.ts.map +1 -1
  25. package/node_modules/@buddi/cli/dist/doctor.js +18 -0
  26. package/node_modules/@buddi/cli/dist/doctor.js.map +1 -1
  27. package/node_modules/@buddi/cli/dist/index.d.ts +4 -1
  28. package/node_modules/@buddi/cli/dist/index.d.ts.map +1 -1
  29. package/node_modules/@buddi/cli/dist/index.js +4 -1
  30. package/node_modules/@buddi/cli/dist/index.js.map +1 -1
  31. package/node_modules/@buddi/cli/dist/jobs-cmd.d.ts +4 -0
  32. package/node_modules/@buddi/cli/dist/jobs-cmd.d.ts.map +1 -1
  33. package/node_modules/@buddi/cli/dist/jobs-cmd.js +26 -7
  34. package/node_modules/@buddi/cli/dist/jobs-cmd.js.map +1 -1
  35. package/node_modules/@buddi/cli/dist/main.d.ts +9 -2
  36. package/node_modules/@buddi/cli/dist/main.d.ts.map +1 -1
  37. package/node_modules/@buddi/cli/dist/main.js +256 -30
  38. package/node_modules/@buddi/cli/dist/main.js.map +1 -1
  39. package/node_modules/@buddi/cli/dist/paths.d.ts +7 -4
  40. package/node_modules/@buddi/cli/dist/paths.d.ts.map +1 -1
  41. package/node_modules/@buddi/cli/dist/paths.js +17 -6
  42. package/node_modules/@buddi/cli/dist/paths.js.map +1 -1
  43. package/node_modules/@buddi/cli/dist/status.d.ts +70 -0
  44. package/node_modules/@buddi/cli/dist/status.d.ts.map +1 -0
  45. package/node_modules/@buddi/cli/dist/status.js +122 -0
  46. package/node_modules/@buddi/cli/dist/status.js.map +1 -0
  47. package/node_modules/@buddi/cli/dist/style.d.ts +13 -0
  48. package/node_modules/@buddi/cli/dist/style.d.ts.map +1 -0
  49. package/node_modules/@buddi/cli/dist/style.js +10 -0
  50. package/node_modules/@buddi/cli/dist/style.js.map +1 -0
  51. package/node_modules/@buddi/cli/dist/telegram-cmd.d.ts +1 -1
  52. package/node_modules/@buddi/cli/dist/telegram-cmd.d.ts.map +1 -1
  53. package/node_modules/@buddi/cli/dist/telegram-cmd.js +23 -6
  54. package/node_modules/@buddi/cli/dist/telegram-cmd.js.map +1 -1
  55. package/node_modules/@buddi/cli/dist/uninstall-cmd.d.ts +42 -0
  56. package/node_modules/@buddi/cli/dist/uninstall-cmd.d.ts.map +1 -0
  57. package/node_modules/@buddi/cli/dist/uninstall-cmd.js +208 -0
  58. package/node_modules/@buddi/cli/dist/uninstall-cmd.js.map +1 -0
  59. package/node_modules/@buddi/cli/dist/vault-cmd.js +3 -3
  60. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  61. package/node_modules/@buddi/core/dist/actions/approvals.d.ts +0 -17
  62. package/node_modules/@buddi/core/dist/actions/approvals.d.ts.map +1 -1
  63. package/node_modules/@buddi/core/dist/actions/approvals.js +21 -0
  64. package/node_modules/@buddi/core/dist/actions/approvals.js.map +1 -1
  65. package/node_modules/@buddi/core/dist/actions/execute.d.ts +1 -1
  66. package/node_modules/@buddi/core/dist/actions/jobs.d.ts +1 -1
  67. package/node_modules/@buddi/core/dist/actions/types.js +1 -1
  68. package/node_modules/@buddi/core/dist/agents/models.d.ts.map +1 -1
  69. package/node_modules/@buddi/core/dist/agents/models.js +4 -3
  70. package/node_modules/@buddi/core/dist/agents/models.js.map +1 -1
  71. package/node_modules/@buddi/core/dist/agents/provider-from-env.d.ts +1 -1
  72. package/node_modules/@buddi/core/dist/agents/provider-from-env.js +1 -1
  73. package/node_modules/@buddi/core/dist/agents/skills.d.ts +2 -2
  74. package/node_modules/@buddi/core/dist/goals/frequency.d.ts +51 -0
  75. package/node_modules/@buddi/core/dist/goals/frequency.d.ts.map +1 -0
  76. package/node_modules/@buddi/core/dist/goals/frequency.js +113 -0
  77. package/node_modules/@buddi/core/dist/goals/frequency.js.map +1 -0
  78. package/node_modules/@buddi/core/dist/goals/index.d.ts +2 -0
  79. package/node_modules/@buddi/core/dist/goals/index.d.ts.map +1 -1
  80. package/node_modules/@buddi/core/dist/goals/index.js +2 -0
  81. package/node_modules/@buddi/core/dist/goals/index.js.map +1 -1
  82. package/node_modules/@buddi/core/dist/goals/math.d.ts +8 -2
  83. package/node_modules/@buddi/core/dist/goals/math.d.ts.map +1 -1
  84. package/node_modules/@buddi/core/dist/goals/math.js +17 -4
  85. package/node_modules/@buddi/core/dist/goals/math.js.map +1 -1
  86. package/node_modules/@buddi/core/dist/goals/owner.d.ts +129 -0
  87. package/node_modules/@buddi/core/dist/goals/owner.d.ts.map +1 -0
  88. package/node_modules/@buddi/core/dist/goals/owner.js +239 -0
  89. package/node_modules/@buddi/core/dist/goals/owner.js.map +1 -0
  90. package/node_modules/@buddi/core/dist/goals/store.d.ts.map +1 -1
  91. package/node_modules/@buddi/core/dist/goals/store.js +11 -4
  92. package/node_modules/@buddi/core/dist/goals/store.js.map +1 -1
  93. package/node_modules/@buddi/core/dist/goals/types.d.ts +17 -3
  94. package/node_modules/@buddi/core/dist/goals/types.d.ts.map +1 -1
  95. package/node_modules/@buddi/core/dist/goals/types.js +8 -2
  96. package/node_modules/@buddi/core/dist/goals/types.js.map +1 -1
  97. package/node_modules/@buddi/core/dist/host/build.d.ts +15 -1
  98. package/node_modules/@buddi/core/dist/host/build.d.ts.map +1 -1
  99. package/node_modules/@buddi/core/dist/host/build.js +99 -1
  100. package/node_modules/@buddi/core/dist/host/build.js.map +1 -1
  101. package/node_modules/@buddi/core/dist/host/types.d.ts +88 -1
  102. package/node_modules/@buddi/core/dist/host/types.d.ts.map +1 -1
  103. package/node_modules/@buddi/core/dist/index.d.ts +1 -0
  104. package/node_modules/@buddi/core/dist/index.d.ts.map +1 -1
  105. package/node_modules/@buddi/core/dist/index.js +1 -0
  106. package/node_modules/@buddi/core/dist/index.js.map +1 -1
  107. package/node_modules/@buddi/core/dist/learning/announce.d.ts +29 -0
  108. package/node_modules/@buddi/core/dist/learning/announce.d.ts.map +1 -0
  109. package/node_modules/@buddi/core/dist/learning/announce.js +49 -0
  110. package/node_modules/@buddi/core/dist/learning/announce.js.map +1 -0
  111. package/node_modules/@buddi/core/dist/learning/index.d.ts +1 -0
  112. package/node_modules/@buddi/core/dist/learning/index.d.ts.map +1 -1
  113. package/node_modules/@buddi/core/dist/learning/index.js +1 -0
  114. package/node_modules/@buddi/core/dist/learning/index.js.map +1 -1
  115. package/node_modules/@buddi/core/dist/learning/store.d.ts.map +1 -1
  116. package/node_modules/@buddi/core/dist/learning/store.js +15 -4
  117. package/node_modules/@buddi/core/dist/learning/store.js.map +1 -1
  118. package/node_modules/@buddi/core/dist/notifications/channels.d.ts +37 -0
  119. package/node_modules/@buddi/core/dist/notifications/channels.d.ts.map +1 -0
  120. package/node_modules/@buddi/core/dist/notifications/channels.js +87 -0
  121. package/node_modules/@buddi/core/dist/notifications/channels.js.map +1 -0
  122. package/node_modules/@buddi/core/dist/notifications/index.d.ts +5 -0
  123. package/node_modules/@buddi/core/dist/notifications/index.d.ts.map +1 -0
  124. package/node_modules/@buddi/core/dist/notifications/index.js +5 -0
  125. package/node_modules/@buddi/core/dist/notifications/index.js.map +1 -0
  126. package/node_modules/@buddi/core/dist/notifications/notify.d.ts +35 -0
  127. package/node_modules/@buddi/core/dist/notifications/notify.d.ts.map +1 -0
  128. package/node_modules/@buddi/core/dist/notifications/notify.js +263 -0
  129. package/node_modules/@buddi/core/dist/notifications/notify.js.map +1 -0
  130. package/node_modules/@buddi/core/dist/notifications/store.d.ts +50 -0
  131. package/node_modules/@buddi/core/dist/notifications/store.d.ts.map +1 -0
  132. package/node_modules/@buddi/core/dist/notifications/store.js +216 -0
  133. package/node_modules/@buddi/core/dist/notifications/store.js.map +1 -0
  134. package/node_modules/@buddi/core/dist/notifications/types.d.ts +142 -0
  135. package/node_modules/@buddi/core/dist/notifications/types.d.ts.map +1 -0
  136. package/node_modules/@buddi/core/dist/notifications/types.js +5 -0
  137. package/node_modules/@buddi/core/dist/notifications/types.js.map +1 -0
  138. package/node_modules/@buddi/core/dist/owner.js +1 -1
  139. package/node_modules/@buddi/core/dist/pages.d.ts +2 -2
  140. package/node_modules/@buddi/core/dist/plugin/index.d.ts +1 -1
  141. package/node_modules/@buddi/core/dist/plugin/index.d.ts.map +1 -1
  142. package/node_modules/@buddi/core/dist/plugin/uses.d.ts +1 -1
  143. package/node_modules/@buddi/core/dist/plugin/uses.d.ts.map +1 -1
  144. package/node_modules/@buddi/core/dist/plugin/uses.js +4 -0
  145. package/node_modules/@buddi/core/dist/plugin/uses.js.map +1 -1
  146. package/node_modules/@buddi/core/dist/plugin/version.d.ts +1 -1
  147. package/node_modules/@buddi/core/dist/plugin/version.js +1 -1
  148. package/node_modules/@buddi/core/dist/provider.d.ts +1 -1
  149. package/node_modules/@buddi/core/dist/provider.js +1 -1
  150. package/node_modules/@buddi/core/dist/queue/retry-policy.d.ts +1 -1
  151. package/node_modules/@buddi/core/dist/queue/retry-policy.js +1 -1
  152. package/node_modules/@buddi/core/dist/registry.d.ts.map +1 -1
  153. package/node_modules/@buddi/core/dist/registry.js +3 -4
  154. package/node_modules/@buddi/core/dist/registry.js.map +1 -1
  155. package/node_modules/@buddi/core/dist/reminders/store.d.ts +1 -1
  156. package/node_modules/@buddi/core/dist/reminders/store.js +1 -1
  157. package/node_modules/@buddi/core/dist/reminders/types.d.ts +1 -1
  158. package/node_modules/@buddi/core/dist/reminders/types.js +1 -1
  159. package/node_modules/@buddi/core/dist/sentinels/run.d.ts.map +1 -1
  160. package/node_modules/@buddi/core/dist/sentinels/run.js +4 -1
  161. package/node_modules/@buddi/core/dist/sentinels/run.js.map +1 -1
  162. package/node_modules/@buddi/core/dist/sentinels/types.d.ts +21 -1
  163. package/node_modules/@buddi/core/dist/sentinels/types.d.ts.map +1 -1
  164. package/node_modules/@buddi/core/dist/sentinels/types.js.map +1 -1
  165. package/node_modules/@buddi/core/dist/surfaces.d.ts +2 -0
  166. package/node_modules/@buddi/core/dist/surfaces.d.ts.map +1 -1
  167. package/node_modules/@buddi/core/dist/surfaces.js +7 -0
  168. package/node_modules/@buddi/core/dist/surfaces.js.map +1 -1
  169. package/node_modules/@buddi/core/dist/time.d.ts +12 -0
  170. package/node_modules/@buddi/core/dist/time.d.ts.map +1 -1
  171. package/node_modules/@buddi/core/dist/time.js +46 -0
  172. package/node_modules/@buddi/core/dist/time.js.map +1 -1
  173. package/node_modules/@buddi/core/dist/tools.d.ts +5 -5
  174. package/node_modules/@buddi/core/dist/uninstall.d.ts +79 -0
  175. package/node_modules/@buddi/core/dist/uninstall.d.ts.map +1 -0
  176. package/node_modules/@buddi/core/dist/uninstall.js +109 -0
  177. package/node_modules/@buddi/core/dist/uninstall.js.map +1 -0
  178. package/node_modules/@buddi/core/dist/vault/file.js +2 -2
  179. package/node_modules/@buddi/core/dist/vault/keychain.js +1 -1
  180. package/node_modules/@buddi/core/dist/vault/keychain.js.map +1 -1
  181. package/node_modules/@buddi/core/dist/vault/resolve.d.ts +3 -3
  182. package/node_modules/@buddi/core/dist/vault/resolve.js +3 -3
  183. package/node_modules/@buddi/core/dist/vault/types.d.ts +1 -1
  184. package/node_modules/@buddi/core/dist/vault/types.js +1 -1
  185. package/node_modules/@buddi/core/dist/views.d.ts +66 -66
  186. package/node_modules/@buddi/core/migrations/003_owner_surfaces.sql +1 -1
  187. package/node_modules/@buddi/core/migrations/005_artifacts.sql +1 -1
  188. package/node_modules/@buddi/core/migrations/009_queue.sql +1 -2
  189. package/node_modules/@buddi/core/migrations/010_actions.sql +1 -1
  190. package/node_modules/@buddi/core/migrations/043_owner_notifications.sql +77 -0
  191. package/node_modules/@buddi/core/migrations/044_owner_metrics.sql +45 -0
  192. package/node_modules/@buddi/core/migrations/045_frequency_goals.sql +19 -0
  193. package/node_modules/@buddi/core/package.json +4 -0
  194. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  195. package/node_modules/@buddi/gateway/dist/agents/catalog.js +1 -1
  196. package/node_modules/@buddi/gateway/dist/agents-cli.d.ts +25 -1
  197. package/node_modules/@buddi/gateway/dist/agents-cli.d.ts.map +1 -1
  198. package/node_modules/@buddi/gateway/dist/agents-cli.js +91 -27
  199. package/node_modules/@buddi/gateway/dist/agents-cli.js.map +1 -1
  200. package/node_modules/@buddi/gateway/dist/bootstrap.d.ts.map +1 -1
  201. package/node_modules/@buddi/gateway/dist/bootstrap.js +8 -0
  202. package/node_modules/@buddi/gateway/dist/bootstrap.js.map +1 -1
  203. package/node_modules/@buddi/gateway/dist/channels/local-notification.d.ts +39 -0
  204. package/node_modules/@buddi/gateway/dist/channels/local-notification.d.ts.map +1 -0
  205. package/node_modules/@buddi/gateway/dist/channels/local-notification.js +154 -0
  206. package/node_modules/@buddi/gateway/dist/channels/local-notification.js.map +1 -0
  207. package/node_modules/@buddi/gateway/dist/chat/approvals.d.ts +3 -3
  208. package/node_modules/@buddi/gateway/dist/chat/approvals.js +3 -3
  209. package/node_modules/@buddi/gateway/dist/chat/usage.d.ts.map +1 -1
  210. package/node_modules/@buddi/gateway/dist/chat/usage.js +1 -0
  211. package/node_modules/@buddi/gateway/dist/chat/usage.js.map +1 -1
  212. package/node_modules/@buddi/gateway/dist/cli.d.ts +14 -0
  213. package/node_modules/@buddi/gateway/dist/cli.d.ts.map +1 -1
  214. package/node_modules/@buddi/gateway/dist/cli.js +208 -37
  215. package/node_modules/@buddi/gateway/dist/cli.js.map +1 -1
  216. package/node_modules/@buddi/gateway/dist/db-ready.d.ts +2 -1
  217. package/node_modules/@buddi/gateway/dist/db-ready.d.ts.map +1 -1
  218. package/node_modules/@buddi/gateway/dist/db-ready.js +3 -2
  219. package/node_modules/@buddi/gateway/dist/db-ready.js.map +1 -1
  220. package/node_modules/@buddi/gateway/dist/index.d.ts +5 -1
  221. package/node_modules/@buddi/gateway/dist/index.d.ts.map +1 -1
  222. package/node_modules/@buddi/gateway/dist/index.js +6 -1
  223. package/node_modules/@buddi/gateway/dist/index.js.map +1 -1
  224. package/node_modules/@buddi/gateway/dist/missions/agent-run.d.ts.map +1 -1
  225. package/node_modules/@buddi/gateway/dist/missions/agent-run.js +11 -1
  226. package/node_modules/@buddi/gateway/dist/missions/agent-run.js.map +1 -1
  227. package/node_modules/@buddi/gateway/dist/missions/execute.d.ts +22 -1
  228. package/node_modules/@buddi/gateway/dist/missions/execute.d.ts.map +1 -1
  229. package/node_modules/@buddi/gateway/dist/missions/execute.js +8 -1
  230. package/node_modules/@buddi/gateway/dist/missions/execute.js.map +1 -1
  231. package/node_modules/@buddi/gateway/dist/missions/goals-format.d.ts +32 -5
  232. package/node_modules/@buddi/gateway/dist/missions/goals-format.d.ts.map +1 -1
  233. package/node_modules/@buddi/gateway/dist/missions/goals-format.js +59 -2
  234. package/node_modules/@buddi/gateway/dist/missions/goals-format.js.map +1 -1
  235. package/node_modules/@buddi/gateway/dist/missions/goals-page.d.ts +60 -5
  236. package/node_modules/@buddi/gateway/dist/missions/goals-page.d.ts.map +1 -1
  237. package/node_modules/@buddi/gateway/dist/missions/goals-page.js +355 -8
  238. package/node_modules/@buddi/gateway/dist/missions/goals-page.js.map +1 -1
  239. package/node_modules/@buddi/gateway/dist/missions/goals.d.ts +64 -5
  240. package/node_modules/@buddi/gateway/dist/missions/goals.d.ts.map +1 -1
  241. package/node_modules/@buddi/gateway/dist/missions/goals.js +834 -116
  242. package/node_modules/@buddi/gateway/dist/missions/goals.js.map +1 -1
  243. package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.d.ts +5 -0
  244. package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.d.ts.map +1 -1
  245. package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.js +12 -0
  246. package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.js.map +1 -1
  247. package/node_modules/@buddi/gateway/dist/missions-cli.d.ts +2 -0
  248. package/node_modules/@buddi/gateway/dist/missions-cli.d.ts.map +1 -1
  249. package/node_modules/@buddi/gateway/dist/missions-cli.js +53 -8
  250. package/node_modules/@buddi/gateway/dist/missions-cli.js.map +1 -1
  251. package/node_modules/@buddi/gateway/dist/owner-notify.d.ts +44 -0
  252. package/node_modules/@buddi/gateway/dist/owner-notify.d.ts.map +1 -0
  253. package/node_modules/@buddi/gateway/dist/owner-notify.js +91 -0
  254. package/node_modules/@buddi/gateway/dist/owner-notify.js.map +1 -0
  255. package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts +3 -1
  256. package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts.map +1 -1
  257. package/node_modules/@buddi/gateway/dist/plugins-cli.js +11 -4
  258. package/node_modules/@buddi/gateway/dist/plugins-cli.js.map +1 -1
  259. package/node_modules/@buddi/gateway/dist/provider-accounts.d.ts.map +1 -1
  260. package/node_modules/@buddi/gateway/dist/provider-accounts.js +22 -13
  261. package/node_modules/@buddi/gateway/dist/provider-accounts.js.map +1 -1
  262. package/node_modules/@buddi/gateway/dist/reminders-cli.d.ts +3 -1
  263. package/node_modules/@buddi/gateway/dist/reminders-cli.d.ts.map +1 -1
  264. package/node_modules/@buddi/gateway/dist/reminders-cli.js +21 -2
  265. package/node_modules/@buddi/gateway/dist/reminders-cli.js.map +1 -1
  266. package/node_modules/@buddi/gateway/dist/serve.d.ts +2 -0
  267. package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
  268. package/node_modules/@buddi/gateway/dist/serve.js +61 -13
  269. package/node_modules/@buddi/gateway/dist/serve.js.map +1 -1
  270. package/node_modules/@buddi/gateway/dist/subscription-signins.d.ts +28 -0
  271. package/node_modules/@buddi/gateway/dist/subscription-signins.d.ts.map +1 -0
  272. package/node_modules/@buddi/gateway/dist/subscription-signins.js +30 -0
  273. package/node_modules/@buddi/gateway/dist/subscription-signins.js.map +1 -0
  274. package/node_modules/@buddi/gateway/dist/telegram/api.d.ts +43 -9
  275. package/node_modules/@buddi/gateway/dist/telegram/api.d.ts.map +1 -1
  276. package/node_modules/@buddi/gateway/dist/telegram/api.js +80 -21
  277. package/node_modules/@buddi/gateway/dist/telegram/api.js.map +1 -1
  278. package/node_modules/@buddi/gateway/dist/telegram/approvals.d.ts +3 -3
  279. package/node_modules/@buddi/gateway/dist/telegram/approvals.js +3 -3
  280. package/node_modules/@buddi/gateway/dist/telegram/attachments.d.ts +6 -0
  281. package/node_modules/@buddi/gateway/dist/telegram/attachments.d.ts.map +1 -1
  282. package/node_modules/@buddi/gateway/dist/telegram/attachments.js +1 -0
  283. package/node_modules/@buddi/gateway/dist/telegram/attachments.js.map +1 -1
  284. package/node_modules/@buddi/gateway/dist/telegram/browser-view.d.ts.map +1 -1
  285. package/node_modules/@buddi/gateway/dist/telegram/browser-view.js +2 -1
  286. package/node_modules/@buddi/gateway/dist/telegram/browser-view.js.map +1 -1
  287. package/node_modules/@buddi/gateway/dist/telegram/channel.d.ts +36 -0
  288. package/node_modules/@buddi/gateway/dist/telegram/channel.d.ts.map +1 -0
  289. package/node_modules/@buddi/gateway/dist/telegram/channel.js +71 -0
  290. package/node_modules/@buddi/gateway/dist/telegram/channel.js.map +1 -0
  291. package/node_modules/@buddi/gateway/dist/telegram/commands.d.ts +28 -0
  292. package/node_modules/@buddi/gateway/dist/telegram/commands.d.ts.map +1 -0
  293. package/node_modules/@buddi/gateway/dist/telegram/commands.js +74 -0
  294. package/node_modules/@buddi/gateway/dist/telegram/commands.js.map +1 -0
  295. package/node_modules/@buddi/gateway/dist/telegram/main.d.ts +3 -0
  296. package/node_modules/@buddi/gateway/dist/telegram/main.d.ts.map +1 -1
  297. package/node_modules/@buddi/gateway/dist/telegram/main.js +71 -2
  298. package/node_modules/@buddi/gateway/dist/telegram/main.js.map +1 -1
  299. package/node_modules/@buddi/gateway/dist/telegram/outbound.d.ts +191 -0
  300. package/node_modules/@buddi/gateway/dist/telegram/outbound.d.ts.map +1 -0
  301. package/node_modules/@buddi/gateway/dist/telegram/outbound.js +671 -0
  302. package/node_modules/@buddi/gateway/dist/telegram/outbound.js.map +1 -0
  303. package/node_modules/@buddi/gateway/dist/telegram/proposals.d.ts +65 -0
  304. package/node_modules/@buddi/gateway/dist/telegram/proposals.d.ts.map +1 -0
  305. package/node_modules/@buddi/gateway/dist/telegram/proposals.js +183 -0
  306. package/node_modules/@buddi/gateway/dist/telegram/proposals.js.map +1 -0
  307. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts +47 -47
  308. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
  309. package/node_modules/@buddi/gateway/dist/telegram/surface.js +103 -291
  310. package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
  311. package/node_modules/@buddi/gateway/dist/web/config.js +3 -3
  312. package/node_modules/@buddi/gateway/dist/web/http.d.ts +16 -3
  313. package/node_modules/@buddi/gateway/dist/web/http.d.ts.map +1 -1
  314. package/node_modules/@buddi/gateway/dist/web/http.js +39 -3
  315. package/node_modules/@buddi/gateway/dist/web/http.js.map +1 -1
  316. package/node_modules/@buddi/gateway/dist/web/notifications.d.ts +36 -0
  317. package/node_modules/@buddi/gateway/dist/web/notifications.d.ts.map +1 -0
  318. package/node_modules/@buddi/gateway/dist/web/notifications.js +63 -0
  319. package/node_modules/@buddi/gateway/dist/web/notifications.js.map +1 -0
  320. package/node_modules/@buddi/gateway/dist/web/onboarding.d.ts +1 -1
  321. package/node_modules/@buddi/gateway/dist/web/onboarding.d.ts.map +1 -1
  322. package/node_modules/@buddi/gateway/dist/web/onboarding.js +5 -1
  323. package/node_modules/@buddi/gateway/dist/web/onboarding.js.map +1 -1
  324. package/node_modules/@buddi/gateway/dist/web/read.js +3 -3
  325. package/node_modules/@buddi/gateway/dist/web/secrets.d.ts.map +1 -1
  326. package/node_modules/@buddi/gateway/dist/web/secrets.js +3 -2
  327. package/node_modules/@buddi/gateway/dist/web/secrets.js.map +1 -1
  328. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  329. package/node_modules/@buddi/gateway/dist/web/server.js +54 -23
  330. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  331. package/node_modules/@buddi/gateway/dist/web/telegram.d.ts +39 -0
  332. package/node_modules/@buddi/gateway/dist/web/telegram.d.ts.map +1 -1
  333. package/node_modules/@buddi/gateway/dist/web/telegram.js +53 -1
  334. package/node_modules/@buddi/gateway/dist/web/telegram.js.map +1 -1
  335. package/node_modules/@buddi/gateway/dist/web/version.d.ts +1 -0
  336. package/node_modules/@buddi/gateway/dist/web/version.d.ts.map +1 -1
  337. package/node_modules/@buddi/gateway/dist/web/version.js +2 -1
  338. package/node_modules/@buddi/gateway/dist/web/version.js.map +1 -1
  339. package/node_modules/@buddi/gateway/dist/web/write.js +1 -1
  340. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  341. package/node_modules/@buddi/install/dist/environment.d.ts +29 -0
  342. package/node_modules/@buddi/install/dist/environment.d.ts.map +1 -1
  343. package/node_modules/@buddi/install/dist/environment.js +50 -1
  344. package/node_modules/@buddi/install/dist/environment.js.map +1 -1
  345. package/node_modules/@buddi/install/dist/launcher.d.ts +3 -1
  346. package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
  347. package/node_modules/@buddi/install/dist/launcher.js +220 -14
  348. package/node_modules/@buddi/install/dist/launcher.js.map +1 -1
  349. package/node_modules/@buddi/install/dist/uninstall.d.ts +59 -0
  350. package/node_modules/@buddi/install/dist/uninstall.d.ts.map +1 -0
  351. package/node_modules/@buddi/install/dist/uninstall.js +260 -0
  352. package/node_modules/@buddi/install/dist/uninstall.js.map +1 -0
  353. package/node_modules/@buddi/install/dist/upgrade.d.ts +16 -3
  354. package/node_modules/@buddi/install/dist/upgrade.d.ts.map +1 -1
  355. package/node_modules/@buddi/install/dist/upgrade.js +21 -7
  356. package/node_modules/@buddi/install/dist/upgrade.js.map +1 -1
  357. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  358. package/node_modules/@buddi/runtime/dist/anthropic.d.ts +35 -2
  359. package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
  360. package/node_modules/@buddi/runtime/dist/anthropic.js +36 -12
  361. package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
  362. package/node_modules/@buddi/runtime/dist/context-window.d.ts.map +1 -1
  363. package/node_modules/@buddi/runtime/dist/context-window.js +5 -2
  364. package/node_modules/@buddi/runtime/dist/context-window.js.map +1 -1
  365. package/node_modules/@buddi/runtime/dist/delegate.js +1 -1
  366. package/node_modules/@buddi/runtime/dist/loop.d.ts +13 -1
  367. package/node_modules/@buddi/runtime/dist/loop.d.ts.map +1 -1
  368. package/node_modules/@buddi/runtime/dist/loop.js +70 -3
  369. package/node_modules/@buddi/runtime/dist/loop.js.map +1 -1
  370. package/node_modules/@buddi/runtime/dist/openai.d.ts.map +1 -1
  371. package/node_modules/@buddi/runtime/dist/openai.js +26 -8
  372. package/node_modules/@buddi/runtime/dist/openai.js.map +1 -1
  373. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  374. package/node_modules/@buddi/tool-artifacts/dist/index.d.ts +1 -1
  375. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  376. package/node_modules/@buddi/tool-browser/dist/availability.d.ts +34 -8
  377. package/node_modules/@buddi/tool-browser/dist/availability.d.ts.map +1 -1
  378. package/node_modules/@buddi/tool-browser/dist/availability.js +44 -5
  379. package/node_modules/@buddi/tool-browser/dist/availability.js.map +1 -1
  380. package/node_modules/@buddi/tool-browser/dist/controller.d.ts +2 -2
  381. package/node_modules/@buddi/tool-browser/dist/controller.d.ts.map +1 -1
  382. package/node_modules/@buddi/tool-browser/dist/controller.js +7 -6
  383. package/node_modules/@buddi/tool-browser/dist/controller.js.map +1 -1
  384. package/node_modules/@buddi/tool-browser/dist/host.d.ts +3 -1
  385. package/node_modules/@buddi/tool-browser/dist/host.d.ts.map +1 -1
  386. package/node_modules/@buddi/tool-browser/dist/host.js +5 -1
  387. package/node_modules/@buddi/tool-browser/dist/host.js.map +1 -1
  388. package/node_modules/@buddi/tool-browser/dist/index.d.ts +2 -2
  389. package/node_modules/@buddi/tool-browser/dist/index.d.ts.map +1 -1
  390. package/node_modules/@buddi/tool-browser/dist/index.js +13 -5
  391. package/node_modules/@buddi/tool-browser/dist/index.js.map +1 -1
  392. package/node_modules/@buddi/tool-browser/dist/origin-pattern.d.ts +31 -0
  393. package/node_modules/@buddi/tool-browser/dist/origin-pattern.d.ts.map +1 -0
  394. package/node_modules/@buddi/tool-browser/dist/origin-pattern.js +61 -0
  395. package/node_modules/@buddi/tool-browser/dist/origin-pattern.js.map +1 -0
  396. package/node_modules/@buddi/tool-browser/dist/public-suffixes.d.ts +24 -0
  397. package/node_modules/@buddi/tool-browser/dist/public-suffixes.d.ts.map +1 -0
  398. package/node_modules/@buddi/tool-browser/dist/public-suffixes.js +153 -0
  399. package/node_modules/@buddi/tool-browser/dist/public-suffixes.js.map +1 -0
  400. package/node_modules/@buddi/tool-browser/dist/secrets.d.ts +45 -9
  401. package/node_modules/@buddi/tool-browser/dist/secrets.d.ts.map +1 -1
  402. package/node_modules/@buddi/tool-browser/dist/secrets.js +77 -20
  403. package/node_modules/@buddi/tool-browser/dist/secrets.js.map +1 -1
  404. package/node_modules/@buddi/tool-browser/dist/service.d.ts +12 -2
  405. package/node_modules/@buddi/tool-browser/dist/service.d.ts.map +1 -1
  406. package/node_modules/@buddi/tool-browser/dist/service.js +84 -20
  407. package/node_modules/@buddi/tool-browser/dist/service.js.map +1 -1
  408. package/node_modules/@buddi/tool-browser/dist/types.d.ts +7 -1
  409. package/node_modules/@buddi/tool-browser/dist/types.d.ts.map +1 -1
  410. package/node_modules/@buddi/tool-browser/dist/types.js +7 -1
  411. package/node_modules/@buddi/tool-browser/dist/types.js.map +1 -1
  412. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  413. package/node_modules/@buddi/tool-email/dist/channel.d.ts +43 -0
  414. package/node_modules/@buddi/tool-email/dist/channel.d.ts.map +1 -0
  415. package/node_modules/@buddi/tool-email/dist/channel.js +99 -0
  416. package/node_modules/@buddi/tool-email/dist/channel.js.map +1 -0
  417. package/node_modules/@buddi/tool-email/dist/index.d.ts +1 -0
  418. package/node_modules/@buddi/tool-email/dist/index.d.ts.map +1 -1
  419. package/node_modules/@buddi/tool-email/dist/index.js +8 -1
  420. package/node_modules/@buddi/tool-email/dist/index.js.map +1 -1
  421. package/node_modules/@buddi/tool-email/dist/ports.d.ts +3 -3
  422. package/node_modules/@buddi/tool-email/dist/ports.js +1 -1
  423. package/node_modules/@buddi/tool-email/dist/tools/drafts.d.ts +1 -1
  424. package/node_modules/@buddi/tool-email/dist/tools/read.js +1 -1
  425. package/node_modules/@buddi/tool-email/dist/tools/read.js.map +1 -1
  426. package/node_modules/@buddi/tool-email/dist/tools/send.js +1 -1
  427. package/node_modules/@buddi/tool-email/migrations/001_email.sql +3 -2
  428. package/node_modules/@buddi/tool-email/package.json +2 -1
  429. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  430. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  431. package/node_modules/@buddi/tool-memory/dist/index.js +1 -1
  432. package/node_modules/@buddi/tool-memory/migrations/001_memory.sql +1 -1
  433. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  434. package/node_modules/ws/lib/websocket.js +17 -3
  435. package/node_modules/ws/package.json +1 -1
  436. package/package.json +5 -2
  437. package/packages/cli/dist/.tsbuildinfo +1 -1
  438. package/packages/cli/dist/args.d.ts +16 -3
  439. package/packages/cli/dist/args.d.ts.map +1 -1
  440. package/packages/cli/dist/args.js +39 -89
  441. package/packages/cli/dist/args.js.map +1 -1
  442. package/packages/cli/dist/backup/index.d.ts +2 -0
  443. package/packages/cli/dist/backup/index.d.ts.map +1 -1
  444. package/packages/cli/dist/backup/index.js +13 -4
  445. package/packages/cli/dist/backup/index.js.map +1 -1
  446. package/packages/cli/dist/commands.d.ts +94 -0
  447. package/packages/cli/dist/commands.d.ts.map +1 -0
  448. package/packages/cli/dist/commands.js +1028 -0
  449. package/packages/cli/dist/commands.js.map +1 -0
  450. package/packages/cli/dist/dashboard-app.d.ts +6 -0
  451. package/packages/cli/dist/dashboard-app.d.ts.map +1 -1
  452. package/packages/cli/dist/dashboard-app.js +16 -1
  453. package/packages/cli/dist/dashboard-app.js.map +1 -1
  454. package/packages/cli/dist/doctor-probes.d.ts.map +1 -1
  455. package/packages/cli/dist/doctor-probes.js +5 -2
  456. package/packages/cli/dist/doctor-probes.js.map +1 -1
  457. package/packages/cli/dist/doctor.d.ts +16 -0
  458. package/packages/cli/dist/doctor.d.ts.map +1 -1
  459. package/packages/cli/dist/doctor.js +18 -0
  460. package/packages/cli/dist/doctor.js.map +1 -1
  461. package/packages/cli/dist/index.d.ts +4 -1
  462. package/packages/cli/dist/index.d.ts.map +1 -1
  463. package/packages/cli/dist/index.js +4 -1
  464. package/packages/cli/dist/index.js.map +1 -1
  465. package/packages/cli/dist/jobs-cmd.d.ts +4 -0
  466. package/packages/cli/dist/jobs-cmd.d.ts.map +1 -1
  467. package/packages/cli/dist/jobs-cmd.js +26 -7
  468. package/packages/cli/dist/jobs-cmd.js.map +1 -1
  469. package/packages/cli/dist/main.d.ts +9 -2
  470. package/packages/cli/dist/main.d.ts.map +1 -1
  471. package/packages/cli/dist/main.js +256 -30
  472. package/packages/cli/dist/main.js.map +1 -1
  473. package/packages/cli/dist/paths.d.ts +7 -4
  474. package/packages/cli/dist/paths.d.ts.map +1 -1
  475. package/packages/cli/dist/paths.js +17 -6
  476. package/packages/cli/dist/paths.js.map +1 -1
  477. package/packages/cli/dist/status.d.ts +70 -0
  478. package/packages/cli/dist/status.d.ts.map +1 -0
  479. package/packages/cli/dist/status.js +122 -0
  480. package/packages/cli/dist/status.js.map +1 -0
  481. package/packages/cli/dist/style.d.ts +13 -0
  482. package/packages/cli/dist/style.d.ts.map +1 -0
  483. package/packages/cli/dist/style.js +10 -0
  484. package/packages/cli/dist/style.js.map +1 -0
  485. package/packages/cli/dist/telegram-cmd.d.ts +1 -1
  486. package/packages/cli/dist/telegram-cmd.d.ts.map +1 -1
  487. package/packages/cli/dist/telegram-cmd.js +23 -6
  488. package/packages/cli/dist/telegram-cmd.js.map +1 -1
  489. package/packages/cli/dist/uninstall-cmd.d.ts +42 -0
  490. package/packages/cli/dist/uninstall-cmd.d.ts.map +1 -0
  491. package/packages/cli/dist/uninstall-cmd.js +208 -0
  492. package/packages/cli/dist/uninstall-cmd.js.map +1 -0
  493. package/packages/cli/dist/vault-cmd.js +3 -3
  494. package/packages/core/dist/.tsbuildinfo +1 -1
  495. package/packages/core/dist/actions/approvals.d.ts +0 -17
  496. package/packages/core/dist/actions/approvals.d.ts.map +1 -1
  497. package/packages/core/dist/actions/approvals.js +21 -0
  498. package/packages/core/dist/actions/approvals.js.map +1 -1
  499. package/packages/core/dist/actions/execute.d.ts +1 -1
  500. package/packages/core/dist/actions/jobs.d.ts +1 -1
  501. package/packages/core/dist/actions/types.js +1 -1
  502. package/packages/core/dist/agents/models.d.ts.map +1 -1
  503. package/packages/core/dist/agents/models.js +4 -3
  504. package/packages/core/dist/agents/models.js.map +1 -1
  505. package/packages/core/dist/agents/provider-from-env.d.ts +1 -1
  506. package/packages/core/dist/agents/provider-from-env.js +1 -1
  507. package/packages/core/dist/agents/skills.d.ts +2 -2
  508. package/packages/core/dist/goals/frequency.d.ts +51 -0
  509. package/packages/core/dist/goals/frequency.d.ts.map +1 -0
  510. package/packages/core/dist/goals/frequency.js +113 -0
  511. package/packages/core/dist/goals/frequency.js.map +1 -0
  512. package/packages/core/dist/goals/index.d.ts +2 -0
  513. package/packages/core/dist/goals/index.d.ts.map +1 -1
  514. package/packages/core/dist/goals/index.js +2 -0
  515. package/packages/core/dist/goals/index.js.map +1 -1
  516. package/packages/core/dist/goals/math.d.ts +8 -2
  517. package/packages/core/dist/goals/math.d.ts.map +1 -1
  518. package/packages/core/dist/goals/math.js +17 -4
  519. package/packages/core/dist/goals/math.js.map +1 -1
  520. package/packages/core/dist/goals/owner.d.ts +129 -0
  521. package/packages/core/dist/goals/owner.d.ts.map +1 -0
  522. package/packages/core/dist/goals/owner.js +239 -0
  523. package/packages/core/dist/goals/owner.js.map +1 -0
  524. package/packages/core/dist/goals/store.d.ts.map +1 -1
  525. package/packages/core/dist/goals/store.js +11 -4
  526. package/packages/core/dist/goals/store.js.map +1 -1
  527. package/packages/core/dist/goals/types.d.ts +17 -3
  528. package/packages/core/dist/goals/types.d.ts.map +1 -1
  529. package/packages/core/dist/goals/types.js +8 -2
  530. package/packages/core/dist/goals/types.js.map +1 -1
  531. package/packages/core/dist/host/build.d.ts +15 -1
  532. package/packages/core/dist/host/build.d.ts.map +1 -1
  533. package/packages/core/dist/host/build.js +99 -1
  534. package/packages/core/dist/host/build.js.map +1 -1
  535. package/packages/core/dist/host/types.d.ts +88 -1
  536. package/packages/core/dist/host/types.d.ts.map +1 -1
  537. package/packages/core/dist/index.d.ts +1 -0
  538. package/packages/core/dist/index.d.ts.map +1 -1
  539. package/packages/core/dist/index.js +1 -0
  540. package/packages/core/dist/index.js.map +1 -1
  541. package/packages/core/dist/learning/announce.d.ts +29 -0
  542. package/packages/core/dist/learning/announce.d.ts.map +1 -0
  543. package/packages/core/dist/learning/announce.js +49 -0
  544. package/packages/core/dist/learning/announce.js.map +1 -0
  545. package/packages/core/dist/learning/index.d.ts +1 -0
  546. package/packages/core/dist/learning/index.d.ts.map +1 -1
  547. package/packages/core/dist/learning/index.js +1 -0
  548. package/packages/core/dist/learning/index.js.map +1 -1
  549. package/packages/core/dist/learning/store.d.ts.map +1 -1
  550. package/packages/core/dist/learning/store.js +15 -4
  551. package/packages/core/dist/learning/store.js.map +1 -1
  552. package/packages/core/dist/notifications/channels.d.ts +37 -0
  553. package/packages/core/dist/notifications/channels.d.ts.map +1 -0
  554. package/packages/core/dist/notifications/channels.js +87 -0
  555. package/packages/core/dist/notifications/channels.js.map +1 -0
  556. package/packages/core/dist/notifications/index.d.ts +5 -0
  557. package/packages/core/dist/notifications/index.d.ts.map +1 -0
  558. package/packages/core/dist/notifications/index.js +5 -0
  559. package/packages/core/dist/notifications/index.js.map +1 -0
  560. package/packages/core/dist/notifications/notify.d.ts +35 -0
  561. package/packages/core/dist/notifications/notify.d.ts.map +1 -0
  562. package/packages/core/dist/notifications/notify.js +263 -0
  563. package/packages/core/dist/notifications/notify.js.map +1 -0
  564. package/packages/core/dist/notifications/store.d.ts +50 -0
  565. package/packages/core/dist/notifications/store.d.ts.map +1 -0
  566. package/packages/core/dist/notifications/store.js +216 -0
  567. package/packages/core/dist/notifications/store.js.map +1 -0
  568. package/packages/core/dist/notifications/types.d.ts +142 -0
  569. package/packages/core/dist/notifications/types.d.ts.map +1 -0
  570. package/packages/core/dist/notifications/types.js +5 -0
  571. package/packages/core/dist/notifications/types.js.map +1 -0
  572. package/packages/core/dist/owner.js +1 -1
  573. package/packages/core/dist/pages.d.ts +2 -2
  574. package/packages/core/dist/plugin/index.d.ts +1 -1
  575. package/packages/core/dist/plugin/index.d.ts.map +1 -1
  576. package/packages/core/dist/plugin/uses.d.ts +1 -1
  577. package/packages/core/dist/plugin/uses.d.ts.map +1 -1
  578. package/packages/core/dist/plugin/uses.js +4 -0
  579. package/packages/core/dist/plugin/uses.js.map +1 -1
  580. package/packages/core/dist/plugin/version.d.ts +1 -1
  581. package/packages/core/dist/plugin/version.js +1 -1
  582. package/packages/core/dist/provider.d.ts +1 -1
  583. package/packages/core/dist/provider.js +1 -1
  584. package/packages/core/dist/queue/retry-policy.d.ts +1 -1
  585. package/packages/core/dist/queue/retry-policy.js +1 -1
  586. package/packages/core/dist/registry.d.ts.map +1 -1
  587. package/packages/core/dist/registry.js +3 -4
  588. package/packages/core/dist/registry.js.map +1 -1
  589. package/packages/core/dist/reminders/store.d.ts +1 -1
  590. package/packages/core/dist/reminders/store.js +1 -1
  591. package/packages/core/dist/reminders/types.d.ts +1 -1
  592. package/packages/core/dist/reminders/types.js +1 -1
  593. package/packages/core/dist/sentinels/run.d.ts.map +1 -1
  594. package/packages/core/dist/sentinels/run.js +4 -1
  595. package/packages/core/dist/sentinels/run.js.map +1 -1
  596. package/packages/core/dist/sentinels/types.d.ts +21 -1
  597. package/packages/core/dist/sentinels/types.d.ts.map +1 -1
  598. package/packages/core/dist/sentinels/types.js.map +1 -1
  599. package/packages/core/dist/surfaces.d.ts +2 -0
  600. package/packages/core/dist/surfaces.d.ts.map +1 -1
  601. package/packages/core/dist/surfaces.js +7 -0
  602. package/packages/core/dist/surfaces.js.map +1 -1
  603. package/packages/core/dist/time.d.ts +12 -0
  604. package/packages/core/dist/time.d.ts.map +1 -1
  605. package/packages/core/dist/time.js +46 -0
  606. package/packages/core/dist/time.js.map +1 -1
  607. package/packages/core/dist/tools.d.ts +5 -5
  608. package/packages/core/dist/uninstall.d.ts +79 -0
  609. package/packages/core/dist/uninstall.d.ts.map +1 -0
  610. package/packages/core/dist/uninstall.js +109 -0
  611. package/packages/core/dist/uninstall.js.map +1 -0
  612. package/packages/core/dist/vault/file.js +2 -2
  613. package/packages/core/dist/vault/keychain.js +1 -1
  614. package/packages/core/dist/vault/keychain.js.map +1 -1
  615. package/packages/core/dist/vault/resolve.d.ts +3 -3
  616. package/packages/core/dist/vault/resolve.js +3 -3
  617. package/packages/core/dist/vault/types.d.ts +1 -1
  618. package/packages/core/dist/vault/types.js +1 -1
  619. package/packages/core/dist/views.d.ts +66 -66
  620. package/packages/core/migrations/003_owner_surfaces.sql +1 -1
  621. package/packages/core/migrations/005_artifacts.sql +1 -1
  622. package/packages/core/migrations/009_queue.sql +1 -2
  623. package/packages/core/migrations/010_actions.sql +1 -1
  624. package/packages/core/migrations/043_owner_notifications.sql +77 -0
  625. package/packages/core/migrations/044_owner_metrics.sql +45 -0
  626. package/packages/core/migrations/045_frequency_goals.sql +19 -0
  627. package/packages/core/package.json +4 -0
  628. package/packages/gateway/dist/.tsbuildinfo +1 -1
  629. package/packages/gateway/dist/agents/catalog.js +1 -1
  630. package/packages/gateway/dist/agents-cli.d.ts +25 -1
  631. package/packages/gateway/dist/agents-cli.d.ts.map +1 -1
  632. package/packages/gateway/dist/agents-cli.js +91 -27
  633. package/packages/gateway/dist/agents-cli.js.map +1 -1
  634. package/packages/gateway/dist/bootstrap.d.ts.map +1 -1
  635. package/packages/gateway/dist/bootstrap.js +8 -0
  636. package/packages/gateway/dist/bootstrap.js.map +1 -1
  637. package/packages/gateway/dist/channels/local-notification.d.ts +39 -0
  638. package/packages/gateway/dist/channels/local-notification.d.ts.map +1 -0
  639. package/packages/gateway/dist/channels/local-notification.js +154 -0
  640. package/packages/gateway/dist/channels/local-notification.js.map +1 -0
  641. package/packages/gateway/dist/chat/approvals.d.ts +3 -3
  642. package/packages/gateway/dist/chat/approvals.js +3 -3
  643. package/packages/gateway/dist/chat/usage.d.ts.map +1 -1
  644. package/packages/gateway/dist/chat/usage.js +1 -0
  645. package/packages/gateway/dist/chat/usage.js.map +1 -1
  646. package/packages/gateway/dist/cli.d.ts +14 -0
  647. package/packages/gateway/dist/cli.d.ts.map +1 -1
  648. package/packages/gateway/dist/cli.js +208 -37
  649. package/packages/gateway/dist/cli.js.map +1 -1
  650. package/packages/gateway/dist/db-ready.d.ts +2 -1
  651. package/packages/gateway/dist/db-ready.d.ts.map +1 -1
  652. package/packages/gateway/dist/db-ready.js +3 -2
  653. package/packages/gateway/dist/db-ready.js.map +1 -1
  654. package/packages/gateway/dist/index.d.ts +5 -1
  655. package/packages/gateway/dist/index.d.ts.map +1 -1
  656. package/packages/gateway/dist/index.js +6 -1
  657. package/packages/gateway/dist/index.js.map +1 -1
  658. package/packages/gateway/dist/missions/agent-run.d.ts.map +1 -1
  659. package/packages/gateway/dist/missions/agent-run.js +11 -1
  660. package/packages/gateway/dist/missions/agent-run.js.map +1 -1
  661. package/packages/gateway/dist/missions/execute.d.ts +22 -1
  662. package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
  663. package/packages/gateway/dist/missions/execute.js +8 -1
  664. package/packages/gateway/dist/missions/execute.js.map +1 -1
  665. package/packages/gateway/dist/missions/goals-format.d.ts +32 -5
  666. package/packages/gateway/dist/missions/goals-format.d.ts.map +1 -1
  667. package/packages/gateway/dist/missions/goals-format.js +59 -2
  668. package/packages/gateway/dist/missions/goals-format.js.map +1 -1
  669. package/packages/gateway/dist/missions/goals-page.d.ts +60 -5
  670. package/packages/gateway/dist/missions/goals-page.d.ts.map +1 -1
  671. package/packages/gateway/dist/missions/goals-page.js +355 -8
  672. package/packages/gateway/dist/missions/goals-page.js.map +1 -1
  673. package/packages/gateway/dist/missions/goals.d.ts +64 -5
  674. package/packages/gateway/dist/missions/goals.d.ts.map +1 -1
  675. package/packages/gateway/dist/missions/goals.js +834 -116
  676. package/packages/gateway/dist/missions/goals.js.map +1 -1
  677. package/packages/gateway/dist/missions/sentinel-wake.d.ts +5 -0
  678. package/packages/gateway/dist/missions/sentinel-wake.d.ts.map +1 -1
  679. package/packages/gateway/dist/missions/sentinel-wake.js +12 -0
  680. package/packages/gateway/dist/missions/sentinel-wake.js.map +1 -1
  681. package/packages/gateway/dist/missions-cli.d.ts +2 -0
  682. package/packages/gateway/dist/missions-cli.d.ts.map +1 -1
  683. package/packages/gateway/dist/missions-cli.js +53 -8
  684. package/packages/gateway/dist/missions-cli.js.map +1 -1
  685. package/packages/gateway/dist/owner-notify.d.ts +44 -0
  686. package/packages/gateway/dist/owner-notify.d.ts.map +1 -0
  687. package/packages/gateway/dist/owner-notify.js +91 -0
  688. package/packages/gateway/dist/owner-notify.js.map +1 -0
  689. package/packages/gateway/dist/plugins-cli.d.ts +3 -1
  690. package/packages/gateway/dist/plugins-cli.d.ts.map +1 -1
  691. package/packages/gateway/dist/plugins-cli.js +11 -4
  692. package/packages/gateway/dist/plugins-cli.js.map +1 -1
  693. package/packages/gateway/dist/provider-accounts.d.ts.map +1 -1
  694. package/packages/gateway/dist/provider-accounts.js +22 -13
  695. package/packages/gateway/dist/provider-accounts.js.map +1 -1
  696. package/packages/gateway/dist/reminders-cli.d.ts +3 -1
  697. package/packages/gateway/dist/reminders-cli.d.ts.map +1 -1
  698. package/packages/gateway/dist/reminders-cli.js +21 -2
  699. package/packages/gateway/dist/reminders-cli.js.map +1 -1
  700. package/packages/gateway/dist/serve.d.ts +2 -0
  701. package/packages/gateway/dist/serve.d.ts.map +1 -1
  702. package/packages/gateway/dist/serve.js +61 -13
  703. package/packages/gateway/dist/serve.js.map +1 -1
  704. package/packages/gateway/dist/subscription-signins.d.ts +28 -0
  705. package/packages/gateway/dist/subscription-signins.d.ts.map +1 -0
  706. package/packages/gateway/dist/subscription-signins.js +30 -0
  707. package/packages/gateway/dist/subscription-signins.js.map +1 -0
  708. package/packages/gateway/dist/telegram/api.d.ts +43 -9
  709. package/packages/gateway/dist/telegram/api.d.ts.map +1 -1
  710. package/packages/gateway/dist/telegram/api.js +80 -21
  711. package/packages/gateway/dist/telegram/api.js.map +1 -1
  712. package/packages/gateway/dist/telegram/approvals.d.ts +3 -3
  713. package/packages/gateway/dist/telegram/approvals.js +3 -3
  714. package/packages/gateway/dist/telegram/attachments.d.ts +6 -0
  715. package/packages/gateway/dist/telegram/attachments.d.ts.map +1 -1
  716. package/packages/gateway/dist/telegram/attachments.js +1 -0
  717. package/packages/gateway/dist/telegram/attachments.js.map +1 -1
  718. package/packages/gateway/dist/telegram/browser-view.d.ts.map +1 -1
  719. package/packages/gateway/dist/telegram/browser-view.js +2 -1
  720. package/packages/gateway/dist/telegram/browser-view.js.map +1 -1
  721. package/packages/gateway/dist/telegram/channel.d.ts +36 -0
  722. package/packages/gateway/dist/telegram/channel.d.ts.map +1 -0
  723. package/packages/gateway/dist/telegram/channel.js +71 -0
  724. package/packages/gateway/dist/telegram/channel.js.map +1 -0
  725. package/packages/gateway/dist/telegram/commands.d.ts +28 -0
  726. package/packages/gateway/dist/telegram/commands.d.ts.map +1 -0
  727. package/packages/gateway/dist/telegram/commands.js +74 -0
  728. package/packages/gateway/dist/telegram/commands.js.map +1 -0
  729. package/packages/gateway/dist/telegram/main.d.ts +3 -0
  730. package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
  731. package/packages/gateway/dist/telegram/main.js +71 -2
  732. package/packages/gateway/dist/telegram/main.js.map +1 -1
  733. package/packages/gateway/dist/telegram/outbound.d.ts +191 -0
  734. package/packages/gateway/dist/telegram/outbound.d.ts.map +1 -0
  735. package/packages/gateway/dist/telegram/outbound.js +671 -0
  736. package/packages/gateway/dist/telegram/outbound.js.map +1 -0
  737. package/packages/gateway/dist/telegram/proposals.d.ts +65 -0
  738. package/packages/gateway/dist/telegram/proposals.d.ts.map +1 -0
  739. package/packages/gateway/dist/telegram/proposals.js +183 -0
  740. package/packages/gateway/dist/telegram/proposals.js.map +1 -0
  741. package/packages/gateway/dist/telegram/surface.d.ts +47 -47
  742. package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
  743. package/packages/gateway/dist/telegram/surface.js +103 -291
  744. package/packages/gateway/dist/telegram/surface.js.map +1 -1
  745. package/packages/gateway/dist/web/config.js +3 -3
  746. package/packages/gateway/dist/web/http.d.ts +16 -3
  747. package/packages/gateway/dist/web/http.d.ts.map +1 -1
  748. package/packages/gateway/dist/web/http.js +39 -3
  749. package/packages/gateway/dist/web/http.js.map +1 -1
  750. package/packages/gateway/dist/web/notifications.d.ts +36 -0
  751. package/packages/gateway/dist/web/notifications.d.ts.map +1 -0
  752. package/packages/gateway/dist/web/notifications.js +63 -0
  753. package/packages/gateway/dist/web/notifications.js.map +1 -0
  754. package/packages/gateway/dist/web/onboarding.d.ts +1 -1
  755. package/packages/gateway/dist/web/onboarding.d.ts.map +1 -1
  756. package/packages/gateway/dist/web/onboarding.js +5 -1
  757. package/packages/gateway/dist/web/onboarding.js.map +1 -1
  758. package/packages/gateway/dist/web/read.js +3 -3
  759. package/packages/gateway/dist/web/secrets.d.ts.map +1 -1
  760. package/packages/gateway/dist/web/secrets.js +3 -2
  761. package/packages/gateway/dist/web/secrets.js.map +1 -1
  762. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  763. package/packages/gateway/dist/web/server.js +54 -23
  764. package/packages/gateway/dist/web/server.js.map +1 -1
  765. package/packages/gateway/dist/web/telegram.d.ts +39 -0
  766. package/packages/gateway/dist/web/telegram.d.ts.map +1 -1
  767. package/packages/gateway/dist/web/telegram.js +53 -1
  768. package/packages/gateway/dist/web/telegram.js.map +1 -1
  769. package/packages/gateway/dist/web/version.d.ts +1 -0
  770. package/packages/gateway/dist/web/version.d.ts.map +1 -1
  771. package/packages/gateway/dist/web/version.js +2 -1
  772. package/packages/gateway/dist/web/version.js.map +1 -1
  773. package/packages/gateway/dist/web/write.js +1 -1
  774. package/packages/install/dist/.tsbuildinfo +1 -1
  775. package/packages/install/dist/environment.d.ts +29 -0
  776. package/packages/install/dist/environment.d.ts.map +1 -1
  777. package/packages/install/dist/environment.js +50 -1
  778. package/packages/install/dist/environment.js.map +1 -1
  779. package/packages/install/dist/launcher.d.ts +3 -1
  780. package/packages/install/dist/launcher.d.ts.map +1 -1
  781. package/packages/install/dist/launcher.js +220 -14
  782. package/packages/install/dist/launcher.js.map +1 -1
  783. package/packages/install/dist/uninstall.d.ts +59 -0
  784. package/packages/install/dist/uninstall.d.ts.map +1 -0
  785. package/packages/install/dist/uninstall.js +260 -0
  786. package/packages/install/dist/uninstall.js.map +1 -0
  787. package/packages/install/dist/upgrade.d.ts +16 -3
  788. package/packages/install/dist/upgrade.d.ts.map +1 -1
  789. package/packages/install/dist/upgrade.js +21 -7
  790. package/packages/install/dist/upgrade.js.map +1 -1
  791. package/packages/runtime/dist/.tsbuildinfo +1 -1
  792. package/packages/runtime/dist/anthropic.d.ts +35 -2
  793. package/packages/runtime/dist/anthropic.d.ts.map +1 -1
  794. package/packages/runtime/dist/anthropic.js +36 -12
  795. package/packages/runtime/dist/anthropic.js.map +1 -1
  796. package/packages/runtime/dist/context-window.d.ts.map +1 -1
  797. package/packages/runtime/dist/context-window.js +5 -2
  798. package/packages/runtime/dist/context-window.js.map +1 -1
  799. package/packages/runtime/dist/delegate.js +1 -1
  800. package/packages/runtime/dist/loop.d.ts +13 -1
  801. package/packages/runtime/dist/loop.d.ts.map +1 -1
  802. package/packages/runtime/dist/loop.js +70 -3
  803. package/packages/runtime/dist/loop.js.map +1 -1
  804. package/packages/runtime/dist/openai.d.ts.map +1 -1
  805. package/packages/runtime/dist/openai.js +26 -8
  806. package/packages/runtime/dist/openai.js.map +1 -1
  807. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  808. package/packages/tools/artifacts/dist/index.d.ts +1 -1
  809. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  810. package/packages/tools/browser/dist/availability.d.ts +34 -8
  811. package/packages/tools/browser/dist/availability.d.ts.map +1 -1
  812. package/packages/tools/browser/dist/availability.js +44 -5
  813. package/packages/tools/browser/dist/availability.js.map +1 -1
  814. package/packages/tools/browser/dist/controller.d.ts +2 -2
  815. package/packages/tools/browser/dist/controller.d.ts.map +1 -1
  816. package/packages/tools/browser/dist/controller.js +7 -6
  817. package/packages/tools/browser/dist/controller.js.map +1 -1
  818. package/packages/tools/browser/dist/host.d.ts +3 -1
  819. package/packages/tools/browser/dist/host.d.ts.map +1 -1
  820. package/packages/tools/browser/dist/host.js +5 -1
  821. package/packages/tools/browser/dist/host.js.map +1 -1
  822. package/packages/tools/browser/dist/index.d.ts +2 -2
  823. package/packages/tools/browser/dist/index.d.ts.map +1 -1
  824. package/packages/tools/browser/dist/index.js +13 -5
  825. package/packages/tools/browser/dist/index.js.map +1 -1
  826. package/packages/tools/browser/dist/origin-pattern.d.ts +31 -0
  827. package/packages/tools/browser/dist/origin-pattern.d.ts.map +1 -0
  828. package/packages/tools/browser/dist/origin-pattern.js +61 -0
  829. package/packages/tools/browser/dist/origin-pattern.js.map +1 -0
  830. package/packages/tools/browser/dist/public-suffixes.d.ts +24 -0
  831. package/packages/tools/browser/dist/public-suffixes.d.ts.map +1 -0
  832. package/packages/tools/browser/dist/public-suffixes.js +153 -0
  833. package/packages/tools/browser/dist/public-suffixes.js.map +1 -0
  834. package/packages/tools/browser/dist/secrets.d.ts +45 -9
  835. package/packages/tools/browser/dist/secrets.d.ts.map +1 -1
  836. package/packages/tools/browser/dist/secrets.js +77 -20
  837. package/packages/tools/browser/dist/secrets.js.map +1 -1
  838. package/packages/tools/browser/dist/service.d.ts +12 -2
  839. package/packages/tools/browser/dist/service.d.ts.map +1 -1
  840. package/packages/tools/browser/dist/service.js +84 -20
  841. package/packages/tools/browser/dist/service.js.map +1 -1
  842. package/packages/tools/browser/dist/types.d.ts +7 -1
  843. package/packages/tools/browser/dist/types.d.ts.map +1 -1
  844. package/packages/tools/browser/dist/types.js +7 -1
  845. package/packages/tools/browser/dist/types.js.map +1 -1
  846. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  847. package/packages/tools/email/dist/channel.d.ts +43 -0
  848. package/packages/tools/email/dist/channel.d.ts.map +1 -0
  849. package/packages/tools/email/dist/channel.js +99 -0
  850. package/packages/tools/email/dist/channel.js.map +1 -0
  851. package/packages/tools/email/dist/index.d.ts +1 -0
  852. package/packages/tools/email/dist/index.d.ts.map +1 -1
  853. package/packages/tools/email/dist/index.js +8 -1
  854. package/packages/tools/email/dist/index.js.map +1 -1
  855. package/packages/tools/email/dist/ports.d.ts +3 -3
  856. package/packages/tools/email/dist/ports.js +1 -1
  857. package/packages/tools/email/dist/tools/drafts.d.ts +1 -1
  858. package/packages/tools/email/dist/tools/read.js +1 -1
  859. package/packages/tools/email/dist/tools/read.js.map +1 -1
  860. package/packages/tools/email/dist/tools/send.js +1 -1
  861. package/packages/tools/email/migrations/001_email.sql +3 -2
  862. package/packages/tools/email/package.json +2 -1
  863. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  864. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  865. package/packages/tools/memory/dist/index.js +1 -1
  866. package/packages/tools/memory/migrations/001_memory.sql +1 -1
  867. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  868. package/packages/web/dist/assets/dm-mono-latin-400-normal--0xN8mdc.woff +0 -0
  869. package/packages/web/dist/assets/dm-mono-latin-400-normal-4GdczIuU.woff2 +0 -0
  870. package/packages/web/dist/assets/dm-mono-latin-500-normal-CN8Miw6E.woff +0 -0
  871. package/packages/web/dist/assets/dm-mono-latin-500-normal-DRMDZjhP.woff2 +0 -0
  872. package/packages/web/dist/assets/dm-mono-latin-ext-400-normal-1aZr6b2b.woff +0 -0
  873. package/packages/web/dist/assets/dm-mono-latin-ext-400-normal-C2zvOubV.woff2 +0 -0
  874. package/packages/web/dist/assets/dm-mono-latin-ext-500-normal-BtRyHRi6.woff2 +0 -0
  875. package/packages/web/dist/assets/dm-mono-latin-ext-500-normal-Dw3M13d8.woff +0 -0
  876. package/packages/web/dist/assets/dm-sans-latin-ext-standard-italic-DNX9AbKj.woff2 +0 -0
  877. package/packages/web/dist/assets/dm-sans-latin-ext-standard-normal-oos9povj.woff2 +0 -0
  878. package/packages/web/dist/assets/dm-sans-latin-standard-italic-C8i6y2Ft.woff2 +0 -0
  879. package/packages/web/dist/assets/dm-sans-latin-standard-normal-Bf69Tn_J.woff2 +0 -0
  880. package/packages/web/dist/assets/index-B727JQsO.css +1 -0
  881. package/packages/web/dist/assets/index-OA0xgibo.js +123 -0
  882. package/packages/web/dist/index.html +2 -2
  883. package/packages/web/dist/assets/index-CxaF2koC.js +0 -122
  884. package/packages/web/dist/assets/index-DEho_xyR.css +0 -1
@@ -0,0 +1,671 @@
1
+ /**
2
+ * What a run's outcome becomes on Telegram, and the one place it is sent from.
3
+ *
4
+ * The surface decides *what* a turn produced — the text, the keyboard under
5
+ * it, the files it saved, the view it drew — and hands it here. This module
6
+ * decides how that reaches a phone: plain text (never markdown, never a parse
7
+ * mode, with one escaped exception for a table), a placeholder that becomes
8
+ * the answer, an answer streamed into one message while the model speaks,
9
+ * files after the text, and a sentence naming the dashboard for anything a
10
+ * chat cannot hold.
11
+ *
12
+ * Nothing here decides who the owner is or what a run may do. Every send is
13
+ * presentation, and every failure but the final text's is cosmetic.
14
+ */
15
+ import { MAX_MESSAGE_CHARS, MAX_PHOTO_BYTES, MAX_SEND_BYTES, TELEGRAM_MAX_MESSAGE_CHARS, TelegramApiError, splitMessage, } from './api.js';
16
+ import { formatBytes } from './attachments.js';
17
+ import { canvasShow } from '../agents/canvas.js';
18
+ /* ------------------------------------------------------------------ *
19
+ * The first-run burst
20
+ * ------------------------------------------------------------------ */
21
+ /** How many messages one first-run answer may be broken into. */
22
+ export const MAX_BURST_MESSAGES = 3;
23
+ /** The pause between them: long enough to read as typing, short enough to wait. */
24
+ export const BURST_GAP_MS = 600;
25
+ /**
26
+ * Break an answer into the messages it should arrive as.
27
+ *
28
+ * A paragraph break is the agent saying "and then this" — in a chat that is a
29
+ * second message, not a blank line inside one bubble. So up to
30
+ * `MAX_BURST_MESSAGES` paragraphs become that many sends, with a typing
31
+ * indicator in between.
32
+ *
33
+ * The cap is a cap, not a truncation: an answer with *more* paragraphs than
34
+ * that is sent whole. Breaking a six-paragraph explanation into three bubbles
35
+ * and a blob would read worse than either, and a first run should never be
36
+ * six paragraphs anyway — the skill says two short messages, maximum.
37
+ */
38
+ export function splitIntoMessages(text, max = MAX_BURST_MESSAGES) {
39
+ const body = text.trim();
40
+ if (body === '')
41
+ return [];
42
+ const paragraphs = body
43
+ .split(/\n\s*\n/)
44
+ .map((part) => part.trim())
45
+ .filter((part) => part !== '');
46
+ if (paragraphs.length <= 1 || paragraphs.length > max)
47
+ return [body];
48
+ return paragraphs;
49
+ }
50
+ /**
51
+ * Send one answer as up to three messages, typing between them.
52
+ *
53
+ * The pause is the whole point: three bubbles posted in the same millisecond
54
+ * are one block with extra steps. `splitIntoMessages` decides how many there
55
+ * are; this only paces them.
56
+ */
57
+ export async function sendBurst(api, chatId, reply, gapMs = BURST_GAP_MS) {
58
+ const parts = splitIntoMessages(reply);
59
+ if (parts.length === 0) {
60
+ await api.sendMessage(chatId, '(no reply)');
61
+ return;
62
+ }
63
+ for (const [index, part] of parts.entries()) {
64
+ if (index > 0) {
65
+ await api.sendChatAction(chatId).catch(() => { });
66
+ await sleep(gapMs);
67
+ }
68
+ await api.sendMessage(chatId, part);
69
+ }
70
+ }
71
+ /* ------------------------------------------------------------------ *
72
+ * Plain text safety net
73
+ * ------------------------------------------------------------------ */
74
+ /*
75
+ * We never send `parse_mode`, so any markdown a model emits is shown to the
76
+ * owner literally: `**Status — 2026-09-13**`, backticks, pipe tables. The
77
+ * prompt asks for plain text; this is the deterministic net under that ask.
78
+ *
79
+ * It is pure and conservative: markers are only removed when they actually
80
+ * wrap a span, so arithmetic (`2 * 3`) and identifiers (`snake_case`) survive
81
+ * untouched, and no digit, currency symbol or word is ever rewritten.
82
+ */
83
+ /** A ``` fence line, with or without a language tag. */
84
+ const FENCE_RE = /^\s*```[A-Za-z0-9_+-]*\s*$/;
85
+ /** `# Heading` → `Heading`. Only at the start of a line, marker plus space. */
86
+ const HEADING_RE = /^(\s*)#{1,6}[ \t]+(?=\S)/;
87
+ /** `[label](url)` → `label (url)`. */
88
+ const LINK_RE = /\[([^\]\n]*)\]\(([^()\s]*)\)/g;
89
+ /** `` `code` `` → `code`. Single backticks only; the span may not be empty. */
90
+ const INLINE_CODE_RE = /`([^`\n]+)`/g;
91
+ /** `**bold**` — both markers must hug non-space, so `a ** b` is left alone. */
92
+ const BOLD_STAR_RE = /\*\*(?=\S)([^*\n]+?)(?<=\S)\*\*/g;
93
+ /** `__bold__` — word characters on either side mean it is an identifier. */
94
+ const BOLD_UNDER_RE = /(^|[^\w])__(?=\S)([^_\n]+?)(?<=\S)__(?!\w)/g;
95
+ /** `*italic*` — a lone `*` (as in `2 * 3`) never matches: it wraps nothing. */
96
+ const ITALIC_STAR_RE = /\*(?=\S)([^*\n]+?)(?<=\S)\*/g;
97
+ /** `_italic_` — `snake_case` keeps its underscores: they sit inside a word. */
98
+ const ITALIC_UNDER_RE = /(^|[^\w])_(?=\S)([^_\n]+?)(?<=\S)_(?!\w)/g;
99
+ /** `|---|:--:|` and friends: a table rule carries no content. */
100
+ function isTableSeparatorRow(cells) {
101
+ return cells.length > 0 && cells.every((cell) => /^:?-{2,}:?$/.test(cell));
102
+ }
103
+ /** `| a | b |` → `a — b`; the separator row is dropped by the caller. */
104
+ function tableCells(line) {
105
+ const trimmed = line.trim();
106
+ if (!trimmed.startsWith('|') || trimmed.length < 2)
107
+ return undefined;
108
+ const inner = trimmed.replace(/^\|/, '').replace(/\|$/, '');
109
+ if (!inner.includes('|') && inner.trim() === '')
110
+ return undefined;
111
+ return inner.split('|').map((cell) => cell.trim());
112
+ }
113
+ /** Marker removal inside one line of prose. Never applied to fenced code. */
114
+ function stripInline(line) {
115
+ return line
116
+ .replace(LINK_RE, (whole, label, url) => {
117
+ const text = label.trim();
118
+ if (url === '')
119
+ return text;
120
+ return text === '' ? url : `${text} (${url})`;
121
+ })
122
+ .replace(INLINE_CODE_RE, '$1')
123
+ .replace(BOLD_STAR_RE, '$1')
124
+ .replace(BOLD_UNDER_RE, '$1$2')
125
+ .replace(ITALIC_STAR_RE, '$1')
126
+ .replace(ITALIC_UNDER_RE, '$1$2');
127
+ }
128
+ /* ------------------------------------------------------------------ *
129
+ * Tool names never reach the owner
130
+ * ------------------------------------------------------------------ */
131
+ /**
132
+ * The namespaces the runtime registers tools under. Tool names are internal
133
+ * plumbing: the owner is told what happened, never which function did it.
134
+ * The personas say so, and this pass is the deterministic net under that ask
135
+ * for the turns where the model slips anyway.
136
+ *
137
+ * The surface is constructed without a registry to read, so this is the one
138
+ * place the namespaces live. A new namespace belongs here the day its tools
139
+ * are registered.
140
+ */
141
+ export const TOOL_NAMESPACES = [
142
+ 'finance',
143
+ 'memory',
144
+ 'artifacts',
145
+ 'email',
146
+ 'agent',
147
+ 'mission',
148
+ 'reminder',
149
+ 'schedule',
150
+ ];
151
+ /**
152
+ * Tool names that carry no underscore. A dotted pair counts as a tool only
153
+ * when the namespace is known *and* the second half is snake_case or one of
154
+ * these — "has a dot" is never the rule, so `gmail.com`, `shotcrisp.app`,
155
+ * `Statement.pdf`, `v1.2.3` and an email address are all left alone.
156
+ */
157
+ const TOOL_WORDS = [
158
+ 'summary',
159
+ 'balance',
160
+ 'delegate',
161
+ 'report',
162
+ 'silent',
163
+ 'status',
164
+ 'search',
165
+ 'send',
166
+ 'list',
167
+ 'add',
168
+ 'set',
169
+ 'get',
170
+ 'cancel',
171
+ 'snooze',
172
+ 'purge',
173
+ 'remember',
174
+ 'recall',
175
+ 'forget',
176
+ 'note',
177
+ 'read',
178
+ 'text',
179
+ 'describe',
180
+ 'reconcile',
181
+ ];
182
+ const NAMESPACE_ALT = TOOL_NAMESPACES.join('|');
183
+ /**
184
+ * `finance.set_liability`, `agent.delegate`. The guards on either side keep
185
+ * the match off anything that merely contains a dot: a longer hostname
186
+ * (`mail.finance.summary.io`), a path segment, an address local part. A dot
187
+ * that ends a sentence is not a continuation, so a mention may close one.
188
+ */
189
+ const TOOL_REF_SRC = `(?<![\\w./@-])(?:${NAMESPACE_ALT})\\.` +
190
+ `(?:[a-z][a-z0-9]*(?:_[a-z0-9]+)+|${TOOL_WORDS.join('|')})(?![\\w@/-])(?!\\.[A-Za-z0-9])`;
191
+ /** `(finance.set_liability)`, `(via agent.delegate)` — the whole aside goes. */
192
+ const TOOL_PAREN_RE = new RegExp(`[ \\t]*\\((?:\\s*(?:via|see|using|through|with|by)\\s+)?${TOOL_REF_SRC}` +
193
+ `(?:[ \\t]*(?:,|and|\\+|&)[ \\t]*${TOOL_REF_SRC})*[ \\t]*\\)`, 'gi');
194
+ /** `` `finance.x` ``, `'finance.x'`, `"finance.x"` — the quotes leave with it. */
195
+ const TOOL_QUOTED_RE = new RegExp(`[\`'"“‘]${TOOL_REF_SRC}[\`'"”’]`, 'gi');
196
+ /** A bare mention, with the connector that introduced it when there is one. */
197
+ const TOOL_BARE_RE = new RegExp(`(?:[ \\t]+(?:via|using|through|by calling)[ \\t]+)?${TOOL_REF_SRC}`, 'gi');
198
+ /**
199
+ * Spacing and punctuation left dangling by a removal: `stored , and` or
200
+ * `on the calendar .`. Applied only to a line something was actually removed
201
+ * from, so prose that mentions no tool is returned byte for byte.
202
+ */
203
+ function tidyAfterRemoval(cleaned, indent) {
204
+ const body = cleaned
205
+ .replace(/\(\s*\)/g, '')
206
+ .replace(/\[\s*\]/g, '')
207
+ .replace(/[ \t]{2,}/g, ' ')
208
+ .replace(/\([ \t]+/g, '(')
209
+ .replace(/[ \t]+([,.;:!?)])/g, '$1')
210
+ .replace(/,(?:[ \t]*,)+/g, ',')
211
+ .replace(/,[ \t]*([.;:!?])/g, '$1')
212
+ .replace(/([.;:!?])[ \t]*,/g, '$1')
213
+ .trim();
214
+ if (body === '')
215
+ return '';
216
+ // All that survived is punctuation: the mention *was* the sentence. Drop
217
+ // the remains and leave every other line of the answer untouched.
218
+ return /^[,.;:!?—-]+$/.test(body) ? '' : `${indent}${body}`;
219
+ }
220
+ /** One line of prose, minus any tool reference and the mess it leaves. */
221
+ function stripToolNamesFromLine(line) {
222
+ const cleaned = line
223
+ .replace(TOOL_PAREN_RE, '')
224
+ .replace(TOOL_QUOTED_RE, '')
225
+ .replace(TOOL_BARE_RE, '');
226
+ if (cleaned === line)
227
+ return line;
228
+ return tidyAfterRemoval(cleaned, /^[ \t]*/.exec(line)?.[0] ?? '');
229
+ }
230
+ /**
231
+ * Remove internal tool names from an agent answer. Pure, idempotent, and
232
+ * conservative: a line with no tool reference in it is returned unchanged.
233
+ *
234
+ * Exported on its own so every surface that renders an answer — Telegram
235
+ * through `toPlainText`, the CLI directly — applies the same rule.
236
+ */
237
+ export function stripToolNames(text) {
238
+ if (text === '')
239
+ return '';
240
+ return text.split('\n').map(stripToolNamesFromLine).join('\n');
241
+ }
242
+ /**
243
+ * Render agent-authored markdown as the plain text Telegram will display
244
+ * verbatim. Pure: same input, same output, no clock and no I/O.
245
+ *
246
+ * Applied to final agent and mission answers only. Progress lines and the
247
+ * surface's own copy (`/help`, `/agents`) are already plain by construction.
248
+ */
249
+ export function toPlainText(text) {
250
+ if (text === '')
251
+ return '';
252
+ const lines = text.split('\n');
253
+ const out = [];
254
+ let inFence = false;
255
+ for (const line of lines) {
256
+ if (FENCE_RE.test(line)) {
257
+ // Drop the fence, keep whatever it wrapped.
258
+ inFence = !inFence;
259
+ continue;
260
+ }
261
+ if (inFence) {
262
+ out.push(line);
263
+ continue;
264
+ }
265
+ const cells = tableCells(line);
266
+ if (cells) {
267
+ if (isTableSeparatorRow(cells))
268
+ continue;
269
+ out.push(stripToolNamesFromLine(stripInline(cells.join(' — '))));
270
+ continue;
271
+ }
272
+ out.push(stripToolNamesFromLine(stripInline(line.replace(HEADING_RE, '$1'))));
273
+ }
274
+ return out.join('\n').replace(/\n{3,}/g, '\n\n');
275
+ }
276
+ /** How many times the final text is re-sent after a 429 before giving up. */
277
+ const FINAL_RETRIES = 3;
278
+ /**
279
+ * Land the finished answer: in `messageId` (the placeholder, or the message
280
+ * the stream has been editing) when there is one, as new messages otherwise.
281
+ *
282
+ * Longer than Telegram's 4,096: the first part goes in that message and the
283
+ * rest follows as new messages, cut at paragraph boundaries. A keyboard sits
284
+ * under the last part. This is the one write that must land — a 429 is waited
285
+ * out, and an edit Telegram refuses becomes a fresh message.
286
+ */
287
+ export async function landAnswer(deps, chatId, messageId, reply, keyboard) {
288
+ const text = reply.trim() === '' ? '(no reply)' : reply;
289
+ const parts = splitMessage(text, TELEGRAM_MAX_MESSAGE_CHARS);
290
+ for (const [index, part] of parts.entries()) {
291
+ const last = index === parts.length - 1;
292
+ const markup = last && keyboard ? { replyMarkup: keyboard } : {};
293
+ const send = { ...markup, splitAt: TELEGRAM_MAX_MESSAGE_CHARS };
294
+ if (index === 0 && messageId !== undefined) {
295
+ const edited = await retrying(deps, () => deps.api.editMessageText(chatId, messageId, part, markup))
296
+ .then(() => true)
297
+ .catch((err) => {
298
+ // Telegram refuses an edit whose text is already there: the answer
299
+ // landed, which is all this call is for.
300
+ if (err instanceof TelegramApiError && /not modified/i.test(err.description) && !keyboard)
301
+ return true;
302
+ deps.log(`telegram: final edit failed, sending instead: ${message(err)}`);
303
+ return false;
304
+ });
305
+ if (edited)
306
+ continue;
307
+ }
308
+ await retrying(deps, () => deps.api.sendMessage(chatId, part, send));
309
+ }
310
+ }
311
+ /** Run a Bot API call, waiting out a 429 as often as `FINAL_RETRIES` allows. */
312
+ async function retrying(deps, call) {
313
+ for (let attempt = 0;; attempt += 1) {
314
+ try {
315
+ return await call();
316
+ }
317
+ catch (err) {
318
+ if (!(err instanceof TelegramApiError) || err.retryAfter === undefined || attempt >= FINAL_RETRIES)
319
+ throw err;
320
+ deps.log(`telegram: rate limited, waiting ${err.retryAfter}s before the final text`);
321
+ await sleep(err.retryAfter * 1000);
322
+ }
323
+ }
324
+ }
325
+ /* ------------------------------------------------------------------ *
326
+ * Streaming
327
+ * ------------------------------------------------------------------ */
328
+ /** The shortest gap between two edits of a streamed answer. */
329
+ export const STREAM_EDIT_INTERVAL_MS = 1500;
330
+ /**
331
+ * One answer, shown while the model speaks.
332
+ *
333
+ * The first chunk lands at once — in the placeholder when there is one, as a
334
+ * new message otherwise — and the same message is edited with the whole text
335
+ * so far at most once per interval, cut at 4,000 characters with an ellipsis
336
+ * while it grows. On a 429 no edit is attempted until Telegram's `retry_after`
337
+ * has passed; the text keeps accumulating and the next edit carries all of
338
+ * it. `finish` writes the whole answer last, whatever happened before.
339
+ *
340
+ * `push` is synchronous and never throws: the runtime's delta hook must not
341
+ * wait on Telegram, and a failed edit must not cost the owner the run.
342
+ */
343
+ export class StreamedAnswer {
344
+ #deps;
345
+ #chatId;
346
+ #opts;
347
+ #messageId;
348
+ #text = '';
349
+ #shown = '';
350
+ #started = false;
351
+ #closed = false;
352
+ #inFlight = false;
353
+ #lastEditAt = 0;
354
+ #pausedUntil = 0;
355
+ #timer;
356
+ #chain = Promise.resolve();
357
+ constructor(deps, chatId, placeholderId, opts = {}) {
358
+ this.#deps = deps;
359
+ this.#chatId = chatId;
360
+ this.#messageId = placeholderId;
361
+ this.#opts = opts;
362
+ if (opts.typing)
363
+ deps.api.sendChatAction(chatId).catch(() => { });
364
+ }
365
+ /** Has any of the answer been shown yet? */
366
+ get streamed() {
367
+ return this.#started;
368
+ }
369
+ #now() {
370
+ return (this.#opts.now ?? Date.now)();
371
+ }
372
+ /** A piece of the answer, as the model writes it. */
373
+ push(delta) {
374
+ if (this.#closed || delta === '')
375
+ return;
376
+ this.#text += delta;
377
+ if (this.#text.trim() === '')
378
+ return;
379
+ if (!this.#started) {
380
+ this.#started = true;
381
+ this.#flush();
382
+ return;
383
+ }
384
+ this.#schedule();
385
+ }
386
+ #schedule() {
387
+ if (this.#timer !== undefined || this.#closed)
388
+ return;
389
+ const interval = this.#opts.intervalMs ?? STREAM_EDIT_INTERVAL_MS;
390
+ const at = Math.max(this.#lastEditAt + interval, this.#pausedUntil);
391
+ const t = setTimeout(() => {
392
+ this.#timer = undefined;
393
+ this.#flush();
394
+ }, Math.max(0, at - this.#now()));
395
+ if (typeof t.unref === 'function')
396
+ t.unref();
397
+ this.#timer = t;
398
+ }
399
+ #flush() {
400
+ if (this.#closed)
401
+ return;
402
+ const now = this.#now();
403
+ // Backing off, or the last write has not come back: try again later with
404
+ // everything that arrived meanwhile, rather than queueing stale edits.
405
+ if (now < this.#pausedUntil || this.#inFlight) {
406
+ this.#schedule();
407
+ return;
408
+ }
409
+ const render = this.#opts.render ?? toPlainText;
410
+ const view = cutForStream(render(this.#text));
411
+ if (view.trim() === '' || view === this.#shown)
412
+ return;
413
+ const first = this.#shown === '';
414
+ const before = this.#shown;
415
+ this.#shown = view;
416
+ this.#lastEditAt = now;
417
+ this.#inFlight = true;
418
+ this.#chain = this.#chain.then(async () => {
419
+ try {
420
+ if (first && this.#opts.takeOver)
421
+ await this.#opts.takeOver();
422
+ if (this.#closed)
423
+ return;
424
+ if (this.#messageId === undefined) {
425
+ this.#messageId = await this.#deps.api.sendMessage(this.#chatId, view);
426
+ }
427
+ else {
428
+ await this.#deps.api.editMessageText(this.#chatId, this.#messageId, view);
429
+ }
430
+ }
431
+ catch (err) {
432
+ if (err instanceof TelegramApiError && err.retryAfter !== undefined) {
433
+ this.#pausedUntil = this.#now() + err.retryAfter * 1000;
434
+ }
435
+ // Shown again next time: the text on the phone is not this one.
436
+ this.#shown = before;
437
+ this.#deps.log(`telegram: stream edit failed: ${message(err)}`);
438
+ }
439
+ finally {
440
+ this.#inFlight = false;
441
+ }
442
+ });
443
+ }
444
+ /**
445
+ * Write the whole answer, with its keyboard, as the last word. Waits for any
446
+ * edit in flight and out any back-off first, so nothing older lands after it.
447
+ */
448
+ async finish(reply, keyboard) {
449
+ this.#closed = true;
450
+ if (this.#timer !== undefined)
451
+ clearTimeout(this.#timer);
452
+ this.#timer = undefined;
453
+ await this.#chain;
454
+ if (!this.#started && this.#opts.takeOver)
455
+ await this.#opts.takeOver();
456
+ const wait = this.#pausedUntil - this.#now();
457
+ if (wait > 0)
458
+ await sleep(wait);
459
+ await landAnswer(this.#deps, this.#chatId, this.#messageId, reply, keyboard);
460
+ }
461
+ }
462
+ /** The text so far, cut to what one message holds while it is still growing. */
463
+ export function cutForStream(text, limit = MAX_MESSAGE_CHARS) {
464
+ return text.length <= limit ? text : `${text.slice(0, limit - 1).trimEnd()}…`;
465
+ }
466
+ /**
467
+ * The canvas after one tool call: what `canvas.show` drew, nothing after
468
+ * `canvas.clear`, unchanged by anything else. The canvas holds one view, so
469
+ * the last one drawn is the one a run leaves behind.
470
+ */
471
+ export function canvasAfterCall(current, name, input) {
472
+ if (name === 'canvas.clear')
473
+ return undefined;
474
+ if (name !== 'canvas.show')
475
+ return current;
476
+ const parsed = canvasShow.input.safeParse(input);
477
+ return parsed.success ? parsed.data : current;
478
+ }
479
+ function cellText(value) {
480
+ if (value === null || value === undefined)
481
+ return '';
482
+ if (typeof value === 'boolean')
483
+ return value ? 'yes' : 'no';
484
+ return String(value).replace(/\s+/g, ' ').trim();
485
+ }
486
+ /** Every row as strings, padded to the column count (ragged rows are padded). */
487
+ function tableGrid(view) {
488
+ const width = view.data.columns.length;
489
+ return view.data.rows.map((row) => Array.from({ length: width }, (_, i) => cellText(row[i])));
490
+ }
491
+ /**
492
+ * A table as monospace lines: a header, a rule, the rows, numbers aligned to
493
+ * the right. Plain text; the HTML wrapper is `tableMessage`.
494
+ */
495
+ export function tableText(view) {
496
+ const headers = view.data.columns.map((c) => c.label);
497
+ const rows = tableGrid(view);
498
+ const numeric = view.data.columns.map((c, i) => c.unit === 'number' || c.unit === 'currency' || c.unit === 'percent' ||
499
+ (rows.length > 0 && rows.every((r) => r[i] === '' || /^-?[\d.,]+%?$/.test(r[i]))));
500
+ const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
501
+ const line = (cells) => cells.map((cell, i) => (numeric[i] ? cell.padStart(widths[i]) : cell.padEnd(widths[i]))).join(' ').trimEnd();
502
+ return [line(headers), widths.map((w) => '-'.repeat(w)).join(' '), ...rows.map(line)].join('\n');
503
+ }
504
+ function escapeHtml(text) {
505
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
506
+ }
507
+ /**
508
+ * The table as one HTML message — the title, then the grid in `<pre>` — or
509
+ * undefined when it would not fit one message. Every character that came from
510
+ * the agent is escaped; the only markup is the two tags written here.
511
+ */
512
+ export function tableMessage(view, limit = MAX_MESSAGE_CHARS) {
513
+ const head = view.title ? `${escapeHtml(view.title)}\n` : '';
514
+ const html = `${head}<pre>${escapeHtml(tableText(view))}</pre>`;
515
+ return html.length <= limit ? html : undefined;
516
+ }
517
+ /** The table as CSV: a header row, then the rows, quoted where they need it. */
518
+ export function tableCsv(view) {
519
+ const quote = (cell) => (/[",\n\r]|^\s|\s$/.test(cell) ? `"${cell.replace(/"/g, '""')}"` : cell);
520
+ const lines = [view.data.columns.map((c) => c.label), ...tableGrid(view)];
521
+ return `${lines.map((cells) => cells.map(quote).join(',')).join('\r\n')}\r\n`;
522
+ }
523
+ /** A file name from a view title: no separators, no control characters. */
524
+ export function csvName(title) {
525
+ const base = (title ?? '').replace(/[\\/:*?"<>|\x00-\x1f]/g, ' ').replace(/\s+/g, ' ').trim().slice(0, 60);
526
+ return `${base === '' ? 'table' : base}.csv`;
527
+ }
528
+ /** Said for a view a chat cannot hold. */
529
+ export const CHART_TEXT = 'That is a chart; open the dashboard to see it.';
530
+ export const VIEW_TEXT = 'That is on the dashboard beside the chat; open the dashboard to see it.';
531
+ /** The one line for a chart or any other view, with the link when there is one. */
532
+ export function viewLine(view, dashboardUrl) {
533
+ const said = view.renderer === 'timeseries' || view.renderer === 'bars' ? CHART_TEXT : VIEW_TEXT;
534
+ return dashboardUrl ? `${said}\n${dashboardUrl}` : said;
535
+ }
536
+ /* ------------------------------------------------------------------ *
537
+ * Files
538
+ * ------------------------------------------------------------------ */
539
+ /** How many of a run's files are sent; the rest are named as a count. */
540
+ export const MAX_FILES_OUT = 10;
541
+ /** Pictures Telegram shows inline. Anything else image-shaped goes as a file. */
542
+ const PHOTO_MIMES = new Set(['image/jpeg', 'image/png', 'image/webp']);
543
+ const MIME_EXT = {
544
+ 'application/pdf': '.pdf',
545
+ 'text/csv': '.csv',
546
+ 'text/plain': '.txt',
547
+ 'text/markdown': '.md',
548
+ 'application/json': '.json',
549
+ 'image/png': '.png',
550
+ 'image/jpeg': '.jpg',
551
+ 'image/webp': '.webp',
552
+ };
553
+ /** The name a file is sent under: its own, or one made from its type. */
554
+ export function sendName(row) {
555
+ if (row.filename && row.filename.trim() !== '')
556
+ return row.filename.trim();
557
+ return `file-${row.id.slice(0, 8)}${MIME_EXT[row.mime] ?? ''}`;
558
+ }
559
+ /** A file over Telegram's limit, in one sentence naming where it is. */
560
+ export function tooBigText(name, bytes, filesUrl) {
561
+ const said = `${name} is ${formatBytes(bytes)}, over Telegram's 50 MB limit; it is on the dashboard, under Files.`;
562
+ return filesUrl ? `${said}\n${filesUrl}` : said;
563
+ }
564
+ /** A file that could not be sent for any other reason. */
565
+ export function fileFailedText(name, filesUrl) {
566
+ const said = `I could not send ${name} here; it is on the dashboard, under Files.`;
567
+ return filesUrl ? `${said}\n${filesUrl}` : said;
568
+ }
569
+ /** What is said for the files past `MAX_FILES_OUT`. */
570
+ export function moreFilesText(count, filesUrl) {
571
+ const said = `And ${count} more ${count === 1 ? 'file' : 'files'} on the dashboard, under Files.`;
572
+ return filesUrl ? `${said}\n${filesUrl}` : said;
573
+ }
574
+ /** The dashboard's address for a phone, or undefined when it is on this computer only. */
575
+ export function dashboardUrl(publicOrigin, route = '') {
576
+ if (!publicOrigin)
577
+ return undefined;
578
+ return `${publicOrigin.replace(/\/$/, '')}/${route.replace(/^\//, '')}`;
579
+ }
580
+ /** Send one file a run saved, or the sentence that stands in for it. */
581
+ async function sendFile(deps, chatId, id, filesUrl) {
582
+ const store = deps.artifacts;
583
+ if (!store?.describe)
584
+ return;
585
+ const row = await store.describe(id).catch((err) => {
586
+ deps.log(`telegram: file ${id} unreadable: ${message(err)}`);
587
+ return null;
588
+ });
589
+ if (!row)
590
+ return;
591
+ const name = sendName(row);
592
+ if (row.sizeBytes > MAX_SEND_BYTES) {
593
+ await deps.api.sendMessage(chatId, tooBigText(name, row.sizeBytes, filesUrl));
594
+ return;
595
+ }
596
+ try {
597
+ const loaded = await store.load(id);
598
+ if (!loaded)
599
+ throw new Error('the file is gone');
600
+ const bytes = Buffer.from(loaded.data, 'base64');
601
+ const mime = row.mime || loaded.mime;
602
+ if (PHOTO_MIMES.has(mime) && bytes.length <= MAX_PHOTO_BYTES) {
603
+ // A picture shows no name of its own, so the caption carries it.
604
+ await deps.api.sendPhoto(chatId, bytes, { filename: name, contentType: mime, caption: name });
605
+ }
606
+ else {
607
+ // A document shows its name already; a caption would say it twice.
608
+ await deps.api.sendDocument(chatId, bytes, { filename: name, contentType: mime });
609
+ }
610
+ }
611
+ catch (err) {
612
+ deps.log(`telegram: sending ${name} failed: ${message(err)}`);
613
+ await deps.api.sendMessage(chatId, fileFailedText(name, filesUrl)).catch(() => { });
614
+ }
615
+ }
616
+ /** Send the view a run left on the canvas, the way a phone can hold it. */
617
+ async function sendView(deps, chatId, view) {
618
+ if (view.renderer !== 'table') {
619
+ await deps.api.sendMessage(chatId, viewLine(view, dashboardUrl(deps.publicOrigin)));
620
+ return;
621
+ }
622
+ if (view.data.rows.length === 0) {
623
+ const empty = view.data.empty?.trim() || 'The table is empty.';
624
+ await deps.api.sendMessage(chatId, view.title ? `${view.title}\n${empty}` : empty);
625
+ return;
626
+ }
627
+ const html = tableMessage(view);
628
+ if (html !== undefined) {
629
+ await deps.api.sendMessage(chatId, html, { parseMode: 'HTML' });
630
+ return;
631
+ }
632
+ await deps.api.sendDocument(chatId, Buffer.from(tableCsv(view), 'utf8'), {
633
+ filename: csvName(view.title),
634
+ contentType: 'text/csv',
635
+ });
636
+ }
637
+ /**
638
+ * Everything a run produced besides its text, sent after the text: the view
639
+ * it left on the canvas, then the files it saved, in the order it saved them.
640
+ * Each send is independent — one failure never stops the rest.
641
+ */
642
+ export async function sendRunExtras(deps, chatId, extras) {
643
+ if (extras.canvas) {
644
+ await sendView(deps, chatId, extras.canvas).catch((err) => {
645
+ deps.log(`telegram: sending the canvas view failed: ${message(err)}`);
646
+ });
647
+ }
648
+ const ids = [...new Set(extras.artifacts ?? [])];
649
+ if (ids.length === 0)
650
+ return;
651
+ const filesUrl = dashboardUrl(deps.publicOrigin, '#/files');
652
+ for (const id of ids.slice(0, MAX_FILES_OUT)) {
653
+ await sendFile(deps, chatId, id, filesUrl).catch((err) => {
654
+ deps.log(`telegram: file ${id} not sent: ${message(err)}`);
655
+ });
656
+ }
657
+ if (ids.length > MAX_FILES_OUT) {
658
+ await deps.api.sendMessage(chatId, moreFilesText(ids.length - MAX_FILES_OUT, filesUrl)).catch(() => { });
659
+ }
660
+ }
661
+ function message(err) {
662
+ return err instanceof Error ? err.message : String(err);
663
+ }
664
+ function sleep(ms) {
665
+ return new Promise((resolve) => {
666
+ const t = setTimeout(resolve, ms);
667
+ if (typeof t.unref === 'function')
668
+ t.unref();
669
+ });
670
+ }
671
+ //# sourceMappingURL=outbound.js.map