@withbuddi/buddi 0.1.0-pre.29 → 0.1.0-pre.30
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/extension/manifest.json +2 -2
- package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/cli/dist/args.d.ts +6 -1
- package/node_modules/@buddi/cli/dist/args.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/args.js +7 -2
- package/node_modules/@buddi/cli/dist/args.js.map +1 -1
- package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/commands.js +13 -3
- package/node_modules/@buddi/cli/dist/commands.js.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor-probes.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor-probes.js +2 -1
- package/node_modules/@buddi/cli/dist/doctor-probes.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 +53 -4
- package/node_modules/@buddi/cli/dist/jobs-cmd.js.map +1 -1
- package/node_modules/@buddi/cli/dist/main.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/main.js +5 -1
- package/node_modules/@buddi/cli/dist/main.js.map +1 -1
- package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/core/dist/lock.d.ts +8 -2
- package/node_modules/@buddi/core/dist/lock.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/lock.js +20 -5
- package/node_modules/@buddi/core/dist/lock.js.map +1 -1
- package/node_modules/@buddi/core/dist/pages.d.ts +3 -1
- package/node_modules/@buddi/core/dist/pages.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/pages.js +6 -1
- package/node_modules/@buddi/core/dist/pages.js.map +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/index.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/queue/failures.d.ts +84 -0
- package/node_modules/@buddi/core/dist/queue/failures.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/queue/failures.js +195 -0
- package/node_modules/@buddi/core/dist/queue/failures.js.map +1 -0
- package/node_modules/@buddi/core/dist/queue/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/queue/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/queue/index.js +1 -0
- package/node_modules/@buddi/core/dist/queue/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/queue/jobs.d.ts +39 -3
- package/node_modules/@buddi/core/dist/queue/jobs.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/queue/jobs.js +54 -4
- package/node_modules/@buddi/core/dist/queue/jobs.js.map +1 -1
- package/node_modules/@buddi/core/dist/queue/types.d.ts +20 -0
- package/node_modules/@buddi/core/dist/queue/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/queue/types.js +17 -0
- package/node_modules/@buddi/core/dist/queue/types.js.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/settings.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/secrets/settings.js +23 -3
- package/node_modules/@buddi/core/dist/secrets/settings.js.map +1 -1
- package/node_modules/@buddi/core/dist/sentinels/digest.d.ts +8 -1
- package/node_modules/@buddi/core/dist/sentinels/digest.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/sentinels/digest.js +10 -3
- package/node_modules/@buddi/core/dist/sentinels/digest.js.map +1 -1
- package/node_modules/@buddi/core/dist/sentinels/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/sentinels/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/sentinels/index.js +1 -0
- package/node_modules/@buddi/core/dist/sentinels/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/sentinels/mutes.d.ts +51 -0
- package/node_modules/@buddi/core/dist/sentinels/mutes.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/sentinels/mutes.js +86 -0
- package/node_modules/@buddi/core/dist/sentinels/mutes.js.map +1 -0
- package/node_modules/@buddi/core/dist/sentinels/run.d.ts +14 -4
- package/node_modules/@buddi/core/dist/sentinels/run.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/sentinels/run.js +64 -20
- package/node_modules/@buddi/core/dist/sentinels/run.js.map +1 -1
- package/node_modules/@buddi/core/dist/sentinels/types.d.ts +152 -2
- package/node_modules/@buddi/core/dist/sentinels/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/sentinels/types.js +126 -2
- package/node_modules/@buddi/core/dist/sentinels/types.js.map +1 -1
- package/node_modules/@buddi/core/dist/views.d.ts +112 -112
- package/node_modules/@buddi/core/dist/views.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/views.js +2 -0
- package/node_modules/@buddi/core/dist/views.js.map +1 -1
- package/node_modules/@buddi/core/migrations/066_alert_decisions.sql +45 -0
- package/node_modules/@buddi/core/migrations/067_job_acknowledged.sql +21 -0
- package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/gateway/dist/chat/conversations.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/chat/conversations.js +8 -2
- package/node_modules/@buddi/gateway/dist/chat/conversations.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.js +36 -2
- package/node_modules/@buddi/gateway/dist/missions/execute.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/goals.d.ts +12 -1
- package/node_modules/@buddi/gateway/dist/missions/goals.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/goals.js +21 -1
- package/node_modules/@buddi/gateway/dist/missions/goals.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.d.ts +3 -0
- package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.js +4 -1
- package/node_modules/@buddi/gateway/dist/missions/sentinel-wake.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.d.ts +17 -0
- package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js +27 -0
- package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/alerts.d.ts +179 -0
- package/node_modules/@buddi/gateway/dist/web/alerts.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/alerts.js +363 -0
- package/node_modules/@buddi/gateway/dist/web/alerts.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/api-routes.js +45 -6
- package/node_modules/@buddi/gateway/dist/web/api-routes.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/chat.d.ts +1 -0
- package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/chat.js +4 -3
- package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/lock.d.ts +7 -4
- package/node_modules/@buddi/gateway/dist/web/lock.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/lock.js +20 -14
- package/node_modules/@buddi/gateway/dist/web/lock.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/plugins.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/plugins.js +17 -3
- package/node_modules/@buddi/gateway/dist/web/plugins.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/read.d.ts +52 -26
- package/node_modules/@buddi/gateway/dist/web/read.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/read.js +52 -36
- package/node_modules/@buddi/gateway/dist/web/read.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/secrets.d.ts +61 -1
- package/node_modules/@buddi/gateway/dist/web/secrets.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/secrets.js +111 -3
- package/node_modules/@buddi/gateway/dist/web/secrets.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.js +125 -9
- package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/widgets.d.ts +1 -0
- package/node_modules/@buddi/gateway/dist/web/widgets.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/widgets.js +6 -1
- package/node_modules/@buddi/gateway/dist/web/widgets.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/write.d.ts +23 -0
- package/node_modules/@buddi/gateway/dist/web/write.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/write.js +46 -1
- package/node_modules/@buddi/gateway/dist/web/write.js.map +1 -1
- package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/runtime/dist/anthropic.d.ts +6 -0
- package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
- package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
- package/node_modules/@buddi/runtime/dist/openai.d.ts +34 -1
- package/node_modules/@buddi/runtime/dist/openai.d.ts.map +1 -1
- package/node_modules/@buddi/runtime/dist/openai.js +66 -12
- 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-browser/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-email/dist/agent.js +1 -1
- package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.d.ts +8 -0
- package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.js +59 -4
- package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/mail.d.ts +42 -0
- package/node_modules/@buddi/tool-email/dist/mail.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/mail.js +116 -0
- package/node_modules/@buddi/tool-email/dist/mail.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/mailbox/select.d.ts +6 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/select.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/mailbox/select.js +11 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/select.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/metrics.d.ts +5 -6
- package/node_modules/@buddi/tool-email/dist/metrics.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/metrics.js +4 -5
- package/node_modules/@buddi/tool-email/dist/metrics.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/needs-you.d.ts +58 -0
- package/node_modules/@buddi/tool-email/dist/needs-you.d.ts.map +1 -0
- package/node_modules/@buddi/tool-email/dist/needs-you.js +97 -0
- package/node_modules/@buddi/tool-email/dist/needs-you.js.map +1 -0
- package/node_modules/@buddi/tool-email/dist/pages/descriptors.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/descriptors.js +110 -78
- package/node_modules/@buddi/tool-email/dist/pages/descriptors.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/drafts-tools.d.ts +2 -2
- package/node_modules/@buddi/tool-email/dist/pages/queries.d.ts +7 -0
- package/node_modules/@buddi/tool-email/dist/pages/queries.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/queries.js +31 -3
- package/node_modules/@buddi/tool-email/dist/pages/queries.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/ports.d.ts +8 -0
- package/node_modules/@buddi/tool-email/dist/ports.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/ports.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/sentinels/suspicious-sender.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/sentinels/suspicious-sender.js +4 -1
- package/node_modules/@buddi/tool-email/dist/sentinels/suspicious-sender.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/sentinels/waiting-on-me.d.ts +18 -21
- package/node_modules/@buddi/tool-email/dist/sentinels/waiting-on-me.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/sentinels/waiting-on-me.js +39 -63
- package/node_modules/@buddi/tool-email/dist/sentinels/waiting-on-me.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.js +3 -2
- package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/suspicions-store.d.ts +6 -0
- package/node_modules/@buddi/tool-email/dist/suspicions-store.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/suspicions-store.js +16 -1
- package/node_modules/@buddi/tool-email/dist/suspicions-store.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/threads.d.ts +17 -2
- package/node_modules/@buddi/tool-email/dist/threads.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/threads.js +35 -14
- package/node_modules/@buddi/tool-email/dist/threads.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/tools/mailbox.d.ts +3 -0
- package/node_modules/@buddi/tool-email/dist/tools/mailbox.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/tools/mailbox.js +5 -0
- package/node_modules/@buddi/tool-email/dist/tools/mailbox.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/tools/threads.d.ts +7 -3
- package/node_modules/@buddi/tool-email/dist/tools/threads.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/tools/threads.js +18 -5
- package/node_modules/@buddi/tool-email/dist/tools/threads.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/watchers.d.ts +91 -7
- package/node_modules/@buddi/tool-email/dist/watchers.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/watchers.js +164 -1
- package/node_modules/@buddi/tool-email/dist/watchers.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/widgets.d.ts +3 -2
- package/node_modules/@buddi/tool-email/dist/widgets.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/widgets.js +2 -2
- package/node_modules/@buddi/tool-email/dist/widgets.js.map +1 -1
- package/node_modules/@buddi/tool-email/migrations/023_attention.sql +100 -0
- package/node_modules/@buddi/tool-email/migrations/024_auth_domain.sql +9 -0
- package/node_modules/@buddi/tool-email/migrations/025_thread_ignore.sql +77 -0
- package/node_modules/@buddi/tool-email/package.json +1 -1
- package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
- package/node_modules/ip-address/README.md +34 -34
- package/node_modules/ip-address/dist/ipv4.js +7 -0
- package/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/ip-address/package.json +1 -1
- package/package.json +2 -2
- package/packages/cli/dist/.tsbuildinfo +1 -1
- package/packages/cli/dist/args.d.ts +6 -1
- package/packages/cli/dist/args.d.ts.map +1 -1
- package/packages/cli/dist/args.js +7 -2
- package/packages/cli/dist/args.js.map +1 -1
- package/packages/cli/dist/commands.d.ts.map +1 -1
- package/packages/cli/dist/commands.js +13 -3
- package/packages/cli/dist/commands.js.map +1 -1
- package/packages/cli/dist/doctor-probes.d.ts.map +1 -1
- package/packages/cli/dist/doctor-probes.js +2 -1
- package/packages/cli/dist/doctor-probes.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 +53 -4
- package/packages/cli/dist/jobs-cmd.js.map +1 -1
- package/packages/cli/dist/main.d.ts.map +1 -1
- package/packages/cli/dist/main.js +5 -1
- package/packages/cli/dist/main.js.map +1 -1
- package/packages/core/dist/.tsbuildinfo +1 -1
- package/packages/core/dist/lock.d.ts +8 -2
- package/packages/core/dist/lock.d.ts.map +1 -1
- package/packages/core/dist/lock.js +20 -5
- package/packages/core/dist/lock.js.map +1 -1
- package/packages/core/dist/pages.d.ts +3 -1
- package/packages/core/dist/pages.d.ts.map +1 -1
- package/packages/core/dist/pages.js +6 -1
- package/packages/core/dist/pages.js.map +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/index.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/queue/failures.d.ts +84 -0
- package/packages/core/dist/queue/failures.d.ts.map +1 -0
- package/packages/core/dist/queue/failures.js +195 -0
- package/packages/core/dist/queue/failures.js.map +1 -0
- package/packages/core/dist/queue/index.d.ts +1 -0
- package/packages/core/dist/queue/index.d.ts.map +1 -1
- package/packages/core/dist/queue/index.js +1 -0
- package/packages/core/dist/queue/index.js.map +1 -1
- package/packages/core/dist/queue/jobs.d.ts +39 -3
- package/packages/core/dist/queue/jobs.d.ts.map +1 -1
- package/packages/core/dist/queue/jobs.js +54 -4
- package/packages/core/dist/queue/jobs.js.map +1 -1
- package/packages/core/dist/queue/types.d.ts +20 -0
- package/packages/core/dist/queue/types.d.ts.map +1 -1
- package/packages/core/dist/queue/types.js +17 -0
- package/packages/core/dist/queue/types.js.map +1 -1
- package/packages/core/dist/secrets/settings.d.ts.map +1 -1
- package/packages/core/dist/secrets/settings.js +23 -3
- package/packages/core/dist/secrets/settings.js.map +1 -1
- package/packages/core/dist/sentinels/digest.d.ts +8 -1
- package/packages/core/dist/sentinels/digest.d.ts.map +1 -1
- package/packages/core/dist/sentinels/digest.js +10 -3
- package/packages/core/dist/sentinels/digest.js.map +1 -1
- package/packages/core/dist/sentinels/index.d.ts +1 -0
- package/packages/core/dist/sentinels/index.d.ts.map +1 -1
- package/packages/core/dist/sentinels/index.js +1 -0
- package/packages/core/dist/sentinels/index.js.map +1 -1
- package/packages/core/dist/sentinels/mutes.d.ts +51 -0
- package/packages/core/dist/sentinels/mutes.d.ts.map +1 -0
- package/packages/core/dist/sentinels/mutes.js +86 -0
- package/packages/core/dist/sentinels/mutes.js.map +1 -0
- package/packages/core/dist/sentinels/run.d.ts +14 -4
- package/packages/core/dist/sentinels/run.d.ts.map +1 -1
- package/packages/core/dist/sentinels/run.js +64 -20
- package/packages/core/dist/sentinels/run.js.map +1 -1
- package/packages/core/dist/sentinels/types.d.ts +152 -2
- package/packages/core/dist/sentinels/types.d.ts.map +1 -1
- package/packages/core/dist/sentinels/types.js +126 -2
- package/packages/core/dist/sentinels/types.js.map +1 -1
- package/packages/core/dist/views.d.ts +112 -112
- package/packages/core/dist/views.d.ts.map +1 -1
- package/packages/core/dist/views.js +2 -0
- package/packages/core/dist/views.js.map +1 -1
- package/packages/core/migrations/066_alert_decisions.sql +45 -0
- package/packages/core/migrations/067_job_acknowledged.sql +21 -0
- package/packages/gateway/dist/.tsbuildinfo +1 -1
- package/packages/gateway/dist/chat/conversations.d.ts.map +1 -1
- package/packages/gateway/dist/chat/conversations.js +8 -2
- package/packages/gateway/dist/chat/conversations.js.map +1 -1
- package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
- package/packages/gateway/dist/missions/execute.js +36 -2
- package/packages/gateway/dist/missions/execute.js.map +1 -1
- package/packages/gateway/dist/missions/goals.d.ts +12 -1
- package/packages/gateway/dist/missions/goals.d.ts.map +1 -1
- package/packages/gateway/dist/missions/goals.js +21 -1
- package/packages/gateway/dist/missions/goals.js.map +1 -1
- package/packages/gateway/dist/missions/sentinel-wake.d.ts +3 -0
- package/packages/gateway/dist/missions/sentinel-wake.d.ts.map +1 -1
- package/packages/gateway/dist/missions/sentinel-wake.js +4 -1
- package/packages/gateway/dist/missions/sentinel-wake.js.map +1 -1
- package/packages/gateway/dist/surfaces/offered-actions.d.ts +17 -0
- package/packages/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
- package/packages/gateway/dist/surfaces/offered-actions.js +27 -0
- package/packages/gateway/dist/surfaces/offered-actions.js.map +1 -1
- package/packages/gateway/dist/web/alerts.d.ts +179 -0
- package/packages/gateway/dist/web/alerts.d.ts.map +1 -0
- package/packages/gateway/dist/web/alerts.js +363 -0
- package/packages/gateway/dist/web/alerts.js.map +1 -0
- package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
- package/packages/gateway/dist/web/api-routes.js +45 -6
- package/packages/gateway/dist/web/api-routes.js.map +1 -1
- package/packages/gateway/dist/web/chat.d.ts +1 -0
- package/packages/gateway/dist/web/chat.d.ts.map +1 -1
- package/packages/gateway/dist/web/chat.js +4 -3
- package/packages/gateway/dist/web/chat.js.map +1 -1
- package/packages/gateway/dist/web/lock.d.ts +7 -4
- package/packages/gateway/dist/web/lock.d.ts.map +1 -1
- package/packages/gateway/dist/web/lock.js +20 -14
- package/packages/gateway/dist/web/lock.js.map +1 -1
- package/packages/gateway/dist/web/plugins.d.ts.map +1 -1
- package/packages/gateway/dist/web/plugins.js +17 -3
- package/packages/gateway/dist/web/plugins.js.map +1 -1
- package/packages/gateway/dist/web/read.d.ts +52 -26
- package/packages/gateway/dist/web/read.d.ts.map +1 -1
- package/packages/gateway/dist/web/read.js +52 -36
- package/packages/gateway/dist/web/read.js.map +1 -1
- package/packages/gateway/dist/web/secrets.d.ts +61 -1
- package/packages/gateway/dist/web/secrets.d.ts.map +1 -1
- package/packages/gateway/dist/web/secrets.js +111 -3
- package/packages/gateway/dist/web/secrets.js.map +1 -1
- package/packages/gateway/dist/web/server.d.ts.map +1 -1
- package/packages/gateway/dist/web/server.js +125 -9
- package/packages/gateway/dist/web/server.js.map +1 -1
- package/packages/gateway/dist/web/widgets.d.ts +1 -0
- package/packages/gateway/dist/web/widgets.d.ts.map +1 -1
- package/packages/gateway/dist/web/widgets.js +6 -1
- package/packages/gateway/dist/web/widgets.js.map +1 -1
- package/packages/gateway/dist/web/write.d.ts +23 -0
- package/packages/gateway/dist/web/write.d.ts.map +1 -1
- package/packages/gateway/dist/web/write.js +46 -1
- package/packages/gateway/dist/web/write.js.map +1 -1
- package/packages/install/dist/.tsbuildinfo +1 -1
- package/packages/runtime/dist/.tsbuildinfo +1 -1
- package/packages/runtime/dist/anthropic.d.ts +6 -0
- package/packages/runtime/dist/anthropic.d.ts.map +1 -1
- package/packages/runtime/dist/anthropic.js.map +1 -1
- package/packages/runtime/dist/openai.d.ts +34 -1
- package/packages/runtime/dist/openai.d.ts.map +1 -1
- package/packages/runtime/dist/openai.js +66 -12
- package/packages/runtime/dist/openai.js.map +1 -1
- package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
- package/packages/tools/browser/dist/.tsbuildinfo +1 -1
- package/packages/tools/email/dist/.tsbuildinfo +1 -1
- package/packages/tools/email/dist/agent.js +1 -1
- package/packages/tools/email/dist/imap/imapflow-client.d.ts +8 -0
- package/packages/tools/email/dist/imap/imapflow-client.d.ts.map +1 -1
- package/packages/tools/email/dist/imap/imapflow-client.js +59 -4
- package/packages/tools/email/dist/imap/imapflow-client.js.map +1 -1
- package/packages/tools/email/dist/mail.d.ts +42 -0
- package/packages/tools/email/dist/mail.d.ts.map +1 -1
- package/packages/tools/email/dist/mail.js +116 -0
- package/packages/tools/email/dist/mail.js.map +1 -1
- package/packages/tools/email/dist/mailbox/select.d.ts +6 -0
- package/packages/tools/email/dist/mailbox/select.d.ts.map +1 -1
- package/packages/tools/email/dist/mailbox/select.js +11 -0
- package/packages/tools/email/dist/mailbox/select.js.map +1 -1
- package/packages/tools/email/dist/metrics.d.ts +5 -6
- package/packages/tools/email/dist/metrics.d.ts.map +1 -1
- package/packages/tools/email/dist/metrics.js +4 -5
- package/packages/tools/email/dist/metrics.js.map +1 -1
- package/packages/tools/email/dist/needs-you.d.ts +58 -0
- package/packages/tools/email/dist/needs-you.d.ts.map +1 -0
- package/packages/tools/email/dist/needs-you.js +97 -0
- package/packages/tools/email/dist/needs-you.js.map +1 -0
- package/packages/tools/email/dist/pages/descriptors.d.ts.map +1 -1
- package/packages/tools/email/dist/pages/descriptors.js +110 -78
- package/packages/tools/email/dist/pages/descriptors.js.map +1 -1
- package/packages/tools/email/dist/pages/drafts-tools.d.ts +2 -2
- package/packages/tools/email/dist/pages/queries.d.ts +7 -0
- package/packages/tools/email/dist/pages/queries.d.ts.map +1 -1
- package/packages/tools/email/dist/pages/queries.js +31 -3
- package/packages/tools/email/dist/pages/queries.js.map +1 -1
- package/packages/tools/email/dist/ports.d.ts +8 -0
- package/packages/tools/email/dist/ports.d.ts.map +1 -1
- package/packages/tools/email/dist/ports.js.map +1 -1
- package/packages/tools/email/dist/sentinels/suspicious-sender.d.ts.map +1 -1
- package/packages/tools/email/dist/sentinels/suspicious-sender.js +4 -1
- package/packages/tools/email/dist/sentinels/suspicious-sender.js.map +1 -1
- package/packages/tools/email/dist/sentinels/waiting-on-me.d.ts +18 -21
- package/packages/tools/email/dist/sentinels/waiting-on-me.d.ts.map +1 -1
- package/packages/tools/email/dist/sentinels/waiting-on-me.js +39 -63
- package/packages/tools/email/dist/sentinels/waiting-on-me.js.map +1 -1
- package/packages/tools/email/dist/sources/inbox-poll.d.ts.map +1 -1
- package/packages/tools/email/dist/sources/inbox-poll.js +3 -2
- package/packages/tools/email/dist/sources/inbox-poll.js.map +1 -1
- package/packages/tools/email/dist/suspicions-store.d.ts +6 -0
- package/packages/tools/email/dist/suspicions-store.d.ts.map +1 -1
- package/packages/tools/email/dist/suspicions-store.js +16 -1
- package/packages/tools/email/dist/suspicions-store.js.map +1 -1
- package/packages/tools/email/dist/threads.d.ts +17 -2
- package/packages/tools/email/dist/threads.d.ts.map +1 -1
- package/packages/tools/email/dist/threads.js +35 -14
- package/packages/tools/email/dist/threads.js.map +1 -1
- package/packages/tools/email/dist/tools/mailbox.d.ts +3 -0
- package/packages/tools/email/dist/tools/mailbox.d.ts.map +1 -1
- package/packages/tools/email/dist/tools/mailbox.js +5 -0
- package/packages/tools/email/dist/tools/mailbox.js.map +1 -1
- package/packages/tools/email/dist/tools/threads.d.ts +7 -3
- package/packages/tools/email/dist/tools/threads.d.ts.map +1 -1
- package/packages/tools/email/dist/tools/threads.js +18 -5
- package/packages/tools/email/dist/tools/threads.js.map +1 -1
- package/packages/tools/email/dist/watchers.d.ts +91 -7
- package/packages/tools/email/dist/watchers.d.ts.map +1 -1
- package/packages/tools/email/dist/watchers.js +164 -1
- package/packages/tools/email/dist/watchers.js.map +1 -1
- package/packages/tools/email/dist/widgets.d.ts +3 -2
- package/packages/tools/email/dist/widgets.d.ts.map +1 -1
- package/packages/tools/email/dist/widgets.js +2 -2
- package/packages/tools/email/dist/widgets.js.map +1 -1
- package/packages/tools/email/migrations/023_attention.sql +100 -0
- package/packages/tools/email/migrations/024_auth_domain.sql +9 -0
- package/packages/tools/email/migrations/025_thread_ignore.sql +77 -0
- package/packages/tools/email/package.json +1 -1
- package/packages/tools/host/dist/.tsbuildinfo +1 -1
- package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
- package/packages/tools/memory/dist/.tsbuildinfo +1 -1
- package/packages/tools/web/dist/.tsbuildinfo +1 -1
- package/packages/web/dist/assets/earth-2560-Ce3xs8Cb.webp +0 -0
- package/packages/web/dist/assets/earth-phone-BqC7cDhk.webp +0 -0
- package/packages/web/dist/assets/index-WS4UjGsy.js +129 -0
- package/packages/web/dist/assets/index-Zrt_o2UG.css +1 -0
- package/packages/web/dist/assets/{lottie_light-Cdn77Osu.js → lottie_light-Ls7i1ATS.js} +1 -1
- package/packages/web/dist/build.json +1 -1
- package/packages/web/dist/index.html +2 -2
- package/packages/web/dist/precache.json +4 -4
- package/packages/web/dist/sw.js +3 -2
- package/packages/web/dist/assets/index-D8_tmf2k.js +0 -131
- package/packages/web/dist/assets/index-DYQyioa6.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentinel-wake.js","sourceRoot":"","sources":["../../src/missions/sentinel-wake.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,wBAAwB,GAIzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"sentinel-wake.js","sourceRoot":"","sources":["../../src/missions/sentinel-wake.ts"],"names":[],"mappings":"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"}
|
|
@@ -104,6 +104,23 @@ export declare const OFFER_TURN_SPEAKER_PREFIX = "offer:";
|
|
|
104
104
|
export declare function offerTurnSpeaker(label: string): string;
|
|
105
105
|
/** The label behind such a stamp, or null when the turn is an ordinary one. */
|
|
106
106
|
export declare function offerTurnLabel(speaker: string | null | undefined): string | null;
|
|
107
|
+
/**
|
|
108
|
+
* The speaker on a turn whose words are an agent-only brief: Alerts' "Ask"
|
|
109
|
+
* hands the agent the finding's full brief, while the owner only pressed a
|
|
110
|
+
* button about one line. Unlike a chip's sentence, which is the owner's to
|
|
111
|
+
* read, the brief never leaves the gateway — every transcript reader replaces
|
|
112
|
+
* the turn's words with the label (`visibleTurnBlocks`), so no web or MCP
|
|
113
|
+
* payload carries it. The model's own history is untouched.
|
|
114
|
+
*/
|
|
115
|
+
export declare const BRIEF_TURN_SPEAKER_PREFIX = "brief:";
|
|
116
|
+
export declare function briefTurnSpeaker(label: string): string;
|
|
117
|
+
/** The label behind a brief turn's stamp, or null for any other turn. */
|
|
118
|
+
export declare function briefTurnLabel(speaker: string | null | undefined): string | null;
|
|
119
|
+
/**
|
|
120
|
+
* What a reader may show of a stored turn: its blocks, except a brief turn's,
|
|
121
|
+
* which become the one line the owner pressed.
|
|
122
|
+
*/
|
|
123
|
+
export declare function visibleTurnBlocks(speaker: string | null | undefined, blocks: Array<Record<string, any>>): Array<Record<string, any>>;
|
|
107
124
|
/**
|
|
108
125
|
* Retire what the previous turn of this conversation offered.
|
|
109
126
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offered-actions.d.ts","sourceRoot":"","sources":["../../src/surfaces/offered-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,OAAO,EAML,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,aAAa,CAAC;AAGrB;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAElD,4EAA4E;AAC5E,eAAO,MAAM,UAAU,uBAAuB,CAAC;AAE/C,6EAA6E;AAC7E,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAAiB,CAAC;AAE3D,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AA6BD,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,CAyBnE;AAED,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,QAgBrB,CAAC;AAMZ;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAElD,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIhF;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,SAAS,EACf,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,IAAI,EACT,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC3B,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE;IACL,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,GACA,OAAO,CAAC,KAAK,EAAE,CAAC,CAclB"}
|
|
1
|
+
{"version":3,"file":"offered-actions.d.ts","sourceRoot":"","sources":["../../src/surfaces/offered-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,OAAO,EAML,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,aAAa,CAAC;AAGrB;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAElD,4EAA4E;AAC5E,eAAO,MAAM,UAAU,uBAAuB,CAAC;AAE/C,6EAA6E;AAC7E,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAAiB,CAAC;AAE3D,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AA6BD,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,CAyBnE;AAED,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,QAgBrB,CAAC;AAMZ;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAElD,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIhF;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIhF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAGpI;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,SAAS,EACf,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,IAAI,EACT,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC3B,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE;IACL,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,GACA,OAAO,CAAC,KAAK,EAAE,CAAC,CAclB"}
|
|
@@ -165,6 +165,33 @@ export function offerTurnLabel(speaker) {
|
|
|
165
165
|
const label = speaker.slice(OFFER_TURN_SPEAKER_PREFIX.length).trim();
|
|
166
166
|
return label === '' ? null : label;
|
|
167
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* The speaker on a turn whose words are an agent-only brief: Alerts' "Ask"
|
|
170
|
+
* hands the agent the finding's full brief, while the owner only pressed a
|
|
171
|
+
* button about one line. Unlike a chip's sentence, which is the owner's to
|
|
172
|
+
* read, the brief never leaves the gateway — every transcript reader replaces
|
|
173
|
+
* the turn's words with the label (`visibleTurnBlocks`), so no web or MCP
|
|
174
|
+
* payload carries it. The model's own history is untouched.
|
|
175
|
+
*/
|
|
176
|
+
export const BRIEF_TURN_SPEAKER_PREFIX = 'brief:';
|
|
177
|
+
export function briefTurnSpeaker(label) {
|
|
178
|
+
return `${BRIEF_TURN_SPEAKER_PREFIX}${label.trim()}`;
|
|
179
|
+
}
|
|
180
|
+
/** The label behind a brief turn's stamp, or null for any other turn. */
|
|
181
|
+
export function briefTurnLabel(speaker) {
|
|
182
|
+
if (typeof speaker !== 'string' || !speaker.startsWith(BRIEF_TURN_SPEAKER_PREFIX))
|
|
183
|
+
return null;
|
|
184
|
+
const label = speaker.slice(BRIEF_TURN_SPEAKER_PREFIX.length).trim();
|
|
185
|
+
return label === '' ? null : label;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* What a reader may show of a stored turn: its blocks, except a brief turn's,
|
|
189
|
+
* which become the one line the owner pressed.
|
|
190
|
+
*/
|
|
191
|
+
export function visibleTurnBlocks(speaker, blocks) {
|
|
192
|
+
const label = briefTurnLabel(speaker);
|
|
193
|
+
return label === null ? blocks : [{ type: 'text', text: label }];
|
|
194
|
+
}
|
|
168
195
|
/* ------------------------------------------------------------------ *
|
|
169
196
|
* What a surface does with it
|
|
170
197
|
* ------------------------------------------------------------------ */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offered-actions.js","sourceRoot":"","sources":["../../src/surfaces/offered-actions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"offered-actions.js","sourceRoot":"","sources":["../../src/surfaces/offered-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,OAAO,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,YAAY,GAMb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAElD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAE/C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAsB,CAAC,UAAU,CAAC,CAAC;AAO3D,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,OAAO,EAAE,CAAC;SACP,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,eAAe,CAAC;aACpB,QAAQ,CACP,gKAAgK,CACjK;QACH,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,gBAAgB,CAAC;aACrB,QAAQ,CACP,qTAAqT,CACtT;KACJ,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,UAAU,CAAC;SACf,QAAQ,CACP,OAAO,UAAU,qHAAqH,CACvI;CACJ,CAAC,CAAC;AAIH;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAe;IACjD,MAAM,KAAK,GAA4D;QACrE,IAAI,EAAE,UAAU;QAChB,WAAW,EACT,26BAA26B;QAC76B,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,UAAU;QACjB,KAAK,CAAC,OAAO,CAAC,KAAK;YACjB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC5C,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;gBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;aAC7B,CAAC,CAAC,CAAC;YACJ,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1C,CAAC;KACF,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,qEAAqE;QACrE,qEAAqE;QACrE,MAAM,EAAE,MAAM;QACd,aAAa,EAAE,EAAE;QACjB,KAAK,EAAE,CAAC,KAAK,CAAC;KACf,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,mIAAmI,UAAU,iBAAiB,UAAU,WAAW;IACnL,iNAAiN;IACjN,iFAAiF;IACjF,6KAA6K;IAC7K,4EAA4E;IAC5E,0EAA0E;IAC1E,yEAAyE;IACzE,yEAAyE;IACzE,4EAA4E;IAC5E,oEAAoE;IACpE,2OAA2O,UAAU,6DAA6D;IAClT,+NAA+N;IAC/N,uOAAuO,UAAU,kDAAkD;IACnS,kJAAkJ;IAClJ,yLAAyL;CAC1L,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ;;wEAEwE;AAExE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAC;AAElD,sDAAsD;AACtD,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,GAAG,yBAAyB,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,OAAkC;IAC/D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,yBAAyB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAC;AAElD,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,GAAG,yBAAyB,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,OAAkC;IAC/D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,yBAAyB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAkC,EAAE,MAAkC;IACtG,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACnE,CAAC;AAED;;wEAEwE;AAExE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAe,EACf,cAAsB,EACtB,GAAS,EACT,GAA4B;IAE5B,IAAI,CAAC;QACH,OAAO,MAAM,uBAAuB,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,EAAE,CAAC,sDAAsD,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAe,EACf,KAMC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,IAAI,EAAE;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,OAAO,EAAE,QAAQ;YACjB,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,GAAG,EAAE,CAAC,kDAAkD,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alerts: decisions, not chores (docs/dashboard.md, "Alerts").
|
|
3
|
+
*
|
|
4
|
+
* What the watchers found, shaped for the owner. Three rules, and every
|
|
5
|
+
* surface that lists findings — the Alerts page, Home's Needs you — reads them
|
|
6
|
+
* from here so none of them can drift:
|
|
7
|
+
*
|
|
8
|
+
* 1. **Only the owner's line is ever sent.** A finding's `detail` is the agent
|
|
9
|
+
* brief, written for a model; it never leaves this file. A finding without
|
|
10
|
+
* an owner line shows its title.
|
|
11
|
+
* 2. **Only decisions are listed.** An `info` finding goes to the recap
|
|
12
|
+
* silently: it is counted in one line ("12 notes saved for Friday's
|
|
13
|
+
* recap") and listed only in that line's preview.
|
|
14
|
+
* 3. **Repeats are one row.** Open findings of the same watcher and kind are
|
|
15
|
+
* one group, titled by the watcher's group spec, with the subjects inside.
|
|
16
|
+
*
|
|
17
|
+
* Every row carries the actions its findings declared (host API 1.23), shaped
|
|
18
|
+
* so the page can only ask for what was declared: a `run` or a `fill` is named
|
|
19
|
+
* by finding key and action index, and resolved again here before anything
|
|
20
|
+
* runs.
|
|
21
|
+
*/
|
|
22
|
+
import { type CoreToolContext, type PluginManifest, type SentinelFinding, type ToolRegistry } from '@buddi/core';
|
|
23
|
+
import type { Pool } from 'pg';
|
|
24
|
+
export interface AlertItemView {
|
|
25
|
+
key: string;
|
|
26
|
+
/** The owner's line (or the title). Never the brief. */
|
|
27
|
+
line: string;
|
|
28
|
+
subject: {
|
|
29
|
+
id: string;
|
|
30
|
+
label: string;
|
|
31
|
+
} | null;
|
|
32
|
+
/** Beside the subject inside a group: its last value ("2,340.00 USD on 2026-09-14"), else its line. */
|
|
33
|
+
note: string;
|
|
34
|
+
firstSeenAt: string;
|
|
35
|
+
/**
|
|
36
|
+
* Inside a group of many: what this one finding offers that the group
|
|
37
|
+
* cannot offer for all — its own `run` actions (Send, Discard) and its own
|
|
38
|
+
* `open` when the group's items differ. Absent on a row of one, whose
|
|
39
|
+
* actions are the group's.
|
|
40
|
+
*/
|
|
41
|
+
actions?: AlertActionView[];
|
|
42
|
+
}
|
|
43
|
+
export type AlertActionView = {
|
|
44
|
+
kind: 'open';
|
|
45
|
+
label: string;
|
|
46
|
+
plugin: string | null;
|
|
47
|
+
page?: string;
|
|
48
|
+
item?: string;
|
|
49
|
+
place?: 'files';
|
|
50
|
+
} | {
|
|
51
|
+
kind: 'run';
|
|
52
|
+
label: string;
|
|
53
|
+
key: string;
|
|
54
|
+
index: number;
|
|
55
|
+
confirm?: string;
|
|
56
|
+
tone?: 'danger';
|
|
57
|
+
} | {
|
|
58
|
+
kind: 'fill';
|
|
59
|
+
label: string;
|
|
60
|
+
title: string;
|
|
61
|
+
fields: Array<{
|
|
62
|
+
key: string;
|
|
63
|
+
index: number;
|
|
64
|
+
label: string;
|
|
65
|
+
type: 'number' | 'text' | 'date';
|
|
66
|
+
value: string | number | null;
|
|
67
|
+
hint: string | null;
|
|
68
|
+
}>;
|
|
69
|
+
} | {
|
|
70
|
+
kind: 'ask';
|
|
71
|
+
label: string | null;
|
|
72
|
+
} | {
|
|
73
|
+
kind: 'dismiss';
|
|
74
|
+
label: string;
|
|
75
|
+
};
|
|
76
|
+
export interface AlertGroupView {
|
|
77
|
+
/** `<sentinel>:<kind>` for a group, the finding's key for a single one. */
|
|
78
|
+
id: string;
|
|
79
|
+
sentinelId: string;
|
|
80
|
+
/** The plugin that ships the watcher, when it is installed. */
|
|
81
|
+
plugin: string | null;
|
|
82
|
+
kind: string;
|
|
83
|
+
/** The row's words: the owner line, or the group's title. */
|
|
84
|
+
title: string;
|
|
85
|
+
/** The group's owner line under the title, when the watcher wrote one. */
|
|
86
|
+
line: string | null;
|
|
87
|
+
urgent: boolean;
|
|
88
|
+
since: string;
|
|
89
|
+
/** Who answers for it: Ask goes there. Null: the wake mission's agent. */
|
|
90
|
+
agentId: string | null;
|
|
91
|
+
keys: string[];
|
|
92
|
+
items: AlertItemView[];
|
|
93
|
+
actions: AlertActionView[];
|
|
94
|
+
/** What "Stop telling me this" silences: one subject, or the whole kind. */
|
|
95
|
+
stop: {
|
|
96
|
+
scope: 'subject' | 'kind';
|
|
97
|
+
label: string;
|
|
98
|
+
};
|
|
99
|
+
snoozedUntil: string | null;
|
|
100
|
+
resolvedAt: string | null;
|
|
101
|
+
}
|
|
102
|
+
export interface AlertsView {
|
|
103
|
+
/** Urgent, open, not snoozed, not silenced: the decisions. */
|
|
104
|
+
open: AlertGroupView[];
|
|
105
|
+
/** Urgent ones the owner put off ("Not now") or set aside ("Not needed"). */
|
|
106
|
+
snoozed: AlertGroupView[];
|
|
107
|
+
/** What stopped being true lately. */
|
|
108
|
+
resolved: AlertGroupView[];
|
|
109
|
+
/** The notes waiting for the recap: a count, when, and the preview's groups. */
|
|
110
|
+
recap: {
|
|
111
|
+
count: number;
|
|
112
|
+
missionId: string | null;
|
|
113
|
+
nextAt: string | null;
|
|
114
|
+
groups: AlertGroupView[];
|
|
115
|
+
};
|
|
116
|
+
/** "Stop telling me this", as Settings → Watchers lists them. */
|
|
117
|
+
mutes: Array<{
|
|
118
|
+
id: string;
|
|
119
|
+
sentinelId: string;
|
|
120
|
+
label: string;
|
|
121
|
+
createdAt: string;
|
|
122
|
+
}>;
|
|
123
|
+
}
|
|
124
|
+
/** Which plugin ships each watcher. */
|
|
125
|
+
export declare function sentinelPlugins(manifests: readonly PluginManifest[]): Map<string, string>;
|
|
126
|
+
/**
|
|
127
|
+
* The owner's line for a surface: the plugin's own fences round quoted mail
|
|
128
|
+
* (`<<<QUOTED MAIL …>>>`) are for a model reading it, not for a person, so a
|
|
129
|
+
* surface draws the words without them. The finding keeps them for the agent.
|
|
130
|
+
*/
|
|
131
|
+
export declare function plainLine(f: {
|
|
132
|
+
ownerLine?: string | null;
|
|
133
|
+
title: string;
|
|
134
|
+
}): string;
|
|
135
|
+
/** One row per watcher and kind; a fact on its own is a row of one. */
|
|
136
|
+
export declare function groupFindings(findings: readonly SentinelFinding[], plugins: ReadonlyMap<string, string>): AlertGroupView[];
|
|
137
|
+
/** The decisions alone: what the Alerts page lists and Home's Needs you counts. */
|
|
138
|
+
export declare function readAlertDecisions(pool: Pool, registry: ToolRegistry, now: Date): Promise<AlertGroupView[]>;
|
|
139
|
+
export declare function readAlerts(pool: Pool, registry: ToolRegistry, now: Date): Promise<AlertsView>;
|
|
140
|
+
export type AlertReply = {
|
|
141
|
+
status: number;
|
|
142
|
+
body: unknown;
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* "Stop telling me this" on a row. A finding with a subject silences that
|
|
146
|
+
* subject; a group, or a finding about nothing in particular, its whole kind.
|
|
147
|
+
* `group` says which the page drew.
|
|
148
|
+
*/
|
|
149
|
+
export declare function muteAlert(pool: Pool, body: Record<string, unknown>, now: Date): Promise<AlertReply>;
|
|
150
|
+
export interface AlertActDeps {
|
|
151
|
+
pool: Pool;
|
|
152
|
+
registry: ToolRegistry;
|
|
153
|
+
ctx: CoreToolContext;
|
|
154
|
+
now: () => Date;
|
|
155
|
+
}
|
|
156
|
+
/** At most this many entries in one act: a quick form of every balance, not a script. */
|
|
157
|
+
export declare const ALERT_ACT_MAX = 50;
|
|
158
|
+
/**
|
|
159
|
+
* Run what a finding declared: a `run`, or a `fill` with the value the owner
|
|
160
|
+
* typed. The page names a finding key and an action index, never a tool, so
|
|
161
|
+
* it can only run what the watcher put on the row — and only a tool of the
|
|
162
|
+
* plugin that ships the watcher. A gated tool answers its approval, exactly
|
|
163
|
+
* as from the plugin's own page.
|
|
164
|
+
*/
|
|
165
|
+
export declare function actOnAlerts(deps: AlertActDeps, body: Record<string, unknown>, session: {
|
|
166
|
+
via?: string;
|
|
167
|
+
}): Promise<AlertReply>;
|
|
168
|
+
/**
|
|
169
|
+
* "Ask <agent>": a turn with the agent that answers for the findings. The
|
|
170
|
+
* thread shows the owner's line as what he asked about; the agent reads the
|
|
171
|
+
* findings — brief, data and all — inside the watcher fence, the way a wake
|
|
172
|
+
* hands them over.
|
|
173
|
+
*/
|
|
174
|
+
export declare function askPrompt(findings: readonly SentinelFinding[]): {
|
|
175
|
+
label: string;
|
|
176
|
+
prompt: string;
|
|
177
|
+
};
|
|
178
|
+
export declare function findingsForAsk(pool: Pool, keys: readonly string[]): Promise<SentinelFinding[]>;
|
|
179
|
+
//# sourceMappingURL=alerts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/web/alerts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alerts: decisions, not chores (docs/dashboard.md, "Alerts").
|
|
3
|
+
*
|
|
4
|
+
* What the watchers found, shaped for the owner. Three rules, and every
|
|
5
|
+
* surface that lists findings — the Alerts page, Home's Needs you — reads them
|
|
6
|
+
* from here so none of them can drift:
|
|
7
|
+
*
|
|
8
|
+
* 1. **Only the owner's line is ever sent.** A finding's `detail` is the agent
|
|
9
|
+
* brief, written for a model; it never leaves this file. A finding without
|
|
10
|
+
* an owner line shows its title.
|
|
11
|
+
* 2. **Only decisions are listed.** An `info` finding goes to the recap
|
|
12
|
+
* silently: it is counted in one line ("12 notes saved for Friday's
|
|
13
|
+
* recap") and listed only in that line's preview.
|
|
14
|
+
* 3. **Repeats are one row.** Open findings of the same watcher and kind are
|
|
15
|
+
* one group, titled by the watcher's group spec, with the subjects inside.
|
|
16
|
+
*
|
|
17
|
+
* Every row carries the actions its findings declared (host API 1.23), shaped
|
|
18
|
+
* so the page can only ask for what was declared: a `run` or a `fill` is named
|
|
19
|
+
* by finding key and action index, and resolved again here before anything
|
|
20
|
+
* runs.
|
|
21
|
+
*/
|
|
22
|
+
import { OWNER_AGENT_ID, getActiveSchedule, isMuted, isSnoozed, muteFindings, nextAfter, ownerLineOf, sentinelMutes, SENTINEL_FINDING_COLUMNS, toSentinelFinding, } from '@buddi/core';
|
|
23
|
+
import { recapMissionId } from '../missions/recap.js';
|
|
24
|
+
import { renderFindings } from '../missions/sentinel-wake.js';
|
|
25
|
+
/** Which plugin ships each watcher. */
|
|
26
|
+
export function sentinelPlugins(manifests) {
|
|
27
|
+
const out = new Map();
|
|
28
|
+
for (const m of manifests)
|
|
29
|
+
for (const s of m.sentinels ?? [])
|
|
30
|
+
out.set(s.id, m.name);
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The owner's line for a surface: the plugin's own fences round quoted mail
|
|
35
|
+
* (`<<<QUOTED MAIL …>>>`) are for a model reading it, not for a person, so a
|
|
36
|
+
* surface draws the words without them. The finding keeps them for the agent.
|
|
37
|
+
*/
|
|
38
|
+
export function plainLine(f) {
|
|
39
|
+
return unfenced(ownerLineOf(f));
|
|
40
|
+
}
|
|
41
|
+
function unfenced(text) {
|
|
42
|
+
return text.replace(/<<<[^<>]*>>>/g, '').replace(/\s+/g, ' ').trim();
|
|
43
|
+
}
|
|
44
|
+
function groupKey(f) {
|
|
45
|
+
return `${f.sentinelId}:${f.kind}`;
|
|
46
|
+
}
|
|
47
|
+
function fill(template, count) {
|
|
48
|
+
return template.split('{count}').join(String(count));
|
|
49
|
+
}
|
|
50
|
+
/** The action a single finding offers, as the page draws it. */
|
|
51
|
+
function actionView(f, a, index, plugin) {
|
|
52
|
+
switch (a.kind) {
|
|
53
|
+
case 'open':
|
|
54
|
+
return { kind: 'open', label: a.label, plugin, ...(a.page ? { page: a.page } : {}), ...(a.item ? { item: a.item } : {}), ...(a.place ? { place: a.place } : {}) };
|
|
55
|
+
case 'run':
|
|
56
|
+
return { kind: 'run', label: a.label, key: f.key, index, ...(a.confirm ? { confirm: a.confirm } : {}), ...(a.tone ? { tone: a.tone } : {}) };
|
|
57
|
+
case 'fill':
|
|
58
|
+
return {
|
|
59
|
+
kind: 'fill',
|
|
60
|
+
label: a.label,
|
|
61
|
+
title: a.title ?? a.label,
|
|
62
|
+
fields: [{ key: f.key, index, label: a.field.label, type: a.field.type, value: a.field.value ?? null, hint: a.field.hint ?? null }],
|
|
63
|
+
};
|
|
64
|
+
case 'ask':
|
|
65
|
+
return { kind: 'ask', label: a.label ?? null };
|
|
66
|
+
case 'dismiss':
|
|
67
|
+
return { kind: 'dismiss', label: a.label };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A group's actions, from its first finding's: what makes sense for many at
|
|
72
|
+
* once. A `fill` gathers a field from every finding that offers the same tool
|
|
73
|
+
* — one quick form for nine balances. An `open` stays when every finding opens
|
|
74
|
+
* the same page (without an item when the items differ). A `run` is about one
|
|
75
|
+
* thing, so a group never offers it; each finding keeps its own on its row
|
|
76
|
+
* inside the group (`itemActions`).
|
|
77
|
+
*/
|
|
78
|
+
function groupActions(findings, plugin) {
|
|
79
|
+
const first = findings[0];
|
|
80
|
+
if (findings.length === 1) {
|
|
81
|
+
const own = first.actions.map((a, i) => actionView(first, a, i, plugin));
|
|
82
|
+
return own.length > 0 ? own : [{ kind: 'ask', label: null }];
|
|
83
|
+
}
|
|
84
|
+
const out = [];
|
|
85
|
+
first.actions.forEach((a) => {
|
|
86
|
+
if (a.kind === 'run')
|
|
87
|
+
return;
|
|
88
|
+
if (a.kind === 'fill') {
|
|
89
|
+
const fields = [];
|
|
90
|
+
for (const f of findings) {
|
|
91
|
+
const index = f.actions.findIndex((x) => x.kind === 'fill' && x.tool === a.tool);
|
|
92
|
+
const own = f.actions[index];
|
|
93
|
+
if (own === undefined || own.kind !== 'fill')
|
|
94
|
+
continue;
|
|
95
|
+
fields.push({ key: f.key, index, label: own.field.label, type: own.field.type, value: own.field.value ?? null, hint: own.field.hint ?? null });
|
|
96
|
+
}
|
|
97
|
+
out.push({ kind: 'fill', label: a.groupLabel ?? a.label, title: a.title ?? a.groupLabel ?? a.label, fields });
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (a.kind === 'open') {
|
|
101
|
+
const same = findings.every((f) => f.actions.some((x) => x.kind === 'open' && x.page === a.page && x.place === a.place));
|
|
102
|
+
if (!same)
|
|
103
|
+
return;
|
|
104
|
+
const oneItem = findings.every((f) => f.actions.some((x) => x.kind === 'open' && x.item === a.item));
|
|
105
|
+
out.push({ kind: 'open', label: a.label, plugin, ...(a.page ? { page: a.page } : {}), ...(oneItem && a.item ? { item: a.item } : {}), ...(a.place ? { place: a.place } : {}) });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
out.push(actionView(first, a, 0, plugin));
|
|
109
|
+
});
|
|
110
|
+
return out.length > 0 ? out : [{ kind: 'ask', label: null }];
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* One finding's own actions inside a group of many: every `run`, by its own
|
|
114
|
+
* key and index, and an `open` that names its own item when the group's
|
|
115
|
+
* opens could not (`groupActions` drops the item when they differ).
|
|
116
|
+
*/
|
|
117
|
+
function itemActions(f, group, plugin) {
|
|
118
|
+
const out = [];
|
|
119
|
+
f.actions.forEach((a, index) => {
|
|
120
|
+
if (a.kind === 'run')
|
|
121
|
+
out.push(actionView(f, a, index, plugin));
|
|
122
|
+
if (a.kind === 'open' && a.item) {
|
|
123
|
+
const covered = group.some((g) => g.kind === 'open' && g.page === a.page && g.place === a.place && g.item === a.item);
|
|
124
|
+
if (!covered)
|
|
125
|
+
out.push(actionView(f, a, index, plugin));
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
/** One row per watcher and kind; a fact on its own is a row of one. */
|
|
131
|
+
export function groupFindings(findings, plugins) {
|
|
132
|
+
const buckets = new Map();
|
|
133
|
+
for (const f of findings) {
|
|
134
|
+
const key = groupKey(f);
|
|
135
|
+
const list = buckets.get(key);
|
|
136
|
+
if (list)
|
|
137
|
+
list.push(f);
|
|
138
|
+
else
|
|
139
|
+
buckets.set(key, [f]);
|
|
140
|
+
}
|
|
141
|
+
const groups = [];
|
|
142
|
+
for (const list of buckets.values()) {
|
|
143
|
+
list.sort((a, b) => a.firstSeenAt.getTime() - b.firstSeenAt.getTime() || a.key.localeCompare(b.key));
|
|
144
|
+
const first = list[0];
|
|
145
|
+
const plugin = plugins.get(first.sentinelId) ?? null;
|
|
146
|
+
const many = list.length > 1;
|
|
147
|
+
const spec = list.find((f) => f.group !== null)?.group ?? null;
|
|
148
|
+
const title = !many
|
|
149
|
+
? plainLine(first)
|
|
150
|
+
: spec
|
|
151
|
+
? fill(spec.title, list.length)
|
|
152
|
+
: `${plainLine(first)} — and ${list.length - 1} more like it`;
|
|
153
|
+
const line = many && spec?.ownerLine ? fill(spec.ownerLine, list.length) : null;
|
|
154
|
+
const subject = !many ? first.subject : null;
|
|
155
|
+
const actions = groupActions(list, plugin);
|
|
156
|
+
groups.push({
|
|
157
|
+
id: many ? groupKey(first) : first.key,
|
|
158
|
+
sentinelId: first.sentinelId,
|
|
159
|
+
plugin,
|
|
160
|
+
kind: first.kind,
|
|
161
|
+
title,
|
|
162
|
+
line,
|
|
163
|
+
urgent: list.some((f) => f.severity === 'urgent'),
|
|
164
|
+
since: first.firstSeenAt.toISOString(),
|
|
165
|
+
agentId: list.find((f) => f.agentId !== null)?.agentId ?? null,
|
|
166
|
+
keys: list.map((f) => f.key),
|
|
167
|
+
items: list.map((f) => {
|
|
168
|
+
const fillAction = f.actions.find((a) => a.kind === 'fill');
|
|
169
|
+
const hint = fillAction?.kind === 'fill' ? fillAction.field.hint : undefined;
|
|
170
|
+
const own = many ? itemActions(f, actions, plugin) : [];
|
|
171
|
+
return {
|
|
172
|
+
key: f.key,
|
|
173
|
+
line: plainLine(f),
|
|
174
|
+
subject: f.subject ? { id: f.subject.id, label: unfenced(f.subject.label) } : null,
|
|
175
|
+
note: hint ?? plainLine(f),
|
|
176
|
+
firstSeenAt: f.firstSeenAt.toISOString(),
|
|
177
|
+
...(own.length > 0 ? { actions: own } : {}),
|
|
178
|
+
};
|
|
179
|
+
}),
|
|
180
|
+
actions,
|
|
181
|
+
stop: subject
|
|
182
|
+
? { scope: 'subject', label: `${unfenced(subject.label)}: ${plainLine(first)}` }
|
|
183
|
+
: { scope: 'kind', label: title },
|
|
184
|
+
snoozedUntil: list.map((f) => f.snoozedUntil).find((d) => d !== null)?.toISOString() ?? null,
|
|
185
|
+
resolvedAt: list.every((f) => f.resolvedAt !== null) ? list[list.length - 1].resolvedAt.toISOString() : null,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
// Urgent first, then the longest waiting.
|
|
189
|
+
groups.sort((a, b) => Number(b.urgent) - Number(a.urgent) || a.since.localeCompare(b.since));
|
|
190
|
+
return groups;
|
|
191
|
+
}
|
|
192
|
+
async function loadFindings(pool, where, params = []) {
|
|
193
|
+
const { rows } = await pool.query(`select ${SENTINEL_FINDING_COLUMNS} from core.sentinel_findings where ${where}`, params);
|
|
194
|
+
return rows.map(toSentinelFinding);
|
|
195
|
+
}
|
|
196
|
+
function notMuted(mutes) {
|
|
197
|
+
return (f) => !isMuted(mutes, f.sentinelId, f.kind, f.subject?.id ?? null);
|
|
198
|
+
}
|
|
199
|
+
/** The decisions alone: what the Alerts page lists and Home's Needs you counts. */
|
|
200
|
+
export async function readAlertDecisions(pool, registry, now) {
|
|
201
|
+
const mutes = await sentinelMutes(pool);
|
|
202
|
+
const open = await loadFindings(pool, `resolved_at is null and severity = 'urgent'`);
|
|
203
|
+
const live = open.filter(notMuted(mutes)).filter((f) => !isSnoozed(f, now));
|
|
204
|
+
return groupFindings(live, sentinelPlugins(registry.manifests()));
|
|
205
|
+
}
|
|
206
|
+
/** When the recap runs next, if a plugin ships one and it is on. */
|
|
207
|
+
async function nextRecap(pool, manifests, now) {
|
|
208
|
+
const missionId = recapMissionId(manifests) ?? null;
|
|
209
|
+
if (missionId === null)
|
|
210
|
+
return { missionId, nextAt: null };
|
|
211
|
+
const { rows } = await pool.query(`select enabled from core.missions where id = $1`, [missionId]);
|
|
212
|
+
if (rows[0]?.enabled !== true)
|
|
213
|
+
return { missionId, nextAt: null };
|
|
214
|
+
const spec = await getActiveSchedule(pool, missionId).catch(() => null);
|
|
215
|
+
if (!spec)
|
|
216
|
+
return { missionId, nextAt: null };
|
|
217
|
+
const next = nextAfter(spec.cron, now, spec.timezone);
|
|
218
|
+
return { missionId, nextAt: next ? next.toISOString() : null };
|
|
219
|
+
}
|
|
220
|
+
export async function readAlerts(pool, registry, now) {
|
|
221
|
+
const manifests = registry.manifests();
|
|
222
|
+
const plugins = sentinelPlugins(manifests);
|
|
223
|
+
const mutes = await sentinelMutes(pool);
|
|
224
|
+
const shown = notMuted(mutes);
|
|
225
|
+
const urgentOpen = (await loadFindings(pool, `resolved_at is null and severity = 'urgent'`)).filter(shown);
|
|
226
|
+
const open = urgentOpen.filter((f) => !isSnoozed(f, now));
|
|
227
|
+
const snoozed = urgentOpen.filter((f) => isSnoozed(f, now));
|
|
228
|
+
const resolved = (await loadFindings(pool, `resolved_at is not null and resolved_at > $1 order by resolved_at desc limit 20`, [
|
|
229
|
+
new Date(now.getTime() - 7 * 86_400_000).toISOString(),
|
|
230
|
+
])).filter(shown);
|
|
231
|
+
// The recap's notes: what is queued for it, in the owner's words.
|
|
232
|
+
const queued = await loadFindings(pool, `key in (select finding_key from core.digest_items where consumed_at is null)`);
|
|
233
|
+
const notes = queued.filter(shown);
|
|
234
|
+
const recap = await nextRecap(pool, manifests, now);
|
|
235
|
+
return {
|
|
236
|
+
open: groupFindings(open, plugins),
|
|
237
|
+
snoozed: groupFindings(snoozed, plugins),
|
|
238
|
+
resolved: groupFindings(resolved, plugins),
|
|
239
|
+
recap: { count: notes.length, ...recap, groups: groupFindings(notes, plugins) },
|
|
240
|
+
mutes: mutes.map((m) => ({ id: m.id, sentinelId: m.sentinelId, label: m.label, createdAt: m.createdAt.toISOString() })),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
async function openFinding(pool, key) {
|
|
244
|
+
const [f] = await loadFindings(pool, `key = $1 and resolved_at is null`, [key]);
|
|
245
|
+
return f ?? null;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* "Stop telling me this" on a row. A finding with a subject silences that
|
|
249
|
+
* subject; a group, or a finding about nothing in particular, its whole kind.
|
|
250
|
+
* `group` says which the page drew.
|
|
251
|
+
*/
|
|
252
|
+
export async function muteAlert(pool, body, now) {
|
|
253
|
+
const key = typeof body.key === 'string' ? body.key : '';
|
|
254
|
+
const f = key ? await openFinding(pool, key) : null;
|
|
255
|
+
if (!f)
|
|
256
|
+
return { status: 404, body: { error: 'No open alert has that key.' } };
|
|
257
|
+
const scope = body.scope === 'kind' || f.subject === null ? 'kind' : 'subject';
|
|
258
|
+
const label = typeof body.label === 'string' && body.label.trim() !== ''
|
|
259
|
+
? body.label.trim()
|
|
260
|
+
: scope === 'subject' && f.subject
|
|
261
|
+
? `${f.subject.label}: ${plainLine(f)}`
|
|
262
|
+
: plainLine(f);
|
|
263
|
+
const mute = await muteFindings(pool, { sentinelId: f.sentinelId, kind: f.kind, subjectId: scope === 'subject' && f.subject ? f.subject.id : '', label }, now);
|
|
264
|
+
return { status: 200, body: { id: mute.id, label: mute.label } };
|
|
265
|
+
}
|
|
266
|
+
/** At most this many entries in one act: a quick form of every balance, not a script. */
|
|
267
|
+
export const ALERT_ACT_MAX = 50;
|
|
268
|
+
/**
|
|
269
|
+
* Run what a finding declared: a `run`, or a `fill` with the value the owner
|
|
270
|
+
* typed. The page names a finding key and an action index, never a tool, so
|
|
271
|
+
* it can only run what the watcher put on the row — and only a tool of the
|
|
272
|
+
* plugin that ships the watcher. A gated tool answers its approval, exactly
|
|
273
|
+
* as from the plugin's own page.
|
|
274
|
+
*/
|
|
275
|
+
export async function actOnAlerts(deps, body, session) {
|
|
276
|
+
const entries = Array.isArray(body.entries) ? body.entries : null;
|
|
277
|
+
if (entries === null || entries.length === 0)
|
|
278
|
+
return { status: 400, body: { error: 'Send `{ entries: [{ key, action, value? }] }`.' } };
|
|
279
|
+
if (entries.length > ALERT_ACT_MAX)
|
|
280
|
+
return { status: 400, body: { error: `At most ${ALERT_ACT_MAX} at once.` } };
|
|
281
|
+
const plugins = sentinelPlugins(deps.registry.manifests());
|
|
282
|
+
const results = [];
|
|
283
|
+
for (const raw of entries) {
|
|
284
|
+
const entry = (raw ?? {});
|
|
285
|
+
const key = typeof entry.key === 'string' ? entry.key : '';
|
|
286
|
+
const index = typeof entry.action === 'number' && Number.isInteger(entry.action) ? entry.action : -1;
|
|
287
|
+
const f = key ? await openFinding(deps.pool, key) : null;
|
|
288
|
+
const action = f?.actions[index];
|
|
289
|
+
if (!f || !action || (action.kind !== 'run' && action.kind !== 'fill')) {
|
|
290
|
+
results.push({ key, error: 'That alert has no such action any more.' });
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
const plugin = plugins.get(f.sentinelId);
|
|
294
|
+
if (plugin === undefined || deps.registry.pluginOf(action.tool) !== plugin) {
|
|
295
|
+
results.push({ key, error: `${action.tool} is not a tool of the plugin that raised this alert.` });
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
const args = { ...(action.args ?? {}) };
|
|
299
|
+
if (action.kind === 'fill') {
|
|
300
|
+
const value = entry.value;
|
|
301
|
+
if (action.field.type === 'number') {
|
|
302
|
+
const n = typeof value === 'number' ? value : typeof value === 'string' && value.trim() !== '' ? Number(value.replace(/[,\s]/g, '')) : NaN;
|
|
303
|
+
if (!Number.isFinite(n)) {
|
|
304
|
+
results.push({ key, error: `${action.field.label}: a number, please.` });
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
args[action.field.name] = n;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
311
|
+
results.push({ key, error: `${action.field.label}: nothing typed.` });
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
args[action.field.name] = value.trim();
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
const result = await deps.registry.invoke(action.tool, args, { ...deps.ctx, agentId: OWNER_AGENT_ID, now: deps.now }, { askOnly: session.via === 'token' });
|
|
318
|
+
if (result.ok)
|
|
319
|
+
results.push({ key, result: result.output });
|
|
320
|
+
else if (result.reason === 'approval-required')
|
|
321
|
+
results.push({ key, approvalId: result.actionId });
|
|
322
|
+
else if (result.reason === 'ask-only')
|
|
323
|
+
results.push({ key, error: `An API token cannot run ${action.tool}: it runs without an approval.` });
|
|
324
|
+
else
|
|
325
|
+
results.push({ key, error: result.message });
|
|
326
|
+
}
|
|
327
|
+
return { status: 200, body: { results } };
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* "Ask <agent>": a turn with the agent that answers for the findings. The
|
|
331
|
+
* thread shows the owner's line as what he asked about; the agent reads the
|
|
332
|
+
* findings — brief, data and all — inside the watcher fence, the way a wake
|
|
333
|
+
* hands them over.
|
|
334
|
+
*/
|
|
335
|
+
export function askPrompt(findings) {
|
|
336
|
+
const payloads = findings.map((f) => ({
|
|
337
|
+
key: f.key,
|
|
338
|
+
sentinelId: f.sentinelId,
|
|
339
|
+
severity: f.severity,
|
|
340
|
+
title: f.title,
|
|
341
|
+
...(f.ownerLine ? { ownerLine: f.ownerLine } : {}),
|
|
342
|
+
detail: f.detail,
|
|
343
|
+
agentId: f.agentId,
|
|
344
|
+
data: f.data ?? null,
|
|
345
|
+
}));
|
|
346
|
+
const label = findings.length === 1
|
|
347
|
+
? `About: ${plainLine(findings[0])}`
|
|
348
|
+
: `About ${findings.length} alerts: ${plainLine(findings[0])}…`;
|
|
349
|
+
const prompt = [
|
|
350
|
+
findings.length === 1
|
|
351
|
+
? 'The owner pressed "Ask" on this alert on his Alerts page. Check it with your own tools first, then tell him in a few plain sentences what it means and what you suggest — offer to do the part you can do.'
|
|
352
|
+
: 'The owner pressed "Ask" on these alerts, grouped on his Alerts page. Check them with your own tools first, then answer once, in a few plain sentences: what they mean together and what you suggest — offer to do the part you can do.',
|
|
353
|
+
'',
|
|
354
|
+
renderFindings(payloads),
|
|
355
|
+
].join('\n');
|
|
356
|
+
return { label: label.length > 160 ? `${label.slice(0, 157)}…` : label, prompt };
|
|
357
|
+
}
|
|
358
|
+
export async function findingsForAsk(pool, keys) {
|
|
359
|
+
if (keys.length === 0)
|
|
360
|
+
return [];
|
|
361
|
+
return loadFindings(pool, `key = any($1::text[]) order by first_seen_at`, [[...keys].slice(0, ALERT_ACT_MAX)]);
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=alerts.js.map
|