@withbuddi/buddi 0.1.0-pre.23 → 0.1.0-pre.25

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 (578) hide show
  1. package/README.md +66 -50
  2. package/extension/background.js +24 -1
  3. package/extension/blob.png +0 -0
  4. package/extension/fonts/dm-mono-latin-400-normal.woff2 +0 -0
  5. package/extension/fonts/dm-mono-latin-500-normal.woff2 +0 -0
  6. package/extension/fonts/dm-sans-latin-ext-standard-normal.woff2 +0 -0
  7. package/extension/fonts/dm-sans-latin-standard-normal.woff2 +0 -0
  8. package/extension/icons/128.png +0 -0
  9. package/extension/icons/16.png +0 -0
  10. package/extension/icons/32.png +0 -0
  11. package/extension/icons/48.png +0 -0
  12. package/extension/manifest.json +4 -3
  13. package/extension/popup.css +199 -81
  14. package/extension/popup.html +39 -17
  15. package/extension/popup.js +133 -37
  16. package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
  17. package/node_modules/@buddi/cli/dist/args.d.ts +59 -0
  18. package/node_modules/@buddi/cli/dist/args.d.ts.map +1 -1
  19. package/node_modules/@buddi/cli/dist/args.js +141 -0
  20. package/node_modules/@buddi/cli/dist/args.js.map +1 -1
  21. package/node_modules/@buddi/cli/dist/commands.d.ts +2 -0
  22. package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -1
  23. package/node_modules/@buddi/cli/dist/commands.js +83 -3
  24. package/node_modules/@buddi/cli/dist/commands.js.map +1 -1
  25. package/node_modules/@buddi/cli/dist/connections-cmd.d.ts +93 -0
  26. package/node_modules/@buddi/cli/dist/connections-cmd.d.ts.map +1 -0
  27. package/node_modules/@buddi/cli/dist/connections-cmd.js +657 -0
  28. package/node_modules/@buddi/cli/dist/connections-cmd.js.map +1 -0
  29. package/node_modules/@buddi/cli/dist/doctor-probes.d.ts.map +1 -1
  30. package/node_modules/@buddi/cli/dist/doctor-probes.js +53 -9
  31. package/node_modules/@buddi/cli/dist/doctor-probes.js.map +1 -1
  32. package/node_modules/@buddi/cli/dist/doctor.d.ts +1 -8
  33. package/node_modules/@buddi/cli/dist/doctor.d.ts.map +1 -1
  34. package/node_modules/@buddi/cli/dist/doctor.js +1 -15
  35. package/node_modules/@buddi/cli/dist/doctor.js.map +1 -1
  36. package/node_modules/@buddi/cli/dist/init-plan.d.ts +1 -2
  37. package/node_modules/@buddi/cli/dist/init-plan.d.ts.map +1 -1
  38. package/node_modules/@buddi/cli/dist/init-plan.js +2 -6
  39. package/node_modules/@buddi/cli/dist/init-plan.js.map +1 -1
  40. package/node_modules/@buddi/cli/dist/init.d.ts.map +1 -1
  41. package/node_modules/@buddi/cli/dist/init.js +5 -29
  42. package/node_modules/@buddi/cli/dist/init.js.map +1 -1
  43. package/node_modules/@buddi/cli/dist/main.d.ts.map +1 -1
  44. package/node_modules/@buddi/cli/dist/main.js +12 -2
  45. package/node_modules/@buddi/cli/dist/main.js.map +1 -1
  46. package/node_modules/@buddi/cli/dist/mcp/gateway-client.d.ts +5 -0
  47. package/node_modules/@buddi/cli/dist/mcp/gateway-client.d.ts.map +1 -1
  48. package/node_modules/@buddi/cli/dist/mcp/gateway-client.js +15 -4
  49. package/node_modules/@buddi/cli/dist/mcp/gateway-client.js.map +1 -1
  50. package/node_modules/@buddi/cli/dist/plugins-toggle.d.ts +9 -0
  51. package/node_modules/@buddi/cli/dist/plugins-toggle.d.ts.map +1 -0
  52. package/node_modules/@buddi/cli/dist/plugins-toggle.js +20 -0
  53. package/node_modules/@buddi/cli/dist/plugins-toggle.js.map +1 -0
  54. package/node_modules/@buddi/cli/dist/service/index.d.ts +4 -2
  55. package/node_modules/@buddi/cli/dist/service/index.d.ts.map +1 -1
  56. package/node_modules/@buddi/cli/dist/service/index.js +5 -7
  57. package/node_modules/@buddi/cli/dist/service/index.js.map +1 -1
  58. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  59. package/node_modules/@buddi/core/dist/agents/provider-from-env.d.ts +7 -6
  60. package/node_modules/@buddi/core/dist/agents/provider-from-env.d.ts.map +1 -1
  61. package/node_modules/@buddi/core/dist/agents/provider-from-env.js +9 -12
  62. package/node_modules/@buddi/core/dist/agents/provider-from-env.js.map +1 -1
  63. package/node_modules/@buddi/core/dist/backup/load.d.ts.map +1 -1
  64. package/node_modules/@buddi/core/dist/backup/load.js +37 -0
  65. package/node_modules/@buddi/core/dist/backup/load.js.map +1 -1
  66. package/node_modules/@buddi/core/dist/backup/restore.js +2 -2
  67. package/node_modules/@buddi/core/dist/backup/restore.js.map +1 -1
  68. package/node_modules/@buddi/core/dist/connection-config.d.ts +96 -0
  69. package/node_modules/@buddi/core/dist/connection-config.d.ts.map +1 -0
  70. package/node_modules/@buddi/core/dist/connection-config.js +308 -0
  71. package/node_modules/@buddi/core/dist/connection-config.js.map +1 -0
  72. package/node_modules/@buddi/core/dist/failures/owner-message.d.ts.map +1 -1
  73. package/node_modules/@buddi/core/dist/failures/owner-message.js +37 -10
  74. package/node_modules/@buddi/core/dist/failures/owner-message.js.map +1 -1
  75. package/node_modules/@buddi/core/dist/host/build.d.ts +7 -0
  76. package/node_modules/@buddi/core/dist/host/build.d.ts.map +1 -1
  77. package/node_modules/@buddi/core/dist/host/build.js +14 -1
  78. package/node_modules/@buddi/core/dist/host/build.js.map +1 -1
  79. package/node_modules/@buddi/core/dist/onboarding/store.d.ts.map +1 -1
  80. package/node_modules/@buddi/core/dist/onboarding/store.js +17 -1
  81. package/node_modules/@buddi/core/dist/onboarding/store.js.map +1 -1
  82. package/node_modules/@buddi/core/dist/onboarding/types.d.ts +14 -0
  83. package/node_modules/@buddi/core/dist/onboarding/types.d.ts.map +1 -1
  84. package/node_modules/@buddi/core/dist/provider-accounts.d.ts +21 -1
  85. package/node_modules/@buddi/core/dist/provider-accounts.d.ts.map +1 -1
  86. package/node_modules/@buddi/core/dist/provider-accounts.js +31 -1
  87. package/node_modules/@buddi/core/dist/provider-accounts.js.map +1 -1
  88. package/node_modules/@buddi/core/dist/provider.d.ts +4 -3
  89. package/node_modules/@buddi/core/dist/provider.d.ts.map +1 -1
  90. package/node_modules/@buddi/core/dist/provider.js +7 -4
  91. package/node_modules/@buddi/core/dist/provider.js.map +1 -1
  92. package/node_modules/@buddi/core/dist/registry.d.ts +9 -0
  93. package/node_modules/@buddi/core/dist/registry.d.ts.map +1 -1
  94. package/node_modules/@buddi/core/dist/registry.js +32 -2
  95. package/node_modules/@buddi/core/dist/registry.js.map +1 -1
  96. package/node_modules/@buddi/core/dist/secrets/destinations.d.ts +2 -0
  97. package/node_modules/@buddi/core/dist/secrets/destinations.d.ts.map +1 -1
  98. package/node_modules/@buddi/core/dist/secrets/destinations.js +6 -0
  99. package/node_modules/@buddi/core/dist/secrets/destinations.js.map +1 -1
  100. package/node_modules/@buddi/core/dist/testing/accounts.d.ts +12 -0
  101. package/node_modules/@buddi/core/dist/testing/accounts.d.ts.map +1 -0
  102. package/node_modules/@buddi/core/dist/testing/accounts.js +7 -0
  103. package/node_modules/@buddi/core/dist/testing/accounts.js.map +1 -0
  104. package/node_modules/@buddi/core/dist/testing/index.d.ts +1 -0
  105. package/node_modules/@buddi/core/dist/testing/index.d.ts.map +1 -1
  106. package/node_modules/@buddi/core/dist/testing/index.js +1 -0
  107. package/node_modules/@buddi/core/dist/testing/index.js.map +1 -1
  108. package/node_modules/@buddi/core/dist/vault/resolve.d.ts.map +1 -1
  109. package/node_modules/@buddi/core/dist/vault/resolve.js +0 -2
  110. package/node_modules/@buddi/core/dist/vault/resolve.js.map +1 -1
  111. package/node_modules/@buddi/core/migrations/053_drop_legacy_anthropic_env.sql +31 -0
  112. package/node_modules/@buddi/core/package.json +4 -0
  113. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  114. package/node_modules/@buddi/gateway/dist/agents/catalog.d.ts +3 -2
  115. package/node_modules/@buddi/gateway/dist/agents/catalog.d.ts.map +1 -1
  116. package/node_modules/@buddi/gateway/dist/agents/catalog.js +3 -2
  117. package/node_modules/@buddi/gateway/dist/agents/catalog.js.map +1 -1
  118. package/node_modules/@buddi/gateway/dist/agents-cli.js +1 -1
  119. package/node_modules/@buddi/gateway/dist/agents-cli.js.map +1 -1
  120. package/node_modules/@buddi/gateway/dist/bootstrap.d.ts +1 -3
  121. package/node_modules/@buddi/gateway/dist/bootstrap.d.ts.map +1 -1
  122. package/node_modules/@buddi/gateway/dist/bootstrap.js +13 -8
  123. package/node_modules/@buddi/gateway/dist/bootstrap.js.map +1 -1
  124. package/node_modules/@buddi/gateway/dist/cli.js +1 -1
  125. package/node_modules/@buddi/gateway/dist/index.d.ts +1 -1
  126. package/node_modules/@buddi/gateway/dist/index.d.ts.map +1 -1
  127. package/node_modules/@buddi/gateway/dist/index.js.map +1 -1
  128. package/node_modules/@buddi/gateway/dist/mlxh.d.ts +44 -0
  129. package/node_modules/@buddi/gateway/dist/mlxh.d.ts.map +1 -0
  130. package/node_modules/@buddi/gateway/dist/mlxh.js +98 -0
  131. package/node_modules/@buddi/gateway/dist/mlxh.js.map +1 -0
  132. package/node_modules/@buddi/gateway/dist/owner-secrets.d.ts +21 -1
  133. package/node_modules/@buddi/gateway/dist/owner-secrets.d.ts.map +1 -1
  134. package/node_modules/@buddi/gateway/dist/owner-secrets.js +96 -2
  135. package/node_modules/@buddi/gateway/dist/owner-secrets.js.map +1 -1
  136. package/node_modules/@buddi/gateway/dist/plugins/live.d.ts +42 -0
  137. package/node_modules/@buddi/gateway/dist/plugins/live.d.ts.map +1 -0
  138. package/node_modules/@buddi/gateway/dist/plugins/live.js +81 -0
  139. package/node_modules/@buddi/gateway/dist/plugins/live.js.map +1 -0
  140. package/node_modules/@buddi/gateway/dist/plugins/stage.d.ts +4 -0
  141. package/node_modules/@buddi/gateway/dist/plugins/stage.d.ts.map +1 -1
  142. package/node_modules/@buddi/gateway/dist/plugins/stage.js +3 -0
  143. package/node_modules/@buddi/gateway/dist/plugins/stage.js.map +1 -1
  144. package/node_modules/@buddi/gateway/dist/plugins/toggle.d.ts +18 -2
  145. package/node_modules/@buddi/gateway/dist/plugins/toggle.d.ts.map +1 -1
  146. package/node_modules/@buddi/gateway/dist/plugins/toggle.js +36 -12
  147. package/node_modules/@buddi/gateway/dist/plugins/toggle.js.map +1 -1
  148. package/node_modules/@buddi/gateway/dist/plugins/update.d.ts +8 -0
  149. package/node_modules/@buddi/gateway/dist/plugins/update.d.ts.map +1 -1
  150. package/node_modules/@buddi/gateway/dist/plugins/update.js +8 -2
  151. package/node_modules/@buddi/gateway/dist/plugins/update.js.map +1 -1
  152. package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts +44 -5
  153. package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts.map +1 -1
  154. package/node_modules/@buddi/gateway/dist/plugins-cli.js +177 -20
  155. package/node_modules/@buddi/gateway/dist/plugins-cli.js.map +1 -1
  156. package/node_modules/@buddi/gateway/dist/provider-accounts.d.ts +6 -13
  157. package/node_modules/@buddi/gateway/dist/provider-accounts.d.ts.map +1 -1
  158. package/node_modules/@buddi/gateway/dist/provider-accounts.js +76 -16
  159. package/node_modules/@buddi/gateway/dist/provider-accounts.js.map +1 -1
  160. package/node_modules/@buddi/gateway/dist/providers.d.ts +3 -3
  161. package/node_modules/@buddi/gateway/dist/providers.d.ts.map +1 -1
  162. package/node_modules/@buddi/gateway/dist/providers.js +7 -7
  163. package/node_modules/@buddi/gateway/dist/providers.js.map +1 -1
  164. package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
  165. package/node_modules/@buddi/gateway/dist/serve.js +2 -0
  166. package/node_modules/@buddi/gateway/dist/serve.js.map +1 -1
  167. package/node_modules/@buddi/gateway/dist/surfaces/context-budget.d.ts +1 -1
  168. package/node_modules/@buddi/gateway/dist/surfaces/context-budget.d.ts.map +1 -1
  169. package/node_modules/@buddi/gateway/dist/surfaces/context-budget.js +46 -3
  170. package/node_modules/@buddi/gateway/dist/surfaces/context-budget.js.map +1 -1
  171. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
  172. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.js +2 -1
  173. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.js.map +1 -1
  174. package/node_modules/@buddi/gateway/dist/tips/rules.d.ts +2 -0
  175. package/node_modules/@buddi/gateway/dist/tips/rules.d.ts.map +1 -1
  176. package/node_modules/@buddi/gateway/dist/tips/rules.js +10 -0
  177. package/node_modules/@buddi/gateway/dist/tips/rules.js.map +1 -1
  178. package/node_modules/@buddi/gateway/dist/web/agents.d.ts.map +1 -1
  179. package/node_modules/@buddi/gateway/dist/web/agents.js +5 -1
  180. package/node_modules/@buddi/gateway/dist/web/agents.js.map +1 -1
  181. package/node_modules/@buddi/gateway/dist/web/connections.d.ts +15 -5
  182. package/node_modules/@buddi/gateway/dist/web/connections.d.ts.map +1 -1
  183. package/node_modules/@buddi/gateway/dist/web/connections.js +70 -2
  184. package/node_modules/@buddi/gateway/dist/web/connections.js.map +1 -1
  185. package/node_modules/@buddi/gateway/dist/web/extension.d.ts +6 -0
  186. package/node_modules/@buddi/gateway/dist/web/extension.d.ts.map +1 -1
  187. package/node_modules/@buddi/gateway/dist/web/extension.js +5 -1
  188. package/node_modules/@buddi/gateway/dist/web/extension.js.map +1 -1
  189. package/node_modules/@buddi/gateway/dist/web/folders.d.ts +23 -0
  190. package/node_modules/@buddi/gateway/dist/web/folders.d.ts.map +1 -0
  191. package/node_modules/@buddi/gateway/dist/web/folders.js +100 -0
  192. package/node_modules/@buddi/gateway/dist/web/folders.js.map +1 -0
  193. package/node_modules/@buddi/gateway/dist/web/market.d.ts +129 -0
  194. package/node_modules/@buddi/gateway/dist/web/market.d.ts.map +1 -0
  195. package/node_modules/@buddi/gateway/dist/web/market.js +353 -0
  196. package/node_modules/@buddi/gateway/dist/web/market.js.map +1 -0
  197. package/node_modules/@buddi/gateway/dist/web/onboarding.d.ts +21 -7
  198. package/node_modules/@buddi/gateway/dist/web/onboarding.d.ts.map +1 -1
  199. package/node_modules/@buddi/gateway/dist/web/onboarding.js +59 -9
  200. package/node_modules/@buddi/gateway/dist/web/onboarding.js.map +1 -1
  201. package/node_modules/@buddi/gateway/dist/web/plugins.d.ts +42 -7
  202. package/node_modules/@buddi/gateway/dist/web/plugins.d.ts.map +1 -1
  203. package/node_modules/@buddi/gateway/dist/web/plugins.js +54 -14
  204. package/node_modules/@buddi/gateway/dist/web/plugins.js.map +1 -1
  205. package/node_modules/@buddi/gateway/dist/web/recovery.js +1 -1
  206. package/node_modules/@buddi/gateway/dist/web/recovery.js.map +1 -1
  207. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  208. package/node_modules/@buddi/gateway/dist/web/server.js +100 -3
  209. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  210. package/node_modules/@buddi/gateway/dist/web/static.d.ts +8 -0
  211. package/node_modules/@buddi/gateway/dist/web/static.d.ts.map +1 -1
  212. package/node_modules/@buddi/gateway/dist/web/static.js +21 -1
  213. package/node_modules/@buddi/gateway/dist/web/static.js.map +1 -1
  214. package/node_modules/@buddi/gateway/dist/web/svg.d.ts +23 -0
  215. package/node_modules/@buddi/gateway/dist/web/svg.d.ts.map +1 -0
  216. package/node_modules/@buddi/gateway/dist/web/svg.js +125 -0
  217. package/node_modules/@buddi/gateway/dist/web/svg.js.map +1 -0
  218. package/node_modules/@buddi/gateway/dist/web/take-on.d.ts +91 -0
  219. package/node_modules/@buddi/gateway/dist/web/take-on.d.ts.map +1 -0
  220. package/node_modules/@buddi/gateway/dist/web/take-on.js +287 -0
  221. package/node_modules/@buddi/gateway/dist/web/take-on.js.map +1 -0
  222. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  223. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  224. package/node_modules/@buddi/runtime/dist/anthropic.d.ts +7 -0
  225. package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
  226. package/node_modules/@buddi/runtime/dist/anthropic.js +29 -3
  227. package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
  228. package/node_modules/@buddi/runtime/dist/provider-models.d.ts +2 -0
  229. package/node_modules/@buddi/runtime/dist/provider-models.d.ts.map +1 -1
  230. package/node_modules/@buddi/runtime/dist/provider-models.js +22 -0
  231. package/node_modules/@buddi/runtime/dist/provider-models.js.map +1 -1
  232. package/node_modules/@buddi/runtime/dist/search.js +2 -2
  233. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  234. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  235. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  236. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  237. package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
  238. package/node_modules/@buddi/tool-mcp/dist/catalog.d.ts +32 -2
  239. package/node_modules/@buddi/tool-mcp/dist/catalog.d.ts.map +1 -1
  240. package/node_modules/@buddi/tool-mcp/dist/catalog.js +41 -7
  241. package/node_modules/@buddi/tool-mcp/dist/catalog.js.map +1 -1
  242. package/node_modules/@buddi/tool-mcp/dist/device.d.ts +53 -0
  243. package/node_modules/@buddi/tool-mcp/dist/device.d.ts.map +1 -0
  244. package/node_modules/@buddi/tool-mcp/dist/device.js +100 -0
  245. package/node_modules/@buddi/tool-mcp/dist/device.js.map +1 -0
  246. package/node_modules/@buddi/tool-mcp/dist/fetch.d.ts +10 -1
  247. package/node_modules/@buddi/tool-mcp/dist/fetch.d.ts.map +1 -1
  248. package/node_modules/@buddi/tool-mcp/dist/fetch.js +7 -1
  249. package/node_modules/@buddi/tool-mcp/dist/fetch.js.map +1 -1
  250. package/node_modules/@buddi/tool-mcp/dist/index.d.ts +5 -3
  251. package/node_modules/@buddi/tool-mcp/dist/index.d.ts.map +1 -1
  252. package/node_modules/@buddi/tool-mcp/dist/index.js +7 -4
  253. package/node_modules/@buddi/tool-mcp/dist/index.js.map +1 -1
  254. package/node_modules/@buddi/tool-mcp/dist/ports.d.ts +31 -0
  255. package/node_modules/@buddi/tool-mcp/dist/ports.d.ts.map +1 -1
  256. package/node_modules/@buddi/tool-mcp/dist/preview.d.ts +16 -0
  257. package/node_modules/@buddi/tool-mcp/dist/preview.d.ts.map +1 -0
  258. package/node_modules/@buddi/tool-mcp/dist/preview.js +52 -0
  259. package/node_modules/@buddi/tool-mcp/dist/preview.js.map +1 -0
  260. package/node_modules/@buddi/tool-mcp/dist/program.d.ts +73 -0
  261. package/node_modules/@buddi/tool-mcp/dist/program.d.ts.map +1 -0
  262. package/node_modules/@buddi/tool-mcp/dist/program.js +306 -0
  263. package/node_modules/@buddi/tool-mcp/dist/program.js.map +1 -0
  264. package/node_modules/@buddi/tool-mcp/dist/service.d.ts +131 -22
  265. package/node_modules/@buddi/tool-mcp/dist/service.d.ts.map +1 -1
  266. package/node_modules/@buddi/tool-mcp/dist/service.js +717 -29
  267. package/node_modules/@buddi/tool-mcp/dist/service.js.map +1 -1
  268. package/node_modules/@buddi/tool-mcp/dist/session.d.ts +13 -1
  269. package/node_modules/@buddi/tool-mcp/dist/session.d.ts.map +1 -1
  270. package/node_modules/@buddi/tool-mcp/dist/session.js +27 -4
  271. package/node_modules/@buddi/tool-mcp/dist/session.js.map +1 -1
  272. package/node_modules/@buddi/tool-mcp/dist/store.d.ts +39 -1
  273. package/node_modules/@buddi/tool-mcp/dist/store.d.ts.map +1 -1
  274. package/node_modules/@buddi/tool-mcp/dist/store.js +24 -0
  275. package/node_modules/@buddi/tool-mcp/dist/store.js.map +1 -1
  276. package/node_modules/@buddi/tool-mcp/dist/testing/fake.d.ts +6 -0
  277. package/node_modules/@buddi/tool-mcp/dist/testing/fake.d.ts.map +1 -1
  278. package/node_modules/@buddi/tool-mcp/dist/testing/fake.js +26 -0
  279. package/node_modules/@buddi/tool-mcp/dist/testing/fake.js.map +1 -1
  280. package/node_modules/@buddi/tool-mcp/migrations/003_token_auth.sql +14 -0
  281. package/node_modules/@buddi/tool-mcp/migrations/004_programs.sql +26 -0
  282. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  283. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  284. package/node_modules/@hono/node-server/README.md +21 -10
  285. package/node_modules/@hono/node-server/dist/early-hints.cjs +1 -1
  286. package/node_modules/@hono/node-server/dist/early-hints.mjs +1 -1
  287. package/node_modules/@hono/node-server/dist/index.cjs +41 -19
  288. package/node_modules/@hono/node-server/dist/index.mjs +42 -20
  289. package/node_modules/@hono/node-server/dist/serve-static.cjs +1 -0
  290. package/node_modules/@hono/node-server/dist/serve-static.d.cts +2 -1
  291. package/node_modules/@hono/node-server/dist/serve-static.d.mts +2 -1
  292. package/node_modules/@hono/node-server/dist/serve-static.mjs +1 -0
  293. package/node_modules/@hono/node-server/package.json +3 -2
  294. package/node_modules/hono/dist/cjs/adapter/bun/websocket.js +1 -1
  295. package/node_modules/hono/dist/cjs/middleware/language/language.js +1 -1
  296. package/node_modules/hono/dist/cjs/middleware/serve-static/index.js +1 -0
  297. package/node_modules/hono/dist/middleware/language/language.js +1 -1
  298. package/node_modules/hono/dist/middleware/serve-static/index.js +1 -0
  299. package/node_modules/hono/dist/types/middleware/serve-static/index.d.ts +2 -0
  300. package/node_modules/hono/package.json +1 -1
  301. package/package.json +2 -2
  302. package/packages/cli/dist/.tsbuildinfo +1 -1
  303. package/packages/cli/dist/args.d.ts +59 -0
  304. package/packages/cli/dist/args.d.ts.map +1 -1
  305. package/packages/cli/dist/args.js +141 -0
  306. package/packages/cli/dist/args.js.map +1 -1
  307. package/packages/cli/dist/commands.d.ts +2 -0
  308. package/packages/cli/dist/commands.d.ts.map +1 -1
  309. package/packages/cli/dist/commands.js +83 -3
  310. package/packages/cli/dist/commands.js.map +1 -1
  311. package/packages/cli/dist/connections-cmd.d.ts +93 -0
  312. package/packages/cli/dist/connections-cmd.d.ts.map +1 -0
  313. package/packages/cli/dist/connections-cmd.js +657 -0
  314. package/packages/cli/dist/connections-cmd.js.map +1 -0
  315. package/packages/cli/dist/doctor-probes.d.ts.map +1 -1
  316. package/packages/cli/dist/doctor-probes.js +53 -9
  317. package/packages/cli/dist/doctor-probes.js.map +1 -1
  318. package/packages/cli/dist/doctor.d.ts +1 -8
  319. package/packages/cli/dist/doctor.d.ts.map +1 -1
  320. package/packages/cli/dist/doctor.js +1 -15
  321. package/packages/cli/dist/doctor.js.map +1 -1
  322. package/packages/cli/dist/init-plan.d.ts +1 -2
  323. package/packages/cli/dist/init-plan.d.ts.map +1 -1
  324. package/packages/cli/dist/init-plan.js +2 -6
  325. package/packages/cli/dist/init-plan.js.map +1 -1
  326. package/packages/cli/dist/init.d.ts.map +1 -1
  327. package/packages/cli/dist/init.js +5 -29
  328. package/packages/cli/dist/init.js.map +1 -1
  329. package/packages/cli/dist/main.d.ts.map +1 -1
  330. package/packages/cli/dist/main.js +12 -2
  331. package/packages/cli/dist/main.js.map +1 -1
  332. package/packages/cli/dist/mcp/gateway-client.d.ts +5 -0
  333. package/packages/cli/dist/mcp/gateway-client.d.ts.map +1 -1
  334. package/packages/cli/dist/mcp/gateway-client.js +15 -4
  335. package/packages/cli/dist/mcp/gateway-client.js.map +1 -1
  336. package/packages/cli/dist/plugins-toggle.d.ts +9 -0
  337. package/packages/cli/dist/plugins-toggle.d.ts.map +1 -0
  338. package/packages/cli/dist/plugins-toggle.js +20 -0
  339. package/packages/cli/dist/plugins-toggle.js.map +1 -0
  340. package/packages/cli/dist/service/index.d.ts +4 -2
  341. package/packages/cli/dist/service/index.d.ts.map +1 -1
  342. package/packages/cli/dist/service/index.js +5 -7
  343. package/packages/cli/dist/service/index.js.map +1 -1
  344. package/packages/core/dist/.tsbuildinfo +1 -1
  345. package/packages/core/dist/agents/provider-from-env.d.ts +7 -6
  346. package/packages/core/dist/agents/provider-from-env.d.ts.map +1 -1
  347. package/packages/core/dist/agents/provider-from-env.js +9 -12
  348. package/packages/core/dist/agents/provider-from-env.js.map +1 -1
  349. package/packages/core/dist/backup/load.d.ts.map +1 -1
  350. package/packages/core/dist/backup/load.js +37 -0
  351. package/packages/core/dist/backup/load.js.map +1 -1
  352. package/packages/core/dist/backup/restore.js +2 -2
  353. package/packages/core/dist/backup/restore.js.map +1 -1
  354. package/packages/core/dist/connection-config.d.ts +96 -0
  355. package/packages/core/dist/connection-config.d.ts.map +1 -0
  356. package/packages/core/dist/connection-config.js +308 -0
  357. package/packages/core/dist/connection-config.js.map +1 -0
  358. package/packages/core/dist/failures/owner-message.d.ts.map +1 -1
  359. package/packages/core/dist/failures/owner-message.js +37 -10
  360. package/packages/core/dist/failures/owner-message.js.map +1 -1
  361. package/packages/core/dist/host/build.d.ts +7 -0
  362. package/packages/core/dist/host/build.d.ts.map +1 -1
  363. package/packages/core/dist/host/build.js +14 -1
  364. package/packages/core/dist/host/build.js.map +1 -1
  365. package/packages/core/dist/onboarding/store.d.ts.map +1 -1
  366. package/packages/core/dist/onboarding/store.js +17 -1
  367. package/packages/core/dist/onboarding/store.js.map +1 -1
  368. package/packages/core/dist/onboarding/types.d.ts +14 -0
  369. package/packages/core/dist/onboarding/types.d.ts.map +1 -1
  370. package/packages/core/dist/provider-accounts.d.ts +21 -1
  371. package/packages/core/dist/provider-accounts.d.ts.map +1 -1
  372. package/packages/core/dist/provider-accounts.js +31 -1
  373. package/packages/core/dist/provider-accounts.js.map +1 -1
  374. package/packages/core/dist/provider.d.ts +4 -3
  375. package/packages/core/dist/provider.d.ts.map +1 -1
  376. package/packages/core/dist/provider.js +7 -4
  377. package/packages/core/dist/provider.js.map +1 -1
  378. package/packages/core/dist/registry.d.ts +9 -0
  379. package/packages/core/dist/registry.d.ts.map +1 -1
  380. package/packages/core/dist/registry.js +32 -2
  381. package/packages/core/dist/registry.js.map +1 -1
  382. package/packages/core/dist/secrets/destinations.d.ts +2 -0
  383. package/packages/core/dist/secrets/destinations.d.ts.map +1 -1
  384. package/packages/core/dist/secrets/destinations.js +6 -0
  385. package/packages/core/dist/secrets/destinations.js.map +1 -1
  386. package/packages/core/dist/testing/accounts.d.ts +12 -0
  387. package/packages/core/dist/testing/accounts.d.ts.map +1 -0
  388. package/packages/core/dist/testing/accounts.js +7 -0
  389. package/packages/core/dist/testing/accounts.js.map +1 -0
  390. package/packages/core/dist/testing/index.d.ts +1 -0
  391. package/packages/core/dist/testing/index.d.ts.map +1 -1
  392. package/packages/core/dist/testing/index.js +1 -0
  393. package/packages/core/dist/testing/index.js.map +1 -1
  394. package/packages/core/dist/vault/resolve.d.ts.map +1 -1
  395. package/packages/core/dist/vault/resolve.js +0 -2
  396. package/packages/core/dist/vault/resolve.js.map +1 -1
  397. package/packages/core/migrations/053_drop_legacy_anthropic_env.sql +31 -0
  398. package/packages/core/package.json +4 -0
  399. package/packages/gateway/dist/.tsbuildinfo +1 -1
  400. package/packages/gateway/dist/agents/catalog.d.ts +3 -2
  401. package/packages/gateway/dist/agents/catalog.d.ts.map +1 -1
  402. package/packages/gateway/dist/agents/catalog.js +3 -2
  403. package/packages/gateway/dist/agents/catalog.js.map +1 -1
  404. package/packages/gateway/dist/agents-cli.js +1 -1
  405. package/packages/gateway/dist/agents-cli.js.map +1 -1
  406. package/packages/gateway/dist/bootstrap.d.ts +1 -3
  407. package/packages/gateway/dist/bootstrap.d.ts.map +1 -1
  408. package/packages/gateway/dist/bootstrap.js +13 -8
  409. package/packages/gateway/dist/bootstrap.js.map +1 -1
  410. package/packages/gateway/dist/cli.js +1 -1
  411. package/packages/gateway/dist/index.d.ts +1 -1
  412. package/packages/gateway/dist/index.d.ts.map +1 -1
  413. package/packages/gateway/dist/index.js.map +1 -1
  414. package/packages/gateway/dist/mlxh.d.ts +44 -0
  415. package/packages/gateway/dist/mlxh.d.ts.map +1 -0
  416. package/packages/gateway/dist/mlxh.js +98 -0
  417. package/packages/gateway/dist/mlxh.js.map +1 -0
  418. package/packages/gateway/dist/owner-secrets.d.ts +21 -1
  419. package/packages/gateway/dist/owner-secrets.d.ts.map +1 -1
  420. package/packages/gateway/dist/owner-secrets.js +96 -2
  421. package/packages/gateway/dist/owner-secrets.js.map +1 -1
  422. package/packages/gateway/dist/plugins/live.d.ts +42 -0
  423. package/packages/gateway/dist/plugins/live.d.ts.map +1 -0
  424. package/packages/gateway/dist/plugins/live.js +81 -0
  425. package/packages/gateway/dist/plugins/live.js.map +1 -0
  426. package/packages/gateway/dist/plugins/stage.d.ts +4 -0
  427. package/packages/gateway/dist/plugins/stage.d.ts.map +1 -1
  428. package/packages/gateway/dist/plugins/stage.js +3 -0
  429. package/packages/gateway/dist/plugins/stage.js.map +1 -1
  430. package/packages/gateway/dist/plugins/toggle.d.ts +18 -2
  431. package/packages/gateway/dist/plugins/toggle.d.ts.map +1 -1
  432. package/packages/gateway/dist/plugins/toggle.js +36 -12
  433. package/packages/gateway/dist/plugins/toggle.js.map +1 -1
  434. package/packages/gateway/dist/plugins/update.d.ts +8 -0
  435. package/packages/gateway/dist/plugins/update.d.ts.map +1 -1
  436. package/packages/gateway/dist/plugins/update.js +8 -2
  437. package/packages/gateway/dist/plugins/update.js.map +1 -1
  438. package/packages/gateway/dist/plugins-cli.d.ts +44 -5
  439. package/packages/gateway/dist/plugins-cli.d.ts.map +1 -1
  440. package/packages/gateway/dist/plugins-cli.js +177 -20
  441. package/packages/gateway/dist/plugins-cli.js.map +1 -1
  442. package/packages/gateway/dist/provider-accounts.d.ts +6 -13
  443. package/packages/gateway/dist/provider-accounts.d.ts.map +1 -1
  444. package/packages/gateway/dist/provider-accounts.js +76 -16
  445. package/packages/gateway/dist/provider-accounts.js.map +1 -1
  446. package/packages/gateway/dist/providers.d.ts +3 -3
  447. package/packages/gateway/dist/providers.d.ts.map +1 -1
  448. package/packages/gateway/dist/providers.js +7 -7
  449. package/packages/gateway/dist/providers.js.map +1 -1
  450. package/packages/gateway/dist/serve.d.ts.map +1 -1
  451. package/packages/gateway/dist/serve.js +2 -0
  452. package/packages/gateway/dist/serve.js.map +1 -1
  453. package/packages/gateway/dist/surfaces/context-budget.d.ts +1 -1
  454. package/packages/gateway/dist/surfaces/context-budget.d.ts.map +1 -1
  455. package/packages/gateway/dist/surfaces/context-budget.js +46 -3
  456. package/packages/gateway/dist/surfaces/context-budget.js.map +1 -1
  457. package/packages/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
  458. package/packages/gateway/dist/surfaces/pending-question.js +2 -1
  459. package/packages/gateway/dist/surfaces/pending-question.js.map +1 -1
  460. package/packages/gateway/dist/tips/rules.d.ts +2 -0
  461. package/packages/gateway/dist/tips/rules.d.ts.map +1 -1
  462. package/packages/gateway/dist/tips/rules.js +10 -0
  463. package/packages/gateway/dist/tips/rules.js.map +1 -1
  464. package/packages/gateway/dist/web/agents.d.ts.map +1 -1
  465. package/packages/gateway/dist/web/agents.js +5 -1
  466. package/packages/gateway/dist/web/agents.js.map +1 -1
  467. package/packages/gateway/dist/web/connections.d.ts +15 -5
  468. package/packages/gateway/dist/web/connections.d.ts.map +1 -1
  469. package/packages/gateway/dist/web/connections.js +70 -2
  470. package/packages/gateway/dist/web/connections.js.map +1 -1
  471. package/packages/gateway/dist/web/extension.d.ts +6 -0
  472. package/packages/gateway/dist/web/extension.d.ts.map +1 -1
  473. package/packages/gateway/dist/web/extension.js +5 -1
  474. package/packages/gateway/dist/web/extension.js.map +1 -1
  475. package/packages/gateway/dist/web/folders.d.ts +23 -0
  476. package/packages/gateway/dist/web/folders.d.ts.map +1 -0
  477. package/packages/gateway/dist/web/folders.js +100 -0
  478. package/packages/gateway/dist/web/folders.js.map +1 -0
  479. package/packages/gateway/dist/web/market.d.ts +129 -0
  480. package/packages/gateway/dist/web/market.d.ts.map +1 -0
  481. package/packages/gateway/dist/web/market.js +353 -0
  482. package/packages/gateway/dist/web/market.js.map +1 -0
  483. package/packages/gateway/dist/web/onboarding.d.ts +21 -7
  484. package/packages/gateway/dist/web/onboarding.d.ts.map +1 -1
  485. package/packages/gateway/dist/web/onboarding.js +59 -9
  486. package/packages/gateway/dist/web/onboarding.js.map +1 -1
  487. package/packages/gateway/dist/web/plugins.d.ts +42 -7
  488. package/packages/gateway/dist/web/plugins.d.ts.map +1 -1
  489. package/packages/gateway/dist/web/plugins.js +54 -14
  490. package/packages/gateway/dist/web/plugins.js.map +1 -1
  491. package/packages/gateway/dist/web/recovery.js +1 -1
  492. package/packages/gateway/dist/web/recovery.js.map +1 -1
  493. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  494. package/packages/gateway/dist/web/server.js +100 -3
  495. package/packages/gateway/dist/web/server.js.map +1 -1
  496. package/packages/gateway/dist/web/static.d.ts +8 -0
  497. package/packages/gateway/dist/web/static.d.ts.map +1 -1
  498. package/packages/gateway/dist/web/static.js +21 -1
  499. package/packages/gateway/dist/web/static.js.map +1 -1
  500. package/packages/gateway/dist/web/svg.d.ts +23 -0
  501. package/packages/gateway/dist/web/svg.d.ts.map +1 -0
  502. package/packages/gateway/dist/web/svg.js +125 -0
  503. package/packages/gateway/dist/web/svg.js.map +1 -0
  504. package/packages/gateway/dist/web/take-on.d.ts +91 -0
  505. package/packages/gateway/dist/web/take-on.d.ts.map +1 -0
  506. package/packages/gateway/dist/web/take-on.js +287 -0
  507. package/packages/gateway/dist/web/take-on.js.map +1 -0
  508. package/packages/install/dist/.tsbuildinfo +1 -1
  509. package/packages/runtime/dist/.tsbuildinfo +1 -1
  510. package/packages/runtime/dist/anthropic.d.ts +7 -0
  511. package/packages/runtime/dist/anthropic.d.ts.map +1 -1
  512. package/packages/runtime/dist/anthropic.js +29 -3
  513. package/packages/runtime/dist/anthropic.js.map +1 -1
  514. package/packages/runtime/dist/provider-models.d.ts +2 -0
  515. package/packages/runtime/dist/provider-models.d.ts.map +1 -1
  516. package/packages/runtime/dist/provider-models.js +22 -0
  517. package/packages/runtime/dist/provider-models.js.map +1 -1
  518. package/packages/runtime/dist/search.js +2 -2
  519. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  520. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  521. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  522. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  523. package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
  524. package/packages/tools/mcp/dist/catalog.d.ts +32 -2
  525. package/packages/tools/mcp/dist/catalog.d.ts.map +1 -1
  526. package/packages/tools/mcp/dist/catalog.js +41 -7
  527. package/packages/tools/mcp/dist/catalog.js.map +1 -1
  528. package/packages/tools/mcp/dist/device.d.ts +53 -0
  529. package/packages/tools/mcp/dist/device.d.ts.map +1 -0
  530. package/packages/tools/mcp/dist/device.js +100 -0
  531. package/packages/tools/mcp/dist/device.js.map +1 -0
  532. package/packages/tools/mcp/dist/fetch.d.ts +10 -1
  533. package/packages/tools/mcp/dist/fetch.d.ts.map +1 -1
  534. package/packages/tools/mcp/dist/fetch.js +7 -1
  535. package/packages/tools/mcp/dist/fetch.js.map +1 -1
  536. package/packages/tools/mcp/dist/index.d.ts +5 -3
  537. package/packages/tools/mcp/dist/index.d.ts.map +1 -1
  538. package/packages/tools/mcp/dist/index.js +7 -4
  539. package/packages/tools/mcp/dist/index.js.map +1 -1
  540. package/packages/tools/mcp/dist/ports.d.ts +31 -0
  541. package/packages/tools/mcp/dist/ports.d.ts.map +1 -1
  542. package/packages/tools/mcp/dist/preview.d.ts +16 -0
  543. package/packages/tools/mcp/dist/preview.d.ts.map +1 -0
  544. package/packages/tools/mcp/dist/preview.js +52 -0
  545. package/packages/tools/mcp/dist/preview.js.map +1 -0
  546. package/packages/tools/mcp/dist/program.d.ts +73 -0
  547. package/packages/tools/mcp/dist/program.d.ts.map +1 -0
  548. package/packages/tools/mcp/dist/program.js +306 -0
  549. package/packages/tools/mcp/dist/program.js.map +1 -0
  550. package/packages/tools/mcp/dist/service.d.ts +131 -22
  551. package/packages/tools/mcp/dist/service.d.ts.map +1 -1
  552. package/packages/tools/mcp/dist/service.js +717 -29
  553. package/packages/tools/mcp/dist/service.js.map +1 -1
  554. package/packages/tools/mcp/dist/session.d.ts +13 -1
  555. package/packages/tools/mcp/dist/session.d.ts.map +1 -1
  556. package/packages/tools/mcp/dist/session.js +27 -4
  557. package/packages/tools/mcp/dist/session.js.map +1 -1
  558. package/packages/tools/mcp/dist/store.d.ts +39 -1
  559. package/packages/tools/mcp/dist/store.d.ts.map +1 -1
  560. package/packages/tools/mcp/dist/store.js +24 -0
  561. package/packages/tools/mcp/dist/store.js.map +1 -1
  562. package/packages/tools/mcp/dist/testing/fake.d.ts +6 -0
  563. package/packages/tools/mcp/dist/testing/fake.d.ts.map +1 -1
  564. package/packages/tools/mcp/dist/testing/fake.js +26 -0
  565. package/packages/tools/mcp/dist/testing/fake.js.map +1 -1
  566. package/packages/tools/mcp/migrations/003_token_auth.sql +14 -0
  567. package/packages/tools/mcp/migrations/004_programs.sql +26 -0
  568. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  569. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  570. package/packages/web/dist/assets/index-DIXokQ4n.css +1 -0
  571. package/packages/web/dist/assets/index-uqQyuYjR.js +128 -0
  572. package/packages/web/dist/assets/{lottie_light-e1djomjW.js → lottie_light-j3HICV9o.js} +1 -1
  573. package/packages/web/dist/build.json +1 -1
  574. package/packages/web/dist/index.html +2 -2
  575. package/packages/web/dist/manifest.webmanifest +24 -5
  576. package/packages/web/dist/precache.json +4 -4
  577. package/packages/web/dist/assets/index-4hpqlMjL.css +0 -1
  578. package/packages/web/dist/assets/index-B8crjABB.js +0 -125
