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

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 (600) hide show
  1. package/README.md +58 -368
  2. package/examples/agents/concierge/agent.md +10 -2
  3. package/extension/manifest.json +2 -2
  4. package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
  5. package/node_modules/@buddi/cli/dist/agents-catalogue-cmd.d.ts +50 -0
  6. package/node_modules/@buddi/cli/dist/agents-catalogue-cmd.d.ts.map +1 -0
  7. package/node_modules/@buddi/cli/dist/agents-catalogue-cmd.js +328 -0
  8. package/node_modules/@buddi/cli/dist/agents-catalogue-cmd.js.map +1 -0
  9. package/node_modules/@buddi/cli/dist/args.d.ts +5 -0
  10. package/node_modules/@buddi/cli/dist/args.d.ts.map +1 -1
  11. package/node_modules/@buddi/cli/dist/args.js +8 -0
  12. package/node_modules/@buddi/cli/dist/args.js.map +1 -1
  13. package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -1
  14. package/node_modules/@buddi/cli/dist/commands.js +63 -1
  15. package/node_modules/@buddi/cli/dist/commands.js.map +1 -1
  16. package/node_modules/@buddi/cli/dist/doctor-probes.d.ts.map +1 -1
  17. package/node_modules/@buddi/cli/dist/doctor-probes.js +4 -11
  18. package/node_modules/@buddi/cli/dist/doctor-probes.js.map +1 -1
  19. package/node_modules/@buddi/cli/dist/doctor.d.ts +16 -0
  20. package/node_modules/@buddi/cli/dist/doctor.d.ts.map +1 -1
  21. package/node_modules/@buddi/cli/dist/doctor.js +30 -0
  22. package/node_modules/@buddi/cli/dist/doctor.js.map +1 -1
  23. package/node_modules/@buddi/cli/dist/main.d.ts.map +1 -1
  24. package/node_modules/@buddi/cli/dist/main.js +44 -9
  25. package/node_modules/@buddi/cli/dist/main.js.map +1 -1
  26. package/node_modules/@buddi/cli/dist/mcp/tools.d.ts.map +1 -1
  27. package/node_modules/@buddi/cli/dist/mcp/tools.js +3 -1
  28. package/node_modules/@buddi/cli/dist/mcp/tools.js.map +1 -1
  29. package/node_modules/@buddi/cli/dist/skills-cmd.d.ts +15 -0
  30. package/node_modules/@buddi/cli/dist/skills-cmd.d.ts.map +1 -0
  31. package/node_modules/@buddi/cli/dist/skills-cmd.js +54 -0
  32. package/node_modules/@buddi/cli/dist/skills-cmd.js.map +1 -0
  33. package/node_modules/@buddi/cli/dist/status.d.ts +15 -9
  34. package/node_modules/@buddi/cli/dist/status.d.ts.map +1 -1
  35. package/node_modules/@buddi/cli/dist/status.js +6 -11
  36. package/node_modules/@buddi/cli/dist/status.js.map +1 -1
  37. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  38. package/node_modules/@buddi/core/dist/actions/store.d.ts +8 -0
  39. package/node_modules/@buddi/core/dist/actions/store.d.ts.map +1 -1
  40. package/node_modules/@buddi/core/dist/actions/store.js +13 -0
  41. package/node_modules/@buddi/core/dist/actions/store.js.map +1 -1
  42. package/node_modules/@buddi/core/dist/agents/catalog.d.ts +11 -3
  43. package/node_modules/@buddi/core/dist/agents/catalog.d.ts.map +1 -1
  44. package/node_modules/@buddi/core/dist/agents/catalog.js +58 -10
  45. package/node_modules/@buddi/core/dist/agents/catalog.js.map +1 -1
  46. package/node_modules/@buddi/core/dist/agents/frontmatter.d.ts +1 -1
  47. package/node_modules/@buddi/core/dist/agents/frontmatter.d.ts.map +1 -1
  48. package/node_modules/@buddi/core/dist/agents/frontmatter.js +1 -1
  49. package/node_modules/@buddi/core/dist/agents/frontmatter.js.map +1 -1
  50. package/node_modules/@buddi/core/dist/agents/skills.d.ts +29 -3
  51. package/node_modules/@buddi/core/dist/agents/skills.d.ts.map +1 -1
  52. package/node_modules/@buddi/core/dist/agents/skills.js +49 -2
  53. package/node_modules/@buddi/core/dist/agents/skills.js.map +1 -1
  54. package/node_modules/@buddi/core/dist/clock-widget.d.ts.map +1 -1
  55. package/node_modules/@buddi/core/dist/clock-widget.js +5 -3
  56. package/node_modules/@buddi/core/dist/clock-widget.js.map +1 -1
  57. package/node_modules/@buddi/core/dist/host/build.d.ts.map +1 -1
  58. package/node_modules/@buddi/core/dist/host/build.js +11 -0
  59. package/node_modules/@buddi/core/dist/host/build.js.map +1 -1
  60. package/node_modules/@buddi/core/dist/host/types.d.ts +7 -0
  61. package/node_modules/@buddi/core/dist/host/types.d.ts.map +1 -1
  62. package/node_modules/@buddi/core/dist/learning/store.d.ts +7 -0
  63. package/node_modules/@buddi/core/dist/learning/store.d.ts.map +1 -1
  64. package/node_modules/@buddi/core/dist/learning/store.js +6 -0
  65. package/node_modules/@buddi/core/dist/learning/store.js.map +1 -1
  66. package/node_modules/@buddi/core/dist/notifications/agent.d.ts +7 -0
  67. package/node_modules/@buddi/core/dist/notifications/agent.d.ts.map +1 -1
  68. package/node_modules/@buddi/core/dist/notifications/agent.js +2 -0
  69. package/node_modules/@buddi/core/dist/notifications/agent.js.map +1 -1
  70. package/node_modules/@buddi/core/dist/notifications/index.d.ts +1 -0
  71. package/node_modules/@buddi/core/dist/notifications/index.d.ts.map +1 -1
  72. package/node_modules/@buddi/core/dist/notifications/index.js +1 -0
  73. package/node_modules/@buddi/core/dist/notifications/index.js.map +1 -1
  74. package/node_modules/@buddi/core/dist/notifications/needs.d.ts +49 -0
  75. package/node_modules/@buddi/core/dist/notifications/needs.d.ts.map +1 -0
  76. package/node_modules/@buddi/core/dist/notifications/needs.js +41 -0
  77. package/node_modules/@buddi/core/dist/notifications/needs.js.map +1 -0
  78. package/node_modules/@buddi/core/dist/notifications/notify.d.ts.map +1 -1
  79. package/node_modules/@buddi/core/dist/notifications/notify.js +16 -7
  80. package/node_modules/@buddi/core/dist/notifications/notify.js.map +1 -1
  81. package/node_modules/@buddi/core/dist/notifications/store.d.ts.map +1 -1
  82. package/node_modules/@buddi/core/dist/notifications/store.js +2 -1
  83. package/node_modules/@buddi/core/dist/notifications/store.js.map +1 -1
  84. package/node_modules/@buddi/core/dist/notifications/types.d.ts +10 -0
  85. package/node_modules/@buddi/core/dist/notifications/types.d.ts.map +1 -1
  86. package/node_modules/@buddi/core/dist/notifications/types.js.map +1 -1
  87. package/node_modules/@buddi/core/dist/offers/store.d.ts.map +1 -1
  88. package/node_modules/@buddi/core/dist/offers/store.js +9 -4
  89. package/node_modules/@buddi/core/dist/offers/store.js.map +1 -1
  90. package/node_modules/@buddi/core/dist/offers/types.d.ts +24 -1
  91. package/node_modules/@buddi/core/dist/offers/types.d.ts.map +1 -1
  92. package/node_modules/@buddi/core/dist/offers/types.js +23 -1
  93. package/node_modules/@buddi/core/dist/offers/types.js.map +1 -1
  94. package/node_modules/@buddi/core/dist/owner-timezone.d.ts +20 -22
  95. package/node_modules/@buddi/core/dist/owner-timezone.d.ts.map +1 -1
  96. package/node_modules/@buddi/core/dist/owner-timezone.js +17 -25
  97. package/node_modules/@buddi/core/dist/owner-timezone.js.map +1 -1
  98. package/node_modules/@buddi/core/dist/plugin/version.d.ts +1 -1
  99. package/node_modules/@buddi/core/dist/plugin/version.js +1 -1
  100. package/node_modules/@buddi/core/dist/scheduler/missions.d.ts +86 -11
  101. package/node_modules/@buddi/core/dist/scheduler/missions.d.ts.map +1 -1
  102. package/node_modules/@buddi/core/dist/scheduler/missions.js +160 -36
  103. package/node_modules/@buddi/core/dist/scheduler/missions.js.map +1 -1
  104. package/node_modules/@buddi/core/dist/scheduler/runner.d.ts.map +1 -1
  105. package/node_modules/@buddi/core/dist/scheduler/runner.js +6 -1
  106. package/node_modules/@buddi/core/dist/scheduler/runner.js.map +1 -1
  107. package/node_modules/@buddi/core/dist/scheduler/types.d.ts +22 -0
  108. package/node_modules/@buddi/core/dist/scheduler/types.d.ts.map +1 -1
  109. package/node_modules/@buddi/core/dist/scheduler/types.js +6 -0
  110. package/node_modules/@buddi/core/dist/scheduler/types.js.map +1 -1
  111. package/node_modules/@buddi/core/dist/web-settings.d.ts +13 -0
  112. package/node_modules/@buddi/core/dist/web-settings.d.ts.map +1 -1
  113. package/node_modules/@buddi/core/dist/web-settings.js +26 -0
  114. package/node_modules/@buddi/core/dist/web-settings.js.map +1 -1
  115. package/node_modules/@buddi/core/dist/widgets.d.ts +13 -5
  116. package/node_modules/@buddi/core/dist/widgets.d.ts.map +1 -1
  117. package/node_modules/@buddi/core/dist/widgets.js +10 -1
  118. package/node_modules/@buddi/core/dist/widgets.js.map +1 -1
  119. package/node_modules/@buddi/core/migrations/068_notification_action.sql +12 -0
  120. package/node_modules/@buddi/core/migrations/069_schedule_zone_explicit.sql +18 -0
  121. package/node_modules/@buddi/core/migrations/070_offer_handoff.sql +15 -0
  122. package/node_modules/@buddi/core/migrations/071_mission_lifespan.sql +19 -0
  123. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  124. package/node_modules/@buddi/gateway/dist/agents/canvas.d.ts +6 -6
  125. package/node_modules/@buddi/gateway/dist/agents/catalogue-package.d.ts +313 -0
  126. package/node_modules/@buddi/gateway/dist/agents/catalogue-package.d.ts.map +1 -0
  127. package/node_modules/@buddi/gateway/dist/agents/catalogue-package.js +356 -0
  128. package/node_modules/@buddi/gateway/dist/agents/catalogue-package.js.map +1 -0
  129. package/node_modules/@buddi/gateway/dist/agents/learning-digest.d.ts +29 -7
  130. package/node_modules/@buddi/gateway/dist/agents/learning-digest.d.ts.map +1 -1
  131. package/node_modules/@buddi/gateway/dist/agents/learning-digest.js +87 -38
  132. package/node_modules/@buddi/gateway/dist/agents/learning-digest.js.map +1 -1
  133. package/node_modules/@buddi/gateway/dist/agents/owner-tools.d.ts.map +1 -1
  134. package/node_modules/@buddi/gateway/dist/agents/owner-tools.js +11 -1
  135. package/node_modules/@buddi/gateway/dist/agents/owner-tools.js.map +1 -1
  136. package/node_modules/@buddi/gateway/dist/agents/platform-catalogue.d.ts +361 -0
  137. package/node_modules/@buddi/gateway/dist/agents/platform-catalogue.d.ts.map +1 -0
  138. package/node_modules/@buddi/gateway/dist/agents/platform-catalogue.js +1021 -0
  139. package/node_modules/@buddi/gateway/dist/agents/platform-catalogue.js.map +1 -0
  140. package/node_modules/@buddi/gateway/dist/agents/platform-names.d.ts.map +1 -1
  141. package/node_modules/@buddi/gateway/dist/agents/platform-names.js +3 -0
  142. package/node_modules/@buddi/gateway/dist/agents/platform-names.js.map +1 -1
  143. package/node_modules/@buddi/gateway/dist/agents/platform.d.ts +62 -25
  144. package/node_modules/@buddi/gateway/dist/agents/platform.d.ts.map +1 -1
  145. package/node_modules/@buddi/gateway/dist/agents/platform.js +123 -29
  146. package/node_modules/@buddi/gateway/dist/agents/platform.js.map +1 -1
  147. package/node_modules/@buddi/gateway/dist/agents-cli.d.ts +1 -1
  148. package/node_modules/@buddi/gateway/dist/agents-cli.d.ts.map +1 -1
  149. package/node_modules/@buddi/gateway/dist/agents-cli.js +6 -0
  150. package/node_modules/@buddi/gateway/dist/agents-cli.js.map +1 -1
  151. package/node_modules/@buddi/gateway/dist/bootstrap.d.ts.map +1 -1
  152. package/node_modules/@buddi/gateway/dist/bootstrap.js +13 -1
  153. package/node_modules/@buddi/gateway/dist/bootstrap.js.map +1 -1
  154. package/node_modules/@buddi/gateway/dist/index.d.ts +1 -0
  155. package/node_modules/@buddi/gateway/dist/index.d.ts.map +1 -1
  156. package/node_modules/@buddi/gateway/dist/index.js +1 -0
  157. package/node_modules/@buddi/gateway/dist/index.js.map +1 -1
  158. package/node_modules/@buddi/gateway/dist/missions/defaults.d.ts +0 -6
  159. package/node_modules/@buddi/gateway/dist/missions/defaults.d.ts.map +1 -1
  160. package/node_modules/@buddi/gateway/dist/missions/defaults.js +4 -8
  161. package/node_modules/@buddi/gateway/dist/missions/defaults.js.map +1 -1
  162. package/node_modules/@buddi/gateway/dist/missions/execute.d.ts +6 -0
  163. package/node_modules/@buddi/gateway/dist/missions/execute.d.ts.map +1 -1
  164. package/node_modules/@buddi/gateway/dist/missions/execute.js +74 -2
  165. package/node_modules/@buddi/gateway/dist/missions/execute.js.map +1 -1
  166. package/node_modules/@buddi/gateway/dist/missions/reminders.d.ts +10 -0
  167. package/node_modules/@buddi/gateway/dist/missions/reminders.d.ts.map +1 -1
  168. package/node_modules/@buddi/gateway/dist/missions/reminders.js +86 -17
  169. package/node_modules/@buddi/gateway/dist/missions/reminders.js.map +1 -1
  170. package/node_modules/@buddi/gateway/dist/missions/zone-provenance.d.ts +13 -0
  171. package/node_modules/@buddi/gateway/dist/missions/zone-provenance.d.ts.map +1 -0
  172. package/node_modules/@buddi/gateway/dist/missions/zone-provenance.js +31 -0
  173. package/node_modules/@buddi/gateway/dist/missions/zone-provenance.js.map +1 -0
  174. package/node_modules/@buddi/gateway/dist/missions-cli.js +2 -2
  175. package/node_modules/@buddi/gateway/dist/missions-cli.js.map +1 -1
  176. package/node_modules/@buddi/gateway/dist/plugins/load.d.ts.map +1 -1
  177. package/node_modules/@buddi/gateway/dist/plugins/load.js +12 -5
  178. package/node_modules/@buddi/gateway/dist/plugins/load.js.map +1 -1
  179. package/node_modules/@buddi/gateway/dist/plugins/provenance.d.ts +35 -1
  180. package/node_modules/@buddi/gateway/dist/plugins/provenance.d.ts.map +1 -1
  181. package/node_modules/@buddi/gateway/dist/plugins/provenance.js +39 -1
  182. package/node_modules/@buddi/gateway/dist/plugins/provenance.js.map +1 -1
  183. package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
  184. package/node_modules/@buddi/gateway/dist/serve.js +10 -10
  185. package/node_modules/@buddi/gateway/dist/serve.js.map +1 -1
  186. package/node_modules/@buddi/gateway/dist/surfaces/handoff.d.ts +62 -0
  187. package/node_modules/@buddi/gateway/dist/surfaces/handoff.d.ts.map +1 -0
  188. package/node_modules/@buddi/gateway/dist/surfaces/handoff.js +121 -0
  189. package/node_modules/@buddi/gateway/dist/surfaces/handoff.js.map +1 -0
  190. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.d.ts +2 -0
  191. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  192. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js +1 -1
  193. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js.map +1 -1
  194. package/node_modules/@buddi/gateway/dist/telegram/channel.d.ts +11 -1
  195. package/node_modules/@buddi/gateway/dist/telegram/channel.d.ts.map +1 -1
  196. package/node_modules/@buddi/gateway/dist/telegram/channel.js +13 -2
  197. package/node_modules/@buddi/gateway/dist/telegram/channel.js.map +1 -1
  198. package/node_modules/@buddi/gateway/dist/telegram/main.d.ts.map +1 -1
  199. package/node_modules/@buddi/gateway/dist/telegram/main.js +7 -1
  200. package/node_modules/@buddi/gateway/dist/telegram/main.js.map +1 -1
  201. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts +9 -1
  202. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
  203. package/node_modules/@buddi/gateway/dist/telegram/surface.js +58 -6
  204. package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
  205. package/node_modules/@buddi/gateway/dist/web/agent-offers.d.ts +0 -30
  206. package/node_modules/@buddi/gateway/dist/web/agent-offers.d.ts.map +1 -1
  207. package/node_modules/@buddi/gateway/dist/web/agent-offers.js +1 -64
  208. package/node_modules/@buddi/gateway/dist/web/agent-offers.js.map +1 -1
  209. package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts +1 -0
  210. package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts.map +1 -1
  211. package/node_modules/@buddi/gateway/dist/web/api-routes.js +126 -7
  212. package/node_modules/@buddi/gateway/dist/web/api-routes.js.map +1 -1
  213. package/node_modules/@buddi/gateway/dist/web/catalogue-source.d.ts +33 -0
  214. package/node_modules/@buddi/gateway/dist/web/catalogue-source.d.ts.map +1 -0
  215. package/node_modules/@buddi/gateway/dist/web/catalogue-source.js +124 -0
  216. package/node_modules/@buddi/gateway/dist/web/catalogue-source.js.map +1 -0
  217. package/node_modules/@buddi/gateway/dist/web/catalogue.d.ts +155 -0
  218. package/node_modules/@buddi/gateway/dist/web/catalogue.d.ts.map +1 -0
  219. package/node_modules/@buddi/gateway/dist/web/catalogue.js +734 -0
  220. package/node_modules/@buddi/gateway/dist/web/catalogue.js.map +1 -0
  221. package/node_modules/@buddi/gateway/dist/web/chat.d.ts +3 -1
  222. package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
  223. package/node_modules/@buddi/gateway/dist/web/chat.js +8 -1
  224. package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
  225. package/node_modules/@buddi/gateway/dist/web/client-key.d.ts +24 -0
  226. package/node_modules/@buddi/gateway/dist/web/client-key.d.ts.map +1 -0
  227. package/node_modules/@buddi/gateway/dist/web/client-key.js +17 -0
  228. package/node_modules/@buddi/gateway/dist/web/client-key.js.map +1 -0
  229. package/node_modules/@buddi/gateway/dist/web/lock.d.ts +5 -1
  230. package/node_modules/@buddi/gateway/dist/web/lock.d.ts.map +1 -1
  231. package/node_modules/@buddi/gateway/dist/web/lock.js +4 -15
  232. package/node_modules/@buddi/gateway/dist/web/lock.js.map +1 -1
  233. package/node_modules/@buddi/gateway/dist/web/market.d.ts +1 -0
  234. package/node_modules/@buddi/gateway/dist/web/market.d.ts.map +1 -1
  235. package/node_modules/@buddi/gateway/dist/web/market.js +6 -0
  236. package/node_modules/@buddi/gateway/dist/web/market.js.map +1 -1
  237. package/node_modules/@buddi/gateway/dist/web/needs-you.d.ts +36 -0
  238. package/node_modules/@buddi/gateway/dist/web/needs-you.d.ts.map +1 -0
  239. package/node_modules/@buddi/gateway/dist/web/needs-you.js +65 -0
  240. package/node_modules/@buddi/gateway/dist/web/needs-you.js.map +1 -0
  241. package/node_modules/@buddi/gateway/dist/web/notifications.d.ts +9 -1
  242. package/node_modules/@buddi/gateway/dist/web/notifications.d.ts.map +1 -1
  243. package/node_modules/@buddi/gateway/dist/web/notifications.js +14 -3
  244. package/node_modules/@buddi/gateway/dist/web/notifications.js.map +1 -1
  245. package/node_modules/@buddi/gateway/dist/web/read.d.ts +27 -1
  246. package/node_modules/@buddi/gateway/dist/web/read.d.ts.map +1 -1
  247. package/node_modules/@buddi/gateway/dist/web/read.js +57 -8
  248. package/node_modules/@buddi/gateway/dist/web/read.js.map +1 -1
  249. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  250. package/node_modules/@buddi/gateway/dist/web/server.js +165 -13
  251. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  252. package/node_modules/@buddi/gateway/dist/web/skills.d.ts +120 -0
  253. package/node_modules/@buddi/gateway/dist/web/skills.d.ts.map +1 -0
  254. package/node_modules/@buddi/gateway/dist/web/skills.js +672 -0
  255. package/node_modules/@buddi/gateway/dist/web/skills.js.map +1 -0
  256. package/node_modules/@buddi/gateway/dist/web/take-on.d.ts +35 -1
  257. package/node_modules/@buddi/gateway/dist/web/take-on.d.ts.map +1 -1
  258. package/node_modules/@buddi/gateway/dist/web/take-on.js +76 -51
  259. package/node_modules/@buddi/gateway/dist/web/take-on.js.map +1 -1
  260. package/node_modules/@buddi/gateway/dist/web/write.d.ts +9 -1
  261. package/node_modules/@buddi/gateway/dist/web/write.d.ts.map +1 -1
  262. package/node_modules/@buddi/gateway/dist/web/write.js +39 -2
  263. package/node_modules/@buddi/gateway/dist/web/write.js.map +1 -1
  264. package/node_modules/@buddi/gateway/package.json +0 -1
  265. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  266. package/node_modules/@buddi/install/dist/doctor-timezone.d.ts +17 -0
  267. package/node_modules/@buddi/install/dist/doctor-timezone.d.ts.map +1 -0
  268. package/node_modules/@buddi/install/dist/doctor-timezone.js +34 -0
  269. package/node_modules/@buddi/install/dist/doctor-timezone.js.map +1 -0
  270. package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
  271. package/node_modules/@buddi/install/dist/launcher.js +3 -0
  272. package/node_modules/@buddi/install/dist/launcher.js.map +1 -1
  273. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  274. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  275. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  276. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  277. package/node_modules/@buddi/tool-email/dist/needs-you.d.ts +4 -1
  278. package/node_modules/@buddi/tool-email/dist/needs-you.d.ts.map +1 -1
  279. package/node_modules/@buddi/tool-email/dist/needs-you.js +2 -0
  280. package/node_modules/@buddi/tool-email/dist/needs-you.js.map +1 -1
  281. package/node_modules/@buddi/tool-email/migrations/026_attention_filed.sql +89 -0
  282. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  283. package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
  284. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  285. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  286. package/package.json +2 -2
  287. package/packages/cli/dist/.tsbuildinfo +1 -1
  288. package/packages/cli/dist/agents-catalogue-cmd.d.ts +50 -0
  289. package/packages/cli/dist/agents-catalogue-cmd.d.ts.map +1 -0
  290. package/packages/cli/dist/agents-catalogue-cmd.js +328 -0
  291. package/packages/cli/dist/agents-catalogue-cmd.js.map +1 -0
  292. package/packages/cli/dist/args.d.ts +5 -0
  293. package/packages/cli/dist/args.d.ts.map +1 -1
  294. package/packages/cli/dist/args.js +8 -0
  295. package/packages/cli/dist/args.js.map +1 -1
  296. package/packages/cli/dist/commands.d.ts.map +1 -1
  297. package/packages/cli/dist/commands.js +63 -1
  298. package/packages/cli/dist/commands.js.map +1 -1
  299. package/packages/cli/dist/doctor-probes.d.ts.map +1 -1
  300. package/packages/cli/dist/doctor-probes.js +4 -11
  301. package/packages/cli/dist/doctor-probes.js.map +1 -1
  302. package/packages/cli/dist/doctor.d.ts +16 -0
  303. package/packages/cli/dist/doctor.d.ts.map +1 -1
  304. package/packages/cli/dist/doctor.js +30 -0
  305. package/packages/cli/dist/doctor.js.map +1 -1
  306. package/packages/cli/dist/main.d.ts.map +1 -1
  307. package/packages/cli/dist/main.js +44 -9
  308. package/packages/cli/dist/main.js.map +1 -1
  309. package/packages/cli/dist/mcp/tools.d.ts.map +1 -1
  310. package/packages/cli/dist/mcp/tools.js +3 -1
  311. package/packages/cli/dist/mcp/tools.js.map +1 -1
  312. package/packages/cli/dist/skills-cmd.d.ts +15 -0
  313. package/packages/cli/dist/skills-cmd.d.ts.map +1 -0
  314. package/packages/cli/dist/skills-cmd.js +54 -0
  315. package/packages/cli/dist/skills-cmd.js.map +1 -0
  316. package/packages/cli/dist/status.d.ts +15 -9
  317. package/packages/cli/dist/status.d.ts.map +1 -1
  318. package/packages/cli/dist/status.js +6 -11
  319. package/packages/cli/dist/status.js.map +1 -1
  320. package/packages/core/dist/.tsbuildinfo +1 -1
  321. package/packages/core/dist/actions/store.d.ts +8 -0
  322. package/packages/core/dist/actions/store.d.ts.map +1 -1
  323. package/packages/core/dist/actions/store.js +13 -0
  324. package/packages/core/dist/actions/store.js.map +1 -1
  325. package/packages/core/dist/agents/catalog.d.ts +11 -3
  326. package/packages/core/dist/agents/catalog.d.ts.map +1 -1
  327. package/packages/core/dist/agents/catalog.js +58 -10
  328. package/packages/core/dist/agents/catalog.js.map +1 -1
  329. package/packages/core/dist/agents/frontmatter.d.ts +1 -1
  330. package/packages/core/dist/agents/frontmatter.d.ts.map +1 -1
  331. package/packages/core/dist/agents/frontmatter.js +1 -1
  332. package/packages/core/dist/agents/frontmatter.js.map +1 -1
  333. package/packages/core/dist/agents/skills.d.ts +29 -3
  334. package/packages/core/dist/agents/skills.d.ts.map +1 -1
  335. package/packages/core/dist/agents/skills.js +49 -2
  336. package/packages/core/dist/agents/skills.js.map +1 -1
  337. package/packages/core/dist/clock-widget.d.ts.map +1 -1
  338. package/packages/core/dist/clock-widget.js +5 -3
  339. package/packages/core/dist/clock-widget.js.map +1 -1
  340. package/packages/core/dist/host/build.d.ts.map +1 -1
  341. package/packages/core/dist/host/build.js +11 -0
  342. package/packages/core/dist/host/build.js.map +1 -1
  343. package/packages/core/dist/host/types.d.ts +7 -0
  344. package/packages/core/dist/host/types.d.ts.map +1 -1
  345. package/packages/core/dist/learning/store.d.ts +7 -0
  346. package/packages/core/dist/learning/store.d.ts.map +1 -1
  347. package/packages/core/dist/learning/store.js +6 -0
  348. package/packages/core/dist/learning/store.js.map +1 -1
  349. package/packages/core/dist/notifications/agent.d.ts +7 -0
  350. package/packages/core/dist/notifications/agent.d.ts.map +1 -1
  351. package/packages/core/dist/notifications/agent.js +2 -0
  352. package/packages/core/dist/notifications/agent.js.map +1 -1
  353. package/packages/core/dist/notifications/index.d.ts +1 -0
  354. package/packages/core/dist/notifications/index.d.ts.map +1 -1
  355. package/packages/core/dist/notifications/index.js +1 -0
  356. package/packages/core/dist/notifications/index.js.map +1 -1
  357. package/packages/core/dist/notifications/needs.d.ts +49 -0
  358. package/packages/core/dist/notifications/needs.d.ts.map +1 -0
  359. package/packages/core/dist/notifications/needs.js +41 -0
  360. package/packages/core/dist/notifications/needs.js.map +1 -0
  361. package/packages/core/dist/notifications/notify.d.ts.map +1 -1
  362. package/packages/core/dist/notifications/notify.js +16 -7
  363. package/packages/core/dist/notifications/notify.js.map +1 -1
  364. package/packages/core/dist/notifications/store.d.ts.map +1 -1
  365. package/packages/core/dist/notifications/store.js +2 -1
  366. package/packages/core/dist/notifications/store.js.map +1 -1
  367. package/packages/core/dist/notifications/types.d.ts +10 -0
  368. package/packages/core/dist/notifications/types.d.ts.map +1 -1
  369. package/packages/core/dist/notifications/types.js.map +1 -1
  370. package/packages/core/dist/offers/store.d.ts.map +1 -1
  371. package/packages/core/dist/offers/store.js +9 -4
  372. package/packages/core/dist/offers/store.js.map +1 -1
  373. package/packages/core/dist/offers/types.d.ts +24 -1
  374. package/packages/core/dist/offers/types.d.ts.map +1 -1
  375. package/packages/core/dist/offers/types.js +23 -1
  376. package/packages/core/dist/offers/types.js.map +1 -1
  377. package/packages/core/dist/owner-timezone.d.ts +20 -22
  378. package/packages/core/dist/owner-timezone.d.ts.map +1 -1
  379. package/packages/core/dist/owner-timezone.js +17 -25
  380. package/packages/core/dist/owner-timezone.js.map +1 -1
  381. package/packages/core/dist/plugin/version.d.ts +1 -1
  382. package/packages/core/dist/plugin/version.js +1 -1
  383. package/packages/core/dist/scheduler/missions.d.ts +86 -11
  384. package/packages/core/dist/scheduler/missions.d.ts.map +1 -1
  385. package/packages/core/dist/scheduler/missions.js +160 -36
  386. package/packages/core/dist/scheduler/missions.js.map +1 -1
  387. package/packages/core/dist/scheduler/runner.d.ts.map +1 -1
  388. package/packages/core/dist/scheduler/runner.js +6 -1
  389. package/packages/core/dist/scheduler/runner.js.map +1 -1
  390. package/packages/core/dist/scheduler/types.d.ts +22 -0
  391. package/packages/core/dist/scheduler/types.d.ts.map +1 -1
  392. package/packages/core/dist/scheduler/types.js +6 -0
  393. package/packages/core/dist/scheduler/types.js.map +1 -1
  394. package/packages/core/dist/web-settings.d.ts +13 -0
  395. package/packages/core/dist/web-settings.d.ts.map +1 -1
  396. package/packages/core/dist/web-settings.js +26 -0
  397. package/packages/core/dist/web-settings.js.map +1 -1
  398. package/packages/core/dist/widgets.d.ts +13 -5
  399. package/packages/core/dist/widgets.d.ts.map +1 -1
  400. package/packages/core/dist/widgets.js +10 -1
  401. package/packages/core/dist/widgets.js.map +1 -1
  402. package/packages/core/migrations/068_notification_action.sql +12 -0
  403. package/packages/core/migrations/069_schedule_zone_explicit.sql +18 -0
  404. package/packages/core/migrations/070_offer_handoff.sql +15 -0
  405. package/packages/core/migrations/071_mission_lifespan.sql +19 -0
  406. package/packages/gateway/dist/.tsbuildinfo +1 -1
  407. package/packages/gateway/dist/agents/canvas.d.ts +6 -6
  408. package/packages/gateway/dist/agents/catalogue-package.d.ts +313 -0
  409. package/packages/gateway/dist/agents/catalogue-package.d.ts.map +1 -0
  410. package/packages/gateway/dist/agents/catalogue-package.js +356 -0
  411. package/packages/gateway/dist/agents/catalogue-package.js.map +1 -0
  412. package/packages/gateway/dist/agents/learning-digest.d.ts +29 -7
  413. package/packages/gateway/dist/agents/learning-digest.d.ts.map +1 -1
  414. package/packages/gateway/dist/agents/learning-digest.js +87 -38
  415. package/packages/gateway/dist/agents/learning-digest.js.map +1 -1
  416. package/packages/gateway/dist/agents/owner-tools.d.ts.map +1 -1
  417. package/packages/gateway/dist/agents/owner-tools.js +11 -1
  418. package/packages/gateway/dist/agents/owner-tools.js.map +1 -1
  419. package/packages/gateway/dist/agents/platform-catalogue.d.ts +361 -0
  420. package/packages/gateway/dist/agents/platform-catalogue.d.ts.map +1 -0
  421. package/packages/gateway/dist/agents/platform-catalogue.js +1021 -0
  422. package/packages/gateway/dist/agents/platform-catalogue.js.map +1 -0
  423. package/packages/gateway/dist/agents/platform-names.d.ts.map +1 -1
  424. package/packages/gateway/dist/agents/platform-names.js +3 -0
  425. package/packages/gateway/dist/agents/platform-names.js.map +1 -1
  426. package/packages/gateway/dist/agents/platform.d.ts +62 -25
  427. package/packages/gateway/dist/agents/platform.d.ts.map +1 -1
  428. package/packages/gateway/dist/agents/platform.js +123 -29
  429. package/packages/gateway/dist/agents/platform.js.map +1 -1
  430. package/packages/gateway/dist/agents-cli.d.ts +1 -1
  431. package/packages/gateway/dist/agents-cli.d.ts.map +1 -1
  432. package/packages/gateway/dist/agents-cli.js +6 -0
  433. package/packages/gateway/dist/agents-cli.js.map +1 -1
  434. package/packages/gateway/dist/bootstrap.d.ts.map +1 -1
  435. package/packages/gateway/dist/bootstrap.js +13 -1
  436. package/packages/gateway/dist/bootstrap.js.map +1 -1
  437. package/packages/gateway/dist/index.d.ts +1 -0
  438. package/packages/gateway/dist/index.d.ts.map +1 -1
  439. package/packages/gateway/dist/index.js +1 -0
  440. package/packages/gateway/dist/index.js.map +1 -1
  441. package/packages/gateway/dist/missions/defaults.d.ts +0 -6
  442. package/packages/gateway/dist/missions/defaults.d.ts.map +1 -1
  443. package/packages/gateway/dist/missions/defaults.js +4 -8
  444. package/packages/gateway/dist/missions/defaults.js.map +1 -1
  445. package/packages/gateway/dist/missions/execute.d.ts +6 -0
  446. package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
  447. package/packages/gateway/dist/missions/execute.js +74 -2
  448. package/packages/gateway/dist/missions/execute.js.map +1 -1
  449. package/packages/gateway/dist/missions/reminders.d.ts +10 -0
  450. package/packages/gateway/dist/missions/reminders.d.ts.map +1 -1
  451. package/packages/gateway/dist/missions/reminders.js +86 -17
  452. package/packages/gateway/dist/missions/reminders.js.map +1 -1
  453. package/packages/gateway/dist/missions/zone-provenance.d.ts +13 -0
  454. package/packages/gateway/dist/missions/zone-provenance.d.ts.map +1 -0
  455. package/packages/gateway/dist/missions/zone-provenance.js +31 -0
  456. package/packages/gateway/dist/missions/zone-provenance.js.map +1 -0
  457. package/packages/gateway/dist/missions-cli.js +2 -2
  458. package/packages/gateway/dist/missions-cli.js.map +1 -1
  459. package/packages/gateway/dist/plugins/load.d.ts.map +1 -1
  460. package/packages/gateway/dist/plugins/load.js +12 -5
  461. package/packages/gateway/dist/plugins/load.js.map +1 -1
  462. package/packages/gateway/dist/plugins/provenance.d.ts +35 -1
  463. package/packages/gateway/dist/plugins/provenance.d.ts.map +1 -1
  464. package/packages/gateway/dist/plugins/provenance.js +39 -1
  465. package/packages/gateway/dist/plugins/provenance.js.map +1 -1
  466. package/packages/gateway/dist/serve.d.ts.map +1 -1
  467. package/packages/gateway/dist/serve.js +10 -10
  468. package/packages/gateway/dist/serve.js.map +1 -1
  469. package/packages/gateway/dist/surfaces/handoff.d.ts +62 -0
  470. package/packages/gateway/dist/surfaces/handoff.d.ts.map +1 -0
  471. package/packages/gateway/dist/surfaces/handoff.js +121 -0
  472. package/packages/gateway/dist/surfaces/handoff.js.map +1 -0
  473. package/packages/gateway/dist/surfaces/offered-actions.d.ts +2 -0
  474. package/packages/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  475. package/packages/gateway/dist/surfaces/offered-actions.js +1 -1
  476. package/packages/gateway/dist/surfaces/offered-actions.js.map +1 -1
  477. package/packages/gateway/dist/telegram/channel.d.ts +11 -1
  478. package/packages/gateway/dist/telegram/channel.d.ts.map +1 -1
  479. package/packages/gateway/dist/telegram/channel.js +13 -2
  480. package/packages/gateway/dist/telegram/channel.js.map +1 -1
  481. package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
  482. package/packages/gateway/dist/telegram/main.js +7 -1
  483. package/packages/gateway/dist/telegram/main.js.map +1 -1
  484. package/packages/gateway/dist/telegram/surface.d.ts +9 -1
  485. package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
  486. package/packages/gateway/dist/telegram/surface.js +58 -6
  487. package/packages/gateway/dist/telegram/surface.js.map +1 -1
  488. package/packages/gateway/dist/web/agent-offers.d.ts +0 -30
  489. package/packages/gateway/dist/web/agent-offers.d.ts.map +1 -1
  490. package/packages/gateway/dist/web/agent-offers.js +1 -64
  491. package/packages/gateway/dist/web/agent-offers.js.map +1 -1
  492. package/packages/gateway/dist/web/api-routes.d.ts +1 -0
  493. package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
  494. package/packages/gateway/dist/web/api-routes.js +126 -7
  495. package/packages/gateway/dist/web/api-routes.js.map +1 -1
  496. package/packages/gateway/dist/web/catalogue-source.d.ts +33 -0
  497. package/packages/gateway/dist/web/catalogue-source.d.ts.map +1 -0
  498. package/packages/gateway/dist/web/catalogue-source.js +124 -0
  499. package/packages/gateway/dist/web/catalogue-source.js.map +1 -0
  500. package/packages/gateway/dist/web/catalogue.d.ts +155 -0
  501. package/packages/gateway/dist/web/catalogue.d.ts.map +1 -0
  502. package/packages/gateway/dist/web/catalogue.js +734 -0
  503. package/packages/gateway/dist/web/catalogue.js.map +1 -0
  504. package/packages/gateway/dist/web/chat.d.ts +3 -1
  505. package/packages/gateway/dist/web/chat.d.ts.map +1 -1
  506. package/packages/gateway/dist/web/chat.js +8 -1
  507. package/packages/gateway/dist/web/chat.js.map +1 -1
  508. package/packages/gateway/dist/web/client-key.d.ts +24 -0
  509. package/packages/gateway/dist/web/client-key.d.ts.map +1 -0
  510. package/packages/gateway/dist/web/client-key.js +17 -0
  511. package/packages/gateway/dist/web/client-key.js.map +1 -0
  512. package/packages/gateway/dist/web/lock.d.ts +5 -1
  513. package/packages/gateway/dist/web/lock.d.ts.map +1 -1
  514. package/packages/gateway/dist/web/lock.js +4 -15
  515. package/packages/gateway/dist/web/lock.js.map +1 -1
  516. package/packages/gateway/dist/web/market.d.ts +1 -0
  517. package/packages/gateway/dist/web/market.d.ts.map +1 -1
  518. package/packages/gateway/dist/web/market.js +6 -0
  519. package/packages/gateway/dist/web/market.js.map +1 -1
  520. package/packages/gateway/dist/web/needs-you.d.ts +36 -0
  521. package/packages/gateway/dist/web/needs-you.d.ts.map +1 -0
  522. package/packages/gateway/dist/web/needs-you.js +65 -0
  523. package/packages/gateway/dist/web/needs-you.js.map +1 -0
  524. package/packages/gateway/dist/web/notifications.d.ts +9 -1
  525. package/packages/gateway/dist/web/notifications.d.ts.map +1 -1
  526. package/packages/gateway/dist/web/notifications.js +14 -3
  527. package/packages/gateway/dist/web/notifications.js.map +1 -1
  528. package/packages/gateway/dist/web/read.d.ts +27 -1
  529. package/packages/gateway/dist/web/read.d.ts.map +1 -1
  530. package/packages/gateway/dist/web/read.js +57 -8
  531. package/packages/gateway/dist/web/read.js.map +1 -1
  532. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  533. package/packages/gateway/dist/web/server.js +165 -13
  534. package/packages/gateway/dist/web/server.js.map +1 -1
  535. package/packages/gateway/dist/web/skills.d.ts +120 -0
  536. package/packages/gateway/dist/web/skills.d.ts.map +1 -0
  537. package/packages/gateway/dist/web/skills.js +672 -0
  538. package/packages/gateway/dist/web/skills.js.map +1 -0
  539. package/packages/gateway/dist/web/take-on.d.ts +35 -1
  540. package/packages/gateway/dist/web/take-on.d.ts.map +1 -1
  541. package/packages/gateway/dist/web/take-on.js +76 -51
  542. package/packages/gateway/dist/web/take-on.js.map +1 -1
  543. package/packages/gateway/dist/web/write.d.ts +9 -1
  544. package/packages/gateway/dist/web/write.d.ts.map +1 -1
  545. package/packages/gateway/dist/web/write.js +39 -2
  546. package/packages/gateway/dist/web/write.js.map +1 -1
  547. package/packages/gateway/package.json +0 -1
  548. package/packages/install/dist/.tsbuildinfo +1 -1
  549. package/packages/install/dist/doctor-timezone.d.ts +17 -0
  550. package/packages/install/dist/doctor-timezone.d.ts.map +1 -0
  551. package/packages/install/dist/doctor-timezone.js +34 -0
  552. package/packages/install/dist/doctor-timezone.js.map +1 -0
  553. package/packages/install/dist/launcher.d.ts.map +1 -1
  554. package/packages/install/dist/launcher.js +3 -0
  555. package/packages/install/dist/launcher.js.map +1 -1
  556. package/packages/runtime/dist/.tsbuildinfo +1 -1
  557. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  558. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  559. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  560. package/packages/tools/email/dist/needs-you.d.ts +4 -1
  561. package/packages/tools/email/dist/needs-you.d.ts.map +1 -1
  562. package/packages/tools/email/dist/needs-you.js +2 -0
  563. package/packages/tools/email/dist/needs-you.js.map +1 -1
  564. package/packages/tools/email/migrations/026_attention_filed.sql +89 -0
  565. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  566. package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
  567. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  568. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  569. package/packages/web/dist/assets/index-BldmgplG.css +1 -0
  570. package/packages/web/dist/assets/index-C8GaSH__.js +132 -0
  571. package/packages/web/dist/assets/{lottie_light-Ls7i1ATS.js → lottie_light-DdwKPR04.js} +1 -1
  572. package/packages/web/dist/build.json +1 -1
  573. package/packages/web/dist/index.html +2 -2
  574. package/packages/web/dist/precache.json +4 -4
  575. package/node_modules/@buddi/gateway/dist/agents/starter-team.d.ts +0 -59
  576. package/node_modules/@buddi/gateway/dist/agents/starter-team.d.ts.map +0 -1
  577. package/node_modules/@buddi/gateway/dist/agents/starter-team.js +0 -156
  578. package/node_modules/@buddi/gateway/dist/agents/starter-team.js.map +0 -1
  579. package/node_modules/@buddi/gateway/src/agents/starter/keeper/agent.md +0 -31
  580. package/node_modules/@buddi/gateway/src/agents/starter/keeper/skills/keeping-a-history.md +0 -22
  581. package/node_modules/@buddi/gateway/src/agents/starter/planner/agent.md +0 -30
  582. package/node_modules/@buddi/gateway/src/agents/starter/planner/skills/holding-a-follow-up.md +0 -17
  583. package/node_modules/@buddi/gateway/src/agents/starter/planner/skills/writing-the-morning-brief.md +0 -32
  584. package/node_modules/@buddi/gateway/src/agents/starter/scout/agent.md +0 -33
  585. package/node_modules/@buddi/gateway/src/agents/starter/scout/skills/answering-with-sources.md +0 -23
  586. package/node_modules/@buddi/gateway/src/agents/starter/scout/skills/the-web-is-evidence.md +0 -25
  587. package/packages/gateway/dist/agents/starter-team.d.ts +0 -59
  588. package/packages/gateway/dist/agents/starter-team.d.ts.map +0 -1
  589. package/packages/gateway/dist/agents/starter-team.js +0 -156
  590. package/packages/gateway/dist/agents/starter-team.js.map +0 -1
  591. package/packages/gateway/src/agents/starter/keeper/agent.md +0 -31
  592. package/packages/gateway/src/agents/starter/keeper/skills/keeping-a-history.md +0 -22
  593. package/packages/gateway/src/agents/starter/planner/agent.md +0 -30
  594. package/packages/gateway/src/agents/starter/planner/skills/holding-a-follow-up.md +0 -17
  595. package/packages/gateway/src/agents/starter/planner/skills/writing-the-morning-brief.md +0 -32
  596. package/packages/gateway/src/agents/starter/scout/agent.md +0 -33
  597. package/packages/gateway/src/agents/starter/scout/skills/answering-with-sources.md +0 -23
  598. package/packages/gateway/src/agents/starter/scout/skills/the-web-is-evidence.md +0 -25
  599. package/packages/web/dist/assets/index-WS4UjGsy.js +0 -129
  600. package/packages/web/dist/assets/index-Zrt_o2UG.css +0 -1
