@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,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The channels registry: who can carry a message to the owner from this
|
|
3
|
+
* process. A channel is registered by whatever owns the transport — the
|
|
4
|
+
* Telegram surface at gateway boot — and core never knows more about it than
|
|
5
|
+
* this shape.
|
|
6
|
+
*/
|
|
7
|
+
import { ALWAYS_REACH } from './types.js';
|
|
8
|
+
const channels = new Map();
|
|
9
|
+
/** Add a channel; the returned function removes exactly this registration. */
|
|
10
|
+
export function registerChannel(channel) {
|
|
11
|
+
if (channel.kind === 'dashboard')
|
|
12
|
+
throw new Error('"dashboard" is a surface, not a channel');
|
|
13
|
+
channels.set(channel.kind, channel);
|
|
14
|
+
return () => {
|
|
15
|
+
if (channels.get(channel.kind) === channel)
|
|
16
|
+
channels.delete(channel.kind);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** A channel's description, or null when it has nothing to carry a message now. Never throws. */
|
|
20
|
+
async function described(channel) {
|
|
21
|
+
try {
|
|
22
|
+
return (await channel.describe()) ?? null;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** The channels there are now, the default-when-none-is-picked first: by `priority`, then as registered. */
|
|
29
|
+
async function available() {
|
|
30
|
+
const all = [...channels.values()].sort((a, b) => (a.priority ?? 100) - (b.priority ?? 100));
|
|
31
|
+
const answers = await Promise.all(all.map(described));
|
|
32
|
+
return all.flatMap((channel, i) => {
|
|
33
|
+
const description = answers[i];
|
|
34
|
+
return description ? [{ channel, description }] : [];
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/** Every channel there is now, in the order `available` gives. */
|
|
38
|
+
export async function listChannels() {
|
|
39
|
+
return (await available()).map(({ channel, description }) => ({
|
|
40
|
+
kind: channel.kind,
|
|
41
|
+
label: description.label,
|
|
42
|
+
...(description.where ? { where: description.where } : {}),
|
|
43
|
+
can: channel.can,
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
/** Tests only: forget every channel. */
|
|
47
|
+
export function clearChannels() {
|
|
48
|
+
channels.clear();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The channel a message of this kind goes to: the kind's own choice when it
|
|
52
|
+
* names a channel there is now, else the default channel, else the first one
|
|
53
|
+
* (by `priority`, then as registered). `off` when the owner turned the kind off; null when there is
|
|
54
|
+
* nowhere to go.
|
|
55
|
+
*/
|
|
56
|
+
export async function channelFor(settings, kind) {
|
|
57
|
+
const own = kind ? settings.perKind[kind] : undefined;
|
|
58
|
+
if (own === 'off')
|
|
59
|
+
return ALWAYS_REACH.has(kind) ? channelFor(settings) : 'off';
|
|
60
|
+
const there = (await available()).map(({ channel }) => channel.kind);
|
|
61
|
+
if (own && there.includes(own))
|
|
62
|
+
return own;
|
|
63
|
+
if (settings.defaultChannel && there.includes(settings.defaultChannel))
|
|
64
|
+
return settings.defaultChannel;
|
|
65
|
+
return there[0] ?? null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Hand a message to one channel. Never throws: a channel that refuses or
|
|
69
|
+
* throws is an answer, written on the row by the caller.
|
|
70
|
+
*/
|
|
71
|
+
export async function deliverTo(kind, message) {
|
|
72
|
+
const channel = channels.get(kind);
|
|
73
|
+
if (!channel)
|
|
74
|
+
return { ok: false, error: 'no channel' };
|
|
75
|
+
try {
|
|
76
|
+
const answer = await channel.deliver(message);
|
|
77
|
+
if (answer === 'refused')
|
|
78
|
+
return { ok: false, error: `${(await described(channel))?.label ?? kind} refused it` };
|
|
79
|
+
if ('refused' in answer)
|
|
80
|
+
return { ok: false, error: answer.refused };
|
|
81
|
+
return { ok: true, id: answer.id };
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=channels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/notifications/channels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Queryable } from '../owner.js';
|
|
2
|
+
import { type NotificationSettings, type NotifyDeps, type NotifyResult, type OwnerMessage } from './types.js';
|
|
3
|
+
/** A `now` message shown on the dashboard goes to the channel after this long unseen. */
|
|
4
|
+
export declare const ESCALATE_AFTER_MS: number;
|
|
5
|
+
/** The rate rule: more than this many fires of one key in an hour lowers `now` to `today`. */
|
|
6
|
+
export declare const RATE_LIMIT_PER_HOUR = 3;
|
|
7
|
+
/** Said once, on the title, when the rate rule lowers a message. */
|
|
8
|
+
export declare const LOWERED_SENTENCE = "This came up more than three times in an hour, so it waits for the end of the day.";
|
|
9
|
+
/** The surface whose presence means "shown on the dashboard". */
|
|
10
|
+
export declare const DASHBOARD_SURFACE = "web";
|
|
11
|
+
/** Inside quiet hours at `now`, and the instant they end; null when there are none or it is not quiet. */
|
|
12
|
+
export declare function quietUntil(settings: NotificationSettings, now: Date, timezone: string): Date | null;
|
|
13
|
+
/**
|
|
14
|
+
* Tell the owner something. Writes the row, routes it, and never throws for
|
|
15
|
+
* a channel's sake: a message with nowhere to go is a row with `error`.
|
|
16
|
+
* Throws only for a malformed message, which is the caller's bug.
|
|
17
|
+
*/
|
|
18
|
+
export declare function notifyOwner(db: Queryable, deps: NotifyDeps, message: OwnerMessage): Promise<NotifyResult>;
|
|
19
|
+
/** What one tick did. */
|
|
20
|
+
export interface NotificationsTickResult {
|
|
21
|
+
escalated: number;
|
|
22
|
+
endOfDay: number;
|
|
23
|
+
failed: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The later half of routing: runs on the gateway's 60-second loop.
|
|
27
|
+
*
|
|
28
|
+
* 1. Quiet hours: a `now` row that falls due while it is quiet (and is not an
|
|
29
|
+
* approval or a question) waits for the end of them.
|
|
30
|
+
* 2. Escalation: a `now` row shown on the dashboard and not seen, or held
|
|
31
|
+
* through quiet hours, goes to its channel.
|
|
32
|
+
* 3. End of the day: every held `today` row goes out as one message.
|
|
33
|
+
*/
|
|
34
|
+
export declare function notificationsTick(db: Queryable, deps: NotifyDeps, now?: Date): Promise<NotificationsTickResult>;
|
|
35
|
+
//# sourceMappingURL=notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/notifications/notify.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAiB7C,OAAO,EAKL,KAAK,oBAAoB,EAEzB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EAElB,MAAM,YAAY,CAAC;AAEpB,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,QAAc,CAAC;AAE7C,8FAA8F;AAC9F,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,uFAAuF,CAAC;AAErH,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAYvC,0GAA0G;AAC1G,wBAAgB,UAAU,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAOnG;AA0FD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA4F/G;AAED,yBAAyB;AACzB,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,GAAE,IAAiC,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAqEjJ"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one call that reaches the owner, and the tick that keeps its promises
|
|
3
|
+
* (docs/notifications.md).
|
|
4
|
+
*
|
|
5
|
+
* `notifyOwner` writes the row and routes it:
|
|
6
|
+
*
|
|
7
|
+
* now the owner is on the dashboard → shown there; if nobody has seen it
|
|
8
|
+
* in ten minutes, the default channel anyway. Away → the default
|
|
9
|
+
* channel at once. Quiet hours hold it until they end, except
|
|
10
|
+
* approvals and questions.
|
|
11
|
+
* today held until the end of the owner's day, then one message for all.
|
|
12
|
+
* digest stored; the recap reads it.
|
|
13
|
+
*
|
|
14
|
+
* `notificationsTick` does the later half: escalations, the end of quiet
|
|
15
|
+
* hours, the end of the day. Every transition is one UPDATE guarded by the
|
|
16
|
+
* state it leaves, so two ticks never send one row twice.
|
|
17
|
+
*/
|
|
18
|
+
import { getOwnerProfile } from '../onboarding/store.js';
|
|
19
|
+
import { scrubText } from '../secrets/scrub.js';
|
|
20
|
+
import { isKnownTimezone, localDateString, localMinutesOfDay, minutesOfLocalTime, nextLocalTime, timezoneFromEnv, } from '../time.js';
|
|
21
|
+
import { channelFor, deliverTo } from './channels.js';
|
|
22
|
+
import { NOTIFICATION_COLUMNS, presentSurfaces, readNotificationSettings, toNotification, } from './store.js';
|
|
23
|
+
import { ALWAYS_REACH, NOTIFICATION_KINDS, NOTIFICATION_URGENCIES, } from './types.js';
|
|
24
|
+
/** A `now` message shown on the dashboard goes to the channel after this long unseen. */
|
|
25
|
+
export const ESCALATE_AFTER_MS = 10 * 60_000;
|
|
26
|
+
/** The rate rule: more than this many fires of one key in an hour lowers `now` to `today`. */
|
|
27
|
+
export const RATE_LIMIT_PER_HOUR = 3;
|
|
28
|
+
/** Said once, on the title, when the rate rule lowers a message. */
|
|
29
|
+
export const LOWERED_SENTENCE = 'This came up more than three times in an hour, so it waits for the end of the day.';
|
|
30
|
+
/** The surface whose presence means "shown on the dashboard". */
|
|
31
|
+
export const DASHBOARD_SURFACE = 'web';
|
|
32
|
+
async function ownerTimezone(db, deps) {
|
|
33
|
+
try {
|
|
34
|
+
const profile = await getOwnerProfile(db);
|
|
35
|
+
if (profile.timezone && isKnownTimezone(profile.timezone))
|
|
36
|
+
return profile.timezone.trim();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// No owner row yet is not a reason to lose a message.
|
|
40
|
+
}
|
|
41
|
+
return deps.timezone ?? timezoneFromEnv();
|
|
42
|
+
}
|
|
43
|
+
/** Inside quiet hours at `now`, and the instant they end; null when there are none or it is not quiet. */
|
|
44
|
+
export function quietUntil(settings, now, timezone) {
|
|
45
|
+
if (!settings.quietStart || !settings.quietEnd)
|
|
46
|
+
return null;
|
|
47
|
+
const start = minutesOfLocalTime(settings.quietStart);
|
|
48
|
+
const end = minutesOfLocalTime(settings.quietEnd);
|
|
49
|
+
const at = localMinutesOfDay(now, timezone);
|
|
50
|
+
const quiet = start < end ? at >= start && at < end : at >= start || at < end;
|
|
51
|
+
return quiet ? nextLocalTime(now, timezone, settings.quietEnd) : null;
|
|
52
|
+
}
|
|
53
|
+
function route(message, ctx) {
|
|
54
|
+
const always = ALWAYS_REACH.has(message.kind);
|
|
55
|
+
if (!always && ctx.settings.perKind[message.kind] === 'off')
|
|
56
|
+
return { state: 'stored' };
|
|
57
|
+
if (message.urgency === 'digest')
|
|
58
|
+
return { state: 'stored' };
|
|
59
|
+
if (message.urgency === 'today') {
|
|
60
|
+
return { state: 'held', dueAt: nextLocalTime(ctx.now, ctx.timezone, ctx.settings.endOfDay) };
|
|
61
|
+
}
|
|
62
|
+
if (ctx.onDashboard) {
|
|
63
|
+
return { state: 'shown', dueAt: new Date(ctx.now.getTime() + ESCALATE_AFTER_MS), channel: 'dashboard' };
|
|
64
|
+
}
|
|
65
|
+
const quiet = always ? null : quietUntil(ctx.settings, ctx.now, ctx.timezone);
|
|
66
|
+
if (quiet)
|
|
67
|
+
return { state: 'held', dueAt: quiet };
|
|
68
|
+
return { state: 'deliver' };
|
|
69
|
+
}
|
|
70
|
+
function checkMessage(message) {
|
|
71
|
+
if (!NOTIFICATION_KINDS.includes(message.kind)) {
|
|
72
|
+
throw new Error(`"${String(message.kind)}" is not a kind of notification`);
|
|
73
|
+
}
|
|
74
|
+
if (!NOTIFICATION_URGENCIES.includes(message.urgency)) {
|
|
75
|
+
throw new Error(`"${String(message.urgency)}" is not an urgency (now, today or digest)`);
|
|
76
|
+
}
|
|
77
|
+
if (typeof message.title !== 'string' || message.title.trim() === '')
|
|
78
|
+
throw new Error('a notification needs a title');
|
|
79
|
+
if (message.link && (typeof message.link.route !== 'string' || !message.link.route.startsWith('#/'))) {
|
|
80
|
+
throw new Error('a notification link is a dashboard route, like #/chat/…');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function toDeliverable(row) {
|
|
84
|
+
return {
|
|
85
|
+
id: row.id,
|
|
86
|
+
kind: row.kind,
|
|
87
|
+
urgency: row.urgency,
|
|
88
|
+
title: row.title,
|
|
89
|
+
...(row.text ? { text: row.text } : {}),
|
|
90
|
+
...(row.link ? { link: { route: row.link } } : {}),
|
|
91
|
+
...(row.offers.length > 0 ? { offers: row.offers } : {}),
|
|
92
|
+
...(row.dedupeKey ? { dedupeKey: row.dedupeKey } : {}),
|
|
93
|
+
...(row.agentId ? { agentId: row.agentId } : {}),
|
|
94
|
+
...(row.pluginId ? { pluginId: row.pluginId } : {}),
|
|
95
|
+
...(row.actionId ? { actionId: row.actionId } : {}),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Send one claimed row (`state = 'sending'`) and write what came of it. A
|
|
100
|
+
* channel that refuses or throws is written as `error`; nothing is thrown.
|
|
101
|
+
*/
|
|
102
|
+
async function sendClaimed(db, row, settings, now) {
|
|
103
|
+
const kind = await channelFor(settings, row.kind);
|
|
104
|
+
if (kind === 'off') {
|
|
105
|
+
await db.query(`update core.owner_notifications set state = 'stored', updated_at = $2 where id = $1 and state = 'sending'`, [row.id, now]);
|
|
106
|
+
return { state: 'stored', channel: null, error: null };
|
|
107
|
+
}
|
|
108
|
+
const outcome = kind === null ? { ok: false, error: 'no channel' } : await deliverTo(kind, toDeliverable(row));
|
|
109
|
+
if (outcome.ok) {
|
|
110
|
+
await db.query(`update core.owner_notifications set state = 'sent', channel = $2, sent_at = $3, error = null, updated_at = $3
|
|
111
|
+
where id = $1 and state = 'sending'`, [row.id, kind, now]);
|
|
112
|
+
return { state: 'sent', channel: kind, error: null };
|
|
113
|
+
}
|
|
114
|
+
await db.query(`update core.owner_notifications set state = 'failed', channel = $2, error = $3, updated_at = $4
|
|
115
|
+
where id = $1 and state = 'sending'`, [row.id, kind, outcome.error, now]);
|
|
116
|
+
return { state: 'failed', channel: kind, error: outcome.error };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Tell the owner something. Writes the row, routes it, and never throws for
|
|
120
|
+
* a channel's sake: a message with nowhere to go is a row with `error`.
|
|
121
|
+
* Throws only for a malformed message, which is the caller's bug.
|
|
122
|
+
*/
|
|
123
|
+
export async function notifyOwner(db, deps, message) {
|
|
124
|
+
checkMessage(message);
|
|
125
|
+
const now = deps.now?.() ?? new Date();
|
|
126
|
+
const timezone = await ownerTimezone(db, deps);
|
|
127
|
+
const settings = await readNotificationSettings(db);
|
|
128
|
+
const always = ALWAYS_REACH.has(message.kind);
|
|
129
|
+
const dedupeKey = message.dedupeKey?.trim() || null;
|
|
130
|
+
// What leaves the machine on a push channel is scrubbed like everything else.
|
|
131
|
+
const baseTitle = scrubText(message.title.trim().replace(/\s*\n\s*/g, ' '));
|
|
132
|
+
const text = message.text?.trim() ? scrubText(message.text.trim()) : null;
|
|
133
|
+
// The unsent row this key already has, if any: it is updated, not repeated.
|
|
134
|
+
let existing = null;
|
|
135
|
+
let fires = 0;
|
|
136
|
+
if (dedupeKey) {
|
|
137
|
+
const { rows } = await db.query(`select ${NOTIFICATION_COLUMNS} from core.owner_notifications
|
|
138
|
+
where dedupe_key = $1 and sent_at is null and state in ('shown', 'held', 'stored', 'failed')
|
|
139
|
+
order by created_at desc limit 1`, [dedupeKey]);
|
|
140
|
+
existing = rows[0] ? toNotification(rows[0]) : null;
|
|
141
|
+
const counted = await db.query(`select coalesce(sum(fired_count), 0)::int as n from core.owner_notifications
|
|
142
|
+
where dedupe_key = $1 and updated_at > $2`, [dedupeKey, new Date(now.getTime() - 3_600_000)]);
|
|
143
|
+
fires = Number(counted.rows[0]?.n ?? 0);
|
|
144
|
+
}
|
|
145
|
+
// The rate rule. Approvals and questions are never lowered.
|
|
146
|
+
let urgency = message.urgency;
|
|
147
|
+
let lowered = existing?.lowered ?? false;
|
|
148
|
+
if (!always && urgency === 'now' && dedupeKey && (lowered || fires + 1 > RATE_LIMIT_PER_HOUR)) {
|
|
149
|
+
urgency = 'today';
|
|
150
|
+
lowered = true;
|
|
151
|
+
}
|
|
152
|
+
const title = lowered ? `${baseTitle} ${LOWERED_SENTENCE}` : baseTitle;
|
|
153
|
+
const onDashboard = (await presentSurfaces(db, now)).includes(DASHBOARD_SURFACE);
|
|
154
|
+
let next = route({ kind: message.kind, urgency }, { now, timezone, settings, onDashboard });
|
|
155
|
+
// A repeat shown on the dashboard keeps the clock it started, unless the
|
|
156
|
+
// owner had already seen the earlier one: then the new content is unseen.
|
|
157
|
+
if (next.state === 'shown' && existing?.state === 'shown' && existing.seenAt === null && existing.dueAt) {
|
|
158
|
+
next = { ...next, dueAt: new Date(existing.dueAt) };
|
|
159
|
+
}
|
|
160
|
+
const state = next.state === 'deliver' ? 'sending' : next.state;
|
|
161
|
+
const dueAt = 'dueAt' in next ? next.dueAt : null;
|
|
162
|
+
const channel = next.state === 'shown' ? 'dashboard' : null;
|
|
163
|
+
const offers = JSON.stringify(message.offers ?? []);
|
|
164
|
+
let row;
|
|
165
|
+
if (existing) {
|
|
166
|
+
const { rows } = await db.query(`update core.owner_notifications
|
|
167
|
+
set urgency = $2, title = $3, text = $4, link = $5, offers = $6::jsonb, agent_id = coalesce($7, agent_id),
|
|
168
|
+
plugin_id = coalesce($8, plugin_id), action_id = coalesce($9::uuid, action_id), state = $10, due_at = $11,
|
|
169
|
+
channel = $12, fired_count = fired_count + 1, lowered = $13, seen_at = null, error = null, updated_at = $14
|
|
170
|
+
where id = $1 and sent_at is null and state in ('shown', 'held', 'stored', 'failed')
|
|
171
|
+
returning ${NOTIFICATION_COLUMNS}`, [existing.id, urgency, title, text, message.link?.route ?? null, offers, message.agentId ?? null,
|
|
172
|
+
message.pluginId ?? null, message.actionId ?? null, state, dueAt, channel, lowered, now]);
|
|
173
|
+
if (rows[0])
|
|
174
|
+
row = toNotification(rows[0]);
|
|
175
|
+
else
|
|
176
|
+
existing = null; // Sent between the read and the write: this is a new message after all.
|
|
177
|
+
}
|
|
178
|
+
if (!existing) {
|
|
179
|
+
const { rows } = await db.query(`insert into core.owner_notifications
|
|
180
|
+
(kind, urgency, title, text, link, offers, dedupe_key, agent_id, plugin_id, action_id, state, due_at, channel,
|
|
181
|
+
lowered, created_at, updated_at)
|
|
182
|
+
values ($1, $2, $3, $4, $5, $6::jsonb, $7, $8, $9, $10::uuid, $11, $12, $13, $14, $15, $15)
|
|
183
|
+
returning ${NOTIFICATION_COLUMNS}`, [message.kind, urgency, title, text, message.link?.route ?? null, offers, dedupeKey, message.agentId ?? null,
|
|
184
|
+
message.pluginId ?? null, message.actionId ?? null, state, dueAt, channel, lowered, now]);
|
|
185
|
+
row = toNotification(rows[0]);
|
|
186
|
+
}
|
|
187
|
+
row = row;
|
|
188
|
+
const result = {
|
|
189
|
+
id: row.id,
|
|
190
|
+
state: row.state,
|
|
191
|
+
channel: row.channel,
|
|
192
|
+
error: null,
|
|
193
|
+
deduped: existing !== null,
|
|
194
|
+
lowered,
|
|
195
|
+
};
|
|
196
|
+
if (row.state !== 'sending')
|
|
197
|
+
return result;
|
|
198
|
+
const sent = await sendClaimed(db, row, settings, now);
|
|
199
|
+
return { ...result, ...sent };
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* The later half of routing: runs on the gateway's 60-second loop.
|
|
203
|
+
*
|
|
204
|
+
* 1. Quiet hours: a `now` row that falls due while it is quiet (and is not an
|
|
205
|
+
* approval or a question) waits for the end of them.
|
|
206
|
+
* 2. Escalation: a `now` row shown on the dashboard and not seen, or held
|
|
207
|
+
* through quiet hours, goes to its channel.
|
|
208
|
+
* 3. End of the day: every held `today` row goes out as one message.
|
|
209
|
+
*/
|
|
210
|
+
export async function notificationsTick(db, deps, now = deps.now?.() ?? new Date()) {
|
|
211
|
+
const timezone = await ownerTimezone(db, deps);
|
|
212
|
+
const settings = await readNotificationSettings(db);
|
|
213
|
+
const outcome = { escalated: 0, endOfDay: 0, failed: 0 };
|
|
214
|
+
const quiet = quietUntil(settings, now, timezone);
|
|
215
|
+
if (quiet) {
|
|
216
|
+
await db.query(`update core.owner_notifications set state = 'held', due_at = $2, updated_at = $1
|
|
217
|
+
where urgency = 'now' and due_at <= $1 and acted_at is null and kind not in ('approval', 'question')
|
|
218
|
+
and ((state = 'shown' and seen_at is null) or state = 'held')`, [now, quiet]);
|
|
219
|
+
}
|
|
220
|
+
const { rows: claimed } = await db.query(`update core.owner_notifications set state = 'sending', updated_at = $1
|
|
221
|
+
where urgency = 'now' and due_at <= $1 and acted_at is null
|
|
222
|
+
and ((state = 'shown' and seen_at is null) or state = 'held')
|
|
223
|
+
returning ${NOTIFICATION_COLUMNS}`, [now]);
|
|
224
|
+
for (const raw of claimed) {
|
|
225
|
+
const sent = await sendClaimed(db, toNotification(raw), settings, now);
|
|
226
|
+
if (sent.state === 'sent')
|
|
227
|
+
outcome.escalated += 1;
|
|
228
|
+
if (sent.state === 'failed')
|
|
229
|
+
outcome.failed += 1;
|
|
230
|
+
}
|
|
231
|
+
// Held for the end of the day but already dealt with on the dashboard.
|
|
232
|
+
await db.query(`update core.owner_notifications set state = 'stored', updated_at = $1
|
|
233
|
+
where state = 'held' and urgency = 'today' and acted_at is not null`, [now]);
|
|
234
|
+
const { rows: today } = await db.query(`update core.owner_notifications set state = 'sending', updated_at = $1
|
|
235
|
+
where state = 'held' and urgency = 'today' and due_at <= $1 and acted_at is null
|
|
236
|
+
returning ${NOTIFICATION_COLUMNS}`, [now]);
|
|
237
|
+
if (today.length > 0) {
|
|
238
|
+
const rows = today.map(toNotification).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
239
|
+
const kind = await channelFor(settings);
|
|
240
|
+
const message = {
|
|
241
|
+
id: `today:${localDateString(now, timezone)}`,
|
|
242
|
+
kind: 'recap',
|
|
243
|
+
urgency: 'today',
|
|
244
|
+
title: `Today, ${rows.length} ${rows.length === 1 ? 'thing' : 'things'}:`,
|
|
245
|
+
text: rows.map((r) => `- ${r.agentId ?? r.pluginId ?? 'buddi'}: ${r.title}`).join('\n'),
|
|
246
|
+
};
|
|
247
|
+
const answer = kind === null || kind === 'off' ? { ok: false, error: 'no channel' } : await deliverTo(kind, message);
|
|
248
|
+
const ids = rows.map((r) => r.id);
|
|
249
|
+
if (answer.ok) {
|
|
250
|
+
await db.query(`update core.owner_notifications set state = 'sent', channel = $2, sent_at = $3, error = null, updated_at = $3
|
|
251
|
+
where id = any($1::uuid[]) and state = 'sending'`, [ids, kind, now]);
|
|
252
|
+
outcome.endOfDay = rows.length;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
await db.query(`update core.owner_notifications set state = 'failed', channel = $2, error = $3, updated_at = $4
|
|
256
|
+
where id = any($1::uuid[]) and state = 'sending'`, [ids, kind === 'off' ? null : kind, answer.error, now]);
|
|
257
|
+
outcome.failed += rows.length;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return outcome;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/notifications/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Queryable } from '../owner.js';
|
|
2
|
+
import { type NotificationSettings, type OwnerNotification } from './types.js';
|
|
3
|
+
/** "Present" is active on some surface within this long. */
|
|
4
|
+
export declare const PRESENCE_WINDOW_MS: number;
|
|
5
|
+
/** When the day's held items go out when the owner has not said. */
|
|
6
|
+
export declare const DEFAULT_END_OF_DAY = "18:00";
|
|
7
|
+
export declare const DEFAULT_NOTIFICATION_SETTINGS: NotificationSettings;
|
|
8
|
+
export declare const NOTIFICATION_COLUMNS: string;
|
|
9
|
+
export declare function toNotification(row: Record<string, any>): OwnerNotification;
|
|
10
|
+
/** The newest first; at most 100. */
|
|
11
|
+
export declare function listNotifications(db: Queryable, opts?: {
|
|
12
|
+
limit?: number;
|
|
13
|
+
}): Promise<OwnerNotification[]>;
|
|
14
|
+
/** One row, or null. */
|
|
15
|
+
export declare function getNotification(db: Queryable, id: string): Promise<OwnerNotification | null>;
|
|
16
|
+
/** The `digest` rows written since `since`, oldest first: what the recap may read. */
|
|
17
|
+
export declare function listDigestNotifications(db: Queryable, since: Date): Promise<OwnerNotification[]>;
|
|
18
|
+
/**
|
|
19
|
+
* The owner saw it: the dashboard drew it, or they opened its link. The first
|
|
20
|
+
* time counts; a row seen before it escalated never escalates. False when
|
|
21
|
+
* there is no such row.
|
|
22
|
+
*/
|
|
23
|
+
export declare function markSeen(db: Queryable, id: string, now?: Date): Promise<boolean>;
|
|
24
|
+
/** The owner did what it asked. Acted implies seen. */
|
|
25
|
+
export declare function markActed(db: Queryable, id: string, now?: Date): Promise<boolean>;
|
|
26
|
+
/** Every row about this approval is acted on: the owner decided it, wherever. */
|
|
27
|
+
export declare function markActedForAction(db: Queryable, actionId: string, now?: Date): Promise<number>;
|
|
28
|
+
/** A surface says the owner is there (`active`) or has left it (`away`). */
|
|
29
|
+
export declare function presenceTouch(db: Queryable, surface: string, now?: Date, state?: 'active' | 'away'): Promise<void>;
|
|
30
|
+
/** The surfaces the owner is active on now: within two minutes, and not away since. */
|
|
31
|
+
export declare function presentSurfaces(db: Queryable, now?: Date): Promise<string[]>;
|
|
32
|
+
/** Is the owner active anywhere? Advisory: it picks where a message goes first, never whether. */
|
|
33
|
+
export declare function ownerPresent(db: Queryable, now?: Date): Promise<boolean>;
|
|
34
|
+
export declare function readNotificationSettings(db: Queryable): Promise<NotificationSettings>;
|
|
35
|
+
/**
|
|
36
|
+
* Check a whole settings value the page sent. Returns the settings to store,
|
|
37
|
+
* or the sentence that says what is wrong.
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseNotificationSettings(input: unknown): {
|
|
40
|
+
ok: true;
|
|
41
|
+
settings: NotificationSettings;
|
|
42
|
+
} | {
|
|
43
|
+
ok: false;
|
|
44
|
+
message: string;
|
|
45
|
+
};
|
|
46
|
+
/** Replace the settings, whole. */
|
|
47
|
+
export declare function writeNotificationSettings(db: Queryable, settings: NotificationSettings): Promise<void>;
|
|
48
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/notifications/store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAEpB,4DAA4D;AAC5D,eAAO,MAAM,kBAAkB,QAAa,CAAC;AAE7C,oEAAoE;AACpE,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,eAAO,MAAM,6BAA6B,EAAE,oBAM3C,CAAC;AAKF,eAAO,MAAM,oBAAoB,QAE+C,CAAC;AAEjF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAwB1E;AAMD,qCAAqC;AACrC,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAOlH;AAED,wBAAwB;AACxB,wBAAsB,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAIlG;AAED,sFAAsF;AACtF,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAOtG;AAID;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQlG;AAED,uDAAuD;AACvD,wBAAsB,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CASnG;AAED,iFAAiF;AACjF,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CASjH;AAMD,4EAA4E;AAC5E,wBAAsB,aAAa,CACjC,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,IAAiB,EACtB,KAAK,GAAE,QAAQ,GAAG,MAAiB,GAClC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,uFAAuF;AACvF,wBAAsB,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ9F;AAED,kGAAkG;AAClG,wBAAsB,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAE1F;AAMD,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAqB3F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqC/E;AAED,mCAAmC;AACnC,wBAAsB,yBAAyB,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS5G"}
|