@@ -0,0 +1,353 @@
1
+ /**
2
+ * `GET /api/market` — the plugin list from withbuddi.com, for Browse.
3
+ *
4
+ * The page never reaches the internet itself: it asks this route, and this
5
+ * route fetches `<origin>/plugins/index.json` only when it is asked — which is
6
+ * when the owner opens the Browse tab. Nothing fetches it at start or on a
7
+ * timer. It is one of the few things that leave the machine, and the docs list
8
+ * it as that: "the plugin list from withbuddi.com, when you open Browse".
9
+ *
10
+ * The answer is kept a day, in memory and on disk under the data directory, so
11
+ * opening Browse twice does not ask twice. A fetch that fails with a copy on
12
+ * hand answers the copy, marked `stale`; one that fails with nothing answers
13
+ * an empty list and the sentence, still with a 200, because "withbuddi.com did
14
+ * not answer" is something the page shows, not an error in the gateway.
15
+ *
16
+ * Each entry is annotated against the installed record: `installed` when a
17
+ * plugin of that npm name (or buddi name) is here, `update` when the listed
18
+ * version is newer, and `usesWords` in the same words the staged card uses.
19
+ * Nothing about installing changes: Install on the page stages the spec, and
20
+ * the staged card and its approvals are the ones every install goes through.
21
+ *
22
+ * The listings' pictures come through here too: `GET /api/market/asset?url=`
23
+ * fetches a file under `https://withbuddi.com/plugins/` (a screenshot) and
24
+ * keeps it beside the index, so the page never reaches the internet itself.
25
+ * Each listing's icon is read the same way while the list is answered and
26
+ * passed on as `iconSvg`, sanitised to plain shapes (`svg.ts`), so the page can
27
+ * draw it inline in the colour of its tile. Both happen only on the way to
28
+ * Browse, which is already the one time the market is asked anything.
29
+ */
30
+ import { createHash } from 'node:crypto';
31
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
32
+ import path from 'node:path';
33
+ import { z } from 'zod';
34
+ import { compareVersions, resolveDataDir } from '@buddi/core';
35
+ import { installedRecord, usesWords } from './plugins.js';
36
+ import { sanitizeIconSvg } from './svg.js';
37
+ export const MARKET_ORIGIN = 'https://withbuddi.com';
38
+ /** How long a fetched list is trusted before Browse asks again. The pictures keep a day. */
39
+ export const MARKET_TTL_MS = 60 * 60 * 1000;
40
+ export const MARKET_ASSET_TTL_MS = 24 * 60 * 60 * 1000;
41
+ export const MARKET_TIMEOUT_MS = 10_000;
42
+ export const MARKET_CATEGORIES = ['days', 'money', 'home', 'voice', 'work', 'other'];
43
+ /**
44
+ * One listing. Only what Browse relies on is checked; every other field the
45
+ * site writes is kept as it came, so a newer index still reaches the page.
46
+ */
47
+ const entrySchema = z
48
+ .object({
49
+ name: z.string().min(1),
50
+ npm: z.string().min(1),
51
+ version: z.string().min(1),
52
+ title: z.string().min(1),
53
+ summary: z.string(),
54
+ category: z.enum(MARKET_CATEGORIES).catch('other'),
55
+ trust: z.enum(['by-buddi', 'reviewed']),
56
+ pricing: z
57
+ .object({ kind: z.enum(['free', 'paid', 'subscription']) })
58
+ .passthrough()
59
+ .catch({ kind: 'free' }),
60
+ })
61
+ .passthrough();
62
+ const indexSchema = z
63
+ .object({
64
+ generatedAt: z.string().optional(),
65
+ plugins: z.array(z.unknown()),
66
+ })
67
+ .passthrough();
68
+ /** Keyed by the file on disk, so two data directories never share a copy. */
69
+ const memory = new Map();
70
+ /** For tests: forget the in-memory copies. */
71
+ export function resetMarketCache() {
72
+ memory.clear();
73
+ }
74
+ export function marketFile(env) {
75
+ return path.join(resolveDataDir(env), 'market', 'index.json');
76
+ }
77
+ export function marketUrl(env) {
78
+ const origin = env.BUDDI_MARKET_URL?.trim() || MARKET_ORIGIN;
79
+ return `${origin.replace(/\/+$/, '')}/plugins/index.json`;
80
+ }
81
+ /** The index as buddi keeps it: shape checked, bad entries left out and said so. */
82
+ export function parseMarketIndex(value, log = () => { }) {
83
+ const index = indexSchema.parse(value);
84
+ const plugins = [];
85
+ for (const raw of index.plugins) {
86
+ const parsed = entrySchema.safeParse(raw);
87
+ if (parsed.success)
88
+ plugins.push(parsed.data);
89
+ else {
90
+ const name = typeof raw?.name === 'string' ? raw.name : '?';
91
+ log(`market: left out the listing "${name}": ${parsed.error.issues[0]?.message ?? 'not a listing'}`);
92
+ }
93
+ }
94
+ return { ...index, plugins };
95
+ }
96
+ function readDisk(file) {
97
+ try {
98
+ const parsed = JSON.parse(readFileSync(file, 'utf8'));
99
+ if (typeof parsed.fetchedAt !== 'string')
100
+ return undefined;
101
+ return { fetchedAt: parsed.fetchedAt, index: parseMarketIndex(parsed.index) };
102
+ }
103
+ catch {
104
+ return undefined;
105
+ }
106
+ }
107
+ function writeDisk(file, cached, log) {
108
+ try {
109
+ mkdirSync(path.dirname(file), { recursive: true });
110
+ const tmp = `${file}.${process.pid}.tmp`;
111
+ writeFileSync(tmp, `${JSON.stringify(cached, null, 2)}\n`);
112
+ renameSync(tmp, file);
113
+ }
114
+ catch (err) {
115
+ // The copy in memory still answers; a day's cache on disk is a convenience.
116
+ log(`market: could not keep the list on disk: ${err instanceof Error ? err.message : String(err)}`);
117
+ }
118
+ }
119
+ async function fetchIndex(deps) {
120
+ const doFetch = deps.fetch ?? fetch;
121
+ const url = marketUrl(deps.env);
122
+ const response = await doFetch(url, {
123
+ signal: AbortSignal.timeout(MARKET_TIMEOUT_MS),
124
+ headers: { accept: 'application/json' },
125
+ });
126
+ if (!response.ok)
127
+ throw new Error(`${url} answered ${response.status}`);
128
+ return parseMarketIndex(await response.json(), deps.log);
129
+ }
130
+ function reason(err) {
131
+ if (err instanceof Error && (err.name === 'TimeoutError' || err.name === 'AbortError')) {
132
+ return `it did not answer within ${MARKET_TIMEOUT_MS / 1000} seconds`;
133
+ }
134
+ if (err instanceof z.ZodError)
135
+ return 'what it answered is not a plugin list';
136
+ const cause = err instanceof Error && err.cause instanceof Error ? `: ${err.cause.message}` : '';
137
+ return `${err instanceof Error ? err.message : String(err)}${cause}`;
138
+ }
139
+ /** Which installed record, if any, is this listing. */
140
+ export function installedAs(entry, record) {
141
+ return record.find((plugin) => plugin.name === entry.name || (plugin.source.kind === 'registry' && plugin.source.name === entry.npm));
142
+ }
143
+ /** The areas a listing reaches, from its claims, in the staged card's words. */
144
+ function listedUses(entry) {
145
+ const claims = entry.claims;
146
+ const uses = claims?.package?.uses ?? claims?.manifest?.uses;
147
+ return Array.isArray(uses) ? uses : [];
148
+ }
149
+ export function annotateMarket(plugins, record) {
150
+ return plugins.map((entry) => {
151
+ const here = installedAs(entry, record);
152
+ const newer = here !== undefined && (compareVersions(entry.version, here.version) ?? 0) > 0;
153
+ return {
154
+ ...entry,
155
+ usesWords: usesWords(listedUses(entry)),
156
+ ...(here === undefined ? {} : { installed: { version: here.version, name: here.name } }),
157
+ ...(newer ? { update: entry.version } : {}),
158
+ };
159
+ });
160
+ }
161
+ /* ------------------------------------------------------------------ *
162
+ * The listings' files: icons and screenshots
163
+ * ------------------------------------------------------------------ */
164
+ /** Where every listing's files live; nothing outside it is fetched for the page. */
165
+ export const MARKET_ASSET_PREFIX = `${MARKET_ORIGIN}/plugins/`;
166
+ /** A screenshot is a few hundred kilobytes; this is room and no more. */
167
+ export const MAX_ASSET_BYTES = 5 * 1024 * 1024;
168
+ /** What a listing's file may be. Anything else is not passed on. */
169
+ const ASSET_TYPES = new Set(['image/webp', 'image/png', 'image/jpeg', 'image/gif', 'image/svg+xml']);
170
+ /**
171
+ * The prefixes a file may be fetched from: withbuddi.com's, and the origin
172
+ * `BUDDI_MARKET_URL` names when set (a staging copy of the site), whose own
173
+ * files sit at the same place under it.
174
+ */
175
+ function assetPrefixes(env) {
176
+ const configured = env.BUDDI_MARKET_URL?.trim();
177
+ const prefixes = [MARKET_ASSET_PREFIX];
178
+ if (configured)
179
+ prefixes.push(`${configured.replace(/\/+$/, '')}/plugins/`);
180
+ return [...new Set(prefixes)];
181
+ }
182
+ /** The URL, when it is a listing's file; `undefined` for anything else. */
183
+ export function marketAssetUrl(env, raw) {
184
+ if (!raw)
185
+ return undefined;
186
+ let url;
187
+ try {
188
+ url = new URL(raw);
189
+ }
190
+ catch {
191
+ return undefined;
192
+ }
193
+ // Parsed, so `..` and encoded dots are resolved before the prefix is checked.
194
+ if (url.username || url.password || url.search || url.hash)
195
+ return undefined;
196
+ return assetPrefixes(env).some((prefix) => url.href.startsWith(prefix)) && url.href.length > url.origin.length + '/plugins/'.length
197
+ ? url
198
+ : undefined;
199
+ }
200
+ function assetPaths(env, url) {
201
+ const key = createHash('sha256').update(url.href).digest('hex');
202
+ const dir = path.join(path.dirname(marketFile(env)), 'assets');
203
+ return { bytes: path.join(dir, key), meta: path.join(dir, `${key}.json`) };
204
+ }
205
+ function readAsset(env, url) {
206
+ try {
207
+ const files = assetPaths(env, url);
208
+ const meta = JSON.parse(readFileSync(files.meta, 'utf8'));
209
+ if (meta.url !== url.href || typeof meta.type !== 'string' || typeof meta.fetchedAt !== 'string')
210
+ return undefined;
211
+ return { bytes: readFileSync(files.bytes), type: meta.type, fetchedAt: meta.fetchedAt };
212
+ }
213
+ catch {
214
+ return undefined;
215
+ }
216
+ }
217
+ function writeAsset(env, url, asset, log) {
218
+ try {
219
+ const files = assetPaths(env, url);
220
+ mkdirSync(path.dirname(files.bytes), { recursive: true });
221
+ const tmp = `${files.bytes}.${process.pid}.tmp`;
222
+ writeFileSync(tmp, asset.bytes);
223
+ renameSync(tmp, files.bytes);
224
+ writeFileSync(files.meta, `${JSON.stringify({ url: url.href, type: asset.type, fetchedAt: asset.fetchedAt })}\n`);
225
+ }
226
+ catch (err) {
227
+ log(`market: could not keep ${url.href} on disk: ${err instanceof Error ? err.message : String(err)}`);
228
+ }
229
+ }
230
+ async function fetchAsset(deps, url) {
231
+ const doFetch = deps.fetch ?? fetch;
232
+ const response = await doFetch(url.href, { signal: AbortSignal.timeout(MARKET_TIMEOUT_MS), redirect: 'error' });
233
+ if (!response.ok)
234
+ throw new Error(`${url.href} answered ${response.status}`);
235
+ const type = (response.headers.get('content-type') ?? '').split(';')[0]?.trim().toLowerCase() ?? '';
236
+ if (!ASSET_TYPES.has(type))
237
+ throw new Error(`${url.href} is not a picture (${type || 'no type'})`);
238
+ const declared = Number(response.headers.get('content-length') ?? '0');
239
+ if (declared > MAX_ASSET_BYTES)
240
+ throw new Error(`${url.href} is larger than a listing's picture should be`);
241
+ const bytes = Buffer.from(await response.arrayBuffer());
242
+ if (bytes.length > MAX_ASSET_BYTES)
243
+ throw new Error(`${url.href} is larger than a listing's picture should be`);
244
+ return { bytes, type };
245
+ }
246
+ /**
247
+ * One listing's file: from the copy beside the index while it is under a day
248
+ * old, else fetched and kept. A fetch that fails with a copy on hand answers
249
+ * the copy; with none, it throws.
250
+ */
251
+ export async function marketAsset(deps, url) {
252
+ const now = deps.now ?? (() => new Date());
253
+ const kept = readAsset(deps.env, url);
254
+ if (kept && now().getTime() - Date.parse(kept.fetchedAt) < MARKET_ASSET_TTL_MS)
255
+ return kept;
256
+ try {
257
+ const asset = { ...(await fetchAsset(deps, url)), fetchedAt: now().toISOString() };
258
+ writeAsset(deps.env, url, asset, deps.log);
259
+ return asset;
260
+ }
261
+ catch (err) {
262
+ if (kept)
263
+ return kept;
264
+ throw err;
265
+ }
266
+ }
267
+ /**
268
+ * `GET /api/market/asset?url=<a listing's file>` — a screenshot for the
269
+ * detail sheet. An SVG goes out only as the sanitiser re-wrote it.
270
+ */
271
+ export async function marketAssetRoute(deps, url) {
272
+ const target = marketAssetUrl(deps.env, url.searchParams.get('url'));
273
+ if (!target)
274
+ return { status: 400, body: { error: `Only a listing's own files, under ${MARKET_ASSET_PREFIX}, come through here.` } };
275
+ let asset;
276
+ try {
277
+ asset = await marketAsset(deps, target);
278
+ }
279
+ catch (err) {
280
+ deps.log(`market: fetching ${target.href} failed: ${reason(err)}`);
281
+ return { status: 502, body: { error: `buddi could not fetch that picture from withbuddi.com: ${reason(err)}` } };
282
+ }
283
+ if (asset.type === 'image/svg+xml') {
284
+ const svg = sanitizeIconSvg(asset.bytes.toString('utf8'));
285
+ if (svg === undefined)
286
+ return { status: 415, body: { error: 'That picture is not one buddi will draw.' } };
287
+ return { status: 200, bytes: Buffer.from(svg), type: asset.type };
288
+ }
289
+ return { status: 200, bytes: asset.bytes, type: asset.type };
290
+ }
291
+ /** A listing's icon, as markup the page may draw inline; `undefined` when there is none it will draw. */
292
+ async function iconSvgOf(deps, entry) {
293
+ const icon = entry.icon;
294
+ const url = typeof icon === 'string' ? marketAssetUrl(deps.env, icon) : undefined;
295
+ if (!url)
296
+ return undefined;
297
+ try {
298
+ const asset = await marketAsset(deps, url);
299
+ return asset.type === 'image/svg+xml' ? sanitizeIconSvg(asset.bytes.toString('utf8')) : undefined;
300
+ }
301
+ catch (err) {
302
+ deps.log(`market: the icon of "${entry.name}" was left out: ${reason(err)}`);
303
+ return undefined;
304
+ }
305
+ }
306
+ /**
307
+ * The index: the copy kept under an hour old, else fetched and kept. A fetch
308
+ * that fails with a copy on hand answers the copy, marked `stale`; with none,
309
+ * the sentence. Browse and first run's chapter 3 both read it here.
310
+ */
311
+ export async function loadMarketIndex(deps, opts = {}) {
312
+ const now = deps.now ?? (() => new Date());
313
+ const file = marketFile(deps.env);
314
+ let cached = memory.get(file) ?? readDisk(file);
315
+ if (cached !== undefined)
316
+ memory.set(file, cached);
317
+ const fresh = cached !== undefined && now().getTime() - Date.parse(cached.fetchedAt) < MARKET_TTL_MS;
318
+ let stale = false;
319
+ if (opts.refresh === true || !fresh) {
320
+ try {
321
+ const index = await fetchIndex(deps);
322
+ cached = { fetchedAt: now().toISOString(), index };
323
+ memory.set(file, cached);
324
+ writeDisk(file, cached, deps.log);
325
+ }
326
+ catch (err) {
327
+ const why = reason(err);
328
+ deps.log(`market: fetching the plugin list failed: ${why}`);
329
+ if (cached === undefined)
330
+ return { unavailable: `buddi could not reach withbuddi.com: ${why}` };
331
+ stale = true;
332
+ }
333
+ }
334
+ return { fetchedAt: cached.fetchedAt, stale, index: cached.index };
335
+ }
336
+ /** `GET /api/market[?refresh=1]`. */
337
+ export async function marketRoute(deps, url) {
338
+ const loaded = await loadMarketIndex(deps, { refresh: url.searchParams.get('refresh') === '1' });
339
+ if ('unavailable' in loaded)
340
+ return { status: 200, body: { plugins: [], unavailable: loaded.unavailable } };
341
+ const { plugins: record } = installedRecord(deps.env);
342
+ const listed = loaded.index.plugins;
343
+ const icons = await Promise.all(listed.map((entry) => iconSvgOf(deps, entry)));
344
+ return {
345
+ status: 200,
346
+ body: {
347
+ fetchedAt: loaded.fetchedAt,
348
+ ...(loaded.stale ? { stale: true } : {}),
349
+ plugins: annotateMarket(listed, record).map((entry, i) => icons[i] === undefined ? entry : { ...entry, iconSvg: icons[i] }),
350
+ },
351
+ };
352
+ }
353
+ //# sourceMappingURL=market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/web/market.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ export declare const WEB_ONBOARDING_SURFACE = "web";
10
10
  * asks, and the store's contract is that any string may be recorded. These are
