@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.
- package/README.md +66 -50
- package/extension/background.js +24 -1
- package/extension/blob.png +0 -0
- package/extension/fonts/dm-mono-latin-400-normal.woff2 +0 -0
- package/extension/fonts/dm-mono-latin-500-normal.woff2 +0 -0
- package/extension/fonts/dm-sans-latin-ext-standard-normal.woff2 +0 -0
- package/extension/fonts/dm-sans-latin-standard-normal.woff2 +0 -0
- package/extension/icons/128.png +0 -0
- package/extension/icons/16.png +0 -0
- package/extension/icons/32.png +0 -0
- package/extension/icons/48.png +0 -0
- package/extension/manifest.json +4 -3
- package/extension/popup.css +199 -81
- package/extension/popup.html +39 -17
- package/extension/popup.js +133 -37
- package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/cli/dist/args.d.ts +59 -0
- package/node_modules/@buddi/cli/dist/args.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/args.js +141 -0
- package/node_modules/@buddi/cli/dist/args.js.map +1 -1
- package/node_modules/@buddi/cli/dist/commands.d.ts +2 -0
- package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/commands.js +83 -3
- package/node_modules/@buddi/cli/dist/commands.js.map +1 -1
- package/node_modules/@buddi/cli/dist/connections-cmd.d.ts +93 -0
- package/node_modules/@buddi/cli/dist/connections-cmd.d.ts.map +1 -0
- package/node_modules/@buddi/cli/dist/connections-cmd.js +657 -0
- package/node_modules/@buddi/cli/dist/connections-cmd.js.map +1 -0
- package/node_modules/@buddi/cli/dist/doctor-probes.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor-probes.js +53 -9
- package/node_modules/@buddi/cli/dist/doctor-probes.js.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor.d.ts +1 -8
- package/node_modules/@buddi/cli/dist/doctor.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor.js +1 -15
- package/node_modules/@buddi/cli/dist/doctor.js.map +1 -1
- package/node_modules/@buddi/cli/dist/init-plan.d.ts +1 -2
- package/node_modules/@buddi/cli/dist/init-plan.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/init-plan.js +2 -6
- package/node_modules/@buddi/cli/dist/init-plan.js.map +1 -1
- package/node_modules/@buddi/cli/dist/init.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/init.js +5 -29
- package/node_modules/@buddi/cli/dist/init.js.map +1 -1
- package/node_modules/@buddi/cli/dist/main.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/main.js +12 -2
- package/node_modules/@buddi/cli/dist/main.js.map +1 -1
- package/node_modules/@buddi/cli/dist/mcp/gateway-client.d.ts +5 -0
- package/node_modules/@buddi/cli/dist/mcp/gateway-client.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/mcp/gateway-client.js +15 -4
- package/node_modules/@buddi/cli/dist/mcp/gateway-client.js.map +1 -1
- package/node_modules/@buddi/cli/dist/plugins-toggle.d.ts +9 -0
- package/node_modules/@buddi/cli/dist/plugins-toggle.d.ts.map +1 -0
- package/node_modules/@buddi/cli/dist/plugins-toggle.js +20 -0
- package/node_modules/@buddi/cli/dist/plugins-toggle.js.map +1 -0
- package/node_modules/@buddi/cli/dist/service/index.d.ts +4 -2
- package/node_modules/@buddi/cli/dist/service/index.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/service/index.js +5 -7
- package/node_modules/@buddi/cli/dist/service/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/core/dist/agents/provider-from-env.d.ts +7 -6
- package/node_modules/@buddi/core/dist/agents/provider-from-env.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/agents/provider-from-env.js +9 -12
- package/node_modules/@buddi/core/dist/agents/provider-from-env.js.map +1 -1
- package/node_modules/@buddi/core/dist/backup/load.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/backup/load.js +37 -0
- package/node_modules/@buddi/core/dist/backup/load.js.map +1 -1
- package/node_modules/@buddi/core/dist/backup/restore.js +2 -2
- package/node_modules/@buddi/core/dist/backup/restore.js.map +1 -1
- package/node_modules/@buddi/core/dist/connection-config.d.ts +96 -0
- package/node_modules/@buddi/core/dist/connection-config.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/connection-config.js +308 -0
- package/node_modules/@buddi/core/dist/connection-config.js.map +1 -0
- package/node_modules/@buddi/core/dist/failures/owner-message.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/failures/owner-message.js +37 -10
- package/node_modules/@buddi/core/dist/failures/owner-message.js.map +1 -1
- package/node_modules/@buddi/core/dist/host/build.d.ts +7 -0
- package/node_modules/@buddi/core/dist/host/build.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/host/build.js +14 -1
- package/node_modules/@buddi/core/dist/host/build.js.map +1 -1
- package/node_modules/@buddi/core/dist/onboarding/store.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/onboarding/store.js +17 -1
- package/node_modules/@buddi/core/dist/onboarding/store.js.map +1 -1
- package/node_modules/@buddi/core/dist/onboarding/types.d.ts +14 -0
- package/node_modules/@buddi/core/dist/onboarding/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/provider-accounts.d.ts +21 -1
- package/node_modules/@buddi/core/dist/provider-accounts.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/provider-accounts.js +31 -1
- package/node_modules/@buddi/core/dist/provider-accounts.js.map +1 -1
- package/node_modules/@buddi/core/dist/provider.d.ts +4 -3
- package/node_modules/@buddi/core/dist/provider.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/provider.js +7 -4
- package/node_modules/@buddi/core/dist/provider.js.map +1 -1
- package/node_modules/@buddi/core/dist/registry.d.ts +9 -0
- package/node_modules/@buddi/core/dist/registry.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/registry.js +32 -2
- package/node_modules/@buddi/core/dist/registry.js.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/destinations.d.ts +2 -0
- package/node_modules/@buddi/core/dist/secrets/destinations.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/destinations.js +6 -0
- package/node_modules/@buddi/core/dist/secrets/destinations.js.map +1 -1
- package/node_modules/@buddi/core/dist/testing/accounts.d.ts +12 -0
- package/node_modules/@buddi/core/dist/testing/accounts.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/testing/accounts.js +7 -0
- package/node_modules/@buddi/core/dist/testing/accounts.js.map +1 -0
- package/node_modules/@buddi/core/dist/testing/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/testing/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/testing/index.js +1 -0
- package/node_modules/@buddi/core/dist/testing/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/vault/resolve.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/vault/resolve.js +0 -2
- package/node_modules/@buddi/core/dist/vault/resolve.js.map +1 -1
- package/node_modules/@buddi/core/migrations/053_drop_legacy_anthropic_env.sql +31 -0
- package/node_modules/@buddi/core/package.json +4 -0
- package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/gateway/dist/agents/catalog.d.ts +3 -2
- package/node_modules/@buddi/gateway/dist/agents/catalog.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/catalog.js +3 -2
- package/node_modules/@buddi/gateway/dist/agents/catalog.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents-cli.js +1 -1
- package/node_modules/@buddi/gateway/dist/agents-cli.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/bootstrap.d.ts +1 -3
- package/node_modules/@buddi/gateway/dist/bootstrap.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/bootstrap.js +13 -8
- package/node_modules/@buddi/gateway/dist/bootstrap.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/cli.js +1 -1
- package/node_modules/@buddi/gateway/dist/index.d.ts +1 -1
- package/node_modules/@buddi/gateway/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/index.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/mlxh.d.ts +44 -0
- package/node_modules/@buddi/gateway/dist/mlxh.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/mlxh.js +98 -0
- package/node_modules/@buddi/gateway/dist/mlxh.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/owner-secrets.d.ts +21 -1
- package/node_modules/@buddi/gateway/dist/owner-secrets.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/owner-secrets.js +96 -2
- package/node_modules/@buddi/gateway/dist/owner-secrets.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/live.d.ts +42 -0
- package/node_modules/@buddi/gateway/dist/plugins/live.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/plugins/live.js +81 -0
- package/node_modules/@buddi/gateway/dist/plugins/live.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/plugins/stage.d.ts +4 -0
- package/node_modules/@buddi/gateway/dist/plugins/stage.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/stage.js +3 -0
- package/node_modules/@buddi/gateway/dist/plugins/stage.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/toggle.d.ts +18 -2
- package/node_modules/@buddi/gateway/dist/plugins/toggle.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/toggle.js +36 -12
- package/node_modules/@buddi/gateway/dist/plugins/toggle.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/update.d.ts +8 -0
- package/node_modules/@buddi/gateway/dist/plugins/update.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/update.js +8 -2
- package/node_modules/@buddi/gateway/dist/plugins/update.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts +44 -5
- package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins-cli.js +177 -20
- package/node_modules/@buddi/gateway/dist/plugins-cli.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/provider-accounts.d.ts +6 -13
- package/node_modules/@buddi/gateway/dist/provider-accounts.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/provider-accounts.js +76 -16
- package/node_modules/@buddi/gateway/dist/provider-accounts.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/providers.d.ts +3 -3
- package/node_modules/@buddi/gateway/dist/providers.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/providers.js +7 -7
- package/node_modules/@buddi/gateway/dist/providers.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/serve.js +2 -0
- package/node_modules/@buddi/gateway/dist/serve.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/context-budget.d.ts +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/context-budget.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/context-budget.js +46 -3
- package/node_modules/@buddi/gateway/dist/surfaces/context-budget.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/pending-question.js +2 -1
- package/node_modules/@buddi/gateway/dist/surfaces/pending-question.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/tips/rules.d.ts +2 -0
- package/node_modules/@buddi/gateway/dist/tips/rules.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/tips/rules.js +10 -0
- package/node_modules/@buddi/gateway/dist/tips/rules.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/agents.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/agents.js +5 -1
- package/node_modules/@buddi/gateway/dist/web/agents.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/connections.d.ts +15 -5
- package/node_modules/@buddi/gateway/dist/web/connections.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/connections.js +70 -2
- package/node_modules/@buddi/gateway/dist/web/connections.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/extension.d.ts +6 -0
- package/node_modules/@buddi/gateway/dist/web/extension.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/extension.js +5 -1
- package/node_modules/@buddi/gateway/dist/web/extension.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/folders.d.ts +23 -0
- package/node_modules/@buddi/gateway/dist/web/folders.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/folders.js +100 -0
- package/node_modules/@buddi/gateway/dist/web/folders.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/market.d.ts +129 -0
- package/node_modules/@buddi/gateway/dist/web/market.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/market.js +353 -0
- package/node_modules/@buddi/gateway/dist/web/market.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/onboarding.d.ts +21 -7
- package/node_modules/@buddi/gateway/dist/web/onboarding.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/onboarding.js +59 -9
- package/node_modules/@buddi/gateway/dist/web/onboarding.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/plugins.d.ts +42 -7
- package/node_modules/@buddi/gateway/dist/web/plugins.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/plugins.js +54 -14
- package/node_modules/@buddi/gateway/dist/web/plugins.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/recovery.js +1 -1
- package/node_modules/@buddi/gateway/dist/web/recovery.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.js +100 -3
- package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/static.d.ts +8 -0
- package/node_modules/@buddi/gateway/dist/web/static.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/static.js +21 -1
- package/node_modules/@buddi/gateway/dist/web/static.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/svg.d.ts +23 -0
- package/node_modules/@buddi/gateway/dist/web/svg.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/svg.js +125 -0
- package/node_modules/@buddi/gateway/dist/web/svg.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/take-on.d.ts +91 -0
- package/node_modules/@buddi/gateway/dist/web/take-on.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/take-on.js +287 -0
- package/node_modules/@buddi/gateway/dist/web/take-on.js.map +1 -0
- package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/runtime/dist/anthropic.d.ts +7 -0
- package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
- package/node_modules/@buddi/runtime/dist/anthropic.js +29 -3
- package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
- package/node_modules/@buddi/runtime/dist/provider-models.d.ts +2 -0
- package/node_modules/@buddi/runtime/dist/provider-models.d.ts.map +1 -1
- package/node_modules/@buddi/runtime/dist/provider-models.js +22 -0
- package/node_modules/@buddi/runtime/dist/provider-models.js.map +1 -1
- package/node_modules/@buddi/runtime/dist/search.js +2 -2
- package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-mcp/dist/catalog.d.ts +32 -2
- package/node_modules/@buddi/tool-mcp/dist/catalog.d.ts.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/catalog.js +41 -7
- package/node_modules/@buddi/tool-mcp/dist/catalog.js.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/device.d.ts +53 -0
- package/node_modules/@buddi/tool-mcp/dist/device.d.ts.map +1 -0
- package/node_modules/@buddi/tool-mcp/dist/device.js +100 -0
- package/node_modules/@buddi/tool-mcp/dist/device.js.map +1 -0
- package/node_modules/@buddi/tool-mcp/dist/fetch.d.ts +10 -1
- package/node_modules/@buddi/tool-mcp/dist/fetch.d.ts.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/fetch.js +7 -1
- package/node_modules/@buddi/tool-mcp/dist/fetch.js.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/index.d.ts +5 -3
- package/node_modules/@buddi/tool-mcp/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/index.js +7 -4
- package/node_modules/@buddi/tool-mcp/dist/index.js.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/ports.d.ts +31 -0
- package/node_modules/@buddi/tool-mcp/dist/ports.d.ts.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/preview.d.ts +16 -0
- package/node_modules/@buddi/tool-mcp/dist/preview.d.ts.map +1 -0
- package/node_modules/@buddi/tool-mcp/dist/preview.js +52 -0
- package/node_modules/@buddi/tool-mcp/dist/preview.js.map +1 -0
- package/node_modules/@buddi/tool-mcp/dist/program.d.ts +73 -0
- package/node_modules/@buddi/tool-mcp/dist/program.d.ts.map +1 -0
- package/node_modules/@buddi/tool-mcp/dist/program.js +306 -0
- package/node_modules/@buddi/tool-mcp/dist/program.js.map +1 -0
- package/node_modules/@buddi/tool-mcp/dist/service.d.ts +131 -22
- package/node_modules/@buddi/tool-mcp/dist/service.d.ts.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/service.js +717 -29
- package/node_modules/@buddi/tool-mcp/dist/service.js.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/session.d.ts +13 -1
- package/node_modules/@buddi/tool-mcp/dist/session.d.ts.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/session.js +27 -4
- package/node_modules/@buddi/tool-mcp/dist/session.js.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/store.d.ts +39 -1
- package/node_modules/@buddi/tool-mcp/dist/store.d.ts.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/store.js +24 -0
- package/node_modules/@buddi/tool-mcp/dist/store.js.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/testing/fake.d.ts +6 -0
- package/node_modules/@buddi/tool-mcp/dist/testing/fake.d.ts.map +1 -1
- package/node_modules/@buddi/tool-mcp/dist/testing/fake.js +26 -0
- package/node_modules/@buddi/tool-mcp/dist/testing/fake.js.map +1 -1
- package/node_modules/@buddi/tool-mcp/migrations/003_token_auth.sql +14 -0
- package/node_modules/@buddi/tool-mcp/migrations/004_programs.sql +26 -0
- package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
- package/node_modules/@hono/node-server/README.md +21 -10
- package/node_modules/@hono/node-server/dist/early-hints.cjs +1 -1
- package/node_modules/@hono/node-server/dist/early-hints.mjs +1 -1
- package/node_modules/@hono/node-server/dist/index.cjs +41 -19
- package/node_modules/@hono/node-server/dist/index.mjs +42 -20
- package/node_modules/@hono/node-server/dist/serve-static.cjs +1 -0
- package/node_modules/@hono/node-server/dist/serve-static.d.cts +2 -1
- package/node_modules/@hono/node-server/dist/serve-static.d.mts +2 -1
- package/node_modules/@hono/node-server/dist/serve-static.mjs +1 -0
- package/node_modules/@hono/node-server/package.json +3 -2
- package/node_modules/hono/dist/cjs/adapter/bun/websocket.js +1 -1
- package/node_modules/hono/dist/cjs/middleware/language/language.js +1 -1
- package/node_modules/hono/dist/cjs/middleware/serve-static/index.js +1 -0
- package/node_modules/hono/dist/middleware/language/language.js +1 -1
- package/node_modules/hono/dist/middleware/serve-static/index.js +1 -0
- package/node_modules/hono/dist/types/middleware/serve-static/index.d.ts +2 -0
- package/node_modules/hono/package.json +1 -1
- package/package.json +2 -2
- package/packages/cli/dist/.tsbuildinfo +1 -1
- package/packages/cli/dist/args.d.ts +59 -0
- package/packages/cli/dist/args.d.ts.map +1 -1
- package/packages/cli/dist/args.js +141 -0
- package/packages/cli/dist/args.js.map +1 -1
- package/packages/cli/dist/commands.d.ts +2 -0
- package/packages/cli/dist/commands.d.ts.map +1 -1
- package/packages/cli/dist/commands.js +83 -3
- package/packages/cli/dist/commands.js.map +1 -1
- package/packages/cli/dist/connections-cmd.d.ts +93 -0
- package/packages/cli/dist/connections-cmd.d.ts.map +1 -0
- package/packages/cli/dist/connections-cmd.js +657 -0
- package/packages/cli/dist/connections-cmd.js.map +1 -0
- package/packages/cli/dist/doctor-probes.d.ts.map +1 -1
- package/packages/cli/dist/doctor-probes.js +53 -9
- package/packages/cli/dist/doctor-probes.js.map +1 -1
- package/packages/cli/dist/doctor.d.ts +1 -8
- package/packages/cli/dist/doctor.d.ts.map +1 -1
- package/packages/cli/dist/doctor.js +1 -15
- package/packages/cli/dist/doctor.js.map +1 -1
- package/packages/cli/dist/init-plan.d.ts +1 -2
- package/packages/cli/dist/init-plan.d.ts.map +1 -1
- package/packages/cli/dist/init-plan.js +2 -6
- package/packages/cli/dist/init-plan.js.map +1 -1
- package/packages/cli/dist/init.d.ts.map +1 -1
- package/packages/cli/dist/init.js +5 -29
- package/packages/cli/dist/init.js.map +1 -1
- package/packages/cli/dist/main.d.ts.map +1 -1
- package/packages/cli/dist/main.js +12 -2
- package/packages/cli/dist/main.js.map +1 -1
- package/packages/cli/dist/mcp/gateway-client.d.ts +5 -0
- package/packages/cli/dist/mcp/gateway-client.d.ts.map +1 -1
- package/packages/cli/dist/mcp/gateway-client.js +15 -4
- package/packages/cli/dist/mcp/gateway-client.js.map +1 -1
- package/packages/cli/dist/plugins-toggle.d.ts +9 -0
- package/packages/cli/dist/plugins-toggle.d.ts.map +1 -0
- package/packages/cli/dist/plugins-toggle.js +20 -0
- package/packages/cli/dist/plugins-toggle.js.map +1 -0
- package/packages/cli/dist/service/index.d.ts +4 -2
- package/packages/cli/dist/service/index.d.ts.map +1 -1
- package/packages/cli/dist/service/index.js +5 -7
- package/packages/cli/dist/service/index.js.map +1 -1
- package/packages/core/dist/.tsbuildinfo +1 -1
- package/packages/core/dist/agents/provider-from-env.d.ts +7 -6
- package/packages/core/dist/agents/provider-from-env.d.ts.map +1 -1
- package/packages/core/dist/agents/provider-from-env.js +9 -12
- package/packages/core/dist/agents/provider-from-env.js.map +1 -1
- package/packages/core/dist/backup/load.d.ts.map +1 -1
- package/packages/core/dist/backup/load.js +37 -0
- package/packages/core/dist/backup/load.js.map +1 -1
- package/packages/core/dist/backup/restore.js +2 -2
- package/packages/core/dist/backup/restore.js.map +1 -1
- package/packages/core/dist/connection-config.d.ts +96 -0
- package/packages/core/dist/connection-config.d.ts.map +1 -0
- package/packages/core/dist/connection-config.js +308 -0
- package/packages/core/dist/connection-config.js.map +1 -0
- package/packages/core/dist/failures/owner-message.d.ts.map +1 -1
- package/packages/core/dist/failures/owner-message.js +37 -10
- package/packages/core/dist/failures/owner-message.js.map +1 -1
- package/packages/core/dist/host/build.d.ts +7 -0
- package/packages/core/dist/host/build.d.ts.map +1 -1
- package/packages/core/dist/host/build.js +14 -1
- package/packages/core/dist/host/build.js.map +1 -1
- package/packages/core/dist/onboarding/store.d.ts.map +1 -1
- package/packages/core/dist/onboarding/store.js +17 -1
- package/packages/core/dist/onboarding/store.js.map +1 -1
- package/packages/core/dist/onboarding/types.d.ts +14 -0
- package/packages/core/dist/onboarding/types.d.ts.map +1 -1
- package/packages/core/dist/provider-accounts.d.ts +21 -1
- package/packages/core/dist/provider-accounts.d.ts.map +1 -1
- package/packages/core/dist/provider-accounts.js +31 -1
- package/packages/core/dist/provider-accounts.js.map +1 -1
- package/packages/core/dist/provider.d.ts +4 -3
- package/packages/core/dist/provider.d.ts.map +1 -1
- package/packages/core/dist/provider.js +7 -4
- package/packages/core/dist/provider.js.map +1 -1
- package/packages/core/dist/registry.d.ts +9 -0
- package/packages/core/dist/registry.d.ts.map +1 -1
- package/packages/core/dist/registry.js +32 -2
- package/packages/core/dist/registry.js.map +1 -1
- package/packages/core/dist/secrets/destinations.d.ts +2 -0
- package/packages/core/dist/secrets/destinations.d.ts.map +1 -1
- package/packages/core/dist/secrets/destinations.js +6 -0
- package/packages/core/dist/secrets/destinations.js.map +1 -1
- package/packages/core/dist/testing/accounts.d.ts +12 -0
- package/packages/core/dist/testing/accounts.d.ts.map +1 -0
- package/packages/core/dist/testing/accounts.js +7 -0
- package/packages/core/dist/testing/accounts.js.map +1 -0
- package/packages/core/dist/testing/index.d.ts +1 -0
- package/packages/core/dist/testing/index.d.ts.map +1 -1
- package/packages/core/dist/testing/index.js +1 -0
- package/packages/core/dist/testing/index.js.map +1 -1
- package/packages/core/dist/vault/resolve.d.ts.map +1 -1
- package/packages/core/dist/vault/resolve.js +0 -2
- package/packages/core/dist/vault/resolve.js.map +1 -1
- package/packages/core/migrations/053_drop_legacy_anthropic_env.sql +31 -0
- package/packages/core/package.json +4 -0
- package/packages/gateway/dist/.tsbuildinfo +1 -1
- package/packages/gateway/dist/agents/catalog.d.ts +3 -2
- package/packages/gateway/dist/agents/catalog.d.ts.map +1 -1
- package/packages/gateway/dist/agents/catalog.js +3 -2
- package/packages/gateway/dist/agents/catalog.js.map +1 -1
- package/packages/gateway/dist/agents-cli.js +1 -1
- package/packages/gateway/dist/agents-cli.js.map +1 -1
- package/packages/gateway/dist/bootstrap.d.ts +1 -3
- package/packages/gateway/dist/bootstrap.d.ts.map +1 -1
- package/packages/gateway/dist/bootstrap.js +13 -8
- package/packages/gateway/dist/bootstrap.js.map +1 -1
- package/packages/gateway/dist/cli.js +1 -1
- package/packages/gateway/dist/index.d.ts +1 -1
- package/packages/gateway/dist/index.d.ts.map +1 -1
- package/packages/gateway/dist/index.js.map +1 -1
- package/packages/gateway/dist/mlxh.d.ts +44 -0
- package/packages/gateway/dist/mlxh.d.ts.map +1 -0
- package/packages/gateway/dist/mlxh.js +98 -0
- package/packages/gateway/dist/mlxh.js.map +1 -0
- package/packages/gateway/dist/owner-secrets.d.ts +21 -1
- package/packages/gateway/dist/owner-secrets.d.ts.map +1 -1
- package/packages/gateway/dist/owner-secrets.js +96 -2
- package/packages/gateway/dist/owner-secrets.js.map +1 -1
- package/packages/gateway/dist/plugins/live.d.ts +42 -0
- package/packages/gateway/dist/plugins/live.d.ts.map +1 -0
- package/packages/gateway/dist/plugins/live.js +81 -0
- package/packages/gateway/dist/plugins/live.js.map +1 -0
- package/packages/gateway/dist/plugins/stage.d.ts +4 -0
- package/packages/gateway/dist/plugins/stage.d.ts.map +1 -1
- package/packages/gateway/dist/plugins/stage.js +3 -0
- package/packages/gateway/dist/plugins/stage.js.map +1 -1
- package/packages/gateway/dist/plugins/toggle.d.ts +18 -2
- package/packages/gateway/dist/plugins/toggle.d.ts.map +1 -1
- package/packages/gateway/dist/plugins/toggle.js +36 -12
- package/packages/gateway/dist/plugins/toggle.js.map +1 -1
- package/packages/gateway/dist/plugins/update.d.ts +8 -0
- package/packages/gateway/dist/plugins/update.d.ts.map +1 -1
- package/packages/gateway/dist/plugins/update.js +8 -2
- package/packages/gateway/dist/plugins/update.js.map +1 -1
- package/packages/gateway/dist/plugins-cli.d.ts +44 -5
- package/packages/gateway/dist/plugins-cli.d.ts.map +1 -1
- package/packages/gateway/dist/plugins-cli.js +177 -20
- package/packages/gateway/dist/plugins-cli.js.map +1 -1
- package/packages/gateway/dist/provider-accounts.d.ts +6 -13
- package/packages/gateway/dist/provider-accounts.d.ts.map +1 -1
- package/packages/gateway/dist/provider-accounts.js +76 -16
- package/packages/gateway/dist/provider-accounts.js.map +1 -1
- package/packages/gateway/dist/providers.d.ts +3 -3
- package/packages/gateway/dist/providers.d.ts.map +1 -1
- package/packages/gateway/dist/providers.js +7 -7
- package/packages/gateway/dist/providers.js.map +1 -1
- package/packages/gateway/dist/serve.d.ts.map +1 -1
- package/packages/gateway/dist/serve.js +2 -0
- package/packages/gateway/dist/serve.js.map +1 -1
- package/packages/gateway/dist/surfaces/context-budget.d.ts +1 -1
- package/packages/gateway/dist/surfaces/context-budget.d.ts.map +1 -1
- package/packages/gateway/dist/surfaces/context-budget.js +46 -3
- package/packages/gateway/dist/surfaces/context-budget.js.map +1 -1
- package/packages/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
- package/packages/gateway/dist/surfaces/pending-question.js +2 -1
- package/packages/gateway/dist/surfaces/pending-question.js.map +1 -1
- package/packages/gateway/dist/tips/rules.d.ts +2 -0
- package/packages/gateway/dist/tips/rules.d.ts.map +1 -1
- package/packages/gateway/dist/tips/rules.js +10 -0
- package/packages/gateway/dist/tips/rules.js.map +1 -1
- package/packages/gateway/dist/web/agents.d.ts.map +1 -1
- package/packages/gateway/dist/web/agents.js +5 -1
- package/packages/gateway/dist/web/agents.js.map +1 -1
- package/packages/gateway/dist/web/connections.d.ts +15 -5
- package/packages/gateway/dist/web/connections.d.ts.map +1 -1
- package/packages/gateway/dist/web/connections.js +70 -2
- package/packages/gateway/dist/web/connections.js.map +1 -1
- package/packages/gateway/dist/web/extension.d.ts +6 -0
- package/packages/gateway/dist/web/extension.d.ts.map +1 -1
- package/packages/gateway/dist/web/extension.js +5 -1
- package/packages/gateway/dist/web/extension.js.map +1 -1
- package/packages/gateway/dist/web/folders.d.ts +23 -0
- package/packages/gateway/dist/web/folders.d.ts.map +1 -0
- package/packages/gateway/dist/web/folders.js +100 -0
- package/packages/gateway/dist/web/folders.js.map +1 -0
- package/packages/gateway/dist/web/market.d.ts +129 -0
- package/packages/gateway/dist/web/market.d.ts.map +1 -0
- package/packages/gateway/dist/web/market.js +353 -0
- package/packages/gateway/dist/web/market.js.map +1 -0
- package/packages/gateway/dist/web/onboarding.d.ts +21 -7
- package/packages/gateway/dist/web/onboarding.d.ts.map +1 -1
- package/packages/gateway/dist/web/onboarding.js +59 -9
- package/packages/gateway/dist/web/onboarding.js.map +1 -1
- package/packages/gateway/dist/web/plugins.d.ts +42 -7
- package/packages/gateway/dist/web/plugins.d.ts.map +1 -1
- package/packages/gateway/dist/web/plugins.js +54 -14
- package/packages/gateway/dist/web/plugins.js.map +1 -1
- package/packages/gateway/dist/web/recovery.js +1 -1
- package/packages/gateway/dist/web/recovery.js.map +1 -1
- package/packages/gateway/dist/web/server.d.ts.map +1 -1
- package/packages/gateway/dist/web/server.js +100 -3
- package/packages/gateway/dist/web/server.js.map +1 -1
- package/packages/gateway/dist/web/static.d.ts +8 -0
- package/packages/gateway/dist/web/static.d.ts.map +1 -1
- package/packages/gateway/dist/web/static.js +21 -1
- package/packages/gateway/dist/web/static.js.map +1 -1
- package/packages/gateway/dist/web/svg.d.ts +23 -0
- package/packages/gateway/dist/web/svg.d.ts.map +1 -0
- package/packages/gateway/dist/web/svg.js +125 -0
- package/packages/gateway/dist/web/svg.js.map +1 -0
- package/packages/gateway/dist/web/take-on.d.ts +91 -0
- package/packages/gateway/dist/web/take-on.d.ts.map +1 -0
- package/packages/gateway/dist/web/take-on.js +287 -0
- package/packages/gateway/dist/web/take-on.js.map +1 -0
- package/packages/install/dist/.tsbuildinfo +1 -1
- package/packages/runtime/dist/.tsbuildinfo +1 -1
- package/packages/runtime/dist/anthropic.d.ts +7 -0
- package/packages/runtime/dist/anthropic.d.ts.map +1 -1
- package/packages/runtime/dist/anthropic.js +29 -3
- package/packages/runtime/dist/anthropic.js.map +1 -1
- package/packages/runtime/dist/provider-models.d.ts +2 -0
- package/packages/runtime/dist/provider-models.d.ts.map +1 -1
- package/packages/runtime/dist/provider-models.js +22 -0
- package/packages/runtime/dist/provider-models.js.map +1 -1
- package/packages/runtime/dist/search.js +2 -2
- package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
- package/packages/tools/browser/dist/.tsbuildinfo +1 -1
- package/packages/tools/email/dist/.tsbuildinfo +1 -1
- package/packages/tools/host/dist/.tsbuildinfo +1 -1
- package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
- package/packages/tools/mcp/dist/catalog.d.ts +32 -2
- package/packages/tools/mcp/dist/catalog.d.ts.map +1 -1
- package/packages/tools/mcp/dist/catalog.js +41 -7
- package/packages/tools/mcp/dist/catalog.js.map +1 -1
- package/packages/tools/mcp/dist/device.d.ts +53 -0
- package/packages/tools/mcp/dist/device.d.ts.map +1 -0
- package/packages/tools/mcp/dist/device.js +100 -0
- package/packages/tools/mcp/dist/device.js.map +1 -0
- package/packages/tools/mcp/dist/fetch.d.ts +10 -1
- package/packages/tools/mcp/dist/fetch.d.ts.map +1 -1
- package/packages/tools/mcp/dist/fetch.js +7 -1
- package/packages/tools/mcp/dist/fetch.js.map +1 -1
- package/packages/tools/mcp/dist/index.d.ts +5 -3
- package/packages/tools/mcp/dist/index.d.ts.map +1 -1
- package/packages/tools/mcp/dist/index.js +7 -4
- package/packages/tools/mcp/dist/index.js.map +1 -1
- package/packages/tools/mcp/dist/ports.d.ts +31 -0
- package/packages/tools/mcp/dist/ports.d.ts.map +1 -1
- package/packages/tools/mcp/dist/preview.d.ts +16 -0
- package/packages/tools/mcp/dist/preview.d.ts.map +1 -0
- package/packages/tools/mcp/dist/preview.js +52 -0
- package/packages/tools/mcp/dist/preview.js.map +1 -0
- package/packages/tools/mcp/dist/program.d.ts +73 -0
- package/packages/tools/mcp/dist/program.d.ts.map +1 -0
- package/packages/tools/mcp/dist/program.js +306 -0
- package/packages/tools/mcp/dist/program.js.map +1 -0
- package/packages/tools/mcp/dist/service.d.ts +131 -22
- package/packages/tools/mcp/dist/service.d.ts.map +1 -1
- package/packages/tools/mcp/dist/service.js +717 -29
- package/packages/tools/mcp/dist/service.js.map +1 -1
- package/packages/tools/mcp/dist/session.d.ts +13 -1
- package/packages/tools/mcp/dist/session.d.ts.map +1 -1
- package/packages/tools/mcp/dist/session.js +27 -4
- package/packages/tools/mcp/dist/session.js.map +1 -1
- package/packages/tools/mcp/dist/store.d.ts +39 -1
- package/packages/tools/mcp/dist/store.d.ts.map +1 -1
- package/packages/tools/mcp/dist/store.js +24 -0
- package/packages/tools/mcp/dist/store.js.map +1 -1
- package/packages/tools/mcp/dist/testing/fake.d.ts +6 -0
- package/packages/tools/mcp/dist/testing/fake.d.ts.map +1 -1
- package/packages/tools/mcp/dist/testing/fake.js +26 -0
- package/packages/tools/mcp/dist/testing/fake.js.map +1 -1
- package/packages/tools/mcp/migrations/003_token_auth.sql +14 -0
- package/packages/tools/mcp/migrations/004_programs.sql +26 -0
- package/packages/tools/memory/dist/.tsbuildinfo +1 -1
- package/packages/tools/web/dist/.tsbuildinfo +1 -1
- package/packages/web/dist/assets/index-DIXokQ4n.css +1 -0
- package/packages/web/dist/assets/index-uqQyuYjR.js +128 -0
- package/packages/web/dist/assets/{lottie_light-e1djomjW.js → lottie_light-j3HICV9o.js} +1 -1
- package/packages/web/dist/build.json +1 -1
- package/packages/web/dist/index.html +2 -2
- package/packages/web/dist/manifest.webmanifest +24 -5
- package/packages/web/dist/precache.json +4 -4
- package/packages/web/dist/assets/index-4hpqlMjL.css +0 -1
- 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
|
-
*
|
|
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
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
*
|
|
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":"AAmBA,OAAO,EAYL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,iEAAiE;AACjE,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,
|
|
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
|
-
*
|
|
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
|
|
700
|
-
*
|
|
701
|
-
*
|
|
702
|
-
*
|
|
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:
|
|
715
|
-
//
|
|
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
|
|
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
|
/**
|