@withbuddi/buddi 0.1.0-pre.17 → 0.1.0-pre.18
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 +19 -17
- package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/cli/dist/args.d.ts +9 -3
- package/node_modules/@buddi/cli/dist/args.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/args.js +25 -89
- package/node_modules/@buddi/cli/dist/args.js.map +1 -1
- package/node_modules/@buddi/cli/dist/backup/index.d.ts +2 -0
- package/node_modules/@buddi/cli/dist/backup/index.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/backup/index.js +13 -4
- package/node_modules/@buddi/cli/dist/backup/index.js.map +1 -1
- package/node_modules/@buddi/cli/dist/commands.d.ts +94 -0
- package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -0
- package/node_modules/@buddi/cli/dist/commands.js +993 -0
- package/node_modules/@buddi/cli/dist/commands.js.map +1 -0
- package/node_modules/@buddi/cli/dist/index.d.ts +3 -1
- package/node_modules/@buddi/cli/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/index.js +3 -1
- package/node_modules/@buddi/cli/dist/index.js.map +1 -1
- package/node_modules/@buddi/cli/dist/jobs-cmd.d.ts +4 -0
- package/node_modules/@buddi/cli/dist/jobs-cmd.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/jobs-cmd.js +26 -7
- package/node_modules/@buddi/cli/dist/jobs-cmd.js.map +1 -1
- package/node_modules/@buddi/cli/dist/main.d.ts +9 -2
- package/node_modules/@buddi/cli/dist/main.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/main.js +246 -30
- package/node_modules/@buddi/cli/dist/main.js.map +1 -1
- package/node_modules/@buddi/cli/dist/paths.d.ts +7 -4
- package/node_modules/@buddi/cli/dist/paths.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/paths.js +17 -6
- package/node_modules/@buddi/cli/dist/paths.js.map +1 -1
- package/node_modules/@buddi/cli/dist/status.d.ts +70 -0
- package/node_modules/@buddi/cli/dist/status.d.ts.map +1 -0
- package/node_modules/@buddi/cli/dist/status.js +122 -0
- package/node_modules/@buddi/cli/dist/status.js.map +1 -0
- package/node_modules/@buddi/cli/dist/style.d.ts +13 -0
- package/node_modules/@buddi/cli/dist/style.d.ts.map +1 -0
- package/node_modules/@buddi/cli/dist/style.js +10 -0
- package/node_modules/@buddi/cli/dist/style.js.map +1 -0
- package/node_modules/@buddi/cli/dist/telegram-cmd.d.ts +1 -1
- package/node_modules/@buddi/cli/dist/telegram-cmd.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/telegram-cmd.js +23 -6
- package/node_modules/@buddi/cli/dist/telegram-cmd.js.map +1 -1
- package/node_modules/@buddi/cli/dist/vault-cmd.js +3 -3
- package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/core/dist/actions/approvals.d.ts +0 -17
- package/node_modules/@buddi/core/dist/actions/approvals.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/actions/approvals.js +21 -0
- package/node_modules/@buddi/core/dist/actions/approvals.js.map +1 -1
- package/node_modules/@buddi/core/dist/actions/execute.d.ts +1 -1
- package/node_modules/@buddi/core/dist/actions/jobs.d.ts +1 -1
- package/node_modules/@buddi/core/dist/actions/types.js +1 -1
- package/node_modules/@buddi/core/dist/agents/provider-from-env.d.ts +1 -1
- package/node_modules/@buddi/core/dist/agents/provider-from-env.js +1 -1
- package/node_modules/@buddi/core/dist/host/build.d.ts +15 -1
- package/node_modules/@buddi/core/dist/host/build.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/host/build.js +99 -1
- package/node_modules/@buddi/core/dist/host/build.js.map +1 -1
- package/node_modules/@buddi/core/dist/host/types.d.ts +88 -1
- package/node_modules/@buddi/core/dist/host/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/index.js +1 -0
- package/node_modules/@buddi/core/dist/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/notifications/channels.d.ts +37 -0
- package/node_modules/@buddi/core/dist/notifications/channels.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/channels.js +87 -0
- package/node_modules/@buddi/core/dist/notifications/channels.js.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/index.d.ts +5 -0
- package/node_modules/@buddi/core/dist/notifications/index.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/index.js +5 -0
- package/node_modules/@buddi/core/dist/notifications/index.js.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/notify.d.ts +35 -0
- package/node_modules/@buddi/core/dist/notifications/notify.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/notify.js +262 -0
- package/node_modules/@buddi/core/dist/notifications/notify.js.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/store.d.ts +48 -0
- package/node_modules/@buddi/core/dist/notifications/store.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/store.js +207 -0
- package/node_modules/@buddi/core/dist/notifications/store.js.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/types.d.ts +136 -0
- package/node_modules/@buddi/core/dist/notifications/types.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/types.js +5 -0
- package/node_modules/@buddi/core/dist/notifications/types.js.map +1 -0
- package/node_modules/@buddi/core/dist/owner.js +1 -1
- package/node_modules/@buddi/core/dist/plugin/index.d.ts +1 -1
- package/node_modules/@buddi/core/dist/plugin/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/plugin/uses.d.ts +1 -1
- package/node_modules/@buddi/core/dist/plugin/uses.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/plugin/uses.js +4 -0
- package/node_modules/@buddi/core/dist/plugin/uses.js.map +1 -1
- package/node_modules/@buddi/core/dist/plugin/version.d.ts +1 -1
- package/node_modules/@buddi/core/dist/plugin/version.js +1 -1
- package/node_modules/@buddi/core/dist/provider.d.ts +1 -1
- package/node_modules/@buddi/core/dist/provider.js +1 -1
- package/node_modules/@buddi/core/dist/queue/retry-policy.d.ts +1 -1
- package/node_modules/@buddi/core/dist/queue/retry-policy.js +1 -1
- package/node_modules/@buddi/core/dist/registry.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/registry.js +3 -4
- package/node_modules/@buddi/core/dist/registry.js.map +1 -1
- package/node_modules/@buddi/core/dist/reminders/store.d.ts +1 -1
- package/node_modules/@buddi/core/dist/reminders/store.js +1 -1
- package/node_modules/@buddi/core/dist/reminders/types.d.ts +1 -1
- package/node_modules/@buddi/core/dist/reminders/types.js +1 -1
- package/node_modules/@buddi/core/dist/sentinels/types.d.ts +1 -1
- package/node_modules/@buddi/core/dist/time.d.ts +12 -0
- package/node_modules/@buddi/core/dist/time.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/time.js +46 -0
- package/node_modules/@buddi/core/dist/time.js.map +1 -1
- package/node_modules/@buddi/core/dist/tools.d.ts +5 -5
- package/node_modules/@buddi/core/dist/vault/file.js +2 -2
- package/node_modules/@buddi/core/dist/vault/keychain.js +1 -1
- package/node_modules/@buddi/core/dist/vault/keychain.js.map +1 -1
- package/node_modules/@buddi/core/dist/vault/resolve.d.ts +3 -3
- package/node_modules/@buddi/core/dist/vault/resolve.js +3 -3
- package/node_modules/@buddi/core/dist/vault/types.d.ts +1 -1
- package/node_modules/@buddi/core/dist/vault/types.js +1 -1
- package/node_modules/@buddi/core/migrations/003_owner_surfaces.sql +1 -1
- package/node_modules/@buddi/core/migrations/005_artifacts.sql +1 -1
- package/node_modules/@buddi/core/migrations/009_queue.sql +1 -2
- package/node_modules/@buddi/core/migrations/010_actions.sql +1 -1
- package/node_modules/@buddi/core/migrations/043_owner_notifications.sql +77 -0
- package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/gateway/dist/agents/catalog.js +1 -1
- package/node_modules/@buddi/gateway/dist/agents-cli.d.ts +25 -1
- package/node_modules/@buddi/gateway/dist/agents-cli.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents-cli.js +91 -27
- package/node_modules/@buddi/gateway/dist/agents-cli.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/bootstrap.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/bootstrap.js +8 -0
- package/node_modules/@buddi/gateway/dist/bootstrap.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/channels/local-notification.d.ts +39 -0
- package/node_modules/@buddi/gateway/dist/channels/local-notification.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/channels/local-notification.js +154 -0
- package/node_modules/@buddi/gateway/dist/channels/local-notification.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/chat/approvals.d.ts +3 -3
- package/node_modules/@buddi/gateway/dist/chat/approvals.js +3 -3
- package/node_modules/@buddi/gateway/dist/cli.d.ts +14 -0
- package/node_modules/@buddi/gateway/dist/cli.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/cli.js +208 -37
- package/node_modules/@buddi/gateway/dist/cli.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/db-ready.d.ts +2 -1
- package/node_modules/@buddi/gateway/dist/db-ready.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/db-ready.js +3 -2
- package/node_modules/@buddi/gateway/dist/db-ready.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/index.d.ts +4 -1
- package/node_modules/@buddi/gateway/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/index.js +5 -1
- package/node_modules/@buddi/gateway/dist/index.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/agent-run.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/agent-run.js +10 -1
- package/node_modules/@buddi/gateway/dist/missions/agent-run.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.d.ts +15 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.js +6 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions-cli.d.ts +2 -0
- package/node_modules/@buddi/gateway/dist/missions-cli.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions-cli.js +53 -8
- package/node_modules/@buddi/gateway/dist/missions-cli.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/owner-notify.d.ts +43 -0
- package/node_modules/@buddi/gateway/dist/owner-notify.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/owner-notify.js +87 -0
- package/node_modules/@buddi/gateway/dist/owner-notify.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts +3 -1
- package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins-cli.js +11 -4
- package/node_modules/@buddi/gateway/dist/plugins-cli.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/reminders-cli.d.ts +3 -1
- package/node_modules/@buddi/gateway/dist/reminders-cli.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/reminders-cli.js +21 -2
- package/node_modules/@buddi/gateway/dist/reminders-cli.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/serve.d.ts +2 -0
- package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/serve.js +60 -13
- package/node_modules/@buddi/gateway/dist/serve.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/approvals.d.ts +3 -3
- package/node_modules/@buddi/gateway/dist/telegram/approvals.js +3 -3
- package/node_modules/@buddi/gateway/dist/telegram/channel.d.ts +30 -0
- package/node_modules/@buddi/gateway/dist/telegram/channel.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/telegram/channel.js +49 -0
- package/node_modules/@buddi/gateway/dist/telegram/channel.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/surface.js +4 -1
- package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/config.js +3 -3
- package/node_modules/@buddi/gateway/dist/web/http.d.ts +16 -3
- package/node_modules/@buddi/gateway/dist/web/http.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/http.js +39 -3
- package/node_modules/@buddi/gateway/dist/web/http.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/notifications.d.ts +36 -0
- package/node_modules/@buddi/gateway/dist/web/notifications.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/notifications.js +63 -0
- package/node_modules/@buddi/gateway/dist/web/notifications.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/onboarding.d.ts +1 -1
- package/node_modules/@buddi/gateway/dist/web/onboarding.js +1 -1
- package/node_modules/@buddi/gateway/dist/web/read.js +3 -3
- package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.js +34 -22
- package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/version.d.ts +1 -0
- package/node_modules/@buddi/gateway/dist/web/version.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/version.js +2 -1
- package/node_modules/@buddi/gateway/dist/web/version.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/write.js +1 -1
- package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/install/dist/environment.d.ts +29 -0
- package/node_modules/@buddi/install/dist/environment.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/environment.js +50 -1
- package/node_modules/@buddi/install/dist/environment.js.map +1 -1
- package/node_modules/@buddi/install/dist/launcher.d.ts +3 -1
- package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/launcher.js +93 -12
- package/node_modules/@buddi/install/dist/launcher.js.map +1 -1
- package/node_modules/@buddi/install/dist/upgrade.d.ts +16 -3
- package/node_modules/@buddi/install/dist/upgrade.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/upgrade.js +21 -7
- package/node_modules/@buddi/install/dist/upgrade.js.map +1 -1
- package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/runtime/dist/anthropic.d.ts +35 -2
- package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
- package/node_modules/@buddi/runtime/dist/anthropic.js +36 -12
- package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
- package/node_modules/@buddi/runtime/dist/delegate.js +1 -1
- package/node_modules/@buddi/runtime/dist/loop.d.ts +13 -1
- package/node_modules/@buddi/runtime/dist/loop.d.ts.map +1 -1
- package/node_modules/@buddi/runtime/dist/loop.js +70 -3
- package/node_modules/@buddi/runtime/dist/loop.js.map +1 -1
- package/node_modules/@buddi/runtime/dist/openai.d.ts.map +1 -1
- package/node_modules/@buddi/runtime/dist/openai.js +9 -6
- package/node_modules/@buddi/runtime/dist/openai.js.map +1 -1
- package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-artifacts/dist/index.d.ts +1 -1
- package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-browser/dist/availability.d.ts +34 -8
- package/node_modules/@buddi/tool-browser/dist/availability.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/availability.js +44 -5
- package/node_modules/@buddi/tool-browser/dist/availability.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/controller.d.ts +2 -2
- package/node_modules/@buddi/tool-browser/dist/controller.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/controller.js +7 -6
- package/node_modules/@buddi/tool-browser/dist/controller.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/host.d.ts +3 -1
- package/node_modules/@buddi/tool-browser/dist/host.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/host.js +5 -1
- package/node_modules/@buddi/tool-browser/dist/host.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/index.d.ts +1 -1
- package/node_modules/@buddi/tool-browser/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/index.js +1 -1
- package/node_modules/@buddi/tool-browser/dist/index.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/service.d.ts +2 -2
- package/node_modules/@buddi/tool-browser/dist/service.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-email/dist/channel.d.ts +43 -0
- package/node_modules/@buddi/tool-email/dist/channel.d.ts.map +1 -0
- package/node_modules/@buddi/tool-email/dist/channel.js +99 -0
- package/node_modules/@buddi/tool-email/dist/channel.js.map +1 -0
- package/node_modules/@buddi/tool-email/dist/index.d.ts +1 -0
- package/node_modules/@buddi/tool-email/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/index.js +8 -1
- package/node_modules/@buddi/tool-email/dist/index.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/ports.d.ts +3 -3
- package/node_modules/@buddi/tool-email/dist/ports.js +1 -1
- package/node_modules/@buddi/tool-email/dist/tools/drafts.d.ts +1 -1
- package/node_modules/@buddi/tool-email/dist/tools/send.js +1 -1
- package/node_modules/@buddi/tool-email/migrations/001_email.sql +3 -2
- package/node_modules/@buddi/tool-email/package.json +2 -1
- package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-memory/dist/index.js +1 -1
- package/node_modules/@buddi/tool-memory/migrations/001_memory.sql +1 -1
- package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
- package/package.json +5 -2
- package/packages/cli/dist/.tsbuildinfo +1 -1
- package/packages/cli/dist/args.d.ts +9 -3
- package/packages/cli/dist/args.d.ts.map +1 -1
- package/packages/cli/dist/args.js +25 -89
- package/packages/cli/dist/args.js.map +1 -1
- package/packages/cli/dist/backup/index.d.ts +2 -0
- package/packages/cli/dist/backup/index.d.ts.map +1 -1
- package/packages/cli/dist/backup/index.js +13 -4
- package/packages/cli/dist/backup/index.js.map +1 -1
- package/packages/cli/dist/commands.d.ts +94 -0
- package/packages/cli/dist/commands.d.ts.map +1 -0
- package/packages/cli/dist/commands.js +993 -0
- package/packages/cli/dist/commands.js.map +1 -0
- package/packages/cli/dist/index.d.ts +3 -1
- package/packages/cli/dist/index.d.ts.map +1 -1
- package/packages/cli/dist/index.js +3 -1
- package/packages/cli/dist/index.js.map +1 -1
- package/packages/cli/dist/jobs-cmd.d.ts +4 -0
- package/packages/cli/dist/jobs-cmd.d.ts.map +1 -1
- package/packages/cli/dist/jobs-cmd.js +26 -7
- package/packages/cli/dist/jobs-cmd.js.map +1 -1
- package/packages/cli/dist/main.d.ts +9 -2
- package/packages/cli/dist/main.d.ts.map +1 -1
- package/packages/cli/dist/main.js +246 -30
- package/packages/cli/dist/main.js.map +1 -1
- package/packages/cli/dist/paths.d.ts +7 -4
- package/packages/cli/dist/paths.d.ts.map +1 -1
- package/packages/cli/dist/paths.js +17 -6
- package/packages/cli/dist/paths.js.map +1 -1
- package/packages/cli/dist/status.d.ts +70 -0
- package/packages/cli/dist/status.d.ts.map +1 -0
- package/packages/cli/dist/status.js +122 -0
- package/packages/cli/dist/status.js.map +1 -0
- package/packages/cli/dist/style.d.ts +13 -0
- package/packages/cli/dist/style.d.ts.map +1 -0
- package/packages/cli/dist/style.js +10 -0
- package/packages/cli/dist/style.js.map +1 -0
- package/packages/cli/dist/telegram-cmd.d.ts +1 -1
- package/packages/cli/dist/telegram-cmd.d.ts.map +1 -1
- package/packages/cli/dist/telegram-cmd.js +23 -6
- package/packages/cli/dist/telegram-cmd.js.map +1 -1
- package/packages/cli/dist/vault-cmd.js +3 -3
- package/packages/core/dist/.tsbuildinfo +1 -1
- package/packages/core/dist/actions/approvals.d.ts +0 -17
- package/packages/core/dist/actions/approvals.d.ts.map +1 -1
- package/packages/core/dist/actions/approvals.js +21 -0
- package/packages/core/dist/actions/approvals.js.map +1 -1
- package/packages/core/dist/actions/execute.d.ts +1 -1
- package/packages/core/dist/actions/jobs.d.ts +1 -1
- package/packages/core/dist/actions/types.js +1 -1
- package/packages/core/dist/agents/provider-from-env.d.ts +1 -1
- package/packages/core/dist/agents/provider-from-env.js +1 -1
- package/packages/core/dist/host/build.d.ts +15 -1
- package/packages/core/dist/host/build.d.ts.map +1 -1
- package/packages/core/dist/host/build.js +99 -1
- package/packages/core/dist/host/build.js.map +1 -1
- package/packages/core/dist/host/types.d.ts +88 -1
- package/packages/core/dist/host/types.d.ts.map +1 -1
- package/packages/core/dist/index.d.ts +1 -0
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/index.js +1 -0
- package/packages/core/dist/index.js.map +1 -1
- package/packages/core/dist/notifications/channels.d.ts +37 -0
- package/packages/core/dist/notifications/channels.d.ts.map +1 -0
- package/packages/core/dist/notifications/channels.js +87 -0
- package/packages/core/dist/notifications/channels.js.map +1 -0
- package/packages/core/dist/notifications/index.d.ts +5 -0
- package/packages/core/dist/notifications/index.d.ts.map +1 -0
- package/packages/core/dist/notifications/index.js +5 -0
- package/packages/core/dist/notifications/index.js.map +1 -0
- package/packages/core/dist/notifications/notify.d.ts +35 -0
- package/packages/core/dist/notifications/notify.d.ts.map +1 -0
- package/packages/core/dist/notifications/notify.js +262 -0
- package/packages/core/dist/notifications/notify.js.map +1 -0
- package/packages/core/dist/notifications/store.d.ts +48 -0
- package/packages/core/dist/notifications/store.d.ts.map +1 -0
- package/packages/core/dist/notifications/store.js +207 -0
- package/packages/core/dist/notifications/store.js.map +1 -0
- package/packages/core/dist/notifications/types.d.ts +136 -0
- package/packages/core/dist/notifications/types.d.ts.map +1 -0
- package/packages/core/dist/notifications/types.js +5 -0
- package/packages/core/dist/notifications/types.js.map +1 -0
- package/packages/core/dist/owner.js +1 -1
- package/packages/core/dist/plugin/index.d.ts +1 -1
- package/packages/core/dist/plugin/index.d.ts.map +1 -1
- package/packages/core/dist/plugin/uses.d.ts +1 -1
- package/packages/core/dist/plugin/uses.d.ts.map +1 -1
- package/packages/core/dist/plugin/uses.js +4 -0
- package/packages/core/dist/plugin/uses.js.map +1 -1
- package/packages/core/dist/plugin/version.d.ts +1 -1
- package/packages/core/dist/plugin/version.js +1 -1
- package/packages/core/dist/provider.d.ts +1 -1
- package/packages/core/dist/provider.js +1 -1
- package/packages/core/dist/queue/retry-policy.d.ts +1 -1
- package/packages/core/dist/queue/retry-policy.js +1 -1
- package/packages/core/dist/registry.d.ts.map +1 -1
- package/packages/core/dist/registry.js +3 -4
- package/packages/core/dist/registry.js.map +1 -1
- package/packages/core/dist/reminders/store.d.ts +1 -1
- package/packages/core/dist/reminders/store.js +1 -1
- package/packages/core/dist/reminders/types.d.ts +1 -1
- package/packages/core/dist/reminders/types.js +1 -1
- package/packages/core/dist/sentinels/types.d.ts +1 -1
- package/packages/core/dist/time.d.ts +12 -0
- package/packages/core/dist/time.d.ts.map +1 -1
- package/packages/core/dist/time.js +46 -0
- package/packages/core/dist/time.js.map +1 -1
- package/packages/core/dist/tools.d.ts +5 -5
- package/packages/core/dist/vault/file.js +2 -2
- package/packages/core/dist/vault/keychain.js +1 -1
- package/packages/core/dist/vault/keychain.js.map +1 -1
- package/packages/core/dist/vault/resolve.d.ts +3 -3
- package/packages/core/dist/vault/resolve.js +3 -3
- package/packages/core/dist/vault/types.d.ts +1 -1
- package/packages/core/dist/vault/types.js +1 -1
- package/packages/core/migrations/003_owner_surfaces.sql +1 -1
- package/packages/core/migrations/005_artifacts.sql +1 -1
- package/packages/core/migrations/009_queue.sql +1 -2
- package/packages/core/migrations/010_actions.sql +1 -1
- package/packages/core/migrations/043_owner_notifications.sql +77 -0
- package/packages/gateway/dist/.tsbuildinfo +1 -1
- package/packages/gateway/dist/agents/catalog.js +1 -1
- package/packages/gateway/dist/agents-cli.d.ts +25 -1
- package/packages/gateway/dist/agents-cli.d.ts.map +1 -1
- package/packages/gateway/dist/agents-cli.js +91 -27
- package/packages/gateway/dist/agents-cli.js.map +1 -1
- package/packages/gateway/dist/bootstrap.d.ts.map +1 -1
- package/packages/gateway/dist/bootstrap.js +8 -0
- package/packages/gateway/dist/bootstrap.js.map +1 -1
- package/packages/gateway/dist/channels/local-notification.d.ts +39 -0
- package/packages/gateway/dist/channels/local-notification.d.ts.map +1 -0
- package/packages/gateway/dist/channels/local-notification.js +154 -0
- package/packages/gateway/dist/channels/local-notification.js.map +1 -0
- package/packages/gateway/dist/chat/approvals.d.ts +3 -3
- package/packages/gateway/dist/chat/approvals.js +3 -3
- package/packages/gateway/dist/cli.d.ts +14 -0
- package/packages/gateway/dist/cli.d.ts.map +1 -1
- package/packages/gateway/dist/cli.js +208 -37
- package/packages/gateway/dist/cli.js.map +1 -1
- package/packages/gateway/dist/db-ready.d.ts +2 -1
- package/packages/gateway/dist/db-ready.d.ts.map +1 -1
- package/packages/gateway/dist/db-ready.js +3 -2
- package/packages/gateway/dist/db-ready.js.map +1 -1
- package/packages/gateway/dist/index.d.ts +4 -1
- package/packages/gateway/dist/index.d.ts.map +1 -1
- package/packages/gateway/dist/index.js +5 -1
- package/packages/gateway/dist/index.js.map +1 -1
- package/packages/gateway/dist/missions/agent-run.d.ts.map +1 -1
- package/packages/gateway/dist/missions/agent-run.js +10 -1
- package/packages/gateway/dist/missions/agent-run.js.map +1 -1
- package/packages/gateway/dist/missions/execute.d.ts +15 -1
- package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
- package/packages/gateway/dist/missions/execute.js +6 -1
- package/packages/gateway/dist/missions/execute.js.map +1 -1
- package/packages/gateway/dist/missions-cli.d.ts +2 -0
- package/packages/gateway/dist/missions-cli.d.ts.map +1 -1
- package/packages/gateway/dist/missions-cli.js +53 -8
- package/packages/gateway/dist/missions-cli.js.map +1 -1
- package/packages/gateway/dist/owner-notify.d.ts +43 -0
- package/packages/gateway/dist/owner-notify.d.ts.map +1 -0
- package/packages/gateway/dist/owner-notify.js +87 -0
- package/packages/gateway/dist/owner-notify.js.map +1 -0
- package/packages/gateway/dist/plugins-cli.d.ts +3 -1
- package/packages/gateway/dist/plugins-cli.d.ts.map +1 -1
- package/packages/gateway/dist/plugins-cli.js +11 -4
- package/packages/gateway/dist/plugins-cli.js.map +1 -1
- package/packages/gateway/dist/reminders-cli.d.ts +3 -1
- package/packages/gateway/dist/reminders-cli.d.ts.map +1 -1
- package/packages/gateway/dist/reminders-cli.js +21 -2
- package/packages/gateway/dist/reminders-cli.js.map +1 -1
- package/packages/gateway/dist/serve.d.ts +2 -0
- package/packages/gateway/dist/serve.d.ts.map +1 -1
- package/packages/gateway/dist/serve.js +60 -13
- package/packages/gateway/dist/serve.js.map +1 -1
- package/packages/gateway/dist/telegram/approvals.d.ts +3 -3
- package/packages/gateway/dist/telegram/approvals.js +3 -3
- package/packages/gateway/dist/telegram/channel.d.ts +30 -0
- package/packages/gateway/dist/telegram/channel.d.ts.map +1 -0
- package/packages/gateway/dist/telegram/channel.js +49 -0
- package/packages/gateway/dist/telegram/channel.js.map +1 -0
- package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/surface.js +4 -1
- package/packages/gateway/dist/telegram/surface.js.map +1 -1
- package/packages/gateway/dist/web/config.js +3 -3
- package/packages/gateway/dist/web/http.d.ts +16 -3
- package/packages/gateway/dist/web/http.d.ts.map +1 -1
- package/packages/gateway/dist/web/http.js +39 -3
- package/packages/gateway/dist/web/http.js.map +1 -1
- package/packages/gateway/dist/web/notifications.d.ts +36 -0
- package/packages/gateway/dist/web/notifications.d.ts.map +1 -0
- package/packages/gateway/dist/web/notifications.js +63 -0
- package/packages/gateway/dist/web/notifications.js.map +1 -0
- package/packages/gateway/dist/web/onboarding.d.ts +1 -1
- package/packages/gateway/dist/web/onboarding.js +1 -1
- package/packages/gateway/dist/web/read.js +3 -3
- package/packages/gateway/dist/web/server.d.ts.map +1 -1
- package/packages/gateway/dist/web/server.js +34 -22
- package/packages/gateway/dist/web/server.js.map +1 -1
- package/packages/gateway/dist/web/version.d.ts +1 -0
- package/packages/gateway/dist/web/version.d.ts.map +1 -1
- package/packages/gateway/dist/web/version.js +2 -1
- package/packages/gateway/dist/web/version.js.map +1 -1
- package/packages/gateway/dist/web/write.js +1 -1
- package/packages/install/dist/.tsbuildinfo +1 -1
- package/packages/install/dist/environment.d.ts +29 -0
- package/packages/install/dist/environment.d.ts.map +1 -1
- package/packages/install/dist/environment.js +50 -1
- package/packages/install/dist/environment.js.map +1 -1
- package/packages/install/dist/launcher.d.ts +3 -1
- package/packages/install/dist/launcher.d.ts.map +1 -1
- package/packages/install/dist/launcher.js +93 -12
- package/packages/install/dist/launcher.js.map +1 -1
- package/packages/install/dist/upgrade.d.ts +16 -3
- package/packages/install/dist/upgrade.d.ts.map +1 -1
- package/packages/install/dist/upgrade.js +21 -7
- package/packages/install/dist/upgrade.js.map +1 -1
- package/packages/runtime/dist/.tsbuildinfo +1 -1
- package/packages/runtime/dist/anthropic.d.ts +35 -2
- package/packages/runtime/dist/anthropic.d.ts.map +1 -1
- package/packages/runtime/dist/anthropic.js +36 -12
- package/packages/runtime/dist/anthropic.js.map +1 -1
- package/packages/runtime/dist/delegate.js +1 -1
- package/packages/runtime/dist/loop.d.ts +13 -1
- package/packages/runtime/dist/loop.d.ts.map +1 -1
- package/packages/runtime/dist/loop.js +70 -3
- package/packages/runtime/dist/loop.js.map +1 -1
- package/packages/runtime/dist/openai.d.ts.map +1 -1
- package/packages/runtime/dist/openai.js +9 -6
- package/packages/runtime/dist/openai.js.map +1 -1
- package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
- package/packages/tools/artifacts/dist/index.d.ts +1 -1
- package/packages/tools/browser/dist/.tsbuildinfo +1 -1
- package/packages/tools/browser/dist/availability.d.ts +34 -8
- package/packages/tools/browser/dist/availability.d.ts.map +1 -1
- package/packages/tools/browser/dist/availability.js +44 -5
- package/packages/tools/browser/dist/availability.js.map +1 -1
- package/packages/tools/browser/dist/controller.d.ts +2 -2
- package/packages/tools/browser/dist/controller.d.ts.map +1 -1
- package/packages/tools/browser/dist/controller.js +7 -6
- package/packages/tools/browser/dist/controller.js.map +1 -1
- package/packages/tools/browser/dist/host.d.ts +3 -1
- package/packages/tools/browser/dist/host.d.ts.map +1 -1
- package/packages/tools/browser/dist/host.js +5 -1
- package/packages/tools/browser/dist/host.js.map +1 -1
- package/packages/tools/browser/dist/index.d.ts +1 -1
- package/packages/tools/browser/dist/index.d.ts.map +1 -1
- package/packages/tools/browser/dist/index.js +1 -1
- package/packages/tools/browser/dist/index.js.map +1 -1
- package/packages/tools/browser/dist/service.d.ts +2 -2
- package/packages/tools/browser/dist/service.d.ts.map +1 -1
- package/packages/tools/email/dist/.tsbuildinfo +1 -1
- package/packages/tools/email/dist/channel.d.ts +43 -0
- package/packages/tools/email/dist/channel.d.ts.map +1 -0
- package/packages/tools/email/dist/channel.js +99 -0
- package/packages/tools/email/dist/channel.js.map +1 -0
- package/packages/tools/email/dist/index.d.ts +1 -0
- package/packages/tools/email/dist/index.d.ts.map +1 -1
- package/packages/tools/email/dist/index.js +8 -1
- package/packages/tools/email/dist/index.js.map +1 -1
- package/packages/tools/email/dist/ports.d.ts +3 -3
- package/packages/tools/email/dist/ports.js +1 -1
- package/packages/tools/email/dist/tools/drafts.d.ts +1 -1
- package/packages/tools/email/dist/tools/send.js +1 -1
- package/packages/tools/email/migrations/001_email.sql +3 -2
- package/packages/tools/email/package.json +2 -1
- package/packages/tools/host/dist/.tsbuildinfo +1 -1
- package/packages/tools/memory/dist/.tsbuildinfo +1 -1
- package/packages/tools/memory/dist/index.js +1 -1
- package/packages/tools/memory/migrations/001_memory.sql +1 -1
- package/packages/tools/web/dist/.tsbuildinfo +1 -1
- package/packages/web/dist/assets/dm-mono-latin-400-normal--0xN8mdc.woff +0 -0
- package/packages/web/dist/assets/dm-mono-latin-400-normal-4GdczIuU.woff2 +0 -0
- package/packages/web/dist/assets/dm-mono-latin-500-normal-CN8Miw6E.woff +0 -0
- package/packages/web/dist/assets/dm-mono-latin-500-normal-DRMDZjhP.woff2 +0 -0
- package/packages/web/dist/assets/dm-mono-latin-ext-400-normal-1aZr6b2b.woff +0 -0
- package/packages/web/dist/assets/dm-mono-latin-ext-400-normal-C2zvOubV.woff2 +0 -0
- package/packages/web/dist/assets/dm-mono-latin-ext-500-normal-BtRyHRi6.woff2 +0 -0
- package/packages/web/dist/assets/dm-mono-latin-ext-500-normal-Dw3M13d8.woff +0 -0
- package/packages/web/dist/assets/dm-sans-latin-ext-standard-italic-DNX9AbKj.woff2 +0 -0
- package/packages/web/dist/assets/dm-sans-latin-ext-standard-normal-oos9povj.woff2 +0 -0
- package/packages/web/dist/assets/dm-sans-latin-standard-italic-C8i6y2Ft.woff2 +0 -0
- package/packages/web/dist/assets/dm-sans-latin-standard-normal-Bf69Tn_J.woff2 +0 -0
- package/packages/web/dist/assets/index-BRkIoT-q.js +123 -0
- package/packages/web/dist/assets/index-DCn0vN58.css +1 -0
- package/packages/web/dist/index.html +2 -2
- package/packages/web/dist/assets/index-CxaF2koC.js +0 -122
- package/packages/web/dist/assets/index-DEho_xyR.css +0 -1
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This machine's system notification as a channel (docs/notifications.md).
|
|
3
|
+
*
|
|
4
|
+
* macOS: `terminal-notifier` when it is installed, because a click on it can
|
|
5
|
+
* open the dashboard; otherwise `osascript`'s `display notification`, which
|
|
6
|
+
* shows and opens nothing. Linux: `notify-send`, when it exists and there is
|
|
7
|
+
* a display to show on. Anywhere else there is nothing to show, so no channel
|
|
8
|
+
* is made and Settings never lists one.
|
|
9
|
+
*
|
|
10
|
+
* The service runs as a user LaunchAgent on macOS, which is in the owner's
|
|
11
|
+
* GUI session: `osascript -e 'display notification …'` works there without a
|
|
12
|
+
* TTY. A LaunchDaemon (root, no session) could not, and buddi installs none.
|
|
13
|
+
*
|
|
14
|
+
* Nothing leaves the machine. Routing already sends a `now` message here only
|
|
15
|
+
* when the owner is away from the dashboard or after the 10-minute wait, so
|
|
16
|
+
* this module checks nothing more.
|
|
17
|
+
*/
|
|
18
|
+
import { execFile } from 'node:child_process';
|
|
19
|
+
import { accessSync, constants } from 'node:fs';
|
|
20
|
+
import path from 'node:path';
|
|
21
|
+
/** How long one notification may take before it is refused. */
|
|
22
|
+
export const LOCAL_NOTIFY_TIMEOUT_MS = 5_000;
|
|
23
|
+
/** The longest text shown; a system notification is a line or two. */
|
|
24
|
+
export const LOCAL_NOTIFY_MAX_CHARS = 200;
|
|
25
|
+
/** `execFile` with a timeout, answering instead of throwing. */
|
|
26
|
+
export const execCommand = (file, args, opts) => new Promise((resolve) => {
|
|
27
|
+
execFile(file, [...args], { timeout: opts.timeoutMs, windowsHide: true }, (err, _stdout, stderr) => {
|
|
28
|
+
const text = String(stderr ?? '');
|
|
29
|
+
if (!err)
|
|
30
|
+
return resolve({ code: 0, stderr: text });
|
|
31
|
+
const e = err;
|
|
32
|
+
if (e.killed)
|
|
33
|
+
return resolve({ code: null, stderr: text, error: `it took longer than ${opts.timeoutMs / 1000} s` });
|
|
34
|
+
if (typeof e.code === 'number')
|
|
35
|
+
return resolve({ code: e.code, stderr: text });
|
|
36
|
+
resolve({ code: null, stderr: text, error: e.message });
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
/** A binary on PATH (and, on macOS, where Homebrew puts it: a service's PATH may lack it). */
|
|
40
|
+
export function whichOn(env, platform) {
|
|
41
|
+
const dirs = (env.PATH ?? '').split(path.delimiter).filter(Boolean);
|
|
42
|
+
if (platform === 'darwin')
|
|
43
|
+
dirs.push('/opt/homebrew/bin', '/usr/local/bin', '/usr/bin');
|
|
44
|
+
return (bin) => {
|
|
45
|
+
for (const dir of dirs) {
|
|
46
|
+
const full = path.join(dir, bin);
|
|
47
|
+
try {
|
|
48
|
+
accessSync(full, constants.X_OK);
|
|
49
|
+
return full;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// not here
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** One line, at most `max` characters, cut with an ellipsis. */
|
|
59
|
+
export function oneLine(text, max = LOCAL_NOTIFY_MAX_CHARS) {
|
|
60
|
+
const flat = text.replace(/\s+/g, ' ').trim();
|
|
61
|
+
return flat.length <= max ? flat : `${flat.slice(0, max - 1).trimEnd()}…`;
|
|
62
|
+
}
|
|
63
|
+
/** An AppleScript string literal's inside: backslashes and quotes escaped. */
|
|
64
|
+
export function appleScriptString(text) {
|
|
65
|
+
return text.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
66
|
+
}
|
|
67
|
+
/** The first line of a command's stderr, or what is known instead. */
|
|
68
|
+
function reasonOf(what, result) {
|
|
69
|
+
const line = result.stderr.split('\n').map((l) => l.trim()).find(Boolean);
|
|
70
|
+
if (line)
|
|
71
|
+
return `${what}: ${line}`;
|
|
72
|
+
if (result.error)
|
|
73
|
+
return `${what} did not run: ${result.error}`;
|
|
74
|
+
return `${what} exited with code ${result.code}`;
|
|
75
|
+
}
|
|
76
|
+
/** Title and body as the notification shows them. With no text, the title is the body. */
|
|
77
|
+
function parts(message) {
|
|
78
|
+
const text = message.text?.trim();
|
|
79
|
+
return text
|
|
80
|
+
? { title: oneLine(message.title, 120), body: oneLine(text) }
|
|
81
|
+
: { title: oneLine(message.title), body: null };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The channel for this machine, or null when it has nothing to show on.
|
|
85
|
+
* The command is picked once, when the channel is made.
|
|
86
|
+
*/
|
|
87
|
+
export function createLocalNotificationChannel(opts = {}) {
|
|
88
|
+
const platform = opts.platform ?? process.platform;
|
|
89
|
+
const env = opts.env ?? process.env;
|
|
90
|
+
const exec = opts.exec ?? execCommand;
|
|
91
|
+
const which = opts.which ?? whichOn(env, platform);
|
|
92
|
+
const run = async (what, file, args) => {
|
|
93
|
+
let result;
|
|
94
|
+
try {
|
|
95
|
+
result = await exec(file, args, { timeoutMs: LOCAL_NOTIFY_TIMEOUT_MS });
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
result = { code: null, stderr: '', error: err instanceof Error ? err.message : String(err) };
|
|
99
|
+
}
|
|
100
|
+
return result.code === 0 ? { id: 'local' } : { refused: reasonOf(what, result) };
|
|
101
|
+
};
|
|
102
|
+
const base = {
|
|
103
|
+
kind: 'local.notification',
|
|
104
|
+
can: { offers: false, attachments: false, markdown: false },
|
|
105
|
+
// After Telegram, before a plugin's: nothing leaves the machine.
|
|
106
|
+
priority: 10,
|
|
107
|
+
};
|
|
108
|
+
if (platform === 'darwin') {
|
|
109
|
+
const notifier = which('terminal-notifier');
|
|
110
|
+
if (notifier) {
|
|
111
|
+
return {
|
|
112
|
+
...base,
|
|
113
|
+
describe: () => ({ label: 'System notification', where: 'shows on this Mac; a click opens the dashboard' }),
|
|
114
|
+
async deliver(message) {
|
|
115
|
+
const { title, body } = parts(message);
|
|
116
|
+
const args = ['-title', 'buddi', ...(body ? ['-subtitle', title, '-message', body] : ['-message', title]), '-group', `buddi-${message.id}`];
|
|
117
|
+
const url = opts.dashboardUrl?.(message.link?.route ?? '');
|
|
118
|
+
if (url)
|
|
119
|
+
args.push('-open', url);
|
|
120
|
+
return run('terminal-notifier', notifier, args);
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const osascript = which('osascript');
|
|
125
|
+
if (!osascript)
|
|
126
|
+
return null;
|
|
127
|
+
return {
|
|
128
|
+
...base,
|
|
129
|
+
describe: () => ({ label: 'System notification', where: 'shows on this Mac; opens nothing' }),
|
|
130
|
+
async deliver(message) {
|
|
131
|
+
const { title, body } = parts(message);
|
|
132
|
+
const script = body
|
|
133
|
+
? `display notification "${appleScriptString(body)}" with title "buddi" subtitle "${appleScriptString(title)}"`
|
|
134
|
+
: `display notification "${appleScriptString(title)}" with title "buddi"`;
|
|
135
|
+
return run('osascript', osascript, ['-e', script]);
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
if (platform === 'linux') {
|
|
140
|
+
const notifySend = which('notify-send');
|
|
141
|
+
if (!notifySend || !(env.DISPLAY?.trim() || env.WAYLAND_DISPLAY?.trim()))
|
|
142
|
+
return null;
|
|
143
|
+
return {
|
|
144
|
+
...base,
|
|
145
|
+
describe: () => ({ label: 'System notification', where: 'shows on this computer; opens nothing' }),
|
|
146
|
+
async deliver(message) {
|
|
147
|
+
const { title, body } = parts(message);
|
|
148
|
+
return run('notify-send', notifySend, [`buddi: ${title}`, ...(body ? [body] : [])]);
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=local-notification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-notification.js","sourceRoot":"","sources":["../../src/channels/local-notification.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Approvals in the terminal.
|
|
3
3
|
*
|
|
4
|
-
* The rule
|
|
5
|
-
* owner decides, core moves the row, and the
|
|
6
|
-
* runs the effect. So this file is deliberately thin — it calls exactly the
|
|
4
|
+
* The rule in docs/architecture.md ("Actions and approvals") does not change
|
|
5
|
+
* because the surface did: the owner decides, core moves the row, and the
|
|
6
|
+
* Executor is the only thing that runs the effect. So this file is deliberately thin — it calls exactly the
|
|
7
7
|
* functions the Telegram surface calls, in exactly the same order:
|
|
8
8
|
*
|
|
9
9
|
* decideApproval → executeApproved → resumeJobForAction
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Approvals in the terminal.
|
|
3
3
|
*
|
|
4
|
-
* The rule
|
|
5
|
-
* owner decides, core moves the row, and the
|
|
6
|
-
* runs the effect. So this file is deliberately thin — it calls exactly the
|
|
4
|
+
* The rule in docs/architecture.md ("Actions and approvals") does not change
|
|
5
|
+
* because the surface did: the owner decides, core moves the row, and the
|
|
6
|
+
* Executor is the only thing that runs the effect. So this file is deliberately thin — it calls exactly the
|
|
7
7
|
* functions the Telegram surface calls, in exactly the same order:
|
|
8
8
|
*
|
|
9
9
|
* decideApproval → executeApproved → resumeJobForAction
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { type ActionRecord } from '@buddi/core';
|
|
3
|
+
import type { ApprovalResume } from '@buddi/runtime';
|
|
2
4
|
import { type TerminalStyle } from './chat/terminal.js';
|
|
3
5
|
export type ParsedArgs = {
|
|
4
6
|
command: 'chat' | 'ask' | 'agents' | 'help';
|
|
@@ -9,7 +11,17 @@ export type ParsedArgs = {
|
|
|
9
11
|
last: boolean;
|
|
10
12
|
/** `--quiet`: suppress the per-run footer. Absent means "show it". */
|
|
11
13
|
quiet?: boolean;
|
|
14
|
+
/** `ask --json`: one object on stdout instead of the answer's text. */
|
|
15
|
+
json?: boolean;
|
|
16
|
+
/** `ask --file <path>`, repeatable: stored in the library, sent with the question. */
|
|
17
|
+
files?: string[];
|
|
18
|
+
/** `ask --wait <seconds>`: how long to wait for an approval given elsewhere. */
|
|
19
|
+
waitSeconds?: number;
|
|
12
20
|
};
|
|
21
|
+
/** An approval the run stopped on, polled every this often under `--wait`. */
|
|
22
|
+
export declare const WAIT_POLL_MS = 2000;
|
|
23
|
+
/** What `ask` says when it stops for an approval. */
|
|
24
|
+
export declare function approvalStopText(actionId: string, conversationId: string): string;
|
|
13
25
|
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
14
26
|
/** Where the prompt remembers what was typed. Beside every other artifact. */
|
|
15
27
|
export declare function historyFile(env?: NodeJS.ProcessEnv): string;
|
|
@@ -45,4 +57,6 @@ export declare function shouldPage(text: string, style: TerminalStyle, rows: num
|
|
|
45
57
|
* calls this function instead of re-implementing it.
|
|
46
58
|
*/
|
|
47
59
|
export declare function main(argv?: string[]): Promise<void>;
|
|
60
|
+
/** How a decided action wakes the run that stopped on it. */
|
|
61
|
+
export declare function approvalResumeFrom(action: ActionRecord): ApprovalResume;
|
|
48
62
|
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA4BA,OAAO,EAML,KAAK,YAAY,EAElB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC;AAepE,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA2B7E,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,YAAY,OAAQ,CAAC;AAElC,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAKjF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAyCpD;AAiBD,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAExE;AAED,wEAAwE;AACxE,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAWlD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAQ1E;AAMD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAwCvC;AAMD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAIpF;AAoBD;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAwHhF;AAaD,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CASvE"}
|
|
@@ -24,8 +24,9 @@ import { homedir } from 'node:os';
|
|
|
24
24
|
import path from 'node:path';
|
|
25
25
|
import readline from 'node:readline/promises';
|
|
26
26
|
import { spawn } from 'node:child_process';
|
|
27
|
+
import { randomUUID } from 'node:crypto';
|
|
27
28
|
import { fileURLToPath } from 'node:url';
|
|
28
|
-
import { resolveDataDir, CLI_SURFACE, UnknownAgentError, } from '@buddi/core';
|
|
29
|
+
import { getAction, resolveDataDir, CLI_SURFACE, TERMINAL_STATES, UnknownAgentError, } from '@buddi/core';
|
|
29
30
|
import { failedTurnReply } from './surfaces/failure.js';
|
|
30
31
|
import { createConversation, runAgent } from '@buddi/runtime';
|
|
31
32
|
import { nativeSearchRecorder } from '@buddi/tool-web';
|
|
@@ -41,6 +42,7 @@ import { ChatSession, QUIET_UNAVAILABLE_TEXT } from './chat/session.js';
|
|
|
41
42
|
import { Spinner, silentSpinner } from './chat/spinner.js';
|
|
42
43
|
import { bold, dim, styleFor } from './chat/terminal.js';
|
|
43
44
|
import { describeDatabaseError } from './db-ready.js';
|
|
45
|
+
import { attachFile } from './chat/attach.js';
|
|
44
46
|
import { createInlineMissionRunner } from './missions/inline.js';
|
|
45
47
|
import { createEngagementHooks } from './missions/engagement.js';
|
|
46
48
|
import { recapMissionId } from './missions/recap.js';
|
|
@@ -56,12 +58,20 @@ const USAGE = `buddi — your personal agents
|
|
|
56
58
|
buddi ask "<question>" one turn, then exit
|
|
57
59
|
buddi ask "<question>" --agent <handle>
|
|
58
60
|
buddi ask "<question>" --resume <id>
|
|
61
|
+
buddi ask "<question>" --file <path> --wait <seconds> --json
|
|
59
62
|
buddi agents every agent, its engine and whether it can run
|
|
60
63
|
buddi agents show <handle> | set <handle> [--provider p] [--model m]
|
|
61
64
|
buddi agents models | test <handle>
|
|
62
65
|
|
|
63
66
|
In chat: /help lists every command. Exit codes for ask: 0 answered, 1 failed,
|
|
64
|
-
2 stopped awaiting your approval.`;
|
|
67
|
+
2 usage, 3 stopped awaiting your approval (or no database, or no such agent).`;
|
|
68
|
+
/** An approval the run stopped on, polled every this often under `--wait`. */
|
|
69
|
+
export const WAIT_POLL_MS = 2_000;
|
|
70
|
+
/** What `ask` says when it stops for an approval. */
|
|
71
|
+
export function approvalStopText(actionId, conversationId) {
|
|
72
|
+
return (`This run is waiting for your approval (action ${actionId}).\n` +
|
|
73
|
+
`Approve it on the dashboard or Telegram, then run buddi ask again with --resume ${conversationId}`);
|
|
74
|
+
}
|
|
65
75
|
export function parseArgs(argv) {
|
|
66
76
|
const [raw, ...rest] = argv;
|
|
67
77
|
const command = raw === 'chat' ? 'chat' : raw === 'ask' ? 'ask' : raw === 'agents' ? 'agents' : 'help';
|
|
@@ -90,6 +100,21 @@ export function parseArgs(argv) {
|
|
|
90
100
|
else if (arg === '--quiet' || arg === '-q') {
|
|
91
101
|
parsed.quiet = true;
|
|
92
102
|
}
|
|
103
|
+
else if (arg === '--json' && command === 'ask') {
|
|
104
|
+
parsed.json = true;
|
|
105
|
+
}
|
|
106
|
+
else if (arg === '--file' && command === 'ask') {
|
|
107
|
+
const value = rest[++i];
|
|
108
|
+
if (!value)
|
|
109
|
+
throw new Error('--file needs a path');
|
|
110
|
+
parsed.files = [...(parsed.files ?? []), value];
|
|
111
|
+
}
|
|
112
|
+
else if (arg === '--wait' && command === 'ask') {
|
|
113
|
+
const value = Number(rest[++i]);
|
|
114
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
115
|
+
throw new Error('--wait needs a number of seconds');
|
|
116
|
+
parsed.waitSeconds = value;
|
|
117
|
+
}
|
|
93
118
|
else if (arg.startsWith('--')) {
|
|
94
119
|
throw new Error(`unknown option: ${arg}`);
|
|
95
120
|
}
|
|
@@ -245,7 +270,7 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
245
270
|
}
|
|
246
271
|
catch (err) {
|
|
247
272
|
console.error(err instanceof Error ? err.message : String(err));
|
|
248
|
-
process.exit(
|
|
273
|
+
process.exit(2);
|
|
249
274
|
}
|
|
250
275
|
if (args.command === 'help') {
|
|
251
276
|
console.log(USAGE);
|
|
@@ -253,9 +278,16 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
253
278
|
}
|
|
254
279
|
await loadEnvironment();
|
|
255
280
|
const style = styleFor(process.env, process.stdout);
|
|
256
|
-
|
|
281
|
+
// A script pipes its question in: `echo "…" | buddi ask`.
|
|
282
|
+
if (args.command === 'ask' && !args.question && process.stdin.isTTY !== true) {
|
|
283
|
+
const piped = (await readStdin()).trim();
|
|
284
|
+
if (piped !== '')
|
|
285
|
+
args.question = piped;
|
|
286
|
+
}
|
|
287
|
+
// With no question, `--resume` finishes a run that stopped for an approval.
|
|
288
|
+
if (args.command === 'ask' && !args.question && !args.resume) {
|
|
257
289
|
console.error('buddi ask needs a question: buddi ask "can I afford a bike?"');
|
|
258
|
-
process.exit(
|
|
290
|
+
process.exit(2);
|
|
259
291
|
}
|
|
260
292
|
/*
|
|
261
293
|
* The composition root, vault included. `createWiringAsync` hydrates the
|
|
@@ -269,9 +301,9 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
269
301
|
}
|
|
270
302
|
catch (err) {
|
|
271
303
|
// A person is waiting at a prompt: fail fast, with the sentence that says
|
|
272
|
-
// what to do about it.
|
|
304
|
+
// what to do about it. No database is something to fix first: 3.
|
|
273
305
|
console.error(describeDatabaseError(err, process.env.DATABASE_URL));
|
|
274
|
-
process.exit(
|
|
306
|
+
process.exit(3);
|
|
275
307
|
}
|
|
276
308
|
const { pool, registry, catalog, now, timezone, ctx } = wiring;
|
|
277
309
|
// Fails closed: an unknown --agent is never coerced into the default. A
|
|
@@ -284,7 +316,7 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
284
316
|
if (err instanceof UnknownAgentError) {
|
|
285
317
|
console.error(err.message);
|
|
286
318
|
console.error(`agents live in ${AGENTS_DIR}; run "buddi agents" to list them`);
|
|
287
|
-
process.exit(
|
|
319
|
+
process.exit(3);
|
|
288
320
|
}
|
|
289
321
|
throw err;
|
|
290
322
|
}
|
|
@@ -292,8 +324,8 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
292
324
|
// The *selected* agent's provider, not the process's: an agent pinned to
|
|
293
325
|
// another provider is run on that provider or not at all.
|
|
294
326
|
if (!selected.available) {
|
|
295
|
-
console.error(`@${selected.handle} cannot run: ${selected.unavailableReason}. Configure its account in dashboard Providers.`);
|
|
296
|
-
process.exit(
|
|
327
|
+
console.error(`@${selected.handle} cannot run: ${String(selected.unavailableReason).replace(/\.$/, '')}. Configure its account in dashboard Providers.`);
|
|
328
|
+
process.exit(3);
|
|
297
329
|
}
|
|
298
330
|
// The cause chain of every failed attempt, on stderr. At a terminal that is
|
|
299
331
|
// where an operator looks, and it is the only record `buddi chat` keeps.
|
|
@@ -325,6 +357,9 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
325
357
|
wiring,
|
|
326
358
|
provider,
|
|
327
359
|
memoryPreamble,
|
|
360
|
+
json: args.json === true,
|
|
361
|
+
files: args.files ?? [],
|
|
362
|
+
waitSeconds: args.waitSeconds,
|
|
328
363
|
});
|
|
329
364
|
return;
|
|
330
365
|
}
|
|
@@ -339,33 +374,166 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
339
374
|
/* ------------------------------------------------------------------ *
|
|
340
375
|
* ask — one turn, for a script
|
|
341
376
|
* ------------------------------------------------------------------ */
|
|
377
|
+
/** All of stdin, for a question piped in. */
|
|
378
|
+
async function readStdin() {
|
|
379
|
+
const chunks = [];
|
|
380
|
+
for await (const chunk of process.stdin)
|
|
381
|
+
chunks.push(Buffer.from(chunk));
|
|
382
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
383
|
+
}
|
|
384
|
+
/** How a decided action wakes the run that stopped on it. */
|
|
385
|
+
export function approvalResumeFrom(action) {
|
|
386
|
+
const outcome = (action.outcome ?? {});
|
|
387
|
+
return {
|
|
388
|
+
actionId: action.id,
|
|
389
|
+
tool: action.tool,
|
|
390
|
+
state: action.state,
|
|
391
|
+
...(outcome.result === undefined ? {} : { result: outcome.result }),
|
|
392
|
+
...(typeof outcome.error === 'string' ? { error: outcome.error } : {}),
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* The action a conversation's last run stopped on, once it is decided and not
|
|
397
|
+
* yet taken up again. Only actions that belong to no queue job: those the
|
|
398
|
+
* queue wakes on its own.
|
|
399
|
+
*/
|
|
400
|
+
async function decidedButNotResumed(pool, conversationId) {
|
|
401
|
+
const { rows } = await pool.query(`select a.id from core.actions a
|
|
402
|
+
where a.conversation_id = $1 and a.job_id is null
|
|
403
|
+
and not exists (
|
|
404
|
+
select 1 from core.events e
|
|
405
|
+
where e.kind = 'run.resumed' and e.conversation_id = a.conversation_id
|
|
406
|
+
and e.payload->>'actionId' = a.id::text)
|
|
407
|
+
order by a.created_at desc
|
|
408
|
+
limit 1`, [conversationId]);
|
|
409
|
+
const id = rows[0]?.id;
|
|
410
|
+
if (!id)
|
|
411
|
+
return undefined;
|
|
412
|
+
const action = await getAction(pool, id);
|
|
413
|
+
if (!action)
|
|
414
|
+
return undefined;
|
|
415
|
+
return { action, decided: TERMINAL_STATES.includes(action.state) };
|
|
416
|
+
}
|
|
417
|
+
/** Poll an action until it is decided, or the time is up. */
|
|
418
|
+
async function waitForDecision(pool, actionId, seconds) {
|
|
419
|
+
const deadline = Date.now() + seconds * 1000;
|
|
420
|
+
for (;;) {
|
|
421
|
+
const action = await getAction(pool, actionId);
|
|
422
|
+
if (action && TERMINAL_STATES.includes(action.state))
|
|
423
|
+
return action;
|
|
424
|
+
if (Date.now() >= deadline)
|
|
425
|
+
return undefined;
|
|
426
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(WAIT_POLL_MS, Math.max(0, deadline - Date.now()))));
|
|
427
|
+
}
|
|
428
|
+
}
|
|
342
429
|
/**
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
*
|
|
430
|
+
* `ask` — one turn, for a script.
|
|
431
|
+
*
|
|
432
|
+
* The answer on stdout (or one JSON object with `--json`), everything else on
|
|
433
|
+
* stderr, no spinner and no ANSI. Exit 0 answered, 1 failed, 3 stopped for an
|
|
434
|
+
* approval: with `--wait` the run waits for a decision made elsewhere and
|
|
435
|
+
* finishes; without it, the sentence says how to finish it later.
|
|
346
436
|
*/
|
|
347
437
|
async function ask(question, conversationId, deps) {
|
|
348
438
|
const { wiring } = deps;
|
|
349
|
-
|
|
439
|
+
const runId = randomUUID();
|
|
440
|
+
const startedAt = new Date();
|
|
441
|
+
if (!deps.json)
|
|
442
|
+
console.error(`conversation: ${conversationId}`);
|
|
443
|
+
const store = createCoreArtifactStore({ pool: wiring.pool, env: process.env });
|
|
444
|
+
const attachments = [];
|
|
445
|
+
for (const file of deps.files) {
|
|
446
|
+
try {
|
|
447
|
+
const saved = await attachFile(path.resolve(file), {
|
|
448
|
+
store,
|
|
449
|
+
readFile: (candidate) => readFile(candidate),
|
|
450
|
+
createdBy: wiring.ctx.ownerId,
|
|
451
|
+
});
|
|
452
|
+
attachments.push({
|
|
453
|
+
artifactId: saved.artifactId,
|
|
454
|
+
mime: saved.mime,
|
|
455
|
+
kind: saved.kind,
|
|
456
|
+
filename: saved.filename,
|
|
457
|
+
sizeBytes: saved.sizeBytes,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
catch (err) {
|
|
461
|
+
console.error(`Could not attach ${file}: ${err instanceof Error ? err.message : String(err)}`);
|
|
462
|
+
process.exitCode = 1;
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
// No question: finish the run this conversation stopped on, if it can be.
|
|
467
|
+
let resume;
|
|
468
|
+
if (question === undefined) {
|
|
469
|
+
const found = await decidedButNotResumed(wiring.pool, conversationId);
|
|
470
|
+
if (!found) {
|
|
471
|
+
console.error('Nothing in that conversation is waiting to be finished. Ask a question: buddi ask "…" --resume <id>.');
|
|
472
|
+
process.exitCode = 2;
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
let action = found.action;
|
|
476
|
+
if (!found.decided) {
|
|
477
|
+
action = deps.waitSeconds === undefined ? undefined : await waitForDecision(wiring.pool, found.action.id, deps.waitSeconds);
|
|
478
|
+
if (!action) {
|
|
479
|
+
report({ text: '', pendingActionId: found.action.id });
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
resume = approvalResumeFrom(action);
|
|
484
|
+
}
|
|
485
|
+
function report(result, artifacts = []) {
|
|
486
|
+
if (deps.json) {
|
|
487
|
+
console.log(JSON.stringify({
|
|
488
|
+
text: result.text,
|
|
489
|
+
runId,
|
|
490
|
+
conversationId,
|
|
491
|
+
artifacts,
|
|
492
|
+
...(result.pendingActionId ? { pendingActionId: result.pendingActionId } : {}),
|
|
493
|
+
}, null, 2));
|
|
494
|
+
}
|
|
495
|
+
else if (result.text !== '') {
|
|
496
|
+
console.log(result.text);
|
|
497
|
+
}
|
|
498
|
+
if (result.pendingActionId) {
|
|
499
|
+
console.error(`\n${approvalStopText(result.pendingActionId, conversationId)}`);
|
|
500
|
+
process.exitCode = 3;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
const run = (turn) => runAgent({
|
|
504
|
+
agent: deps.agent.definition(wiring.now(), wiring.timezone),
|
|
505
|
+
provider: deps.provider,
|
|
506
|
+
registry: wiring.registry,
|
|
507
|
+
ctx: wiring.ctx,
|
|
508
|
+
pool: wiring.pool,
|
|
509
|
+
// The provider's own web search leaves the same audit row `web.search`
|
|
510
|
+
// does; see @buddi/tool-web's native.ts.
|
|
511
|
+
onNativeSearch: nativeSearchRecorder(wiring.pool),
|
|
512
|
+
conversationId,
|
|
513
|
+
runId,
|
|
514
|
+
...turn,
|
|
515
|
+
loadArtifact: (id) => store.load(id),
|
|
516
|
+
surface: CLI_SURFACE,
|
|
517
|
+
memoryPreamble: deps.memoryPreamble,
|
|
518
|
+
onToolCall: (name, input) => {
|
|
519
|
+
if (!deps.json)
|
|
520
|
+
console.error(`⚙ ${name} ${JSON.stringify(input)}`);
|
|
521
|
+
},
|
|
522
|
+
});
|
|
350
523
|
let result;
|
|
351
524
|
try {
|
|
352
|
-
result = await
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
memoryPreamble: deps.memoryPreamble,
|
|
365
|
-
onToolCall: (name, input) => {
|
|
366
|
-
console.error(`⚙ ${name} ${JSON.stringify(input)}`);
|
|
367
|
-
},
|
|
368
|
-
});
|
|
525
|
+
result = await run(resume
|
|
526
|
+
? { resume }
|
|
527
|
+
: { userMessage: question, ...(attachments.length > 0 ? { attachments } : {}) });
|
|
528
|
+
// `--wait`: the owner decides on another surface, and this run finishes.
|
|
529
|
+
while (result.stopped === 'awaiting-approval' && result.pendingActionId && deps.waitSeconds !== undefined) {
|
|
530
|
+
if (!deps.json)
|
|
531
|
+
console.error(`waiting up to ${deps.waitSeconds}s for your decision on action ${result.pendingActionId}`);
|
|
532
|
+
const decided = await waitForDecision(wiring.pool, result.pendingActionId, deps.waitSeconds);
|
|
533
|
+
if (!decided)
|
|
534
|
+
break;
|
|
535
|
+
result = await run({ resume: approvalResumeFrom(decided) });
|
|
536
|
+
}
|
|
369
537
|
}
|
|
370
538
|
catch (err) {
|
|
371
539
|
// A script still deserves the human sentence: `fetch failed` on stderr and
|
|
@@ -388,14 +556,17 @@ async function ask(question, conversationId, deps) {
|
|
|
388
556
|
process.exitCode = 1;
|
|
389
557
|
return;
|
|
390
558
|
}
|
|
559
|
+
// What the run made: files an agent saved in this conversation since it began.
|
|
560
|
+
const { rows } = await wiring.pool.query(`select id, filename from core.artifacts
|
|
561
|
+
where conversation_id = $1 and created_at >= $2 and created_by <> $3 and deleted_at is null
|
|
562
|
+
order by created_at`, [conversationId, startedAt, wiring.ctx.ownerId]);
|
|
563
|
+
const made = rows.map((r) => ({ id: String(r.id), filename: r.filename }));
|
|
391
564
|
// Safety net, not the mechanism: tool names are internal and nothing asks the
|
|
392
565
|
// model to print one. This catches the answer of a model that did anyway.
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
process.exitCode = 2;
|
|
398
|
-
}
|
|
566
|
+
report({
|
|
567
|
+
text: stripToolNames(result.text),
|
|
568
|
+
...(result.stopped === 'awaiting-approval' && result.pendingActionId ? { pendingActionId: result.pendingActionId } : {}),
|
|
569
|
+
}, made);
|
|
399
570
|
}
|
|
400
571
|
/* ------------------------------------------------------------------ *
|
|
401
572
|
* chat — the REPL
|