11
11
  * what the page resumes from.
12
12
  */
13
- export declare const WEB_ONBOARDING_STEPS: readonly ["welcome", "you", "model", "browser", "agent", "hello", "extras"];
13
+ export declare const WEB_ONBOARDING_STEPS: readonly ["welcome", "you", "model", "take-on", "reach", "browser", "agent", "hello", "extras"];
14
14
  export type WebOnboardingStep = (typeof WEB_ONBOARDING_STEPS)[number];
15
15
  /**
16
16
  * What the owner's first agent may reach.
@@ -254,16 +254,30 @@ export declare function rebindBrain(deps: OnboardingDeps, account: {
254
254
  assistant: string | null;
255
255
  followed: string[];
256
256
  }>;
257
+ /** What the server can find out about the owner's surroundings for the hello; each answer optional. */
258
+ export interface FirstRunSurroundings {
259
+ /** The weather at home in one line, when the weather plugin is installed and answers. */
260
+ weatherAtHome?: () => Promise<string | null>;
261
+ /** Is a mailbox connected for Mail Triage to read? */
262
+ mailboxSet?: () => Promise<boolean>;
263
+ /** The plugins chapter 3 installed, by their titles. */
264
+ installed?: () => Promise<string[]>;
265
+ now?: () => Date;
266
+ }
267
+ /** How long the hello waits for any one of its facts. */
268
+ export declare const FIRST_RUN_FACT_MS = 3000;
257
269
  /**
258
- * The two facts the assistant should not have to ask for.
270
+ * What the assistant should not have to ask for, and what it can already say.
259
271
  *
260
272
  * The owner gave their name a minute ago and the assistant was named by them
261
- * in the same thread; a first message that opens with "what should I call
262
- * you?" is the installation forgetting, in front of the person who just told
263
- * it. The asks stay the page's words — they are the script — and this
264
- * puts what the *server* knows in front of them.
273
+ * in the same run; a first message that opens with "what should I call you?"
274
+ * is the installation forgetting, in front of the person who just told it.
275
+ * And since chapter 3 installed things, the hello can use them: the owner's
276
+ * clock, the weather at home when Weather is in and answers, and whether Mail
277
+ * Triage has a mailbox to read. The asks stay the page's words — they are the
278
+ * script — and this puts what the *server* knows in front of them.
265
279
  */
