@withbuddi/buddi 0.1.0-pre.29 → 0.1.0-pre.31
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 +58 -368
- 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 +14 -4
- 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 +6 -12
- package/node_modules/@buddi/cli/dist/doctor-probes.js.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor.d.ts +16 -0
- package/node_modules/@buddi/cli/dist/doctor.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor.js +30 -0
- package/node_modules/@buddi/cli/dist/doctor.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 +27 -9
- package/node_modules/@buddi/cli/dist/main.js.map +1 -1
- package/node_modules/@buddi/cli/dist/mcp/tools.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/mcp/tools.js +3 -1
- package/node_modules/@buddi/cli/dist/mcp/tools.js.map +1 -1
- package/node_modules/@buddi/cli/dist/status.d.ts +15 -9
- package/node_modules/@buddi/cli/dist/status.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/status.js +6 -11
- package/node_modules/@buddi/cli/dist/status.js.map +1 -1
- package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/core/dist/actions/store.d.ts +8 -0
- package/node_modules/@buddi/core/dist/actions/store.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/actions/store.js +13 -0
- package/node_modules/@buddi/core/dist/actions/store.js.map +1 -1
- package/node_modules/@buddi/core/dist/clock-widget.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/clock-widget.js +5 -3
- package/node_modules/@buddi/core/dist/clock-widget.js.map +1 -1
- package/node_modules/@buddi/core/dist/host/build.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/host/build.js +11 -0
- package/node_modules/@buddi/core/dist/host/build.js.map +1 -1
- package/node_modules/@buddi/core/dist/host/types.d.ts +7 -0
- package/node_modules/@buddi/core/dist/host/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/learning/store.d.ts +7 -0
- package/node_modules/@buddi/core/dist/learning/store.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/learning/store.js +6 -0
- package/node_modules/@buddi/core/dist/learning/store.js.map +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/notifications/agent.d.ts +7 -0
- package/node_modules/@buddi/core/dist/notifications/agent.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/notifications/agent.js +2 -0
- package/node_modules/@buddi/core/dist/notifications/agent.js.map +1 -1
- package/node_modules/@buddi/core/dist/notifications/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/notifications/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/notifications/index.js +1 -0
- package/node_modules/@buddi/core/dist/notifications/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/notifications/needs.d.ts +49 -0
- package/node_modules/@buddi/core/dist/notifications/needs.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/needs.js +41 -0
- package/node_modules/@buddi/core/dist/notifications/needs.js.map +1 -0
- package/node_modules/@buddi/core/dist/notifications/notify.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/notifications/notify.js +16 -7
- package/node_modules/@buddi/core/dist/notifications/notify.js.map +1 -1
- package/node_modules/@buddi/core/dist/notifications/store.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/notifications/store.js +2 -1
- package/node_modules/@buddi/core/dist/notifications/store.js.map +1 -1
- package/node_modules/@buddi/core/dist/notifications/types.d.ts +10 -0
- package/node_modules/@buddi/core/dist/notifications/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/notifications/types.js.map +1 -1
- package/node_modules/@buddi/core/dist/owner-timezone.d.ts +20 -22
- package/node_modules/@buddi/core/dist/owner-timezone.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/owner-timezone.js +17 -25
- package/node_modules/@buddi/core/dist/owner-timezone.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/scheduler/missions.d.ts +39 -10
- package/node_modules/@buddi/core/dist/scheduler/missions.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/scheduler/missions.js +44 -17
- package/node_modules/@buddi/core/dist/scheduler/missions.js.map +1 -1
- package/node_modules/@buddi/core/dist/scheduler/types.d.ts +7 -0
- package/node_modules/@buddi/core/dist/scheduler/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/scheduler/types.js +1 -0
- package/node_modules/@buddi/core/dist/scheduler/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/dist/web-settings.d.ts +13 -0
- package/node_modules/@buddi/core/dist/web-settings.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/web-settings.js +26 -0
- package/node_modules/@buddi/core/dist/web-settings.js.map +1 -1
- package/node_modules/@buddi/core/dist/widgets.d.ts +13 -5
- package/node_modules/@buddi/core/dist/widgets.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/widgets.js +10 -1
- package/node_modules/@buddi/core/dist/widgets.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/core/migrations/068_notification_action.sql +12 -0
- package/node_modules/@buddi/core/migrations/069_schedule_zone_explicit.sql +18 -0
- package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/gateway/dist/agents/learning-digest.d.ts +29 -7
- package/node_modules/@buddi/gateway/dist/agents/learning-digest.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/learning-digest.js +87 -38
- package/node_modules/@buddi/gateway/dist/agents/learning-digest.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/owner-tools.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/owner-tools.js +11 -1
- package/node_modules/@buddi/gateway/dist/agents/owner-tools.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/platform.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/platform.js +2 -0
- package/node_modules/@buddi/gateway/dist/agents/platform.js.map +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/index.d.ts +1 -0
- package/node_modules/@buddi/gateway/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/index.js +1 -0
- package/node_modules/@buddi/gateway/dist/index.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/defaults.d.ts +0 -6
- package/node_modules/@buddi/gateway/dist/missions/defaults.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/defaults.js +4 -8
- package/node_modules/@buddi/gateway/dist/missions/defaults.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/reminders.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/reminders.js +4 -1
- package/node_modules/@buddi/gateway/dist/missions/reminders.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/missions/zone-provenance.d.ts +13 -0
- package/node_modules/@buddi/gateway/dist/missions/zone-provenance.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/missions/zone-provenance.js +36 -0
- package/node_modules/@buddi/gateway/dist/missions/zone-provenance.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/missions-cli.js +2 -2
- package/node_modules/@buddi/gateway/dist/missions-cli.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/serve.js +10 -10
- package/node_modules/@buddi/gateway/dist/serve.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/telegram/channel.d.ts +11 -1
- package/node_modules/@buddi/gateway/dist/telegram/channel.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/channel.js +13 -2
- package/node_modules/@buddi/gateway/dist/telegram/channel.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 +53 -9
- 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 +12 -5
- package/node_modules/@buddi/gateway/dist/web/lock.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/lock.js +23 -28
- package/node_modules/@buddi/gateway/dist/web/lock.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/needs-you.d.ts +36 -0
- package/node_modules/@buddi/gateway/dist/web/needs-you.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/needs-you.js +65 -0
- package/node_modules/@buddi/gateway/dist/web/needs-you.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/notifications.d.ts +9 -1
- package/node_modules/@buddi/gateway/dist/web/notifications.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/notifications.js +14 -3
- package/node_modules/@buddi/gateway/dist/web/notifications.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 +69 -27
- package/node_modules/@buddi/gateway/dist/web/read.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/read.js +103 -43
- 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 +152 -11
- 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 +50 -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/install/dist/doctor-timezone.d.ts +17 -0
- package/node_modules/@buddi/install/dist/doctor-timezone.d.ts.map +1 -0
- package/node_modules/@buddi/install/dist/doctor-timezone.js +34 -0
- package/node_modules/@buddi/install/dist/doctor-timezone.js.map +1 -0
- package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/launcher.js +3 -0
- package/node_modules/@buddi/install/dist/launcher.js.map +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 +61 -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 +99 -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/migrations/026_attention_filed.sql +89 -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 +14 -4
- 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 +6 -12
- package/packages/cli/dist/doctor-probes.js.map +1 -1
- package/packages/cli/dist/doctor.d.ts +16 -0
- package/packages/cli/dist/doctor.d.ts.map +1 -1
- package/packages/cli/dist/doctor.js +30 -0
- package/packages/cli/dist/doctor.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 +27 -9
- package/packages/cli/dist/main.js.map +1 -1
- package/packages/cli/dist/mcp/tools.d.ts.map +1 -1
- package/packages/cli/dist/mcp/tools.js +3 -1
- package/packages/cli/dist/mcp/tools.js.map +1 -1
- package/packages/cli/dist/status.d.ts +15 -9
- package/packages/cli/dist/status.d.ts.map +1 -1
- package/packages/cli/dist/status.js +6 -11
- package/packages/cli/dist/status.js.map +1 -1
- package/packages/core/dist/.tsbuildinfo +1 -1
- package/packages/core/dist/actions/store.d.ts +8 -0
- package/packages/core/dist/actions/store.d.ts.map +1 -1
- package/packages/core/dist/actions/store.js +13 -0
- package/packages/core/dist/actions/store.js.map +1 -1
- package/packages/core/dist/clock-widget.d.ts.map +1 -1
- package/packages/core/dist/clock-widget.js +5 -3
- package/packages/core/dist/clock-widget.js.map +1 -1
- package/packages/core/dist/host/build.d.ts.map +1 -1
- package/packages/core/dist/host/build.js +11 -0
- package/packages/core/dist/host/build.js.map +1 -1
- package/packages/core/dist/host/types.d.ts +7 -0
- package/packages/core/dist/host/types.d.ts.map +1 -1
- package/packages/core/dist/learning/store.d.ts +7 -0
- package/packages/core/dist/learning/store.d.ts.map +1 -1
- package/packages/core/dist/learning/store.js +6 -0
- package/packages/core/dist/learning/store.js.map +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/notifications/agent.d.ts +7 -0
- package/packages/core/dist/notifications/agent.d.ts.map +1 -1
- package/packages/core/dist/notifications/agent.js +2 -0
- package/packages/core/dist/notifications/agent.js.map +1 -1
- package/packages/core/dist/notifications/index.d.ts +1 -0
- package/packages/core/dist/notifications/index.d.ts.map +1 -1
- package/packages/core/dist/notifications/index.js +1 -0
- package/packages/core/dist/notifications/index.js.map +1 -1
- package/packages/core/dist/notifications/needs.d.ts +49 -0
- package/packages/core/dist/notifications/needs.d.ts.map +1 -0
- package/packages/core/dist/notifications/needs.js +41 -0
- package/packages/core/dist/notifications/needs.js.map +1 -0
- package/packages/core/dist/notifications/notify.d.ts.map +1 -1
- package/packages/core/dist/notifications/notify.js +16 -7
- package/packages/core/dist/notifications/notify.js.map +1 -1
- package/packages/core/dist/notifications/store.d.ts.map +1 -1
- package/packages/core/dist/notifications/store.js +2 -1
- package/packages/core/dist/notifications/store.js.map +1 -1
- package/packages/core/dist/notifications/types.d.ts +10 -0
- package/packages/core/dist/notifications/types.d.ts.map +1 -1
- package/packages/core/dist/notifications/types.js.map +1 -1
- package/packages/core/dist/owner-timezone.d.ts +20 -22
- package/packages/core/dist/owner-timezone.d.ts.map +1 -1
- package/packages/core/dist/owner-timezone.js +17 -25
- package/packages/core/dist/owner-timezone.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/scheduler/missions.d.ts +39 -10
- package/packages/core/dist/scheduler/missions.d.ts.map +1 -1
- package/packages/core/dist/scheduler/missions.js +44 -17
- package/packages/core/dist/scheduler/missions.js.map +1 -1
- package/packages/core/dist/scheduler/types.d.ts +7 -0
- package/packages/core/dist/scheduler/types.d.ts.map +1 -1
- package/packages/core/dist/scheduler/types.js +1 -0
- package/packages/core/dist/scheduler/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/dist/web-settings.d.ts +13 -0
- package/packages/core/dist/web-settings.d.ts.map +1 -1
- package/packages/core/dist/web-settings.js +26 -0
- package/packages/core/dist/web-settings.js.map +1 -1
- package/packages/core/dist/widgets.d.ts +13 -5
- package/packages/core/dist/widgets.d.ts.map +1 -1
- package/packages/core/dist/widgets.js +10 -1
- package/packages/core/dist/widgets.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/core/migrations/068_notification_action.sql +12 -0
- package/packages/core/migrations/069_schedule_zone_explicit.sql +18 -0
- package/packages/gateway/dist/.tsbuildinfo +1 -1
- package/packages/gateway/dist/agents/learning-digest.d.ts +29 -7
- package/packages/gateway/dist/agents/learning-digest.d.ts.map +1 -1
- package/packages/gateway/dist/agents/learning-digest.js +87 -38
- package/packages/gateway/dist/agents/learning-digest.js.map +1 -1
- package/packages/gateway/dist/agents/owner-tools.d.ts.map +1 -1
- package/packages/gateway/dist/agents/owner-tools.js +11 -1
- package/packages/gateway/dist/agents/owner-tools.js.map +1 -1
- package/packages/gateway/dist/agents/platform.d.ts.map +1 -1
- package/packages/gateway/dist/agents/platform.js +2 -0
- package/packages/gateway/dist/agents/platform.js.map +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/index.d.ts +1 -0
- package/packages/gateway/dist/index.d.ts.map +1 -1
- package/packages/gateway/dist/index.js +1 -0
- package/packages/gateway/dist/index.js.map +1 -1
- package/packages/gateway/dist/missions/defaults.d.ts +0 -6
- package/packages/gateway/dist/missions/defaults.d.ts.map +1 -1
- package/packages/gateway/dist/missions/defaults.js +4 -8
- package/packages/gateway/dist/missions/defaults.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/reminders.d.ts.map +1 -1
- package/packages/gateway/dist/missions/reminders.js +4 -1
- package/packages/gateway/dist/missions/reminders.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/missions/zone-provenance.d.ts +13 -0
- package/packages/gateway/dist/missions/zone-provenance.d.ts.map +1 -0
- package/packages/gateway/dist/missions/zone-provenance.js +36 -0
- package/packages/gateway/dist/missions/zone-provenance.js.map +1 -0
- package/packages/gateway/dist/missions-cli.js +2 -2
- package/packages/gateway/dist/missions-cli.js.map +1 -1
- package/packages/gateway/dist/serve.d.ts.map +1 -1
- package/packages/gateway/dist/serve.js +10 -10
- package/packages/gateway/dist/serve.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/telegram/channel.d.ts +11 -1
- package/packages/gateway/dist/telegram/channel.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/channel.js +13 -2
- package/packages/gateway/dist/telegram/channel.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 +53 -9
- 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 +12 -5
- package/packages/gateway/dist/web/lock.d.ts.map +1 -1
- package/packages/gateway/dist/web/lock.js +23 -28
- package/packages/gateway/dist/web/lock.js.map +1 -1
- package/packages/gateway/dist/web/needs-you.d.ts +36 -0
- package/packages/gateway/dist/web/needs-you.d.ts.map +1 -0
- package/packages/gateway/dist/web/needs-you.js +65 -0
- package/packages/gateway/dist/web/needs-you.js.map +1 -0
- package/packages/gateway/dist/web/notifications.d.ts +9 -1
- package/packages/gateway/dist/web/notifications.d.ts.map +1 -1
- package/packages/gateway/dist/web/notifications.js +14 -3
- package/packages/gateway/dist/web/notifications.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 +69 -27
- package/packages/gateway/dist/web/read.d.ts.map +1 -1
- package/packages/gateway/dist/web/read.js +103 -43
- 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 +152 -11
- 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 +50 -1
- package/packages/gateway/dist/web/write.js.map +1 -1
- package/packages/install/dist/.tsbuildinfo +1 -1
- package/packages/install/dist/doctor-timezone.d.ts +17 -0
- package/packages/install/dist/doctor-timezone.d.ts.map +1 -0
- package/packages/install/dist/doctor-timezone.js +34 -0
- package/packages/install/dist/doctor-timezone.js.map +1 -0
- package/packages/install/dist/launcher.d.ts.map +1 -1
- package/packages/install/dist/launcher.js +3 -0
- package/packages/install/dist/launcher.js.map +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 +61 -0
- package/packages/tools/email/dist/needs-you.d.ts.map +1 -0
- package/packages/tools/email/dist/needs-you.js +99 -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/migrations/026_attention_filed.sql +89 -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-BYRgwiZp.css +1 -0
- package/packages/web/dist/assets/index-Qb1N-6kN.js +129 -0
- package/packages/web/dist/assets/{lottie_light-Cdn77Osu.js → lottie_light-DU37j1-6.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
|
@@ -22,7 +22,66 @@ export interface RouteReply {
|
|
|
22
22
|
status: number;
|
|
23
23
|
body: unknown;
|
|
24
24
|
}
|
|
25
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* What holds a secret by name: the thing whose row says "my credential is the
|
|
27
|
+
* owner secret called this". The page names a secret by it (a mailbox's
|
|
28
|
+
* address, a model account's label, a connection's name) instead of the
|
|
29
|
+
* generated name, and a secret nothing holds any more is "not used by
|
|
30
|
+
* anything" — a suggestion to remove it, never a removal.
|
|
31
|
+
*/
|
|
32
|
+
export type SecretUser =
|
|
33
|
+
/** `loginFailedAt`: the mail server turned the password down at that time (the Email page's own record), until a login works again. */
|
|
34
|
+
{
|
|
35
|
+
kind: 'mailbox';
|
|
36
|
+
id: string;
|
|
37
|
+
address: string;
|
|
38
|
+
provider: string;
|
|
39
|
+
auth: 'app-password' | 'xoauth2';
|
|
40
|
+
loginFailedAt: string | null;
|
|
41
|
+
} | {
|
|
42
|
+
kind: 'model-account';
|
|
43
|
+
id: string;
|
|
44
|
+
label: string;
|
|
45
|
+
auth: string;
|
|
46
|
+
} | {
|
|
47
|
+
kind: 'connection';
|
|
48
|
+
id: string;
|
|
49
|
+
name: string;
|
|
50
|
+
variable: string | null;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Every row that names an owner secret as its credential, by secret name, and
|
|
54
|
+
* whether every lookup answered. A table that is not installed holds nothing;
|
|
55
|
+
* any other failure — a timeout, a lost connection — leaves `complete` false,
|
|
56
|
+
* because "nothing found" is then not an answer (`isUnused`).
|
|
57
|
+
*/
|
|
58
|
+
export declare function readSecretUsers(pool: Pick<Pool, 'query'>): Promise<{
|
|
59
|
+
users: Map<string, SecretUser[]>;
|
|
60
|
+
complete: boolean;
|
|
61
|
+
}>;
|
|
62
|
+
/** `readSecretUsers`, the users alone. */
|
|
63
|
+
export declare function secretUsers(pool: Pick<Pool, 'query'>): Promise<Map<string, SecretUser[]>>;
|
|
64
|
+
interface ListedSecret {
|
|
65
|
+
name: string;
|
|
66
|
+
bindings: Array<{
|
|
67
|
+
kind: string;
|
|
68
|
+
target: unknown;
|
|
69
|
+
}>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Whether nothing can reach a secret any more: it has bindings, and every one
|
|
73
|
+
* of them is dead — a held kind whose mailbox, account or connection no longer
|
|
74
|
+
* names this secret, or a kind no installed plugin registers. A secret with no
|
|
75
|
+
* binding at all is unused only when it was never the owner's own: a name a
|
|
76
|
+
* mailbox, an account or a connection generated, or the old `.env` mailbox
|
|
77
|
+
* password. An owner's fresh secret with no binding is "not usable yet", a
|
|
78
|
+
* different sentence the page says itself.
|
|
79
|
+
*
|
|
80
|
+
* `complete` false — a lookup of what holds secrets failed — means nobody
|
|
81
|
+
* knows: never unused then, only confirmed absence counts.
|
|
82
|
+
*/
|
|
83
|
+
export declare function isUnused(secret: ListedSecret, users: readonly SecretUser[], registered: ReadonlySet<string>, complete?: boolean): boolean;
|
|
84
|
+
/** `GET /api/secrets` — the page's one read: secrets, destinations, buddi's own keys, and what holds each secret. */
|
|
26
85
|
export declare function listSecrets(deps: SecretsDeps): Promise<RouteReply>;
|
|
27
86
|
/** `GET /api/secrets/uses` — the use log, whole or one secret's. */
|
|
28
87
|
export declare function secretUses(deps: SecretsDeps, url: URL): Promise<RouteReply>;
|
|
@@ -30,4 +89,5 @@ export declare function secretUses(deps: SecretsDeps, url: URL): Promise<RouteRe
|
|
|
30
89
|
export declare function secretsAct(deps: SecretsDeps, body: unknown, session: {
|
|
31
90
|
id: string;
|
|
32
91
|
}): Promise<RouteReply>;
|
|
92
|
+
export {};
|
|
33
93
|
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/web/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAmC,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/web/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAmC,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAKvG,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,YAAY,CAAC;IACvB,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAgCD;;;;;;GAMG;AACH,MAAM,MAAM,UAAU;AACpB,uIAAuI;AACrI;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,GAAG,SAAS,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClI;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAW9E;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAiDjI;AAED,0CAA0C;AAC1C,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAE/F;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,UAAO,GAAG,OAAO,CAKtI;AAKD,qHAAqH;AACrH,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBxE;AAED,oEAAoE;AACpE,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAKjF;AAED,+DAA+D;AAC/D,wBAAsB,UAAU,CAC9B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GACtB,OAAO,CAAC,UAAU,CAAC,CAOrB"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { OWNER_AGENT_ID, SECRETS_QUERIES } from '@buddi/core';
|
|
2
|
+
import { listAccounts } from '@buddi/tool-email';
|
|
3
|
+
import { LEGACY_PASSWORD_VAR } from '../owner-secrets.js';
|
|
4
|
+
import { mailProvider } from './recovery.js';
|
|
2
5
|
const reply = (status, body) => ({ status, body });
|
|
3
6
|
/** Writes from one session: the act route's own budget, reused here. */
|
|
4
7
|
const lastWrite = new Map();
|
|
@@ -31,10 +34,115 @@ async function invoke(deps, tool, args, session) {
|
|
|
31
34
|
return reply(400, { error: result.message });
|
|
32
35
|
}
|
|
33
36
|
const SETTINGS_TOOLS = new Set(['secrets.put', 'secrets.rename', 'secrets.rebind', 'secrets.delete', 'secrets.scrub_history']);
|
|
34
|
-
/**
|
|
37
|
+
/** The kinds whose target names the thing that holds the secret: the binding is alive only while that thing still points back. */
|
|
38
|
+
const HELD_KINDS = new Set(['email.account', 'accounts.provider', 'mcp.env']);
|
|
39
|
+
/** A table or schema that is not installed: a confirmed absence, not a failed lookup. */
|
|
40
|
+
function notInstalled(err) {
|
|
41
|
+
const code = err?.code;
|
|
42
|
+
return code === '42P01' || code === '3F000';
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Every row that names an owner secret as its credential, by secret name, and
|
|
46
|
+
* whether every lookup answered. A table that is not installed holds nothing;
|
|
47
|
+
* any other failure — a timeout, a lost connection — leaves `complete` false,
|
|
48
|
+
* because "nothing found" is then not an answer (`isUnused`).
|
|
49
|
+
*/
|
|
50
|
+
export async function readSecretUsers(pool) {
|
|
51
|
+
const users = new Map();
|
|
52
|
+
let complete = true;
|
|
53
|
+
const failed = (err) => {
|
|
54
|
+
if (!notInstalled(err))
|
|
55
|
+
complete = false;
|
|
56
|
+
};
|
|
57
|
+
const add = (name, user) => {
|
|
58
|
+
if (!name)
|
|
59
|
+
return;
|
|
60
|
+
users.set(name, [...(users.get(name) ?? []), user]);
|
|
61
|
+
};
|
|
62
|
+
try {
|
|
63
|
+
for (const account of await listAccounts(pool, { enabledOnly: false })) {
|
|
64
|
+
const user = { kind: 'mailbox', id: account.id, address: account.address, provider: mailProvider(account.imapHost), auth: account.authMode, loginFailedAt: account.loginFailedAt ?? null };
|
|
65
|
+
add(account.secretName, user);
|
|
66
|
+
// A mailbox the old `.env` named still falls back to `GMAIL_APP_PASSWORD`
|
|
67
|
+
// until its own password is set (`adoptEnvMailbox`, `missingMailboxes`).
|
|
68
|
+
if (account.addedVia === 'env' && account.secretName !== LEGACY_PASSWORD_VAR)
|
|
69
|
+
add(LEGACY_PASSWORD_VAR, user);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
// No email schema: no mailboxes here.
|
|
74
|
+
failed(err);
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const { rows } = await pool.query(`select id, label, auth, secret_ref from core.provider_accounts where not deleting`);
|
|
78
|
+
for (const row of rows)
|
|
79
|
+
add(row.secret_ref, { kind: 'model-account', id: row.id, label: row.label, auth: row.auth });
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
// An installation that predates model accounts.
|
|
83
|
+
failed(err);
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const { rows } = await pool.query(`select id::text as id, name, vault_ref, env from mcp.connections`);
|
|
87
|
+
for (const row of rows) {
|
|
88
|
+
add(row.vault_ref, { kind: 'connection', id: row.id, name: row.name, variable: null });
|
|
89
|
+
if (!Array.isArray(row.env))
|
|
90
|
+
continue;
|
|
91
|
+
for (const entry of row.env) {
|
|
92
|
+
if (typeof entry.secretRef === 'string') {
|
|
93
|
+
add(entry.secretRef, { kind: 'connection', id: row.id, name: row.name, variable: typeof entry.name === 'string' ? entry.name : null });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
// No connections table: nothing connected here.
|
|
100
|
+
failed(err);
|
|
101
|
+
}
|
|
102
|
+
return { users, complete };
|
|
103
|
+
}
|
|
104
|
+
/** `readSecretUsers`, the users alone. */
|
|
105
|
+
export async function secretUsers(pool) {
|
|
106
|
+
return (await readSecretUsers(pool)).users;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Whether nothing can reach a secret any more: it has bindings, and every one
|
|
110
|
+
* of them is dead — a held kind whose mailbox, account or connection no longer
|
|
111
|
+
* names this secret, or a kind no installed plugin registers. A secret with no
|
|
112
|
+
* binding at all is unused only when it was never the owner's own: a name a
|
|
113
|
+
* mailbox, an account or a connection generated, or the old `.env` mailbox
|
|
114
|
+
* password. An owner's fresh secret with no binding is "not usable yet", a
|
|
115
|
+
* different sentence the page says itself.
|
|
116
|
+
*
|
|
117
|
+
* `complete` false — a lookup of what holds secrets failed — means nobody
|
|
118
|
+
* knows: never unused then, only confirmed absence counts.
|
|
119
|
+
*/
|
|
120
|
+
export function isUnused(secret, users, registered, complete = true) {
|
|
121
|
+
if (users.length > 0)
|
|
122
|
+
return false;
|
|
123
|
+
if (!complete)
|
|
124
|
+
return false;
|
|
125
|
+
if (secret.bindings.length === 0)
|
|
126
|
+
return GENERATED_NAME.test(secret.name) || secret.name === LEGACY_PASSWORD_VAR;
|
|
127
|
+
return secret.bindings.every((binding) => HELD_KINDS.has(binding.kind) || !registered.has(binding.kind));
|
|
128
|
+
}
|
|
129
|
+
/** The names buddi itself generates for a credential it keeps for a row. */
|
|
130
|
+
const GENERATED_NAME = /^(PROVIDER_ACCOUNT_|CODEX_ACCOUNT_|ANTHROPIC_ACCOUNT_|OLLAMA_DEVICE_|MCP_TOKEN_|MCP_ENV_|MCP_CONNECTION_|EMAIL_[A-Z0-9_]+_[0-9a-f]{8}$)/;
|
|
131
|
+
/** `GET /api/secrets` — the page's one read: secrets, destinations, buddi's own keys, and what holds each secret. */
|
|
35
132
|
export async function listSecrets(deps) {
|
|
36
|
-
const result = await SECRETS_QUERIES[0].produce({}, { ...deps.ctx, db: deps.pool, now: deps.now ?? (() => new Date()) });
|
|
37
|
-
|
|
133
|
+
const result = (await SECRETS_QUERIES[0].produce({}, { ...deps.ctx, db: deps.pool, now: deps.now ?? (() => new Date()) }));
|
|
134
|
+
const { users, complete } = await readSecretUsers(deps.pool);
|
|
135
|
+
const registered = new Set(result.destinations.map((d) => d.kind));
|
|
136
|
+
return reply(200, {
|
|
137
|
+
...result,
|
|
138
|
+
secrets: result.secrets.map((secret) => {
|
|
139
|
+
const usedBy = users.get(secret.name) ?? [];
|
|
140
|
+
// `usageUnknown`: it would read as unused, but a lookup failed — the page
|
|
141
|
+
// says it couldn't check instead of offering Remove.
|
|
142
|
+
const usageUnknown = !complete && isUnused(secret, usedBy, registered, true);
|
|
143
|
+
return { ...secret, usedBy, unused: isUnused(secret, usedBy, registered, complete), ...(usageUnknown ? { usageUnknown } : {}) };
|
|
144
|
+
}),
|
|
145
|
+
});
|
|
38
146
|
}
|
|
39
147
|
/** `GET /api/secrets/uses` — the use log, whole or one secret's. */
|
|
40
148
|
export async function secretUses(deps, url) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/web/secrets.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,cAAc,EAAE,eAAe,EAA2C,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/web/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAsDA,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAmBtF,OAAO,EAQL,KAAK,eAAe,EAErB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,11 +61,12 @@ import { mlxhBaseUrl, probeMlxh } from '../mlxh.js';
|
|
|
61
61
|
import { OnboardingRefusal, WEB_ONBOARDING_STEPS, WEB_ONBOARDING_SURFACE, claimOpeningTurn, createFirstAgent, probeOllama, readOnboarding, rebindBrain, updateFirstAgent, withFirstRunFacts, readFirstAgentPersona } from './onboarding.js';
|
|
62
62
|
import { TakeOnRefusal, readTakeOn, startTakeOn } from './take-on.js';
|
|
63
63
|
import { TelegramWebError, saveTelegramToken, telegramBot, telegramDevices, telegramPairing, telegramStatus, unpairTelegramDevice, } from './telegram.js';
|
|
64
|
-
import { PAGE_ROUTE, sendPageFile, actOnPage, listPageDescriptors, runPageQuery, } from './pages.js';
|
|
64
|
+
import { PAGE_ROUTE, sendPageFile, actOnPage, actRateLimited, listPageDescriptors, runPageQuery, } from './pages.js';
|
|
65
65
|
import { listSecrets, secretUses, secretsAct } from './secrets.js';
|
|
66
66
|
import { sayRoute, transcribeRoute } from './speech.js';
|
|
67
67
|
import { createServer } from 'node:http';
|
|
68
|
-
import { getAction, idleRolloverMs, inRecovery, listPendingActions, isJobState, parseAgentFile, setSentinelEnabled, snoozeFinding } from '@buddi/core';
|
|
68
|
+
import { getAction, idleRolloverMs, inRecovery, listMissions, listPendingActions, isJobState, parseAgentFile, setSentinelEnabled, snoozeFinding, snoozeFindings, unmuteFindings } from '@buddi/core';
|
|
69
|
+
import { actOnAlerts, askPrompt, findingsForAsk, muteAlert } from './alerts.js';
|
|
69
70
|
import { connectionsOf } from '@buddi/tool-mcp';
|
|
70
71
|
import { CONNECTIONS_CALLBACK_PATH, connectionsRoute } from './connections.js';
|
|
71
72
|
import { browserHost } from '../browser-host.js';
|
|
@@ -93,7 +94,7 @@ import { retryHref, sendSignedOut, wantsSignedOutPage } from './signed-out.js';
|
|
|
93
94
|
import { extensionEndpoint } from './extension.js';
|
|
94
95
|
import { REMOTE_HAND_SOCKET_PATH, RemoteHandEndpoint } from './remote-hand.js';
|
|
95
96
|
import { csrfCookieName, CSRF_HEADER, sessionCookieName, requestPort, BodyTooLargeError, first, cookieHeader, parseCookies, parseUrl, readJsonBody, remoteKey, requestOrigin, requestScope, sendEmpty, sendJson, sendText, } from './http.js';
|
|
96
|
-
import { boundedLimit, readAgents, readApprovals, readConversation, readConversations, readEventKinds, readEvents, readJobs, readMissions, readOverview, setGlanceHidden, readOffers, readReminders, readSentinels, toApprovalView, } from './read.js';
|
|
97
|
+
import { boundedLimit, readAgents, readApprovals, readConversation, readConversations, readEventKinds, readEvents, readJobs, readJobFailures, readMissions, readOverview, setGlanceHidden, setHomeDismissed, readOffers, readReminders, readSentinels, toApprovalView, } from './read.js';
|
|
97
98
|
import { RateLimiter, SessionStore, } from './sessions.js';
|
|
98
99
|
import { supervisorCall } from './service.js';
|
|
99
100
|
import { backupJobRoute, createBackupRoute, discardUpload, listBackups, passphraseRoute, receiveUpload, restoreRoute, scheduleRoute, verifyBackupRoute, } from './backups.js';
|
|
@@ -109,16 +110,17 @@ import { readFacts, webSettingsStore } from '../tips/facts.js';
|
|
|
109
110
|
import { dismissAgentOffer, isPendingAccept, raiseAgentOffers, readAgentOffers, readTeammates } from './agent-offers.js';
|
|
110
111
|
import { currentVersion, upgradeJobRoute, upgradeRoute, versionCheckRoute, versionRoute, } from './version.js';
|
|
111
112
|
import { leaveRecoveryMode, readRecoveryView } from './recovery.js';
|
|
113
|
+
import { readNeedsYou } from './needs-you.js';
|
|
112
114
|
import { readRail, setRailPageHidden } from './rail.js';
|
|
113
115
|
import { BUILD_MISSING, serveAsset, serveShellAtRoot } from './static.js';
|
|
114
|
-
import { StreamBudget, resumeCursor, streamConversation } from './stream.js';
|
|
116
|
+
import { StreamBudget, frame, resumeCursor, streamConversation } from './stream.js';
|
|
115
117
|
import { ensureWebToken, verifyTicket } from './token.js';
|
|
116
118
|
import { MAX_UPLOAD_BYTES, readUpload } from './upload.js';
|
|
117
119
|
import { LOCKED_BODY, LockUnavailable, allowedWhileLocked, clientOf, createLock } from './lock.js';
|
|
118
120
|
import { matchApiRoute, TOKEN_REFUSALS } from './api-routes.js';
|
|
119
121
|
import { apiTokensRoute, bearerOf, verifyApiToken } from './api-tokens.js';
|
|
120
122
|
import { LockImageRefusal, MAX_LOCK_IMAGE_BYTES, normaliseLockImage } from './lock-image.js';
|
|
121
|
-
import { cancelJobFromWeb, cancelReminderFromWeb, decideApprovalFromWeb, retryJobFromWeb, setMissionEnabledFromWeb, setPausedFromWeb, setScheduleFromWeb, dismissOfferFromWeb, dismissOffersFromWeb, takeOfferFromWeb, } from './write.js';
|
|
123
|
+
import { cancelJobFromWeb, cancelReminderFromWeb, decideApprovalFromWeb, retryJobFromWeb, retryJobsFromWeb, dismissJobsFromWeb, undismissJobsFromWeb, setMissionEnabledFromWeb, setPausedFromWeb, setScheduleFromWeb, dismissOfferFromWeb, dismissOffersFromWeb, takeOfferFromWeb, } from './write.js';
|
|
122
124
|
/** How often approvals past their expiry are swept, and waiting delegations told. */
|
|
123
125
|
export const EXPIRY_SWEEP_MS = 60_000;
|
|
124
126
|
/**
|
|
@@ -137,6 +139,16 @@ const WEB_CHATS = new WeakMap();
|
|
|
137
139
|
* it down, and a caller that built a bare `createWebApp` is unaffected.
|
|
138
140
|
*/
|
|
139
141
|
const PREVIEW_APPS = new WeakMap();
|
|
142
|
+
/**
|
|
143
|
+
* What a dashboard says to its open pages just before it closes: one
|
|
144
|
+
* `closing` frame on every live stream, naming the restart or stop the page
|
|
145
|
+
* itself asked for when it was one (`for`), so a page another device or the
|
|
146
|
+
* CLI restarted under draws "Restarting buddi" rather than errors, and
|
|
147
|
+
* reloads once the next process answers `/_buddi/ready` with a new `boot`.
|
|
148
|
+
*/
|
|
149
|
+
const CLOSING_SAYS = new WeakMap();
|
|
150
|
+
/** How long a closing frame may take to reach the pages before the sockets go. */
|
|
151
|
+
const CLOSING_FLUSH_MS = 250;
|
|
140
152
|
/** The chat surface this server is running, if any. */
|
|
141
153
|
/** The most of a text file a preview shows; the download has the whole. */
|
|
142
154
|
const PREVIEW_TEXT_BYTES = 100_000;
|
|
@@ -302,8 +314,33 @@ export function createWebApp(deps) {
|
|
|
302
314
|
* stream are asked again, so one left idle past the delay is locked and cut
|
|
303
315
|
* off even if its page never says a word.
|
|
304
316
|
*/
|
|
305
|
-
|
|
317
|
+
/*
|
|
318
|
+
* What needs the owner, counted once (web/needs-you.ts): Home's counts, the
|
|
319
|
+
* rail's badge and the lock screen all read this, so they agree.
|
|
320
|
+
*/
|
|
321
|
+
const needsYou = () => readNeedsYou({
|
|
322
|
+
pool: deps.pool,
|
|
323
|
+
registry: deps.registry,
|
|
324
|
+
now: deps.now(),
|
|
325
|
+
agentOffers: async () => (await readAgentOffers({
|
|
326
|
+
registry: deps.registry, ctx: deps.ctx, now: deps.now, log, pool: deps.pool, agentIds: () => deps.catalog.list().map((a) => a.id),
|
|
327
|
+
})).offers,
|
|
328
|
+
signals: async () => {
|
|
329
|
+
const service = deps.connections ?? connectionsOf(deps.registry.manifests());
|
|
330
|
+
return service ? service.signals() : [];
|
|
331
|
+
},
|
|
332
|
+
recoveryActive: () => inRecovery(deps.pool),
|
|
333
|
+
});
|
|
334
|
+
const lock = createLock({ pool: deps.pool, sessions, now: deps.now, get timezone() { return deps.timezone; }, widgets, needsYou, log });
|
|
306
335
|
const openStreams = new Map();
|
|
336
|
+
/*
|
|
337
|
+
* This process's boot: answered by `/_buddi/ready`, so a page that watches a
|
|
338
|
+
* restart can tell the process that went from the one that came back.
|
|
339
|
+
* Random, and nothing else: it says which run this is, not when or where.
|
|
340
|
+
*/
|
|
341
|
+
const boot = randomUUID();
|
|
342
|
+
/** Set when a page asked the supervisor to restart or stop this process: what the closing frame says. */
|
|
343
|
+
let goingAway;
|
|
307
344
|
/*
|
|
308
345
|
* The session a live API token acts through: minted on its first request,
|
|
309
346
|
* kept in memory only, one per token (and scope), so a stream budget or a
|
|
@@ -572,6 +609,31 @@ export function createWebApp(deps) {
|
|
|
572
609
|
if (chat)
|
|
573
610
|
WEB_CHATS.set(server, chat);
|
|
574
611
|
PREVIEW_APPS.set(server, previews);
|
|
612
|
+
CLOSING_SAYS.set(server, async () => {
|
|
613
|
+
const said = frame('closing', goingAway === undefined ? {} : { for: goingAway });
|
|
614
|
+
const flushed = [];
|
|
615
|
+
for (const { responses } of openStreams.values()) {
|
|
616
|
+
for (const res of responses) {
|
|
617
|
+
if (res.writableEnded || res.destroyed)
|
|
618
|
+
continue;
|
|
619
|
+
// Ended, not just written: an ended response is flushed before its
|
|
620
|
+
// socket goes, where a frame still queued would be dropped with it.
|
|
621
|
+
flushed.push(new Promise((resolve) => {
|
|
622
|
+
try {
|
|
623
|
+
res.end(said, () => resolve());
|
|
624
|
+
}
|
|
625
|
+
catch {
|
|
626
|
+
resolve();
|
|
627
|
+
}
|
|
628
|
+
}));
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
if (flushed.length === 0)
|
|
632
|
+
return;
|
|
633
|
+
let timer;
|
|
634
|
+
await Promise.race([Promise.all(flushed), new Promise((resolve) => { timer = setTimeout(resolve, CLOSING_FLUSH_MS); })]);
|
|
635
|
+
clearTimeout(timer);
|
|
636
|
+
});
|
|
575
637
|
// "Your browser": the only path this server ever upgrades. Attached here
|
|
576
638
|
// rather than in `startWebServer` so every caller, tests included, has it.
|
|
577
639
|
extension.attach(server);
|
|
@@ -594,7 +656,7 @@ export function createWebApp(deps) {
|
|
|
594
656
|
const challenge = url.searchParams.get('challenge') ?? '';
|
|
595
657
|
if (!/^[a-f0-9]{64}$/.test(challenge))
|
|
596
658
|
return sendEmpty(res, 400);
|
|
597
|
-
return sendJson(res, 200, { proof: createHmac('sha256', deps.token).update(`buddi-ready-v1:${challenge}`).digest('hex') });
|
|
659
|
+
return sendJson(res, 200, { proof: createHmac('sha256', deps.token).update(`buddi-ready-v1:${challenge}`).digest('hex'), boot }, { 'Cache-Control': 'no-store' });
|
|
598
660
|
}
|
|
599
661
|
// A remote socket or proxy metadata can only earn remote access. It
|
|
600
662
|
// decides how long a session minted now lives, and it must keep matching
|
|
@@ -1311,6 +1373,8 @@ export function createWebApp(deps) {
|
|
|
1311
1373
|
// Every surface's runs (Telegram, the queue, the terminal), not only
|
|
1312
1374
|
// this dashboard's; a chat send still being set up counts too.
|
|
1313
1375
|
running: Math.max(runningAgentRuns(), chat?.runningCount ?? 0),
|
|
1376
|
+
// What needs the owner, by the one rule: Home's counts and the rail's badge.
|
|
1377
|
+
needsYou: await needsYou(),
|
|
1314
1378
|
});
|
|
1315
1379
|
case '/api/events':
|
|
1316
1380
|
return sendJson(res, 200, await readEvents(deps.pool, {
|
|
@@ -1335,8 +1399,16 @@ export function createWebApp(deps) {
|
|
|
1335
1399
|
kind: q.get('kind') ?? undefined,
|
|
1336
1400
|
limit: boundedLimit(q.get('limit')),
|
|
1337
1401
|
offset: Math.max(0, Math.min(Number(q.get('offset') ?? 0) || 0, 100_000)),
|
|
1402
|
+
failed: q.get('failed') === 'open' || q.get('failed') === 'dismissed' ? q.get('failed') : undefined,
|
|
1403
|
+
hideDismissed: q.get('dismissed') === '0',
|
|
1338
1404
|
}));
|
|
1339
1405
|
}
|
|
1406
|
+
// Failed jobs grouped by what broke them: the ones still asking, and
|
|
1407
|
+
// the dismissed ones (by the owner, or quiet after 14 days) apart.
|
|
1408
|
+
case '/api/jobs/failures': {
|
|
1409
|
+
const names = new Map(deps.catalog.list().map((a) => [a.id, a.name]));
|
|
1410
|
+
return sendJson(res, 200, await readJobFailures(deps.pool, now, (id) => names.get(id) ?? null));
|
|
1411
|
+
}
|
|
1340
1412
|
case '/api/approvals': {
|
|
1341
1413
|
const approvals = await readApprovals(deps.pool, now, boundedLimit(q.get('limit'), 50));
|
|
1342
1414
|
return sendJson(res, 200, { pending: approvals.pending.map(a => ({ ...a, ...permissionScopes(a.tool) })),
|
|
@@ -1358,7 +1430,7 @@ export function createWebApp(deps) {
|
|
|
1358
1430
|
},
|
|
1359
1431
|
});
|
|
1360
1432
|
case '/api/notifications':
|
|
1361
|
-
return reply(res, await listNotificationsRoute(deps.pool, q.get('limit')));
|
|
1433
|
+
return reply(res, await listNotificationsRoute(deps.pool, q.get('limit'), { needs: q.get('needs') === '1', offset: q.get('offset') }));
|
|
1362
1434
|
case '/api/notifications/settings':
|
|
1363
1435
|
return reply(res, await notificationSettingsRoute(deps.pool, 'GET'));
|
|
1364
1436
|
case '/api/notifications/focus':
|
|
@@ -1368,7 +1440,7 @@ export function createWebApp(deps) {
|
|
|
1368
1440
|
reminders: await readReminders(deps.pool, boundedLimit(q.get('limit'))),
|
|
1369
1441
|
});
|
|
1370
1442
|
case '/api/sentinels':
|
|
1371
|
-
return sendJson(res, 200, await readSentinels(deps.pool, deps.registry,
|
|
1443
|
+
return sendJson(res, 200, await readSentinels(deps.pool, deps.registry, deps.now()));
|
|
1372
1444
|
case '/api/chat/agents':
|
|
1373
1445
|
return sendJson(res, 200, readChatAgents(deps.catalog, await avatarVersions(deps.pool)));
|
|
1374
1446
|
// Which agents are waiting on the owner. One small query, and the only
|
|
@@ -2267,14 +2339,64 @@ export function createWebApp(deps) {
|
|
|
2267
2339
|
return sendJson(res, 400, { error: 'Expected agentId and conversationId.' });
|
|
2268
2340
|
return sendJson(res, 200, { stopped: host.stop(deps.ctx.ownerId, body.agentId, body.conversationId) });
|
|
2269
2341
|
}
|
|
2342
|
+
/*
|
|
2343
|
+
* Alerts (alerts.ts): the owner's verbs on what the watchers found. Snooze
|
|
2344
|
+
* one ("Not now" for a week with `days`, "Not needed" without), several at
|
|
2345
|
+
* once (Clear all, and its Undo), silence a subject or a kind, run what a
|
|
2346
|
+
* finding declared, or ask the agent that answers for it.
|
|
2347
|
+
*/
|
|
2270
2348
|
const alert = /^\/api\/alerts\/([^/]+)\/snooze$/.exec(path);
|
|
2271
2349
|
if (alert) {
|
|
2272
2350
|
if (typeof body.snoozed !== 'boolean')
|
|
2273
2351
|
return sendJson(res, 400, { error: '`snoozed` must be true or false' });
|
|
2274
|
-
const
|
|
2352
|
+
const days = typeof body.days === 'number' && Number.isFinite(body.days) && body.days > 0 && body.days <= 90 ? body.days : null;
|
|
2353
|
+
const until = body.snoozed && days !== null ? new Date(deps.now().getTime() + days * 86_400_000) : null;
|
|
2354
|
+
const finding = await snoozeFinding(deps.pool, decodeURIComponent(alert[1]), body.snoozed, deps.now(), until);
|
|
2275
2355
|
if (!finding)
|
|
2276
2356
|
return sendJson(res, 404, { error: 'No open alert has that key.' });
|
|
2277
|
-
return sendJson(res, 200, {
|
|
2357
|
+
return sendJson(res, 200, {
|
|
2358
|
+
key: finding.key,
|
|
2359
|
+
snoozedAt: finding.snoozedAt ? finding.snoozedAt.toISOString() : null,
|
|
2360
|
+
snoozedUntil: finding.snoozedUntil ? finding.snoozedUntil.toISOString() : null,
|
|
2361
|
+
});
|
|
2362
|
+
}
|
|
2363
|
+
if (path === '/api/alerts/snooze') {
|
|
2364
|
+
const keys = Array.isArray(body.keys) ? body.keys.filter((k) => typeof k === 'string').slice(0, 500) : null;
|
|
2365
|
+
if (keys === null || typeof body.snoozed !== 'boolean')
|
|
2366
|
+
return sendJson(res, 400, { error: 'Send `{ keys: string[], snoozed: boolean, days? }`.' });
|
|
2367
|
+
const days = typeof body.days === 'number' && Number.isFinite(body.days) && body.days > 0 && body.days <= 90 ? body.days : null;
|
|
2368
|
+
const until = body.snoozed && days !== null ? new Date(deps.now().getTime() + days * 86_400_000) : null;
|
|
2369
|
+
return sendJson(res, 200, { keys: await snoozeFindings(deps.pool, keys, body.snoozed, deps.now(), until) });
|
|
2370
|
+
}
|
|
2371
|
+
if (path === '/api/alerts/mute')
|
|
2372
|
+
return reply(res, await muteAlert(deps.pool, body, deps.now()));
|
|
2373
|
+
const unmute = /^\/api\/alerts\/mutes\/([^/]+)\/remove$/.exec(path);
|
|
2374
|
+
if (unmute) {
|
|
2375
|
+
const removed = await unmuteFindings(deps.pool, decodeURIComponent(unmute[1]));
|
|
2376
|
+
return removed ? sendJson(res, 200, { removed: true }) : sendJson(res, 404, { error: 'Nothing is silenced under that id.' });
|
|
2377
|
+
}
|
|
2378
|
+
if (path === '/api/alerts/act') {
|
|
2379
|
+
if (actRateLimited(session.id, deps.now().getTime()))
|
|
2380
|
+
return sendJson(res, 429, { error: 'Too many writes from this page. Wait a moment and try again.' });
|
|
2381
|
+
return reply(res, await actOnAlerts({ pool: deps.pool, registry: deps.registry, ctx: deps.ctx, now: deps.now }, body, session));
|
|
2382
|
+
}
|
|
2383
|
+
if (path === '/api/alerts/ask') {
|
|
2384
|
+
const keys = Array.isArray(body.keys) ? body.keys.filter((k) => typeof k === 'string') : [];
|
|
2385
|
+
const findings = await findingsForAsk(deps.pool, keys);
|
|
2386
|
+
if (findings.length === 0)
|
|
2387
|
+
return sendJson(res, 404, { error: 'No alert has those keys.' });
|
|
2388
|
+
if (!chat)
|
|
2389
|
+
return sendJson(res, 503, { error: 'Chat is not running in this process.' });
|
|
2390
|
+
// The agent that answers for them, else whoever runs the wake mission.
|
|
2391
|
+
const wake = (await listMissions(deps.pool)).find((m) => m.id === 'sentinel-wake');
|
|
2392
|
+
const agentId = findings.find((f) => f.agentId !== null && deps.catalog.get(f.agentId) !== undefined)?.agentId ?? wake?.agentId ?? null;
|
|
2393
|
+
if (agentId === null)
|
|
2394
|
+
return sendJson(res, 409, { error: 'No agent answers for this alert yet.' });
|
|
2395
|
+
const { label, prompt } = askPrompt(findings);
|
|
2396
|
+
const sent = await chat.send({ agentId, text: prompt, offer: { id: `alert:${findings[0].key}`.slice(0, 200), label, brief: true } });
|
|
2397
|
+
if (!sent.ok)
|
|
2398
|
+
return sendJson(res, sent.status, { error: sent.error });
|
|
2399
|
+
return sendJson(res, 200, { agentId, conversationId: sent.conversationId, runId: sent.runId });
|
|
2278
2400
|
}
|
|
2279
2401
|
/*
|
|
2280
2402
|
* A watcher, switched off or back on. Off means it does not run: it raises
|
|
@@ -2302,6 +2424,11 @@ export function createWebApp(deps) {
|
|
|
2302
2424
|
const state = await setSentinelEnabled(deps.pool, sentinelId, body.enabled, deps.now());
|
|
2303
2425
|
return sendJson(res, 200, { sentinelId: state.sentinelId, enabled: state.enabled });
|
|
2304
2426
|
}
|
|
2427
|
+
/* One thing on Home closed until it changes (the digest's ×, a notice's Not now), or shown again. */
|
|
2428
|
+
if (path === '/api/home/dismiss') {
|
|
2429
|
+
const result = await setHomeDismissed(deps.pool, body.slot, body.token === undefined ? undefined : body.token);
|
|
2430
|
+
return sendJson(res, result.status, result.body);
|
|
2431
|
+
}
|
|
2305
2432
|
/* One Home glance, hidden or shown again (Home's ×, Settings → Appearance). */
|
|
2306
2433
|
const glanceHidden = /^\/api\/home\/glances\/([^/]+)\/hidden$/.exec(path);
|
|
2307
2434
|
if (glanceHidden) {
|
|
@@ -2530,8 +2657,10 @@ export function createWebApp(deps) {
|
|
|
2530
2657
|
}
|
|
2531
2658
|
const outcome = await leaveRecoveryMode({ pool: deps.pool, env: deps.env ?? process.env, log }, deps.ctx.ownerId, { dropPending: body.dropPending !== false, keepGrants: keep }, now);
|
|
2532
2659
|
if (socket) {
|
|
2660
|
+
goingAway = 'restart';
|
|
2533
2661
|
res.once('finish', () => {
|
|
2534
2662
|
void supervisorCall(socket, '/restart', 'POST').catch((err) => {
|
|
2663
|
+
goingAway = undefined;
|
|
2535
2664
|
log(`web: supervisor restart after leaving recovery failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2536
2665
|
});
|
|
2537
2666
|
});
|
|
@@ -2571,8 +2700,10 @@ export function createWebApp(deps) {
|
|
|
2571
2700
|
return sendJson(res, 503, { error: 'The supervisor is not answering on its control socket. Run buddi in a terminal.' });
|
|
2572
2701
|
}
|
|
2573
2702
|
}
|
|
2703
|
+
goingAway = action === 'stop' ? 'stop' : 'restart';
|
|
2574
2704
|
res.once('finish', () => {
|
|
2575
2705
|
void supervisorCall(socket, `/${action}`, 'POST').catch((err) => {
|
|
2706
|
+
goingAway = undefined;
|
|
2576
2707
|
log(`web: supervisor ${action} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2577
2708
|
});
|
|
2578
2709
|
});
|
|
@@ -3013,6 +3144,14 @@ export function createWebApp(deps) {
|
|
|
3013
3144
|
return sendJson(res, 400, { error: change });
|
|
3014
3145
|
return finish(res, setAgentEngineFromWeb({ catalog: deps.catalog, env: deps.env ?? process.env }, decodeURIComponent(engine[1]), change));
|
|
3015
3146
|
}
|
|
3147
|
+
// Failed jobs in bulk — by ids, by cause group, or every one still asking.
|
|
3148
|
+
// Dismiss keeps them on record and out of the footer's count.
|
|
3149
|
+
if (path === '/api/jobs/dismiss')
|
|
3150
|
+
return finish(res, await dismissJobsFromWeb(writeDeps, body));
|
|
3151
|
+
if (path === '/api/jobs/undismiss')
|
|
3152
|
+
return finish(res, await undismissJobsFromWeb(writeDeps, body));
|
|
3153
|
+
if (path === '/api/jobs/retry')
|
|
3154
|
+
return finish(res, await retryJobsFromWeb(writeDeps, body));
|
|
3016
3155
|
const job = /^\/api\/jobs\/([^/]+)\/(retry|cancel)$/.exec(path);
|
|
3017
3156
|
if (job) {
|
|
3018
3157
|
const jobId = decodeURIComponent(job[1]);
|
|
@@ -3276,6 +3415,8 @@ export async function startWebServer(deps) {
|
|
|
3276
3415
|
close: async () => {
|
|
3277
3416
|
if (expirySweep)
|
|
3278
3417
|
clearInterval(expirySweep);
|
|
3418
|
+
// Said before anything closes, while the streams can still carry it.
|
|
3419
|
+
await CLOSING_SAYS.get(server)?.();
|
|
3279
3420
|
// Both listeners, both awaited. A preview socket still open is a port
|
|
3280
3421
|
// still held, and the next thing to want it — the next test, the
|
|
3281
3422
|
// gateway coming back up — finds it taken.
|