@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
@@ -8,7 +8,7 @@
8
8
  * getting the normalization exactly right.
9
9
  */
10
10
  import { createReadStream } from 'node:fs';
11
- import { stat } from 'node:fs/promises';
11
+ import { readFile, stat } from 'node:fs/promises';
12
12
  import path from 'node:path';
13
13
  import { baseHeaders } from './http.js';
14
14
  const TYPES = {
@@ -86,4 +86,24 @@ async function isFile(file) {
86
86
  }
87
87
  /** What to say when nobody ran `pnpm -r build`. Owner-facing, plain text. */
88
88
  export const BUILD_MISSING = 'The dashboard has not been built yet. Run `pnpm -r build` (or `pnpm --filter @buddi/web build`) and reload.';
89
+ /**
90
+ * The shell on a path that is not the root (`/connections/callback`). The
91
+ * build references its assets relatively (`./assets/…`, so the same build
92
+ * serves under any prefix), which on a nested path resolves to
93
+ * `/connections/assets/…` and a blank page. A `<base href="/">` puts every
94
+ * relative address back on the root the dashboard is served from.
95
+ */
96
+ export async function serveShellAtRoot(res, assetsDir) {
97
+ const index = path.resolve(assetsDir, 'index.html');
98
+ if (!(await isFile(index)))
99
+ return { served: false, missing: true };
100
+ const raw = await readFile(index, 'utf8');
101
+ const tag = '<base href="/" />';
102
+ const html = /<head>/i.test(raw)
103
+ ? raw.replace(/<head>/i, `<head>\n ${tag}`)
104
+ : raw.replace(/^(\s*<!doctype[^>]*>)?/i, (doctype) => `${doctype}${tag}`);
105
+ res.writeHead(200, { ...baseHeaders(), 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' });
106
+ res.end(html);
107
+ return { served: true };
108
+ }
89
109
  //# sourceMappingURL=static.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/web/static.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/web/static.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * A market icon, made safe to put in the page as markup.
3
+ *
4
+ * The icon is drawn inline so it takes the colour of the tile it sits in
5
+ * (`currentColor`), which an `<img>` cannot do. Inline markup from the
6
+ * internet is a script waiting to happen, so this is an allowlist, not a
7
+ * filter: the input is tokenised, and what comes out is re-written from the
8
+ * tokens using only simple shape elements and the presentation attributes a
9
+ * line icon needs. Anything else in the element tree — a `<script>`, a
10
+ * `<style>`, a `<use>`, an `<image>`, text, an entity, a doctype — and the
11
+ * whole icon is refused (`undefined`), because an icon that needed one of
12
+ * them would not draw right without it anyway. An attribute that is not on
13
+ * the list, or whose value is more than numbers, colours and path letters,
14
+ * is dropped on its own.
15
+ */
16
+ /** Past this, it is not an icon. */
17
+ export declare const MAX_ICON_BYTES: number;
18
+ /**
19
+ * The icon re-written from its allowed parts, or `undefined` when it is not
20
+ * an icon this page will draw.
21
+ */
22
+ export declare function sanitizeIconSvg(input: string): string | undefined;
23
+ //# sourceMappingURL=svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/web/svg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiCH,oCAAoC;AACpC,eAAO,MAAM,cAAc,QAAY,CAAC;AAsBxC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA2CjE"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * A market icon, made safe to put in the page as markup.
3
+ *
4
+ * The icon is drawn inline so it takes the colour of the tile it sits in
5
+ * (`currentColor`), which an `<img>` cannot do. Inline markup from the
6
+ * internet is a script waiting to happen, so this is an allowlist, not a
7
+ * filter: the input is tokenised, and what comes out is re-written from the
8
+ * tokens using only simple shape elements and the presentation attributes a
9
+ * line icon needs. Anything else in the element tree — a `<script>`, a
10
+ * `<style>`, a `<use>`, an `<image>`, text, an entity, a doctype — and the
11
+ * whole icon is refused (`undefined`), because an icon that needed one of
12
+ * them would not draw right without it anyway. An attribute that is not on
13
+ * the list, or whose value is more than numbers, colours and path letters,
14
+ * is dropped on its own.
15
+ */
16
+ /** The elements a line icon is made of. */
17
+ const ELEMENTS = new Set(['svg', 'g', 'path', 'rect', 'circle', 'line', 'polyline', 'polygon']);
18
+ /**
19
+ * The attributes kept. `x1`…`y2` and `ry` go with `line` and `rect`, which
20
+ * are on the element list and draw nothing without them.
21
+ */
22
+ const ATTRIBUTES = new Set([
23
+ 'viewBox',
24
+ 'd',
25
+ 'x',
26
+ 'y',
27
+ 'x1',
28
+ 'y1',
29
+ 'x2',
30
+ 'y2',
31
+ 'width',
32
+ 'height',
33
+ 'rx',
34
+ 'ry',
35
+ 'r',
36
+ 'cx',
37
+ 'cy',
38
+ 'points',
39
+ 'stroke',
40
+ 'fill',
41
+ ]);
42
+ /** Numbers, path letters, `#hex`, `currentColor`, `none`, percentages: never a `url(`, a colon, a quote or an entity. */
43
+ const VALUE = /^[A-Za-z0-9#.,\s%+-]*$/;
44
+ /** Past this, it is not an icon. */
45
+ export const MAX_ICON_BYTES = 16 * 1024;
46
+ const TAG = /<(\/?)([A-Za-z][\w:-]*)((?:\s+[^\s=/>]+(?:\s*=\s*(?:"[^"]*"|'[^']*'))?)*)\s*(\/?)>/y;
47
+ const ATTR = /([^\s=/>]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'))?/g;
48
+ function keepAttribute(name) {
49
+ return ATTRIBUTES.has(name) || /^stroke-[a-z-]+$/.test(name);
50
+ }
51
+ function attributesOf(raw) {
52
+ const kept = [];
53
+ const seen = new Set();
54
+ for (const match of raw.matchAll(ATTR)) {
55
+ const name = match[1];
56
+ const value = match[2] ?? match[3];
57
+ if (value === undefined || seen.has(name) || !keepAttribute(name) || !VALUE.test(value))
58
+ continue;
59
+ seen.add(name);
60
+ kept.push(`${name}="${value.trim()}"`);
61
+ }
62
+ return kept.length === 0 ? '' : ` ${kept.join(' ')}`;
63
+ }
64
+ /**
65
+ * The icon re-written from its allowed parts, or `undefined` when it is not
66
+ * an icon this page will draw.
67
+ */
68
+ export function sanitizeIconSvg(input) {
69
+ if (input.length > MAX_ICON_BYTES)
70
+ return undefined;
71
+ // An XML prolog and comments carry nothing an icon needs; anything else that
72
+ // is not a tag (a doctype, CDATA, a processing instruction) refuses it below.
73
+ const text = input.replace(/^/, '').replace(/^\s*<\?xml[^>]*\?>/, '').replace(/<!--[\s\S]*?-->/g, '');
74
+ const out = [];
75
+ const open = [];
76
+ let at = 0;
77
+ let closedRoot = false;
78
+ while (at < text.length) {
79
+ const next = text.indexOf('<', at);
80
+ const between = next === -1 ? text.slice(at) : text.slice(at, next);
81
+ // Text between tags is whitespace or it is not an icon.
82
+ if (between.trim() !== '')
83
+ return undefined;
84
+ if (next === -1)
85
+ break;
86
+ if (closedRoot)
87
+ return undefined;
88
+ TAG.lastIndex = next;
89
+ const tag = TAG.exec(text);
90
+ if (!tag)
91
+ return undefined;
92
+ at = TAG.lastIndex;
93
+ const [, closing, rawName, rawAttrs, selfClosing] = tag;
94
+ const name = rawName;
95
+ if (!ELEMENTS.has(name))
96
+ return undefined;
97
+ if (open.length === 0 && (closing || name !== 'svg'))
98
+ return undefined;
99
+ if (open.length > 0 && !closing && name === 'svg')
100
+ return undefined;
101
+ if (closing) {
102
+ if (open.pop() !== name)
103
+ return undefined;
104
+ out.push(`</${name}>`);
105
+ if (open.length === 0)
106
+ closedRoot = true;
107
+ continue;
108
+ }
109
+ const attrs = attributesOf(rawAttrs);
110
+ const head = name === 'svg' ? `<svg xmlns="http://www.w3.org/2000/svg"${attrs}` : `<${name}${attrs}`;
111
+ if (selfClosing) {
112
+ out.push(`${head}/>`);
113
+ if (name === 'svg')
114
+ closedRoot = true;
115
+ }
116
+ else {
117
+ out.push(`${head}>`);
118
+ open.push(name);
119
+ }
120
+ }
121
+ if (open.length > 0 || !closedRoot)
122
+ return undefined;
123
+ return out.join('');
124
+ }
125
+ //# sourceMappingURL=svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/web/svg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { type Queryable } from '@buddi/core';
2
+ import type { LiveRegistry } from '../plugins/live.js';
3
+ import { type MarketDeps, type MarketEntry } from './market.js';
4
+ import { type PluginsEngine } from './plugins.js';
5
+ /** The six outcomes, in the order the chapter draws them. */
6
+ export declare const TAKE_ON_TILES: readonly ["days", "mail", "money", "voice", "code", "pictures"];
7
+ export type TakeOnTile = (typeof TAKE_ON_TILES)[number];
8
+ /**
9
+ * The plugins each outcome brings, by their buddi names. Mail and code bring
10
+ * none: Mail Triage and the developer tools are built in.
11
+ */
12
+ export declare const TILE_PLUGINS: Readonly<Record<TakeOnTile, readonly string[]>>;
13
+ /** The teammate an outcome suggests, as an offer; `plugin` is who proposes it. */
14
+ export declare const TILE_TEAMMATES: Readonly<Partial<Record<TakeOnTile, {
15
+ agent: string;
16
+ name: string;
17
+ plugin: string;
18
+ }>>>;
19
+ export type TakeOnState = 'fetching' | 'reading' | 'installing' | 'ready' | 'failed';
20
+ /** One plugin of chapter 3, as the page draws it. */
21
+ export interface TakeOnProgress {
22
+ plugin: string;
23
+ title: string;
24
+ /** The plugin job, when one was started in this process. */
25
+ jobId?: string;
26
+ state: TakeOnState;
27
+ /** Why it failed, in a sentence the owner can read. */
28
+ reason?: string;
29
+ /** Installed, but this process could not load it live: it wakes up on the next restart. */
30
+ wakesOnRestart?: boolean;
31
+ }
32
+ export interface TakeOnView {
33
+ tiles: string[];
34
+ plugins: TakeOnProgress[];
35
+ /** Something is still being fetched, read or installed: the page keeps asking. */
36
+ running: boolean;
37
+ /** "Things still waiting", one sentence each, for the handover card. */
38
+ waiting: string[];
39
+ }
40
+ /** The engine as this module uses it; tests hand in one with a fake npm. */
41
+ export type TakeOnEngine = Pick<PluginsEngine, 'stagePlugin' | 'approveStaged' | 'rejectStaged'> & Partial<Pick<PluginsEngine, 'setPluginEnabled'>>;
42
+ export interface TakeOnDeps {
43
+ pool: Queryable;
44
+ env: NodeJS.ProcessEnv;
45
+ log: (line: string) => void;
46
+ engine?: TakeOnEngine | undefined;
47
+ /** The running registry, so an installed plugin loads without a restart. */
48
+ registry?: LiveRegistry | undefined;
49
+ /** Injected by tests that want no socket; the market module's own otherwise. */
50
+ fetch?: MarketDeps['fetch'];
51
+ /** Is a mailbox connected? The email plugin's own `triage_offer` read. */
52
+ mailboxSet?: () => Promise<boolean>;
53
+ /** The agents the roster holds, for "ready to be introduced". */
54
+ agentIds?: () => string[];
55
+ }
56
+ export declare class TakeOnRefusal extends Error {
57
+ readonly status: number;
58
+ constructor(status: number, message: string);
59
+ }
60
+ /** For tests: forget what this process was doing. */
61
+ export declare function resetTakeOn(): void;
62
+ /** For tests: wait for the installs under way to settle. */
63
+ export declare function takeOnSettled(): Promise<void>;
64
+ /** The tiles as sent, checked: known names, each once, in the chapter's order. */
65
+ export declare function parseTiles(value: unknown): TakeOnTile[];
66
+ /** The plugins the tiles bring, each once. */
67
+ export declare function pluginsOf(tiles: readonly string[]): string[];
68
+ /**
69
+ * `POST /api/onboarding/take-on`: record the choice and start the installs.
70
+ *
71
+ * Answers at once. A plugin already installed is ready with no job; one
72
+ * already being installed keeps its job; everything else gets a new one, and
73
+ * the whole list runs behind this answer, one plugin after the other.
74
+ */
75
+ export declare function startTakeOn(deps: TakeOnDeps, value: unknown): Promise<{
76
+ jobs: Array<{
77
+ plugin: string;
78
+ jobId: string;
79
+ }>;
80
+ }>;
81
+ /**
82
+ * Why buddi may not approve this listing on the owner's behalf, or null when it may.
83
+ *
84
+ * Only a By-buddi listing, and only one that names the integrity the market
85
+ * checked. Anything else — a reviewed listing, a listing with no hash — is
86
+ * left for the owner to read on its card in Settings → Plugins.
87
+ */
88
+ export declare function autoApprovalRefusal(listing: MarketEntry | undefined): string | null;
89
+ /** `GET /api/onboarding/take-on`: the choice, the progress, and what is still waiting. */
90
+ export declare function readTakeOn(deps: TakeOnDeps): Promise<TakeOnView>;
91
+ //# sourceMappingURL=take-on.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"take-on.d.ts","sourceRoot":"","sources":["../../src/web/take-on.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,287 @@
1
+ import { beginOnboarding, getOnboarding, markStepDone, setOnboardingDetails } from '@buddi/core';
2
+ import { loadMarketIndex } from './market.js';
3
+ import { installedRecord, startJob } from './plugins.js';
4
+ import * as engine from '../plugins/index.js';
5
+ /** The six outcomes, in the order the chapter draws them. */
6
+ export const TAKE_ON_TILES = ['days', 'mail', 'money', 'voice', 'code', 'pictures'];
7
+ /**
8
+ * The plugins each outcome brings, by their buddi names. Mail and code bring
9
+ * none: Mail Triage and the developer tools are built in.
10
+ */
11
+ export const TILE_PLUGINS = {
12
+ days: ['weather', 'calendar'],
13
+ mail: [],
14
+ money: ['finance'],
15
+ voice: ['speech'],
16
+ code: [],
17
+ pictures: ['image'],
18
+ };
19
+ /** The teammate an outcome suggests, as an offer; `plugin` is who proposes it. */
20
+ export const TILE_TEAMMATES = {
21
+ days: { agent: 'planner', name: 'Planner', plugin: 'buddi' },
22
+ mail: { agent: 'mail-triage', name: 'Mail Triage', plugin: 'email' },
23
+ money: { agent: 'ledger', name: 'Ledger', plugin: 'finance' },
24
+ pictures: { agent: 'illustrator', name: 'Illustrator', plugin: 'image' },
25
+ };
26
+ /** What a plugin is called on the page when the listing names nothing better. */
27
+ const TITLES = {
28
+ weather: 'Weather',
29
+ calendar: 'Calendar',
30
+ finance: 'Finance',
31
+ speech: 'Speech',
32
+ image: 'Image',
33
+ };
34
+ export class TakeOnRefusal extends Error {
35
+ status;
36
+ constructor(status, message) {
37
+ super(message);
38
+ this.status = status;
39
+ this.name = 'TakeOnRefusal';
40
+ }
41
+ }
42
+ /** Per plugin, this process. A restart forgets it; the record of installs does not. */
43
+ const PROGRESS = new Map();
44
+ /** One run at a time: installs are fetched and approved one after the other. */
45
+ let queue = Promise.resolve();
46
+ /** For tests: forget what this process was doing. */
47
+ export function resetTakeOn() {
48
+ PROGRESS.clear();
49
+ queue = Promise.resolve();
50
+ }
51
+ /** For tests: wait for the installs under way to settle. */
52
+ export function takeOnSettled() {
53
+ return queue;
54
+ }
55
+ /** The tiles as sent, checked: known names, each once, in the chapter's order. */
56
+ export function parseTiles(value) {
57
+ if (!Array.isArray(value) || value.some((tile) => typeof tile !== 'string')) {
58
+ throw new TakeOnRefusal(400, '`tiles` must be a list of the outcomes to take on (an empty list is fine).');
59
+ }
60
+ const unknown = value.filter((tile) => !TAKE_ON_TILES.includes(tile));
61
+ if (unknown.length > 0) {
62
+ throw new TakeOnRefusal(400, `Not an outcome buddi knows: ${unknown.join(', ')}. The six are ${TAKE_ON_TILES.join(', ')}.`);
63
+ }
64
+ return TAKE_ON_TILES.filter((tile) => value.includes(tile));
65
+ }
66
+ /** The plugins the tiles bring, each once. */
67
+ export function pluginsOf(tiles) {
68
+ return [...new Set(tiles.flatMap((tile) => TILE_PLUGINS[tile] ?? []))];
69
+ }
70
+ function isInstalled(env, plugin) {
71
+ return installedRecord(env).plugins.some((entry) => entry.name === plugin);
72
+ }
73
+ function running(progress) {
74
+ return progress !== undefined && progress.state !== 'ready' && progress.state !== 'failed';
75
+ }
76
+ /**
77
+ * `POST /api/onboarding/take-on`: record the choice and start the installs.
78
+ *
79
+ * Answers at once. A plugin already installed is ready with no job; one
80
+ * already being installed keeps its job; everything else gets a new one, and
81
+ * the whole list runs behind this answer, one plugin after the other.
82
+ */
83
+ export async function startTakeOn(deps, value) {
84
+ const tiles = parseTiles(value);
85
+ await beginOnboarding(deps.pool, 'web');
86
+ await markStepDone(deps.pool, 'take-on');
87
+ await setOnboardingDetails(deps.pool, { takeOn: tiles });
88
+ const jobs = [];
89
+ const toRun = [];
90
+ for (const plugin of pluginsOf(tiles)) {
91
+ const now = PROGRESS.get(plugin);
92
+ if (running(now) && now?.jobId) {
93
+ jobs.push({ plugin, jobId: now.jobId });
94
+ continue;
95
+ }
96
+ if (isInstalled(deps.env, plugin)) {
97
+ PROGRESS.set(plugin, { plugin, title: now?.title ?? TITLES[plugin] ?? plugin, state: 'ready', ...(now?.wakesOnRestart ? { wakesOnRestart: true } : {}) });
98
+ continue;
99
+ }
100
+ const job = startJob('stage');
101
+ PROGRESS.set(plugin, { plugin, title: TITLES[plugin] ?? plugin, jobId: job.id, state: 'fetching' });
102
+ jobs.push({ plugin, jobId: job.id });
103
+ toRun.push({ plugin, job });
104
+ }
105
+ if (toRun.length > 0) {
106
+ queue = queue.then(() => runAll(deps, toRun)).catch((err) => {
107
+ deps.log(`first run: taking plugins on failed: ${err instanceof Error ? err.message : String(err)}`);
108
+ });
109
+ }
110
+ return { jobs };
111
+ }
112
+ async function runAll(deps, list) {
113
+ const loaded = await loadMarketIndex({ env: deps.env, log: deps.log, ...(deps.fetch ? { fetch: deps.fetch } : {}) });
114
+ for (const { plugin, job } of list) {
115
+ if ('unavailable' in loaded) {
116
+ fail(deps, plugin, job, 'withbuddi.com did not answer. Settings → Plugins can fetch it later');
117
+ continue;
118
+ }
119
+ const listing = loaded.index.plugins.find((entry) => entry.name === plugin);
120
+ try {
121
+ await installOne(deps, plugin, listing, job);
122
+ }
123
+ catch (err) {
124
+ fail(deps, plugin, job, err instanceof Error ? err.message : String(err));
125
+ }
126
+ }
127
+ }
128
+ function set(plugin, patch) {
129
+ const now = PROGRESS.get(plugin);
130
+ if (now)
131
+ PROGRESS.set(plugin, { ...now, ...patch });
132
+ }
133
+ function fail(deps, plugin, job, reason) {
134
+ const sentence = reason.replace(/[.\s]+$/, '');
135
+ set(plugin, { state: 'failed', reason: sentence });
136
+ job.phase = 'failed';
137
+ job.error = sentence;
138
+ job.finishedAt = new Date().toISOString();
139
+ deps.log(`first run: ${plugin} was not installed: ${sentence}`);
140
+ }
141
+ /**
142
+ * Why buddi may not approve this listing on the owner's behalf, or null when it may.
143
+ *
144
+ * Only a By-buddi listing, and only one that names the integrity the market
145
+ * checked. Anything else — a reviewed listing, a listing with no hash — is
146
+ * left for the owner to read on its card in Settings → Plugins.
147
+ */
148
+ export function autoApprovalRefusal(listing) {
149
+ if (!listing)
150
+ return 'withbuddi.com does not list it. Settings → Plugins can add it later';
151
+ if (listing.trust !== 'by-buddi')
152
+ return `${listing.title} is not made by buddi, so it waits for you to read its card in Settings → Plugins`;
153
+ const integrity = listing.integrity;
154
+ if (typeof integrity !== 'string' || integrity.trim() === '') {
155
+ return `withbuddi.com lists ${listing.title} without its hash, so it waits for you in Settings → Plugins`;
156
+ }
157
+ return null;
158
+ }
159
+ async function installOne(deps, plugin, listing, job) {
160
+ const api = deps.engine ?? engine;
161
+ const refused = autoApprovalRefusal(listing);
162
+ if (refused !== null || !listing) {
163
+ fail(deps, plugin, job, refused ?? 'withbuddi.com does not list it');
164
+ return;
165
+ }
166
+ set(plugin, { title: listing.title });
167
+ const listed = String(listing.integrity).trim();
168
+ const onPhase = (phase) => {
169
+ if (job.finishedAt === undefined)
170
+ job.phase = phase;
171
+ set(plugin, { state: phase === 'reading' ? 'reading' : 'fetching' });
172
+ };
173
+ const staged = await api.stagePlugin(`${listing.npm}@${listing.version}`, { env: deps.env, onPhase });
174
+ job.stagedId = staged.id;
175
+ /*
176
+ * The one place an approval is not the owner's click.
177
+ *
178
+ * Everywhere else, approving a staged plugin is the owner reading its card
179
+ * and sending back the integrity they were shown. Here the owner ticked "My
180
+ * days" on first run, before there is a dashboard to read a card on, and
181
+ * asked buddi to take it on. buddi approves on their behalf only what it
182
+ * made itself: a listing marked By-buddi, whose integrity and npm provenance
183
+ * withbuddi.com checked when it published the index, and only when the
184
+ * tarball that arrived hashes to exactly the integrity that listing names.
185
+ * Anything else — another author, a listing without a hash, bytes that do
186
+ * not match — is refused here and waits on its card like any install. The
187
+ * staged card and its approval are still written, so Settings → Plugins
188
+ * shows the plugin installed with its hash, and the second approval (the
189
+ * package's prose disagreeing with its manifest) is never given for them.
190
+ */
191
+ if (staged.integrity.trim() === '' || staged.integrity.trim() !== listed) {
192
+ try {
193
+ api.rejectStaged(staged.id, deps.env);
194
+ }
195
+ catch {
196
+ /* The stage is swept later either way. */
197
+ }
198
+ fail(deps, plugin, job, `what arrived for ${listing.title} is not what withbuddi.com lists, so it was not installed`);
199
+ return;
200
+ }
201
+ set(plugin, { state: 'installing' });
202
+ const outcome = await api.approveStaged(staged.id, {
203
+ integrity: staged.integrity,
204
+ env: deps.env,
205
+ ...(deps.pool && typeof deps.pool.connect === 'function' ? { pool: deps.pool } : {}),
206
+ });
207
+ if (outcome.kind === 'drift') {
208
+ fail(deps, plugin, job, `${listing.title} says something its code does not match, so it waits for you in Settings → Plugins`);
209
+ return;
210
+ }
211
+ job.phase = 'done';
212
+ job.finishedAt = new Date().toISOString();
213
+ // Live, through the same path the Plugins page's enable switch takes, so the
214
+ // hello can already use it. Anything short of that is said, not hidden.
215
+ let wakesOnRestart = true;
216
+ if (api.setPluginEnabled && deps.registry) {
217
+ try {
218
+ const toggled = await api.setPluginEnabled(outcome.record.name, true, {
219
+ env: deps.env,
220
+ log: deps.log,
221
+ registry: deps.registry,
222
+ ...(deps.pool && typeof deps.pool.connect === 'function' ? { pool: deps.pool } : {}),
223
+ });
224
+ wakesOnRestart = toggled.restartNeeded || toggled.loadProblem !== undefined;
225
+ }
226
+ catch (err) {
227
+ deps.log(`first run: ${plugin} is installed but did not load live: ${err instanceof Error ? err.message : String(err)}`);
228
+ }
229
+ }
230
+ set(plugin, { state: 'ready', ...(wakesOnRestart ? { wakesOnRestart: true } : {}) });
231
+ }
232
+ /** `GET /api/onboarding/take-on`: the choice, the progress, and what is still waiting. */
233
+ export async function readTakeOn(deps) {
234
+ const record = await getOnboarding(deps.pool);
235
+ const tiles = record.details.takeOn ?? [];
236
+ const plugins = pluginsOf(tiles).map((plugin) => {
237
+ const known = PROGRESS.get(plugin);
238
+ if (known && known.state !== 'failed')
239
+ return known;
240
+ if (isInstalled(deps.env, plugin))
241
+ return { plugin, title: known?.title ?? TITLES[plugin] ?? plugin, state: 'ready' };
242
+ return known ?? { plugin, title: TITLES[plugin] ?? plugin, state: 'failed', reason: 'buddi restarted before it finished. Settings → Plugins can fetch it' };
243
+ });
244
+ return {
245
+ tiles,
246
+ plugins,
247
+ running: plugins.some((p) => running(p)),
248
+ waiting: await waitingFor(deps, tiles, plugins),
249
+ };
250
+ }
251
+ /**
252
+ * "Things still waiting": exactly what chapters 3 and 4 left open, one
253
+ * sentence each, in the order the owner would deal with them.
254
+ */
255
+ async function waitingFor(deps, tiles, plugins) {
256
+ const waiting = [];
257
+ const present = new Set((deps.agentIds?.() ?? []).map((id) => id.toLowerCase()));
258
+ const state = (plugin) => plugins.find((p) => p.plugin === plugin);
259
+ let mailbox;
260
+ if (tiles.includes('mail')) {
261
+ mailbox = deps.mailboxSet ? await deps.mailboxSet().catch(() => false) : false;
262
+ if (!mailbox)
263
+ waiting.push('Mail Triage is waiting for a mailbox');
264
+ }
265
+ if (tiles.includes('days') && state('calendar')?.state !== 'failed') {
266
+ waiting.push('Calendar wants your calendar’s private link');
267
+ }
268
+ for (const p of plugins) {
269
+ if (p.state === 'failed')
270
+ waiting.push(`${p.title} did not install: ${p.reason ?? 'no reason was given'}`);
271
+ else if (p.state === 'ready' && p.wakesOnRestart)
272
+ waiting.push(`${p.title} is installed; it wakes up on the next restart`);
273
+ }
274
+ for (const tile of TAKE_ON_TILES) {
275
+ const mate = TILE_TEAMMATES[tile];
276
+ if (!mate || !tiles.includes(tile) || present.has(mate.agent))
277
+ continue;
278
+ // Mail Triage waits for a mailbox first; a plugin's teammate waits for its plugin.
279
+ if (tile === 'mail' && !mailbox)
280
+ continue;
281
+ if (mate.plugin !== 'buddi' && mate.plugin !== 'email' && state(mate.plugin)?.state !== 'ready')
282
+ continue;
283
+ waiting.push(`${mate.name} is ready to be introduced`);
284
+ }
285
+ return waiting;
286
+ }
287
+ //# sourceMappingURL=take-on.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"take-on.js","sourceRoot":"","sources":["../../src/web/take-on.ts"],"names":[],"mappings":"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"}