@@ -0,0 +1,734 @@
1
+ /**
2
+ * The agent catalogue's routes (agent-catalogue.md §5): the list with where
3
+ * each package stands here, what adding one would do, the install job that
4
+ * stages a missing by-buddi plugin on the way, updates, and removing an agent.
5
+ *
6
+ * The owner's click is the approval, as on the Plugins page's "Create @mail"
7
+ * (`acceptAgentRoute`): the route invokes the same gated
8
+ * `platform.install_agent` (or `platform.delete_agent`) Agent Father invokes —
9
+ * which records the action with the whole grant in its preview — and decides
10
+ * it `approved` through the card's own decide in the same request. Only the
11
+ * dashboard and `buddi agents add|update|remove` (through the same routes,
12
+ * with the owner's session) call these.
13
+ *
14
+ * A missing plugin is installed only when it is a By-buddi listing whose
15
+ * staged integrity matches exactly (first run's rule, `installListedPlugin`),
16
+ * then loaded live and waited for. A plugin that fails stops the job before
17
+ * the agent exists; its staged card waits in Settings → Plugins.
18
+ */
19
+ import { randomUUID } from 'node:crypto';
20
+ import { OWNER_AGENT_ID } from '@buddi/core';
21
+ import { addedAgents, installedAsFor, matchesPackage, CATALOGUE_OFFLINE, entryView, packageState, resolvePicks, stateContext, } from '../agents/platform-catalogue.js';
22
+ import { pluginAgentProposals, planCatalogueInstall } from '../agents/platform.js';
23
+ import { loadMarketIndex } from './market.js';
24
+ import { installListedPlugin } from './take-on.js';
25
+ async function marketPlugins(deps) {
26
+ const loaded = await loadMarketIndex({ env: deps.env, log: deps.log, now: deps.now, ...(deps.fetch ? { fetch: deps.fetch } : {}) });
27
+ return 'unavailable' in loaded ? [] : loaded.index.plugins;
28
+ }
29
+ function listingIntegrity(listing) {
30
+ const value = listing.integrity;
31
+ return typeof value === 'string' ? value.trim() : '';
32
+ }
33
+ function missingViews(missing, listings) {
34
+ return missing.map((item) => {
35
+ if (item.kind === 'need')
36
+ return item;
37
+ const listing = listings.find((l) => l.name === item.name);
38
+ return {
39
+ ...item,
40
+ title: listing?.title ?? item.name.charAt(0).toUpperCase() + item.name.slice(1),
41
+ listed: listing !== undefined,
42
+ byBuddi: listing?.trust === 'by-buddi' && listingIntegrity(listing) !== '',
43
+ ...(listing ? { version: listing.version } : {}),
44
+ };
45
+ });
46
+ }
47
+ function addable(view, missing) {
48
+ if (view.state === 'ready')
49
+ return true;
50
+ if (view.state !== 'needs')
51
+ return false;
52
+ return missing.every((m) => m.kind === 'plugin' && m.fix === 'install' && m.byBuddi);
53
+ }
54
+ /** The catalogue as the page draws it. */
55
+ export async function catalogueRoute(deps, url) {
56
+ const loaded = await deps.service.load({ refresh: url.searchParams.get('refresh') === '1' });
57
+ const fromPlugins = proposalCards(deps, 'unavailable' in loaded ? [] : loaded.packages);
58
+ if ('unavailable' in loaded) {
59
+ return { status: 200, body: { agents: [], fromPlugins, delisted: [], unavailable: CATALOGUE_OFFLINE, detail: loaded.unavailable } };
60
+ }
61
+ const state = await stateContext(deps.registry, deps.service, deps.binding);
62
+ const listings = loaded.packages.some((p) => Object.keys(p.manifest.requires).length > 0) ? await marketPlugins(deps) : [];
63
+ const agents = loaded.packages.map((pkg) => {
64
+ const view = entryView(pkg, packageState(pkg, state), deps.ctx.timezone);
65
+ const missing = missingViews(view.missing ?? [], listings);
66
+ const { missing: _missing, skills: _skills, ...rest } = view;
67
+ return {
68
+ ...rest,
69
+ skills: pkg.skills.map((skill) => ({ name: skill.name, description: skill.description, text: skill.body })),
70
+ ...(view.missing ? { missing } : {}),
71
+ addable: addable(view, missing),
72
+ };
73
+ });
74
+ const listed = new Set(loaded.packages.map((p) => p.manifest.name));
75
+ const delisted = state.added
76
+ .filter((a) => a.provenance.source === 'market' && a.provenance.package !== undefined && !listed.has(a.provenance.package))
77
+ .map((a) => ({
78
+ agentId: a.agentId,
79
+ handle: state.handleOf(a.agentId),
80
+ name: deps.binding.catalog.get(a.agentId)?.name ?? a.agentId,
81
+ package: a.provenance.package,
82
+ version: a.provenance.version,
83
+ }));
84
+ return {
85
+ status: 200,
86
+ body: {
87
+ fetchedAt: loaded.fetchedAt,
88
+ ...(loaded.stale ? { stale: true } : {}),
89
+ agents,
90
+ fromPlugins,
91
+ delisted,
92
+ // "Uses your mailbox" on a card that reads mail, said only when one is connected.
93
+ mailbox: state.needs.mailbox === true,
94
+ ...(loaded.problems.length > 0 ? { problems: loaded.problems } : {}),
95
+ },
96
+ };
97
+ }
98
+ /** Agents an installed plugin proposes, shown "from <plugin>" (Mail Triage, third-party advisors). */
99
+ function proposalCards(deps, packages) {
100
+ return pluginAgentProposals(deps.registry)
101
+ .filter(({ plugin, agent }) => !packages.some((p) => p.manifest.replaces.includes(`${plugin}/${agent.id}`)))
102
+ .map(({ plugin, pluginVersion, agent }) => ({
103
+ plugin,
104
+ pluginVersion,
105
+ agent: agent.id,
106
+ handle: agent.handle,
107
+ name: agent.name,
108
+ description: agent.description,
109
+ text: agent.offer?.text ?? agent.description,
110
+ state: deps.binding.catalog.get(agent.id) ? 'installed' : 'ready',
111
+ }));
112
+ }
113
+ /**
114
+ * Every agent on disk that came from the catalogue (or that a package replaces),
115
+ * with its drift against the kept copy of the list. Never fetches: an agent's
116
+ * page asks on every load, and without a copy only what the sidecar knows is said.
117
+ */
118
+ export async function agentsCatalogue(deps) {
119
+ const added = addedAgents(deps.binding.agentsDir);
120
+ if (added.length === 0)
121
+ return {};
122
+ const loaded = await deps.service.load({ cachedOnly: true }).catch(() => ({ unavailable: 'unreadable' }));
123
+ const packages = 'unavailable' in loaded ? null : loaded.packages;
124
+ const handleOf = (id) => deps.binding.catalog.get(id)?.handle ?? id;
125
+ const out = {};
126
+ for (const a of added) {
127
+ if (a.provenance.source === 'market' && a.provenance.package !== undefined) {
128
+ const pkg = packages?.find((p) => p.manifest.name === a.provenance.package);
129
+ const name = a.provenance.package;
130
+ out[a.agentId] = {
131
+ source: 'market',
132
+ package: name,
133
+ title: pkg?.manifest.title ?? name.charAt(0).toUpperCase() + name.slice(1).replace(/-/g, ' '),
134
+ version: a.provenance.version,
135
+ latest: pkg?.manifest.version ?? null,
136
+ drift: pkg ? (installedAsFor(pkg, [a], handleOf)?.drift ?? 'current') : a.edited ? 'edited' : 'current',
137
+ delisted: packages !== null && pkg === undefined,
138
+ };
139
+ continue;
140
+ }
141
+ const pkg = packages?.find((p) => matchesPackage(p, a) === 'replaces');
142
+ const as = pkg ? installedAsFor(pkg, [a], handleOf) : undefined;
143
+ if (!pkg || !as)
144
+ continue;
145
+ out[a.agentId] = {
146
+ source: 'market',
147
+ package: pkg.manifest.name,
148
+ title: pkg.manifest.title,
149
+ version: a.provenance.version,
150
+ latest: pkg.manifest.version,
151
+ drift: as.drift,
152
+ delisted: false,
153
+ ...(as.via ? { via: as.via } : {}),
154
+ };
155
+ }
156
+ return out;
157
+ }
158
+ async function findListed(deps, name) {
159
+ const loaded = await deps.service.load();
160
+ if ('unavailable' in loaded)
161
+ return { reply: { status: 503, body: { error: CATALOGUE_OFFLINE, detail: loaded.unavailable } } };
162
+ const pkg = loaded.packages.find((p) => p.manifest.name === name);
163
+ if (!pkg) {
164
+ const refused = loaded.problems.find((p) => p.startsWith(`${name}:`));
165
+ return { reply: { status: refused ? 422 : 404, body: { error: refused ?? `The catalogue lists no agent "${name}".` } } };
166
+ }
167
+ return { pkg };
168
+ }
169
+ function refusalReply(err) {
170
+ const code = err?.code;
171
+ if (err instanceof Error && (err.name === 'PlatformRefusal' || typeof code === 'string')) {
172
+ const status = code === 'already-added' || code === 'owner-edited' || code === 'up-to-date' || code === 'version-moved' || code === 'plan-moved'
173
+ ? 409
174
+ : code === 'offline'
175
+ ? 503
176
+ : 400;
177
+ return { status, body: { error: err.message, ...(typeof code === 'string' ? { code } : {}) } };
178
+ }
179
+ throw err;
180
+ }
181
+ function stringRecord(value) {
182
+ if (value === undefined || value === null)
183
+ return undefined;
184
+ if (typeof value !== 'object' || Array.isArray(value))
185
+ throw new TypeError('`fills` is an object of pick id to answer');
186
+ const out = {};
187
+ for (const [k, v] of Object.entries(value)) {
188
+ if (typeof v !== 'string')
189
+ throw new TypeError(`the answer to "${k}" must be text`);
190
+ out[k] = v;
191
+ }
192
+ return out;
193
+ }
194
+ function stringList(value, field) {
195
+ if (value === undefined || value === null)
196
+ return undefined;
197
+ if (!Array.isArray(value) || value.some((v) => typeof v !== 'string'))
198
+ throw new TypeError(`\`${field}\` is a list of ids`);
199
+ return value;
200
+ }
201
+ function optionalString(value, field) {
202
+ if (value === undefined || value === null || value === '')
203
+ return undefined;
204
+ if (typeof value !== 'string')
205
+ throw new TypeError(`\`${field}\` must be text`);
206
+ return value;
207
+ }
208
+ /** The package's handle, or the first free one beside it (chef-2), as the install will pick. */
209
+ function freeHandle(deps, base) {
210
+ const taken = new Set(deps.binding.catalog.list().map((a) => a.handle.toLowerCase()));
211
+ if (!taken.has(base))
212
+ return base;
213
+ for (let n = 2; n < 100; n += 1)
214
+ if (!taken.has(`${base}-${n}`))
215
+ return `${base}-${n}`;
216
+ return base;
217
+ }
218
+ /** The tools of a grant, each with its tier and first line, as the sheet lists them. */
219
+ function toolRows(registry, names) {
220
+ const specs = new Map(registry.list().map((t) => [t.name, t]));
221
+ return names.map((name) => {
222
+ const spec = specs.get(name);
223
+ return { name, tier: spec?.tier ?? 'unknown', description: (spec?.description ?? '').split(/(?<=\.)\s/)[0] ?? '' };
224
+ });
225
+ }
226
+ function choicesFor(kind, choices) {
227
+ if (kind === 'mailbox')
228
+ return choices.mailboxes;
229
+ if (kind === 'calendar')
230
+ return choices.calendars;
231
+ if (kind === 'place')
232
+ return choices.places.map((p) => p.label);
233
+ return undefined;
234
+ }
235
+ function missionView(envelope) {
236
+ return envelope.missions.map((m) => ({ id: m.slug, name: m.name, cron: m.cron, enabled: m.enabled, prompt: m.prompt }));
237
+ }
238
+ /**
239
+ * `POST /api/catalogue/:name/plan` — what adding it would do, writing nothing:
240
+ * the plugins it installs on the way, the picks with their defaults and
241
+ * choices, the handle (a free one beside the package's when that is taken),
242
+ * the tools with their tiers, the missions, and the approval's preview.
243
+ */
244
+ export async function planRoute(deps, name, body) {
245
+ const found = await findListed(deps, name);
246
+ if ('reply' in found)
247
+ return found.reply;
248
+ const { pkg } = found;
249
+ let fills;
250
+ let missionsOn;
251
+ let handle;
252
+ try {
253
+ fills = stringRecord(body.fills);
254
+ missionsOn = stringList(body.missionsOn, 'missionsOn');
255
+ handle = optionalString(body.handle, 'handle');
256
+ }
257
+ catch (err) {
258
+ return { status: 400, body: { error: err.message } };
259
+ }
260
+ const state = packageState(pkg, await stateContext(deps.registry, deps.service, deps.binding));
261
+ if (state.state === 'installed') {
262
+ return { status: 409, body: { error: `${pkg.manifest.title} is already on the team as @${state.installed.handle}.`, installed: state.installed } };
263
+ }
264
+ if (state.state === 'unavailable')
265
+ return { status: 409, body: { error: state.reason } };
266
+ const listings = await marketPlugins(deps);
267
+ const missing = missingViews(state.state === 'needs' ? state.missing : [], listings);
268
+ const blocking = missing.filter((m) => !(m.kind === 'plugin' && m.fix === 'install' && m.byBuddi));
269
+ const choices = await deps.service.choices();
270
+ const plugins = missing.filter((m) => m.kind === 'plugin');
271
+ const base = {
272
+ name: pkg.manifest.name,
273
+ version: pkg.manifest.version,
274
+ title: pkg.manifest.title,
275
+ plugins: plugins.map((p) => ({ name: p.name, title: p.title, version: p.version ?? null, byBuddi: p.byBuddi, fix: p.fix })),
276
+ blocked: blocking,
277
+ };
278
+ if (plugins.length > 0 || blocking.length > 0) {
279
+ // The grant cannot be resolved until its plugins load: the sheet shows the
280
+ // package's own list (inside its integrity; the listing's `claims` are not),
281
+ // and the install job asks again when what resolves is not exactly that.
282
+ let picks;
283
+ try {
284
+ picks = resolvePicks(pkg, fills, choices);
285
+ }
286
+ catch (err) {
287
+ return refusalReply(err);
288
+ }
289
+ return {
290
+ status: 200,
291
+ body: {
292
+ ...base,
293
+ handle: handle ?? freeHandle(deps, pkg.manifest.handle),
294
+ fills: pkg.manifest.fills.map((f) => ({ ...f, value: picks.find((p) => p.id === f.id)?.value ?? '', choices: choicesFor(f.kind, choices) })),
295
+ tools: toolRows(deps.registry, pkg.manifest.tools),
296
+ missions: pkg.manifest.missions.map((m) => ({ id: m.id, name: m.name, cron: m.cron, enabled: (missionsOn ?? []).includes(m.id), prompt: m.prompt })),
297
+ preview: null,
298
+ note: blocking.length > 0
299
+ ? 'Something it needs is not here yet; see `blocked`.'
300
+ : `The approval is shown once ${plugins.map((p) => p.title).join(' and ')} ${plugins.length === 1 ? 'is' : 'are'} installed, before ${pkg.manifest.title} is added.`,
301
+ },
302
+ };
303
+ }
304
+ try {
305
+ const { envelope, preview, plan } = await planCatalogueInstall(deps.registry, { name: pkg.manifest.name, version: pkg.manifest.version, ...(fills ? { fills } : {}), ...(missionsOn ? { missionsOn } : {}), ...(handle ? { handle } : {}) }, { timezone: deps.ctx.timezone, db: deps.ctx.db, agentId: OWNER_AGENT_ID });
306
+ return {
307
+ status: 200,
308
+ body: {
309
+ ...base,
310
+ plan,
311
+ id: envelope.id,
312
+ handle: envelope.handle,
313
+ fills: pkg.manifest.fills.map((f) => ({ ...f, value: envelope.picks.find((p) => p.id === f.id)?.value ?? '', choices: choicesFor(f.kind, choices) })),
314
+ tools: toolRows(deps.registry, envelope.tools),
315
+ missions: missionView(envelope),
316
+ account: envelope.account,
317
+ preview,
318
+ },
319
+ };
320
+ }
321
+ catch (err) {
322
+ return refusalReply(err);
323
+ }
324
+ }
325
+ const JOBS = new Map();
326
+ /** How many finished jobs are kept to be asked about; a job in flight is never forgotten. */
327
+ const KEPT_FINISHED = 20;
328
+ /** For tests: forget the jobs. */
329
+ export function resetCatalogueJobs() {
330
+ JOBS.clear();
331
+ }
332
+ function inFlight(job) {
333
+ return job.state === 'running' || job.state === 'confirm';
334
+ }
335
+ /** For tests: wait until a job has finished, or stopped to ask. */
336
+ export async function catalogueJobSettled(id, timeoutMs = 30_000) {
337
+ const until = Date.now() + timeoutMs;
338
+ while (Date.now() < until) {
339
+ const job = JOBS.get(id);
340
+ if (!job || job.state !== 'running')
341
+ return job;
342
+ await new Promise((resolve) => setTimeout(resolve, 10));
343
+ }
344
+ return JOBS.get(id);
345
+ }
346
+ function remember(job) {
347
+ JOBS.set(job.id, job);
348
+ const finished = [...JOBS.values()].filter((j) => !inFlight(j));
349
+ for (const old of finished.slice(0, Math.max(0, finished.length - KEPT_FINISHED)))
350
+ JOBS.delete(old.id);
351
+ }
352
+ /** `GET /api/catalogue/jobs/:id`. */
353
+ export function jobRoute(id) {
354
+ const job = JOBS.get(id);
355
+ return job ? { status: 200, body: job } : { status: 404, body: { error: 'No such job; buddi may have restarted.' } };
356
+ }
357
+ /**
358
+ * `POST /api/catalogue/:name/install` `{ version, fills, handle, missionsOn, plan?, tools? }`
359
+ * — answers 202 with the job at once; `GET /api/catalogue/jobs/:id` gives its
360
+ * progress. `plan` is the fingerprint the plan route gave for the same picks;
361
+ * `tools` the grant the sheet listed. The click approves the agent only when
362
+ * one of them is exactly what resolves; otherwise the job stops at `confirm`.
363
+ */
364
+ export async function installRoute(deps, name, body) {
365
+ const found = await findListed(deps, name);
366
+ if ('reply' in found)
367
+ return found.reply;
368
+ const { pkg } = found;
369
+ let input;
370
+ let shown;
371
+ try {
372
+ const fills = stringRecord(body.fills);
373
+ const missionsOn = stringList(body.missionsOn, 'missionsOn');
374
+ const handle = optionalString(body.handle, 'handle');
375
+ const account = optionalString(body.account, 'account');
376
+ const version = optionalString(body.version, 'version');
377
+ const plan = optionalString(body.plan, 'plan');
378
+ shown = stringList(body.tools, 'tools');
379
+ input = {
380
+ ...(fills ? { fills } : {}),
381
+ ...(missionsOn ? { missionsOn } : {}),
382
+ ...(handle ? { handle } : {}),
383
+ ...(account ? { account } : {}),
384
+ ...(version ? { version } : {}),
385
+ ...(plan ? { plan } : {}),
386
+ };
387
+ }
388
+ catch (err) {
389
+ return { status: 400, body: { error: err.message } };
390
+ }
391
+ if (input.version !== undefined && input.version !== pkg.manifest.version) {
392
+ return { status: 409, body: { error: `The catalogue now lists ${pkg.manifest.title} ${pkg.manifest.version}; look at it again before adding it.`, version: pkg.manifest.version } };
393
+ }
394
+ // The check and the reservation happen with no await between them, so two
395
+ // clicks at once make one job, never two racing to stage the same plugin.
396
+ const running = [...JOBS.values()].find((j) => j.name === name && inFlight(j));
397
+ if (running)
398
+ return { status: 202, body: { jobId: running.id } };
399
+ const agentStep = { kind: 'agent', name, title: pkg.manifest.title, state: 'waiting' };
400
+ const job = {
401
+ id: randomUUID(),
402
+ name,
403
+ version: pkg.manifest.version,
404
+ title: pkg.manifest.title,
405
+ state: 'running',
406
+ steps: [agentStep],
407
+ startedAt: new Date().toISOString(),
408
+ };
409
+ remember(job);
410
+ const refused = (reply) => {
411
+ finish(job, 'failed', String(reply.body.error ?? 'It could not start'));
412
+ return reply;
413
+ };
414
+ let listings;
415
+ let plugins;
416
+ try {
417
+ const state = packageState(pkg, await stateContext(deps.registry, deps.service, deps.binding));
418
+ if (state.state === 'installed') {
419
+ return refused({ status: 409, body: { error: `${pkg.manifest.title} is already on the team as @${state.installed.handle}.`, installed: state.installed } });
420
+ }
421
+ if (state.state === 'unavailable')
422
+ return refused({ status: 409, body: { error: state.reason } });
423
+ listings = await marketPlugins(deps);
424
+ const missing = missingViews(state.state === 'needs' ? state.missing : [], listings);
425
+ const blocking = missing.filter((m) => !(m.kind === 'plugin' && m.fix === 'install' && m.byBuddi));
426
+ if (blocking.length > 0) {
427
+ const words = blocking.map((m) => m.kind === 'need'
428
+ ? m.name === 'mailbox' ? 'a mailbox (Settings → Email)' : 'an account that draws (Settings → Model accounts)'
429
+ : m.fix === 'enable' ? `${m.title} turned on (Settings → Plugins)`
430
+ : m.fix === 'update' ? `${m.title} ${m.range} (Settings → Plugins → Update)`
431
+ : `${m.title}, which is not made by buddi, so it waits for you to install it in Settings → Plugins`);
432
+ return refused({ status: 409, body: { error: `${pkg.manifest.title} needs ${words.join(' and ')} first.`, blocked: blocking } });
433
+ }
434
+ plugins = missing.filter((m) => m.kind === 'plugin');
435
+ }
436
+ catch (err) {
437
+ finish(job, 'failed', err instanceof Error ? err.message : String(err));
438
+ throw err;
439
+ }
440
+ job.steps = [...plugins.map((p) => ({ kind: 'plugin', name: p.name, title: p.title, state: 'waiting' })), agentStep];
441
+ void runJob(deps, job, pkg, input, shown, listings).catch((err) => {
442
+ finish(job, 'failed', err instanceof Error ? err.message : String(err));
443
+ deps.log(`catalogue: adding ${name} failed: ${job.error}`);
444
+ });
445
+ return { status: 202, body: { jobId: job.id } };
446
+ }
447
+ function finish(job, state, error) {
448
+ job.state = state;
449
+ if (error !== undefined)
450
+ job.error = error.replace(/[.\s]+$/, '');
451
+ job.finishedAt = new Date().toISOString();
452
+ }
453
+ async function waitForPlugin(deps, name) {
454
+ const until = Date.now() + (deps.loadWaitMs ?? 60_000);
455
+ for (;;) {
456
+ if (deps.registry.manifests().some((m) => m.name === name))
457
+ return true;
458
+ if (Date.now() >= until)
459
+ return false;
460
+ await new Promise((resolve) => setTimeout(resolve, 250));
461
+ }
462
+ }
463
+ function sameSet(a, b) {
464
+ const left = [...new Set(a)].sort();
465
+ const right = [...new Set(b)].sort();
466
+ return left.length === right.length && left.every((v, i) => v === right[i]);
467
+ }
468
+ async function runJob(deps, job, pkg, input, shown, listings) {
469
+ for (const step of job.steps) {
470
+ if (step.kind !== 'plugin')
471
+ continue;
472
+ const listing = listings.find((l) => l.name === step.name);
473
+ const outcome = await installListedPlugin({ pool: deps.pool, env: deps.env, log: deps.log, engine: deps.engine, registry: deps.liveRegistry }, listing, { keepMismatch: true, onState: (state) => { step.state = state; } });
474
+ if (!outcome.ok) {
475
+ step.state = 'failed';
476
+ step.reason = outcome.reason;
477
+ finish(job, 'failed', `${step.title} was not installed: ${outcome.reason}. ${pkg.manifest.title} was not added`);
478
+ return;
479
+ }
480
+ step.state = 'loading';
481
+ if (!(await waitForPlugin(deps, step.name))) {
482
+ step.state = 'failed';
483
+ step.reason = 'installed, but it did not load; it wakes up on the next restart';
484
+ finish(job, 'failed', `${step.title} is installed but did not load, so ${pkg.manifest.title} was not added. Restart buddi, then add it again`);
485
+ return;
486
+ }
487
+ step.state = 'done';
488
+ }
489
+ const agentStep = job.steps[job.steps.length - 1];
490
+ agentStep.state = 'adding';
491
+ const { plan: shownPlan, ...rest } = input;
492
+ const base = { name: pkg.manifest.name, version: pkg.manifest.version, ...rest };
493
+ const fail = (message) => {
494
+ agentStep.state = 'failed';
495
+ agentStep.reason = message;
496
+ finish(job, 'failed', message);
497
+ };
498
+ // What adding it does now its plugins are here. The approval is bound to
499
+ // exactly this (`plan`), and the click approves it only when the owner saw
500
+ // it: the same plan, the same grant tool for tool, or the package's own list
501
+ // (inside its integrity, resolved against plugins staged on their exact
502
+ // integrity). Never the listing's `claims`, which no integrity covers.
503
+ let planned;
504
+ try {
505
+ planned = await planCatalogueInstall(deps.registry, base, { timezone: deps.ctx.timezone, db: deps.ctx.db, agentId: OWNER_AGENT_ID });
506
+ }
507
+ catch (err) {
508
+ fail(err instanceof Error ? err.message : String(err));
509
+ return;
510
+ }
511
+ if (shownPlan !== undefined && shownPlan !== planned.plan) {
512
+ fail(`What adding ${pkg.manifest.title} would do changed since it was shown. Look at it again before you add it`);
513
+ return;
514
+ }
515
+ const seen = shownPlan !== undefined ||
516
+ (shown !== undefined && (sameSet(shown, planned.envelope.tools) || sameSet(shown, pkg.manifest.tools)));
517
+ const result = await deps.registry.invoke('platform.install_agent', { ...base, plan: planned.plan }, { ...deps.ctx, agentId: OWNER_AGENT_ID, now: deps.now });
518
+ if (!result.ok && result.reason !== 'approval-required') {
519
+ fail(result.message);
520
+ return;
521
+ }
522
+ if (!result.ok) {
523
+ job.approvalId = result.actionId;
524
+ if (!seen) {
525
+ // The listing showed one grant and the plugins resolved another: the
526
+ // owner's click was not for this one. Ask, with the grant as it is.
527
+ const unshown = planned.envelope.tools.filter((t) => !(shown ?? []).includes(t));
528
+ job.confirm = { tools: toolRows(deps.registry, planned.envelope.tools), unshown, preview: planned.preview };
529
+ agentStep.state = 'confirm';
530
+ job.state = 'confirm';
531
+ return;
532
+ }
533
+ await approveJob(deps, job, pkg, input.handle);
534
+ return;
535
+ }
536
+ settleAdded(deps, job, pkg, input.handle);
537
+ }
538
+ /** Decide the job's approval as the owner and finish the job from what it did. */
539
+ async function approveJob(deps, job, pkg, handle) {
540
+ const agentStep = job.steps[job.steps.length - 1];
541
+ const decided = await deps.approve(job.approvalId);
542
+ if (!decided.ok) {
543
+ // Approved meanwhile in Needs you: the agent is there.
544
+ if (addedAgents(deps.binding.agentsDir).some((a) => a.provenance.source === 'market' && a.provenance.package === pkg.manifest.name)) {
545
+ settleAdded(deps, job, pkg, handle);
546
+ return;
547
+ }
548
+ agentStep.state = 'failed';
549
+ agentStep.reason = decided.body.error;
550
+ finish(job, 'failed', decided.body.error);
551
+ return;
552
+ }
553
+ const execution = decided.body.execution;
554
+ if (execution && execution.state !== 'succeeded') {
555
+ agentStep.state = 'failed';
556
+ agentStep.reason = execution.message ?? execution.state;
557
+ finish(job, 'failed', execution.message ?? `Adding ${pkg.manifest.title} did not finish (${execution.state})`);
558
+ return;
559
+ }
560
+ settleAdded(deps, job, pkg, handle);
561
+ }
562
+ function settleAdded(deps, job, pkg, handle) {
563
+ const agentStep = job.steps[job.steps.length - 1];
564
+ const added = addedAgents(deps.binding.agentsDir).find((a) => a.provenance.source === 'market' && a.provenance.package === pkg.manifest.name);
565
+ const agent = added ? deps.binding.catalog.get(added.agentId) : undefined;
566
+ job.agent = agent
567
+ ? { id: agent.id, handle: agent.handle, name: agent.name }
568
+ : { id: added?.agentId ?? pkg.manifest.name, handle: handle ?? pkg.manifest.handle, name: pkg.manifest.title };
569
+ agentStep.state = 'done';
570
+ delete job.confirm;
571
+ finish(job, 'done');
572
+ }
573
+ /**
574
+ * `POST /api/catalogue/jobs/:id/confirm` `{ approve: boolean }` — the owner's
575
+ * answer to a job stopped at `confirm`: yes approves the agent with the grant
576
+ * the job showed; no rejects the approval and ends the job. Its plugins stay.
577
+ */
578
+ export async function confirmJobRoute(deps, id, body) {
579
+ const job = JOBS.get(id);
580
+ if (!job)
581
+ return { status: 404, body: { error: 'No such job; buddi may have restarted.' } };
582
+ if (job.state !== 'confirm' || !job.approvalId)
583
+ return { status: 409, body: { error: 'This job is not waiting for you.', job } };
584
+ if (typeof body.approve !== 'boolean')
585
+ return { status: 400, body: { error: '`approve` is true or false.' } };
586
+ const found = await findListed(deps, job.name);
587
+ if ('reply' in found)
588
+ return found.reply;
589
+ if (job.state !== 'confirm')
590
+ return { status: 409, body: { error: 'This job is not waiting for you.', job } };
591
+ const agentStep = job.steps[job.steps.length - 1];
592
+ if (!body.approve) {
593
+ if (deps.reject)
594
+ await deps.reject(job.approvalId).catch(() => undefined);
595
+ agentStep.state = 'failed';
596
+ agentStep.reason = 'you said no';
597
+ delete job.confirm;
598
+ finish(job, 'failed', `${job.title} was not added`);
599
+ return { status: 200, body: job };
600
+ }
601
+ job.state = 'running';
602
+ agentStep.state = 'adding';
603
+ delete job.confirm;
604
+ await approveJob(deps, job, found.pkg, undefined);
605
+ return { status: 200, body: job };
606
+ }
607
+ /* ------------------------------------------------------------------ *
608
+ * Updates and removal
609
+ * ------------------------------------------------------------------ */
610
+ /**
611
+ * `POST /api/catalogue/:name/update/plan` `{ agentId }` — the update sheet:
612
+ * the version and `changes`, the persona diff, tools added and removed,
613
+ * missions added, and whether the owner edited the file (then only "See what
614
+ * changed" and "Replace my changes" are offered).
615
+ */
616
+ export async function updatePlanRoute(deps, name, body) {
617
+ const agentId = typeof body.agentId === 'string' ? body.agentId : '';
618
+ if (agentId === '')
619
+ return { status: 400, body: { error: '`agentId` names the agent to update.' } };
620
+ try {
621
+ const { envelope, preview, plan } = await planCatalogueInstall(deps.registry,
622
+ // A read: built as if replacing, so an edited file's diff shows too.
623
+ { name, agent: agentId, replaceEdits: true }, { timezone: deps.ctx.timezone, db: deps.ctx.db, agentId: OWNER_AGENT_ID });
624
+ const u = envelope.update;
625
+ return {
626
+ status: 200,
627
+ body: {
628
+ plan,
629
+ agentId: envelope.id,
630
+ handle: envelope.handle,
631
+ name,
632
+ title: envelope.package.title,
633
+ fromVersion: u.fromVersion,
634
+ version: envelope.package.version,
635
+ changes: envelope.package.changes,
636
+ via: u.via,
637
+ edited: u.edited,
638
+ replacesOwn: u.replacesOwn,
639
+ retires: u.retires,
640
+ widened: u.widened,
641
+ added: toolRows(deps.registry, u.added),
642
+ removed: u.removed,
643
+ personaDiff: u.personaDiff,
644
+ missionsAdded: missionView(envelope),
645
+ preview,
646
+ },
647
+ };
648
+ }
649
+ catch (err) {
650
+ return refusalReply(err);
651
+ }
652
+ }
653
+ /** Invoke a gated platform tool as the owner and approve it with the same click. */
654
+ async function invokeApproved(deps, tool, args) {
655
+ const result = await deps.registry.invoke(tool, args, { ...deps.ctx, agentId: OWNER_AGENT_ID, now: deps.now });
656
+ if (result.ok)
657
+ return { ok: true, approvalId: null, result: result.output };
658
+ if (result.reason !== 'approval-required') {
659
+ const status = result.reason === 'unknown-tool' ? 404 : 400;
660
+ return { ok: false, reply: { status, body: { error: result.message } } };
661
+ }
662
+ const decided = await deps.approve(result.actionId);
663
+ if (!decided.ok)
664
+ return { ok: false, reply: { status: decided.status, body: { error: decided.body.error, approvalId: result.actionId } } };
665
+ const execution = decided.body.execution;
666
+ if (execution && execution.state !== 'succeeded') {
667
+ return { ok: false, reply: { status: 409, body: { error: execution.message ?? `It did not finish (${execution.state}).`, approvalId: result.actionId } } };
668
+ }
669
+ return { ok: true, approvalId: result.actionId, result: execution?.result ?? null };
670
+ }
671
+ /**
672
+ * `POST /api/catalogue/:name/update` `{ agentId, plan, replace? }` — the
673
+ * owner's click on Update (or "Replace my changes", with `replace: true`) is
674
+ * the approval, of the plan `update/plan` showed: `plan` is its fingerprint,
675
+ * and anything it covers that moved since (the package, the grant, the file
676
+ * or a skill on disk) answers 409, untouched. An edited file without
677
+ * `replace` is refused, untouched.
678
+ */
679
+ export async function updateRoute(deps, name, body) {
680
+ const agentId = typeof body.agentId === 'string' ? body.agentId : '';
681
+ if (agentId === '')
682
+ return { status: 400, body: { error: '`agentId` names the agent to update.' } };
683
+ const plan = typeof body.plan === 'string' ? body.plan : '';
684
+ if (plan === '')
685
+ return { status: 400, body: { error: '`plan` is the fingerprint `update/plan` answered: the update approves what was shown.' } };
686
+ const input = { name, agent: agentId, plan, ...(body.replace === true ? { replaceEdits: true } : {}) };
687
+ // Checked first for its typed refusal (an edited file, nothing to update): the card's would be a sentence only.
688
+ try {
689
+ await planCatalogueInstall(deps.registry, input, { timezone: deps.ctx.timezone, db: deps.ctx.db, agentId: OWNER_AGENT_ID });
690
+ }
691
+ catch (err) {
692
+ return refusalReply(err);
693
+ }
694
+ const done = await invokeApproved(deps, 'platform.install_agent', input);
695
+ if (!done.ok)
696
+ return done.reply;
697
+ return { status: 200, body: { approvalId: done.approvalId, result: done.result } };
698
+ }
699
+ /**
700
+ * `GET /api/agents/:id/remove` — what removing it does: the preview
701
+ * `platform.delete_agent` carries (its missions paused, the plugins no other
702
+ * agent uses named). Nothing changes.
703
+ */
704
+ export async function removePreviewRoute(deps, agentId) {
705
+ const tool = deps.registry.lookup('platform.delete_agent');
706
+ if (!tool?.describe)
707
+ return { status: 404, body: { error: 'Removing agents is not available here.' } };
708
+ try {
709
+ const described = await tool.describe({ id: agentId }, { ...deps.ctx, agentId: OWNER_AGENT_ID, now: deps.now });
710
+ const envelope = described.envelope;
711
+ return {
712
+ status: 200,
713
+ body: {
714
+ id: envelope.id,
715
+ handle: envelope.handle,
716
+ name: envelope.name,
717
+ pausesMissions: envelope.pausesMissions ?? [],
718
+ unusedPlugins: envelope.unusedPlugins ?? [],
719
+ preview: described.preview,
720
+ },
721
+ };
722
+ }
723
+ catch (err) {
724
+ return { status: 400, body: { error: err instanceof Error ? err.message : String(err) } };
725
+ }
726
+ }
727
+ /** `POST /api/agents/:id/remove` — Remove from team: the click is the approval. The directory goes to the trash. */
728
+ export async function removeRoute(deps, agentId) {
729
+ const done = await invokeApproved(deps, 'platform.delete_agent', { id: agentId });
730
+ if (!done.ok)
731
+ return done.reply;
732
+ return { status: 200, body: { approvalId: done.approvalId, result: done.result } };
733
+ }
734
+ //# sourceMappingURL=catalogue.js.map