266
- export declare function withFirstRunFacts(deps: OnboardingDeps, instruction: string): Promise<string>;
280
+ export declare function withFirstRunFacts(deps: OnboardingDeps, instruction: string, around?: FirstRunSurroundings): Promise<string>;
267
281
  /**
268
282
  * Claim the one turn first run is allowed to send on the owner's behalf.
269
283
  *
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/web/onboarding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/web/onboarding.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,10 @@ export const WEB_ONBOARDING_STEPS = [
35
35
  'welcome',
36
36
  'you',
37
37
  'model',
38
+ // Chapter 3: what buddi takes on. Recorded by `POST /api/onboarding/take-on`.
39
+ 'take-on',
40
+ // Chapter 4: the phone, a mailbox, the app and the browser, each optional.
41
+ 'reach',
38
42
  // Never a gate: a missing browser is fixed later, from Computer & browser.
39
43
  'browser',
40
44
  'agent',
@@ -692,29 +696,75 @@ function settleThinking(deps, file, agentId, accountId) {
692
696
  }
693
697
  return true;
694
698
  }
699
+ /** An answer that is late is no answer: the hello does not wait on a slow plugin. */
700
+ async function inTime(work, ms) {
701
+ let timer;
702
+ try {
703
+ return await Promise.race([
704
+ work().catch(() => undefined),
705
+ new Promise((resolve) => { timer = setTimeout(() => resolve(undefined), ms); }),
706
+ ]);
707
+ }
708
+ finally {
709
+ if (timer)
710
+ clearTimeout(timer);
711
+ }
712
+ }
713
+ /** How long the hello waits for any one of its facts. */
714
+ export const FIRST_RUN_FACT_MS = 3_000;
695
715
  /**
696
- * The two facts the assistant should not have to ask for.
716
+ * What the assistant should not have to ask for, and what it can already say.
697
717
  *
698
718
  * The owner gave their name a minute ago and the assistant was named by them
699
- * in the same thread; a first message that opens with "what should I call
700
- * you?" is the installation forgetting, in front of the person who just told
701
- * it. The asks stay the page's words — they are the script — and this
702
- * puts what the *server* knows in front of them.
719
+ * in the same run; a first message that opens with "what should I call you?"
720
+ * is the installation forgetting, in front of the person who just told it.
721
+ * And since chapter 3 installed things, the hello can use them: the owner's
722
+ * clock, the weather at home when Weather is in and answers, and whether Mail
723
+ * Triage has a mailbox to read. The asks stay the page's words — they are the
724
+ * script — and this puts what the *server* knows in front of them.
703
725
  */
704
- export async function withFirstRunFacts(deps, instruction) {
726
+ export async function withFirstRunFacts(deps, instruction, around = {}) {
705
727
  const profile = await getOwnerProfile(deps.pool).catch(() => null);
728
+ const record = await getOnboarding(deps.pool).catch(() => null);
706
729
  const owner = profile?.preferredName?.trim() ?? '';
707
730
  const assistant = privateAgent(deps.catalog)?.name.trim() ?? '';
731
+ const zone = profile?.timezone?.trim() ?? '';
732
+ const tiles = record?.details.takeOn ?? [];
708
733
  const facts = [
709
734
  ...(owner === '' ? [] : [`The owner is called ${owner}.`]),
710
735
  ...(assistant === '' ? [] : [`You are ${assistant}.`]),
711
736
  ];
737
+ if (zone !== '') {
738
+ let time = '';
739
+ try {
740
+ time = new Intl.DateTimeFormat('en-GB', { hour: '2-digit', minute: '2-digit', timeZone: zone }).format((around.now ?? (() => new Date()))());
741
+ }
742
+ catch {
743
+ /* A zone the runtime does not know is still the owner's words. */
744
+ }
745
+ facts.push(`The owner's clock is ${zone}${time === '' ? '' : `; it is ${time} there now`}.`);
746
+ }
747
+ const installed = around.installed ? (await inTime(around.installed, FIRST_RUN_FACT_MS)) ?? [] : [];
748
+ if (installed.length > 0)
749
+ facts.push(`Installed for the owner during setup: ${installed.join(', ')}.`);
750
+ if (tiles.includes('days') && around.weatherAtHome) {
751
+ const weather = await inTime(around.weatherAtHome, FIRST_RUN_FACT_MS);
752
+ if (weather)
753
+ facts.push(`The weather at home right now: ${weather}.`);
754
+ }
755
+ if (tiles.includes('mail') && around.mailboxSet) {
756
+ const mailbox = await inTime(around.mailboxSet, FIRST_RUN_FACT_MS);
757
+ if (mailbox === true)
758
+ facts.push('A mailbox is connected, so Mail Triage can read new mail once it is introduced.');
759
+ else if (mailbox === false)
760
+ facts.push('No mailbox is connected yet; Mail Triage is waiting for one.');
761
+ }
712
762
  // The model is told the setup is behind it, because the alternative is an
713
763
  // assistant re-asking what the owner answered a minute ago. And it is told
714
- // where it is: a setup page with no composer, so a question would be one
715
- // the owner has no way to answer there.
764
+ // where it is: the end of setup, with suggested first questions under it,
765
+ // so a question of its own would compete with them.
716
766
  const settled = 'The setup is finished; do not ask about your name, the owner\'s name or onboarding. ' +
717
- 'This message is shown on a setup page where the owner cannot reply yet, so introduce yourself in two or three sentences and do not ask a question.';
767
+ 'This message is shown at the end of setup, above a few suggested first questions, so introduce yourself in two or three sentences, say what you already know and can do today, and do not ask a question.';
718
768
  return [...facts, instruction, settled].join(' ');
719
769
  }
720
770
  /**