@withbuddi/buddi 0.1.0-pre.26 → 0.1.0-pre.28
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/commands.d.ts +10 -0
- package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/commands.js +237 -18
- 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 +10 -8
- package/node_modules/@buddi/cli/dist/doctor-probes.js.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor.d.ts +28 -0
- package/node_modules/@buddi/cli/dist/doctor.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor.js +36 -0
- package/node_modules/@buddi/cli/dist/doctor.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 -2
- package/node_modules/@buddi/cli/dist/mcp/tools.js.map +1 -1
- package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/core/dist/agents/catalog.d.ts +3 -0
- package/node_modules/@buddi/core/dist/agents/catalog.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/agents/catalog.js +1 -0
- package/node_modules/@buddi/core/dist/agents/catalog.js.map +1 -1
- package/node_modules/@buddi/core/dist/agents/edit.d.ts +3 -0
- package/node_modules/@buddi/core/dist/agents/edit.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/agents/edit.js +3 -1
- package/node_modules/@buddi/core/dist/agents/edit.js.map +1 -1
- package/node_modules/@buddi/core/dist/agents/frontmatter.d.ts +10 -0
- package/node_modules/@buddi/core/dist/agents/frontmatter.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/agents/frontmatter.js +7 -0
- package/node_modules/@buddi/core/dist/agents/frontmatter.js.map +1 -1
- package/node_modules/@buddi/core/dist/agents/idle-rollover.d.ts +20 -0
- package/node_modules/@buddi/core/dist/agents/idle-rollover.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/agents/idle-rollover.js +30 -0
- package/node_modules/@buddi/core/dist/agents/idle-rollover.js.map +1 -0
- package/node_modules/@buddi/core/dist/agents/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/agents/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/agents/index.js +1 -0
- package/node_modules/@buddi/core/dist/agents/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/backup/dump.d.ts +9 -0
- package/node_modules/@buddi/core/dist/backup/dump.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/backup/dump.js +10 -1
- package/node_modules/@buddi/core/dist/backup/dump.js.map +1 -1
- package/node_modules/@buddi/core/dist/backup/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/backup/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/backup/index.js +1 -0
- package/node_modules/@buddi/core/dist/backup/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/backup/load.d.ts +18 -0
- package/node_modules/@buddi/core/dist/backup/load.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/backup/load.js +3 -2
- package/node_modules/@buddi/core/dist/backup/load.js.map +1 -1
- package/node_modules/@buddi/core/dist/backup/pending.d.ts +114 -0
- package/node_modules/@buddi/core/dist/backup/pending.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/backup/pending.js +392 -0
- package/node_modules/@buddi/core/dist/backup/pending.js.map +1 -0
- package/node_modules/@buddi/core/dist/backup/restore.d.ts +3 -1
- package/node_modules/@buddi/core/dist/backup/restore.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/backup/restore.js +55 -2
- package/node_modules/@buddi/core/dist/backup/restore.js.map +1 -1
- package/node_modules/@buddi/core/dist/feedback/index.d.ts +108 -0
- package/node_modules/@buddi/core/dist/feedback/index.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/feedback/index.js +160 -0
- package/node_modules/@buddi/core/dist/feedback/index.js.map +1 -0
- package/node_modules/@buddi/core/dist/home.d.ts +24 -0
- package/node_modules/@buddi/core/dist/home.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/home.js +3 -0
- package/node_modules/@buddi/core/dist/home.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 +28 -1
- package/node_modules/@buddi/core/dist/host/build.js.map +1 -1
- package/node_modules/@buddi/core/dist/host/types.d.ts +29 -2
- package/node_modules/@buddi/core/dist/host/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/index.js +1 -0
- package/node_modules/@buddi/core/dist/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/learning/policies.d.ts +7 -1
- package/node_modules/@buddi/core/dist/learning/policies.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/learning/policies.js +4 -1
- package/node_modules/@buddi/core/dist/learning/policies.js.map +1 -1
- package/node_modules/@buddi/core/dist/learning/store.d.ts +29 -1
- package/node_modules/@buddi/core/dist/learning/store.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/learning/store.js +33 -8
- package/node_modules/@buddi/core/dist/learning/store.js.map +1 -1
- package/node_modules/@buddi/core/dist/learning/types.d.ts +24 -1
- package/node_modules/@buddi/core/dist/learning/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/learning/types.js +6 -0
- package/node_modules/@buddi/core/dist/learning/types.js.map +1 -1
- package/node_modules/@buddi/core/dist/owner.d.ts +2 -1
- package/node_modules/@buddi/core/dist/owner.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/owner.js.map +1 -1
- package/node_modules/@buddi/core/dist/pages.d.ts +27 -0
- package/node_modules/@buddi/core/dist/pages.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/pages.js +24 -3
- package/node_modules/@buddi/core/dist/pages.js.map +1 -1
- package/node_modules/@buddi/core/dist/plugin/index.d.ts +7 -6
- package/node_modules/@buddi/core/dist/plugin/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/plugin/index.js +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/postgres/binaries.d.ts +3 -1
- package/node_modules/@buddi/core/dist/postgres/binaries.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/postgres/binaries.js +15 -23
- package/node_modules/@buddi/core/dist/postgres/binaries.js.map +1 -1
- package/node_modules/@buddi/core/dist/postgres/cluster.js +1 -1
- package/node_modules/@buddi/core/dist/postgres/cluster.js.map +1 -1
- package/node_modules/@buddi/core/dist/postgres/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/postgres/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/postgres/index.js +1 -0
- package/node_modules/@buddi/core/dist/postgres/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/postgres/links.d.ts +15 -0
- package/node_modules/@buddi/core/dist/postgres/links.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/postgres/links.js +98 -0
- package/node_modules/@buddi/core/dist/postgres/links.js.map +1 -0
- package/node_modules/@buddi/core/dist/registry.d.ts +10 -1
- package/node_modules/@buddi/core/dist/registry.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/registry.js +13 -0
- package/node_modules/@buddi/core/dist/registry.js.map +1 -1
- package/node_modules/@buddi/core/dist/sources/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/sources/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/sources/index.js +1 -0
- package/node_modules/@buddi/core/dist/sources/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/sources/watch.d.ts +37 -0
- package/node_modules/@buddi/core/dist/sources/watch.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/sources/watch.js +81 -0
- package/node_modules/@buddi/core/dist/sources/watch.js.map +1 -0
- package/node_modules/@buddi/core/dist/tools.d.ts +47 -0
- package/node_modules/@buddi/core/dist/tools.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/tools.js.map +1 -1
- package/node_modules/@buddi/core/migrations/055_pending_plugin_data.sql +24 -0
- package/node_modules/@buddi/core/migrations/056_dashboard_sessions.sql +37 -0
- package/node_modules/@buddi/core/migrations/057_proposal_decided_by.sql +34 -0
- package/node_modules/@buddi/core/migrations/058_message_feedback.sql +50 -0
- package/node_modules/@buddi/core/package.json +4 -0
- package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/gateway/dist/agents/learning-digest.d.ts +7 -1
- package/node_modules/@buddi/gateway/dist/agents/learning-digest.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/learning-digest.js +29 -3
- package/node_modules/@buddi/gateway/dist/agents/learning-digest.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/platform-files.d.ts +2 -0
- package/node_modules/@buddi/gateway/dist/agents/platform-files.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/platform-files.js +2 -0
- package/node_modules/@buddi/gateway/dist/agents/platform-files.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/platform.d.ts +20 -0
- package/node_modules/@buddi/gateway/dist/agents/platform.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/platform.js +46 -3
- package/node_modules/@buddi/gateway/dist/agents/platform.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents-cli.d.ts +1 -1
- package/node_modules/@buddi/gateway/dist/agents-cli.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents-cli.js +12 -2
- package/node_modules/@buddi/gateway/dist/agents-cli.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/chat/session.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/chat/session.js +2 -1
- package/node_modules/@buddi/gateway/dist/chat/session.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/mcp/requests.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/mcp/requests.js +1 -0
- package/node_modules/@buddi/gateway/dist/mcp/requests.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/approve.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/approve.js +13 -2
- package/node_modules/@buddi/gateway/dist/plugins/approve.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/migrate.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/migrate.js +11 -1
- package/node_modules/@buddi/gateway/dist/plugins/migrate.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/paths.d.ts +14 -0
- package/node_modules/@buddi/gateway/dist/plugins/paths.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/paths.js +27 -1
- package/node_modules/@buddi/gateway/dist/plugins/paths.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/stage.d.ts +27 -3
- package/node_modules/@buddi/gateway/dist/plugins/stage.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins/stage.js +35 -5
- package/node_modules/@buddi/gateway/dist/plugins/stage.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts +4 -0
- package/node_modules/@buddi/gateway/dist/plugins-cli.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/plugins-cli.js +42 -9
- package/node_modules/@buddi/gateway/dist/plugins-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 +14 -2
- package/node_modules/@buddi/gateway/dist/serve.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/browser-continuation.d.ts +2 -1
- package/node_modules/@buddi/gateway/dist/surfaces/browser-continuation.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/browser-continuation.js +8 -5
- package/node_modules/@buddi/gateway/dist/surfaces/browser-continuation.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/browser-handoff.d.ts +27 -4
- package/node_modules/@buddi/gateway/dist/surfaces/browser-handoff.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/browser-handoff.js +57 -7
- package/node_modules/@buddi/gateway/dist/surfaces/browser-handoff.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/carry-over.d.ts +89 -0
- package/node_modules/@buddi/gateway/dist/surfaces/carry-over.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/surfaces/carry-over.js +172 -0
- package/node_modules/@buddi/gateway/dist/surfaces/carry-over.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/surfaces/conversation-lifetime.d.ts +5 -2
- package/node_modules/@buddi/gateway/dist/surfaces/conversation-lifetime.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/conversation-lifetime.js +5 -2
- package/node_modules/@buddi/gateway/dist/surfaces/conversation-lifetime.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/api.d.ts +34 -2
- package/node_modules/@buddi/gateway/dist/telegram/api.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/api.js +15 -2
- package/node_modules/@buddi/gateway/dist/telegram/api.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/env-owner.d.ts +30 -0
- package/node_modules/@buddi/gateway/dist/telegram/env-owner.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/telegram/env-owner.js +45 -0
- package/node_modules/@buddi/gateway/dist/telegram/env-owner.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/telegram/main.d.ts +0 -2
- package/node_modules/@buddi/gateway/dist/telegram/main.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/main.js +20 -25
- package/node_modules/@buddi/gateway/dist/telegram/main.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/notify.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/notify.js +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/notify.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/outbound.d.ts +2 -2
- package/node_modules/@buddi/gateway/dist/telegram/outbound.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/outbound.js +12 -3
- package/node_modules/@buddi/gateway/dist/telegram/outbound.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/reactions.d.ts +45 -0
- package/node_modules/@buddi/gateway/dist/telegram/reactions.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/telegram/reactions.js +97 -0
- package/node_modules/@buddi/gateway/dist/telegram/reactions.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts +27 -1
- package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/surface.js +186 -12
- package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/agents.d.ts +7 -1
- package/node_modules/@buddi/gateway/dist/web/agents.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/agents.js +32 -2
- package/node_modules/@buddi/gateway/dist/web/agents.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/chat.d.ts +10 -3
- package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/chat.js +18 -5
- package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/plugins.d.ts +6 -1
- package/node_modules/@buddi/gateway/dist/web/plugins.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/plugins.js +31 -2
- package/node_modules/@buddi/gateway/dist/web/plugins.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/proposals.d.ts +21 -0
- package/node_modules/@buddi/gateway/dist/web/proposals.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/proposals.js +50 -1
- package/node_modules/@buddi/gateway/dist/web/proposals.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/read.d.ts +23 -0
- package/node_modules/@buddi/gateway/dist/web/read.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/read.js +36 -1
- package/node_modules/@buddi/gateway/dist/web/read.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/recovery.d.ts +40 -2
- package/node_modules/@buddi/gateway/dist/web/recovery.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/recovery.js +215 -18
- package/node_modules/@buddi/gateway/dist/web/recovery.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.js +87 -29
- package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/sessions.d.ts +81 -7
- package/node_modules/@buddi/gateway/dist/web/sessions.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/sessions.js +242 -24
- package/node_modules/@buddi/gateway/dist/web/sessions.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/signed-out.d.ts +46 -0
- package/node_modules/@buddi/gateway/dist/web/signed-out.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/signed-out.js +99 -0
- package/node_modules/@buddi/gateway/dist/web/signed-out.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/tailscale.d.ts +13 -0
- package/node_modules/@buddi/gateway/dist/web/tailscale.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/tailscale.js +12 -0
- package/node_modules/@buddi/gateway/dist/web/tailscale.js.map +1 -1
- package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/install/dist/backup.d.ts +18 -0
- package/node_modules/@buddi/install/dist/backup.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/backup.js +39 -2
- package/node_modules/@buddi/install/dist/backup.js.map +1 -1
- package/node_modules/@buddi/install/dist/kept-data.d.ts +20 -0
- package/node_modules/@buddi/install/dist/kept-data.d.ts.map +1 -0
- package/node_modules/@buddi/install/dist/kept-data.js +34 -0
- package/node_modules/@buddi/install/dist/kept-data.js.map +1 -0
- package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/launcher.js +17 -3
- package/node_modules/@buddi/install/dist/launcher.js.map +1 -1
- package/node_modules/@buddi/install/dist/postgres-check.d.ts +18 -0
- package/node_modules/@buddi/install/dist/postgres-check.d.ts.map +1 -0
- package/node_modules/@buddi/install/dist/postgres-check.js +66 -0
- package/node_modules/@buddi/install/dist/postgres-check.js.map +1 -0
- package/node_modules/@buddi/install/dist/upgrade.d.ts +3 -0
- package/node_modules/@buddi/install/dist/upgrade.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/upgrade.js +30 -0
- package/node_modules/@buddi/install/dist/upgrade.js.map +1 -1
- package/node_modules/@buddi/runtime/dist/.tsbuildinfo +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.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/agent.js +11 -0
- package/node_modules/@buddi/tool-email/dist/agent.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/imap/fake.d.ts +89 -3
- package/node_modules/@buddi/tool-email/dist/imap/fake.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/imap/fake.js +234 -4
- package/node_modules/@buddi/tool-email/dist/imap/fake.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.d.ts +14 -1
- 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 +157 -2
- package/node_modules/@buddi/tool-email/dist/imap/imapflow-client.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/index.d.ts +14 -2
- package/node_modules/@buddi/tool-email/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/index.js +23 -4
- package/node_modules/@buddi/tool-email/dist/index.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/logins.d.ts +24 -0
- package/node_modules/@buddi/tool-email/dist/logins.d.ts.map +1 -0
- package/node_modules/@buddi/tool-email/dist/logins.js +35 -0
- package/node_modules/@buddi/tool-email/dist/logins.js.map +1 -0
- package/node_modules/@buddi/tool-email/dist/mail.d.ts +14 -0
- package/node_modules/@buddi/tool-email/dist/mail.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/mail.js +23 -0
- package/node_modules/@buddi/tool-email/dist/mail.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/mailbox/actions.d.ts +205 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/actions.d.ts.map +1 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/actions.js +662 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/actions.js.map +1 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/arrival.d.ts +61 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/arrival.d.ts.map +1 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/arrival.js +153 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/arrival.js.map +1 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/select.d.ts +53 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/select.d.ts.map +1 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/select.js +117 -0
- package/node_modules/@buddi/tool-email/dist/mailbox/select.js.map +1 -0
- package/node_modules/@buddi/tool-email/dist/pages/accounts.d.ts +37 -1
- package/node_modules/@buddi/tool-email/dist/pages/accounts.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/accounts.js +104 -2
- package/node_modules/@buddi/tool-email/dist/pages/accounts.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/descriptors.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/descriptors.js +142 -0
- 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/format.d.ts +1 -12
- package/node_modules/@buddi/tool-email/dist/pages/format.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/format.js +17 -0
- package/node_modules/@buddi/tool-email/dist/pages/format.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/index.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/index.js +5 -1
- package/node_modules/@buddi/tool-email/dist/pages/index.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/policies-tools.d.ts +7 -0
- package/node_modules/@buddi/tool-email/dist/pages/policies-tools.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/policies-tools.js +11 -2
- package/node_modules/@buddi/tool-email/dist/pages/policies-tools.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/pages/queries.d.ts +16 -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 +154 -3
- package/node_modules/@buddi/tool-email/dist/pages/queries.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/policies/auto.d.ts +133 -0
- package/node_modules/@buddi/tool-email/dist/policies/auto.d.ts.map +1 -0
- package/node_modules/@buddi/tool-email/dist/policies/auto.js +241 -0
- package/node_modules/@buddi/tool-email/dist/policies/auto.js.map +1 -0
- package/node_modules/@buddi/tool-email/dist/policies/gate.d.ts +34 -10
- package/node_modules/@buddi/tool-email/dist/policies/gate.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/policies/gate.js +27 -12
- package/node_modules/@buddi/tool-email/dist/policies/gate.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/policies/learn.d.ts +26 -18
- package/node_modules/@buddi/tool-email/dist/policies/learn.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/policies/learn.js +36 -10
- package/node_modules/@buddi/tool-email/dist/policies/learn.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/policies/learned.d.ts +25 -2
- package/node_modules/@buddi/tool-email/dist/policies/learned.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/policies/learned.js +47 -5
- package/node_modules/@buddi/tool-email/dist/policies/learned.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/policies/store.d.ts +8 -2
- package/node_modules/@buddi/tool-email/dist/policies/store.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/policies/store.js +19 -5
- package/node_modules/@buddi/tool-email/dist/policies/store.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/ports.d.ts +79 -0
- package/node_modules/@buddi/tool-email/dist/ports.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/ports.js +6 -0
- package/node_modules/@buddi/tool-email/dist/ports.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/rows.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/rows.js +3 -1
- package/node_modules/@buddi/tool-email/dist/rows.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/sources/idle.d.ts +90 -0
- package/node_modules/@buddi/tool-email/dist/sources/idle.d.ts.map +1 -0
- package/node_modules/@buddi/tool-email/dist/sources/idle.js +250 -0
- package/node_modules/@buddi/tool-email/dist/sources/idle.js.map +1 -0
- package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.d.ts +12 -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 +280 -134
- package/node_modules/@buddi/tool-email/dist/sources/inbox-poll.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/tools/mailbox.d.ts +108 -0
- package/node_modules/@buddi/tool-email/dist/tools/mailbox.d.ts.map +1 -0
- package/node_modules/@buddi/tool-email/dist/tools/mailbox.js +359 -0
- package/node_modules/@buddi/tool-email/dist/tools/mailbox.js.map +1 -0
- package/node_modules/@buddi/tool-email/dist/tools/policies.d.ts +8 -2
- package/node_modules/@buddi/tool-email/dist/tools/policies.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/tools/policies.js +43 -3
- package/node_modules/@buddi/tool-email/dist/tools/policies.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/tools/read.d.ts +2 -2
- package/node_modules/@buddi/tool-email/dist/tools/triage.d.ts.map +1 -1
- package/node_modules/@buddi/tool-email/dist/tools/triage.js +10 -4
- package/node_modules/@buddi/tool-email/dist/tools/triage.js.map +1 -1
- package/node_modules/@buddi/tool-email/migrations/017_mailbox_actions.sql +60 -0
- package/node_modules/@buddi/tool-email/migrations/018_learned_auto.sql +30 -0
- package/node_modules/@buddi/tool-email/migrations/019_arrival_pending.sql +26 -0
- package/node_modules/@buddi/tool-email/package.json +3 -2
- 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/imapflow/CHANGELOG.md +14 -0
- package/node_modules/imapflow/dist/cjs/commands/fetch.js +1 -1
- package/node_modules/imapflow/dist/cjs/imap-flow.d.ts +2 -0
- package/node_modules/imapflow/dist/cjs/imap-flow.js +14 -1
- package/node_modules/imapflow/dist/cjs/package-info.d.ts +1 -1
- package/node_modules/imapflow/dist/cjs/package-info.js +1 -1
- package/node_modules/imapflow/dist/cjs/tools.d.ts +2 -1
- package/node_modules/imapflow/dist/cjs/tools.js +8 -6
- package/node_modules/imapflow/dist/cjs/types.d.ts +9 -1
- package/node_modules/imapflow/dist/esm/commands/fetch.js +1 -1
- package/node_modules/imapflow/dist/esm/imap-flow.d.ts +2 -0
- package/node_modules/imapflow/dist/esm/imap-flow.js +14 -1
- package/node_modules/imapflow/dist/esm/package-info.d.ts +1 -1
- package/node_modules/imapflow/dist/esm/package-info.js +1 -1
- package/node_modules/imapflow/dist/esm/tools.d.ts +2 -1
- package/node_modules/imapflow/dist/esm/tools.js +8 -6
- package/node_modules/imapflow/dist/esm/types.d.ts +9 -1
- package/node_modules/imapflow/package.json +4 -4
- package/package.json +2 -2
- package/packages/cli/dist/.tsbuildinfo +1 -1
- package/packages/cli/dist/commands.d.ts +10 -0
- package/packages/cli/dist/commands.d.ts.map +1 -1
- package/packages/cli/dist/commands.js +237 -18
- 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 +10 -8
- package/packages/cli/dist/doctor-probes.js.map +1 -1
- package/packages/cli/dist/doctor.d.ts +28 -0
- package/packages/cli/dist/doctor.d.ts.map +1 -1
- package/packages/cli/dist/doctor.js +36 -0
- package/packages/cli/dist/doctor.js.map +1 -1
- package/packages/cli/dist/mcp/tools.d.ts.map +1 -1
- package/packages/cli/dist/mcp/tools.js +3 -2
- package/packages/cli/dist/mcp/tools.js.map +1 -1
- package/packages/core/dist/.tsbuildinfo +1 -1
- package/packages/core/dist/agents/catalog.d.ts +3 -0
- package/packages/core/dist/agents/catalog.d.ts.map +1 -1
- package/packages/core/dist/agents/catalog.js +1 -0
- package/packages/core/dist/agents/catalog.js.map +1 -1
- package/packages/core/dist/agents/edit.d.ts +3 -0
- package/packages/core/dist/agents/edit.d.ts.map +1 -1
- package/packages/core/dist/agents/edit.js +3 -1
- package/packages/core/dist/agents/edit.js.map +1 -1
- package/packages/core/dist/agents/frontmatter.d.ts +10 -0
- package/packages/core/dist/agents/frontmatter.d.ts.map +1 -1
- package/packages/core/dist/agents/frontmatter.js +7 -0
- package/packages/core/dist/agents/frontmatter.js.map +1 -1
- package/packages/core/dist/agents/idle-rollover.d.ts +20 -0
- package/packages/core/dist/agents/idle-rollover.d.ts.map +1 -0
- package/packages/core/dist/agents/idle-rollover.js +30 -0
- package/packages/core/dist/agents/idle-rollover.js.map +1 -0
- package/packages/core/dist/agents/index.d.ts +1 -0
- package/packages/core/dist/agents/index.d.ts.map +1 -1
- package/packages/core/dist/agents/index.js +1 -0
- package/packages/core/dist/agents/index.js.map +1 -1
- package/packages/core/dist/backup/dump.d.ts +9 -0
- package/packages/core/dist/backup/dump.d.ts.map +1 -1
- package/packages/core/dist/backup/dump.js +10 -1
- package/packages/core/dist/backup/dump.js.map +1 -1
- package/packages/core/dist/backup/index.d.ts +1 -0
- package/packages/core/dist/backup/index.d.ts.map +1 -1
- package/packages/core/dist/backup/index.js +1 -0
- package/packages/core/dist/backup/index.js.map +1 -1
- package/packages/core/dist/backup/load.d.ts +18 -0
- package/packages/core/dist/backup/load.d.ts.map +1 -1
- package/packages/core/dist/backup/load.js +3 -2
- package/packages/core/dist/backup/load.js.map +1 -1
- package/packages/core/dist/backup/pending.d.ts +114 -0
- package/packages/core/dist/backup/pending.d.ts.map +1 -0
- package/packages/core/dist/backup/pending.js +392 -0
- package/packages/core/dist/backup/pending.js.map +1 -0
- package/packages/core/dist/backup/restore.d.ts +3 -1
- package/packages/core/dist/backup/restore.d.ts.map +1 -1
- package/packages/core/dist/backup/restore.js +55 -2
- package/packages/core/dist/backup/restore.js.map +1 -1
- package/packages/core/dist/feedback/index.d.ts +108 -0
- package/packages/core/dist/feedback/index.d.ts.map +1 -0
- package/packages/core/dist/feedback/index.js +160 -0
- package/packages/core/dist/feedback/index.js.map +1 -0
- package/packages/core/dist/home.d.ts +24 -0
- package/packages/core/dist/home.d.ts.map +1 -1
- package/packages/core/dist/home.js +3 -0
- package/packages/core/dist/home.js.map +1 -1
- package/packages/core/dist/host/build.d.ts.map +1 -1
- package/packages/core/dist/host/build.js +28 -1
- package/packages/core/dist/host/build.js.map +1 -1
- package/packages/core/dist/host/types.d.ts +29 -2
- package/packages/core/dist/host/types.d.ts.map +1 -1
- package/packages/core/dist/index.d.ts +1 -0
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/index.js +1 -0
- package/packages/core/dist/index.js.map +1 -1
- package/packages/core/dist/learning/policies.d.ts +7 -1
- package/packages/core/dist/learning/policies.d.ts.map +1 -1
- package/packages/core/dist/learning/policies.js +4 -1
- package/packages/core/dist/learning/policies.js.map +1 -1
- package/packages/core/dist/learning/store.d.ts +29 -1
- package/packages/core/dist/learning/store.d.ts.map +1 -1
- package/packages/core/dist/learning/store.js +33 -8
- package/packages/core/dist/learning/store.js.map +1 -1
- package/packages/core/dist/learning/types.d.ts +24 -1
- package/packages/core/dist/learning/types.d.ts.map +1 -1
- package/packages/core/dist/learning/types.js +6 -0
- package/packages/core/dist/learning/types.js.map +1 -1
- package/packages/core/dist/owner.d.ts +2 -1
- package/packages/core/dist/owner.d.ts.map +1 -1
- package/packages/core/dist/owner.js.map +1 -1
- package/packages/core/dist/pages.d.ts +27 -0
- package/packages/core/dist/pages.d.ts.map +1 -1
- package/packages/core/dist/pages.js +24 -3
- package/packages/core/dist/pages.js.map +1 -1
- package/packages/core/dist/plugin/index.d.ts +7 -6
- package/packages/core/dist/plugin/index.d.ts.map +1 -1
- package/packages/core/dist/plugin/index.js +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/postgres/binaries.d.ts +3 -1
- package/packages/core/dist/postgres/binaries.d.ts.map +1 -1
- package/packages/core/dist/postgres/binaries.js +15 -23
- package/packages/core/dist/postgres/binaries.js.map +1 -1
- package/packages/core/dist/postgres/cluster.js +1 -1
- package/packages/core/dist/postgres/cluster.js.map +1 -1
- package/packages/core/dist/postgres/index.d.ts +1 -0
- package/packages/core/dist/postgres/index.d.ts.map +1 -1
- package/packages/core/dist/postgres/index.js +1 -0
- package/packages/core/dist/postgres/index.js.map +1 -1
- package/packages/core/dist/postgres/links.d.ts +15 -0
- package/packages/core/dist/postgres/links.d.ts.map +1 -0
- package/packages/core/dist/postgres/links.js +98 -0
- package/packages/core/dist/postgres/links.js.map +1 -0
- package/packages/core/dist/registry.d.ts +10 -1
- package/packages/core/dist/registry.d.ts.map +1 -1
- package/packages/core/dist/registry.js +13 -0
- package/packages/core/dist/registry.js.map +1 -1
- package/packages/core/dist/sources/index.d.ts +1 -0
- package/packages/core/dist/sources/index.d.ts.map +1 -1
- package/packages/core/dist/sources/index.js +1 -0
- package/packages/core/dist/sources/index.js.map +1 -1
- package/packages/core/dist/sources/watch.d.ts +37 -0
- package/packages/core/dist/sources/watch.d.ts.map +1 -0
- package/packages/core/dist/sources/watch.js +81 -0
- package/packages/core/dist/sources/watch.js.map +1 -0
- package/packages/core/dist/tools.d.ts +47 -0
- package/packages/core/dist/tools.d.ts.map +1 -1
- package/packages/core/dist/tools.js.map +1 -1
- package/packages/core/migrations/055_pending_plugin_data.sql +24 -0
- package/packages/core/migrations/056_dashboard_sessions.sql +37 -0
- package/packages/core/migrations/057_proposal_decided_by.sql +34 -0
- package/packages/core/migrations/058_message_feedback.sql +50 -0
- package/packages/core/package.json +4 -0
- package/packages/gateway/dist/.tsbuildinfo +1 -1
- package/packages/gateway/dist/agents/learning-digest.d.ts +7 -1
- package/packages/gateway/dist/agents/learning-digest.d.ts.map +1 -1
- package/packages/gateway/dist/agents/learning-digest.js +29 -3
- package/packages/gateway/dist/agents/learning-digest.js.map +1 -1
- package/packages/gateway/dist/agents/platform-files.d.ts +2 -0
- package/packages/gateway/dist/agents/platform-files.d.ts.map +1 -1
- package/packages/gateway/dist/agents/platform-files.js +2 -0
- package/packages/gateway/dist/agents/platform-files.js.map +1 -1
- package/packages/gateway/dist/agents/platform.d.ts +20 -0
- package/packages/gateway/dist/agents/platform.d.ts.map +1 -1
- package/packages/gateway/dist/agents/platform.js +46 -3
- package/packages/gateway/dist/agents/platform.js.map +1 -1
- package/packages/gateway/dist/agents-cli.d.ts +1 -1
- package/packages/gateway/dist/agents-cli.d.ts.map +1 -1
- package/packages/gateway/dist/agents-cli.js +12 -2
- package/packages/gateway/dist/agents-cli.js.map +1 -1
- package/packages/gateway/dist/chat/session.d.ts.map +1 -1
- package/packages/gateway/dist/chat/session.js +2 -1
- package/packages/gateway/dist/chat/session.js.map +1 -1
- package/packages/gateway/dist/mcp/requests.d.ts.map +1 -1
- package/packages/gateway/dist/mcp/requests.js +1 -0
- package/packages/gateway/dist/mcp/requests.js.map +1 -1
- package/packages/gateway/dist/plugins/approve.d.ts.map +1 -1
- package/packages/gateway/dist/plugins/approve.js +13 -2
- package/packages/gateway/dist/plugins/approve.js.map +1 -1
- package/packages/gateway/dist/plugins/migrate.d.ts.map +1 -1
- package/packages/gateway/dist/plugins/migrate.js +11 -1
- package/packages/gateway/dist/plugins/migrate.js.map +1 -1
- package/packages/gateway/dist/plugins/paths.d.ts +14 -0
- package/packages/gateway/dist/plugins/paths.d.ts.map +1 -1
- package/packages/gateway/dist/plugins/paths.js +27 -1
- package/packages/gateway/dist/plugins/paths.js.map +1 -1
- package/packages/gateway/dist/plugins/stage.d.ts +27 -3
- package/packages/gateway/dist/plugins/stage.d.ts.map +1 -1
- package/packages/gateway/dist/plugins/stage.js +35 -5
- package/packages/gateway/dist/plugins/stage.js.map +1 -1
- package/packages/gateway/dist/plugins-cli.d.ts +4 -0
- package/packages/gateway/dist/plugins-cli.d.ts.map +1 -1
- package/packages/gateway/dist/plugins-cli.js +42 -9
- package/packages/gateway/dist/plugins-cli.js.map +1 -1
- package/packages/gateway/dist/serve.d.ts.map +1 -1
- package/packages/gateway/dist/serve.js +14 -2
- package/packages/gateway/dist/serve.js.map +1 -1
- package/packages/gateway/dist/surfaces/browser-continuation.d.ts +2 -1
- package/packages/gateway/dist/surfaces/browser-continuation.d.ts.map +1 -1
- package/packages/gateway/dist/surfaces/browser-continuation.js +8 -5
- package/packages/gateway/dist/surfaces/browser-continuation.js.map +1 -1
- package/packages/gateway/dist/surfaces/browser-handoff.d.ts +27 -4
- package/packages/gateway/dist/surfaces/browser-handoff.d.ts.map +1 -1
- package/packages/gateway/dist/surfaces/browser-handoff.js +57 -7
- package/packages/gateway/dist/surfaces/browser-handoff.js.map +1 -1
- package/packages/gateway/dist/surfaces/carry-over.d.ts +89 -0
- package/packages/gateway/dist/surfaces/carry-over.d.ts.map +1 -0
- package/packages/gateway/dist/surfaces/carry-over.js +172 -0
- package/packages/gateway/dist/surfaces/carry-over.js.map +1 -0
- package/packages/gateway/dist/surfaces/conversation-lifetime.d.ts +5 -2
- package/packages/gateway/dist/surfaces/conversation-lifetime.d.ts.map +1 -1
- package/packages/gateway/dist/surfaces/conversation-lifetime.js +5 -2
- package/packages/gateway/dist/surfaces/conversation-lifetime.js.map +1 -1
- package/packages/gateway/dist/telegram/api.d.ts +34 -2
- package/packages/gateway/dist/telegram/api.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/api.js +15 -2
- package/packages/gateway/dist/telegram/api.js.map +1 -1
- package/packages/gateway/dist/telegram/env-owner.d.ts +30 -0
- package/packages/gateway/dist/telegram/env-owner.d.ts.map +1 -0
- package/packages/gateway/dist/telegram/env-owner.js +45 -0
- package/packages/gateway/dist/telegram/env-owner.js.map +1 -0
- package/packages/gateway/dist/telegram/main.d.ts +0 -2
- package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/main.js +20 -25
- package/packages/gateway/dist/telegram/main.js.map +1 -1
- package/packages/gateway/dist/telegram/notify.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/notify.js +1 -1
- package/packages/gateway/dist/telegram/notify.js.map +1 -1
- package/packages/gateway/dist/telegram/outbound.d.ts +2 -2
- package/packages/gateway/dist/telegram/outbound.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/outbound.js +12 -3
- package/packages/gateway/dist/telegram/outbound.js.map +1 -1
- package/packages/gateway/dist/telegram/reactions.d.ts +45 -0
- package/packages/gateway/dist/telegram/reactions.d.ts.map +1 -0
- package/packages/gateway/dist/telegram/reactions.js +97 -0
- package/packages/gateway/dist/telegram/reactions.js.map +1 -0
- package/packages/gateway/dist/telegram/surface.d.ts +27 -1
- package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/surface.js +186 -12
- package/packages/gateway/dist/telegram/surface.js.map +1 -1
- package/packages/gateway/dist/web/agents.d.ts +7 -1
- package/packages/gateway/dist/web/agents.d.ts.map +1 -1
- package/packages/gateway/dist/web/agents.js +32 -2
- package/packages/gateway/dist/web/agents.js.map +1 -1
- package/packages/gateway/dist/web/chat.d.ts +10 -3
- package/packages/gateway/dist/web/chat.d.ts.map +1 -1
- package/packages/gateway/dist/web/chat.js +18 -5
- package/packages/gateway/dist/web/chat.js.map +1 -1
- package/packages/gateway/dist/web/plugins.d.ts +6 -1
- package/packages/gateway/dist/web/plugins.d.ts.map +1 -1
- package/packages/gateway/dist/web/plugins.js +31 -2
- package/packages/gateway/dist/web/plugins.js.map +1 -1
- package/packages/gateway/dist/web/proposals.d.ts +21 -0
- package/packages/gateway/dist/web/proposals.d.ts.map +1 -1
- package/packages/gateway/dist/web/proposals.js +50 -1
- package/packages/gateway/dist/web/proposals.js.map +1 -1
- package/packages/gateway/dist/web/read.d.ts +23 -0
- package/packages/gateway/dist/web/read.d.ts.map +1 -1
- package/packages/gateway/dist/web/read.js +36 -1
- package/packages/gateway/dist/web/read.js.map +1 -1
- package/packages/gateway/dist/web/recovery.d.ts +40 -2
- package/packages/gateway/dist/web/recovery.d.ts.map +1 -1
- package/packages/gateway/dist/web/recovery.js +215 -18
- package/packages/gateway/dist/web/recovery.js.map +1 -1
- package/packages/gateway/dist/web/server.d.ts.map +1 -1
- package/packages/gateway/dist/web/server.js +87 -29
- package/packages/gateway/dist/web/server.js.map +1 -1
- package/packages/gateway/dist/web/sessions.d.ts +81 -7
- package/packages/gateway/dist/web/sessions.d.ts.map +1 -1
- package/packages/gateway/dist/web/sessions.js +242 -24
- package/packages/gateway/dist/web/sessions.js.map +1 -1
- package/packages/gateway/dist/web/signed-out.d.ts +46 -0
- package/packages/gateway/dist/web/signed-out.d.ts.map +1 -0
- package/packages/gateway/dist/web/signed-out.js +99 -0
- package/packages/gateway/dist/web/signed-out.js.map +1 -0
- package/packages/gateway/dist/web/tailscale.d.ts +13 -0
- package/packages/gateway/dist/web/tailscale.d.ts.map +1 -1
- package/packages/gateway/dist/web/tailscale.js +12 -0
- package/packages/gateway/dist/web/tailscale.js.map +1 -1
- package/packages/install/dist/.tsbuildinfo +1 -1
- package/packages/install/dist/backup.d.ts +18 -0
- package/packages/install/dist/backup.d.ts.map +1 -1
- package/packages/install/dist/backup.js +39 -2
- package/packages/install/dist/backup.js.map +1 -1
- package/packages/install/dist/kept-data.d.ts +20 -0
- package/packages/install/dist/kept-data.d.ts.map +1 -0
- package/packages/install/dist/kept-data.js +34 -0
- package/packages/install/dist/kept-data.js.map +1 -0
- package/packages/install/dist/launcher.d.ts.map +1 -1
- package/packages/install/dist/launcher.js +17 -3
- package/packages/install/dist/launcher.js.map +1 -1
- package/packages/install/dist/postgres-check.d.ts +18 -0
- package/packages/install/dist/postgres-check.d.ts.map +1 -0
- package/packages/install/dist/postgres-check.js +66 -0
- package/packages/install/dist/postgres-check.js.map +1 -0
- package/packages/install/dist/upgrade.d.ts +3 -0
- package/packages/install/dist/upgrade.d.ts.map +1 -1
- package/packages/install/dist/upgrade.js +30 -0
- package/packages/install/dist/upgrade.js.map +1 -1
- package/packages/runtime/dist/.tsbuildinfo +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.d.ts.map +1 -1
- package/packages/tools/email/dist/agent.js +11 -0
- package/packages/tools/email/dist/agent.js.map +1 -1
- package/packages/tools/email/dist/imap/fake.d.ts +89 -3
- package/packages/tools/email/dist/imap/fake.d.ts.map +1 -1
- package/packages/tools/email/dist/imap/fake.js +234 -4
- package/packages/tools/email/dist/imap/fake.js.map +1 -1
- package/packages/tools/email/dist/imap/imapflow-client.d.ts +14 -1
- package/packages/tools/email/dist/imap/imapflow-client.d.ts.map +1 -1
- package/packages/tools/email/dist/imap/imapflow-client.js +157 -2
- package/packages/tools/email/dist/imap/imapflow-client.js.map +1 -1
- package/packages/tools/email/dist/index.d.ts +14 -2
- package/packages/tools/email/dist/index.d.ts.map +1 -1
- package/packages/tools/email/dist/index.js +23 -4
- package/packages/tools/email/dist/index.js.map +1 -1
- package/packages/tools/email/dist/logins.d.ts +24 -0
- package/packages/tools/email/dist/logins.d.ts.map +1 -0
- package/packages/tools/email/dist/logins.js +35 -0
- package/packages/tools/email/dist/logins.js.map +1 -0
- package/packages/tools/email/dist/mail.d.ts +14 -0
- package/packages/tools/email/dist/mail.d.ts.map +1 -1
- package/packages/tools/email/dist/mail.js +23 -0
- package/packages/tools/email/dist/mail.js.map +1 -1
- package/packages/tools/email/dist/mailbox/actions.d.ts +205 -0
- package/packages/tools/email/dist/mailbox/actions.d.ts.map +1 -0
- package/packages/tools/email/dist/mailbox/actions.js +662 -0
- package/packages/tools/email/dist/mailbox/actions.js.map +1 -0
- package/packages/tools/email/dist/mailbox/arrival.d.ts +61 -0
- package/packages/tools/email/dist/mailbox/arrival.d.ts.map +1 -0
- package/packages/tools/email/dist/mailbox/arrival.js +153 -0
- package/packages/tools/email/dist/mailbox/arrival.js.map +1 -0
- package/packages/tools/email/dist/mailbox/select.d.ts +53 -0
- package/packages/tools/email/dist/mailbox/select.d.ts.map +1 -0
- package/packages/tools/email/dist/mailbox/select.js +117 -0
- package/packages/tools/email/dist/mailbox/select.js.map +1 -0
- package/packages/tools/email/dist/pages/accounts.d.ts +37 -1
- package/packages/tools/email/dist/pages/accounts.d.ts.map +1 -1
- package/packages/tools/email/dist/pages/accounts.js +104 -2
- package/packages/tools/email/dist/pages/accounts.js.map +1 -1
- package/packages/tools/email/dist/pages/descriptors.d.ts.map +1 -1
- package/packages/tools/email/dist/pages/descriptors.js +142 -0
- 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/format.d.ts +1 -12
- package/packages/tools/email/dist/pages/format.d.ts.map +1 -1
- package/packages/tools/email/dist/pages/format.js +17 -0
- package/packages/tools/email/dist/pages/format.js.map +1 -1
- package/packages/tools/email/dist/pages/index.d.ts.map +1 -1
- package/packages/tools/email/dist/pages/index.js +5 -1
- package/packages/tools/email/dist/pages/index.js.map +1 -1
- package/packages/tools/email/dist/pages/policies-tools.d.ts +7 -0
- package/packages/tools/email/dist/pages/policies-tools.d.ts.map +1 -1
- package/packages/tools/email/dist/pages/policies-tools.js +11 -2
- package/packages/tools/email/dist/pages/policies-tools.js.map +1 -1
- package/packages/tools/email/dist/pages/queries.d.ts +16 -0
- package/packages/tools/email/dist/pages/queries.d.ts.map +1 -1
- package/packages/tools/email/dist/pages/queries.js +154 -3
- package/packages/tools/email/dist/pages/queries.js.map +1 -1
- package/packages/tools/email/dist/policies/auto.d.ts +133 -0
- package/packages/tools/email/dist/policies/auto.d.ts.map +1 -0
- package/packages/tools/email/dist/policies/auto.js +241 -0
- package/packages/tools/email/dist/policies/auto.js.map +1 -0
- package/packages/tools/email/dist/policies/gate.d.ts +34 -10
- package/packages/tools/email/dist/policies/gate.d.ts.map +1 -1
- package/packages/tools/email/dist/policies/gate.js +27 -12
- package/packages/tools/email/dist/policies/gate.js.map +1 -1
- package/packages/tools/email/dist/policies/learn.d.ts +26 -18
- package/packages/tools/email/dist/policies/learn.d.ts.map +1 -1
- package/packages/tools/email/dist/policies/learn.js +36 -10
- package/packages/tools/email/dist/policies/learn.js.map +1 -1
- package/packages/tools/email/dist/policies/learned.d.ts +25 -2
- package/packages/tools/email/dist/policies/learned.d.ts.map +1 -1
- package/packages/tools/email/dist/policies/learned.js +47 -5
- package/packages/tools/email/dist/policies/learned.js.map +1 -1
- package/packages/tools/email/dist/policies/store.d.ts +8 -2
- package/packages/tools/email/dist/policies/store.d.ts.map +1 -1
- package/packages/tools/email/dist/policies/store.js +19 -5
- package/packages/tools/email/dist/policies/store.js.map +1 -1
- package/packages/tools/email/dist/ports.d.ts +79 -0
- package/packages/tools/email/dist/ports.d.ts.map +1 -1
- package/packages/tools/email/dist/ports.js +6 -0
- package/packages/tools/email/dist/ports.js.map +1 -1
- package/packages/tools/email/dist/rows.d.ts.map +1 -1
- package/packages/tools/email/dist/rows.js +3 -1
- package/packages/tools/email/dist/rows.js.map +1 -1
- package/packages/tools/email/dist/sources/idle.d.ts +90 -0
- package/packages/tools/email/dist/sources/idle.d.ts.map +1 -0
- package/packages/tools/email/dist/sources/idle.js +250 -0
- package/packages/tools/email/dist/sources/idle.js.map +1 -0
- package/packages/tools/email/dist/sources/inbox-poll.d.ts +12 -1
- package/packages/tools/email/dist/sources/inbox-poll.d.ts.map +1 -1
- package/packages/tools/email/dist/sources/inbox-poll.js +280 -134
- package/packages/tools/email/dist/sources/inbox-poll.js.map +1 -1
- package/packages/tools/email/dist/tools/mailbox.d.ts +108 -0
- package/packages/tools/email/dist/tools/mailbox.d.ts.map +1 -0
- package/packages/tools/email/dist/tools/mailbox.js +359 -0
- package/packages/tools/email/dist/tools/mailbox.js.map +1 -0
- package/packages/tools/email/dist/tools/policies.d.ts +8 -2
- package/packages/tools/email/dist/tools/policies.d.ts.map +1 -1
- package/packages/tools/email/dist/tools/policies.js +43 -3
- package/packages/tools/email/dist/tools/policies.js.map +1 -1
- package/packages/tools/email/dist/tools/read.d.ts +2 -2
- package/packages/tools/email/dist/tools/triage.d.ts.map +1 -1
- package/packages/tools/email/dist/tools/triage.js +10 -4
- package/packages/tools/email/dist/tools/triage.js.map +1 -1
- package/packages/tools/email/migrations/017_mailbox_actions.sql +60 -0
- package/packages/tools/email/migrations/018_learned_auto.sql +30 -0
- package/packages/tools/email/migrations/019_arrival_pending.sql +26 -0
- package/packages/tools/email/package.json +3 -2
- 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/index-CKuhKCWw.js +131 -0
- package/packages/web/dist/assets/index-DsK8UWCJ.css +1 -0
- package/packages/web/dist/assets/{lottie_light-7wQnGwdw.js → lottie_light-CSeMXM8D.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/assets/index-BxbiKNMS.css +0 -1
- package/packages/web/dist/assets/index-Rrze3bGo.js +0 -130
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { localDateString } from '@buddi/core/plugin';
|
|
2
|
+
import { isNoReplyAddress, normalizeAddress } from '../mail.js';
|
|
3
|
+
import { learnedKind, ruleOf, writeLearnedRule } from './learned.js';
|
|
4
|
+
import { policyForSender, revokePolicy, toPolicy, POLICY_COLUMNS } from './store.js';
|
|
5
|
+
/** The actions that only quiet a sender. */
|
|
6
|
+
export const QUIET_ACTIONS = ['ignore'];
|
|
7
|
+
/** The on-arrival actions a rule that keeps itself may carry. */
|
|
8
|
+
export const QUIET_ARRIVALS = ['archive', 'mark-read'];
|
|
9
|
+
/**
|
|
10
|
+
* May this rule keep itself, and why. Pure: the facts are read by the caller.
|
|
11
|
+
* Null is the answer far more often than not, and then it is a card.
|
|
12
|
+
*/
|
|
13
|
+
export function mayKeepItself(input) {
|
|
14
|
+
if (input.ownerHasWritten)
|
|
15
|
+
return null;
|
|
16
|
+
if (input.scope !== 'sender')
|
|
17
|
+
return null;
|
|
18
|
+
if (!QUIET_ACTIONS.includes(input.action))
|
|
19
|
+
return null;
|
|
20
|
+
const arrival = input.params?.onArrival;
|
|
21
|
+
if (arrival && !QUIET_ARRIVALS.includes(arrival.kind))
|
|
22
|
+
return null;
|
|
23
|
+
if (input.bulk)
|
|
24
|
+
return 'bulk';
|
|
25
|
+
if (input.trusted)
|
|
26
|
+
return 'track-record';
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Is this sender's mail sent to many, in this account? A no-reply address, or
|
|
31
|
+
* any message from them that carried `List-Unsubscribe` / `Precedence: bulk`
|
|
32
|
+
* (`bulk`) or a `List-Id`.
|
|
33
|
+
*/
|
|
34
|
+
export async function isBulkSender(db, accountId, address) {
|
|
35
|
+
const matcher = normalizeAddress(address);
|
|
36
|
+
if (matcher === '' || !accountId)
|
|
37
|
+
return false;
|
|
38
|
+
if (isNoReplyAddress(matcher))
|
|
39
|
+
return true;
|
|
40
|
+
const { rows } = await db.query(`select exists (
|
|
41
|
+
select 1 from email.messages m
|
|
42
|
+
where m.account_id = $2::uuid and m.direction = 'in'
|
|
43
|
+
and email.address_of(m.from_addr) = $1
|
|
44
|
+
and (m.bulk or m.list_id is not null)
|
|
45
|
+
) as bulk`, [matcher, accountId]);
|
|
46
|
+
return rows[0]?.bulk === true;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Has the owner ever sent mail to this address, from **any** mailbox? Stricter
|
|
50
|
+
* than the per-account veto on proposals: a rule that keeps itself does not
|
|
51
|
+
* get the benefit of a history split across accounts.
|
|
52
|
+
*/
|
|
53
|
+
export async function ownerHasWrittenAnywhere(db, address) {
|
|
54
|
+
const matcher = normalizeAddress(address);
|
|
55
|
+
if (matcher === '')
|
|
56
|
+
return true;
|
|
57
|
+
const { rows } = await db.query(`select count(*)::int as n from email.messages m
|
|
58
|
+
where m.direction = 'out'
|
|
59
|
+
and (
|
|
60
|
+
exists (select 1 from jsonb_array_elements_text(m.to_addrs) as a(addr) where email.address_of(a.addr) = $1)
|
|
61
|
+
or exists (select 1 from jsonb_array_elements_text(m.cc) as a(addr) where email.address_of(a.addr) = $1)
|
|
62
|
+
)`, [matcher]);
|
|
63
|
+
return Number(rows[0]?.n ?? 0) > 0;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Propose the rule and keep it in one transaction: the card (never
|
|
67
|
+
* announced), the rule through the same apply as a kept card, and the card
|
|
68
|
+
* marked kept by `auto`. Returns the kept card, or null when the owner
|
|
69
|
+
* discarded the same rule in the last 90 days (then nothing happens at all)
|
|
70
|
+
* or the rule could not be written (then the caller proposes it as a card).
|
|
71
|
+
*/
|
|
72
|
+
export async function keepLearnedItself(host, ask, reason, now, run) {
|
|
73
|
+
try {
|
|
74
|
+
return await host.db.transaction(async (tx) => {
|
|
75
|
+
const result = await host.proposals.proposePolicy(run, ask, tx, { announce: false });
|
|
76
|
+
const card = result.ok ? result.proposal : result.reason === 'already-open' ? result.existing : null;
|
|
77
|
+
if (!card)
|
|
78
|
+
return null;
|
|
79
|
+
return keepCardItself(host, tx, card, reason, now);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
if (err instanceof NotKept)
|
|
84
|
+
return null;
|
|
85
|
+
throw err;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
class NotKept extends Error {
|
|
89
|
+
}
|
|
90
|
+
/** Write the rule an open card describes and mark the card kept by `auto`, inside `tx`. Throws `NotKept` to roll back. */
|
|
91
|
+
async function keepCardItself(host, tx, card, reason, now) {
|
|
92
|
+
const written = await writeLearnedRule(tx, card, now, { keptBy: 'auto', autoReason: reason });
|
|
93
|
+
if (!written.ok)
|
|
94
|
+
throw new NotKept(written.note);
|
|
95
|
+
const kept = await host.proposals.keepItself(card.id, tx);
|
|
96
|
+
if (!kept)
|
|
97
|
+
throw new NotKept('the card was decided meanwhile');
|
|
98
|
+
return kept;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The one-time sweep, run on every start and idempotent: every open email
|
|
102
|
+
* card that qualifies as bulk today is kept the same way, so the pile that
|
|
103
|
+
* was waiting before this build disappears into Learned. Only the `bulk`
|
|
104
|
+
* reason: the track record decides new rules, not ones already waiting.
|
|
105
|
+
* A sender with a live rule of any kind is left alone — that rule is the
|
|
106
|
+
* owner's. Returns how many were kept.
|
|
107
|
+
*/
|
|
108
|
+
export async function sweepOpenBulkCards(host, now) {
|
|
109
|
+
const open = await host.proposals.listOpen();
|
|
110
|
+
let kept = 0;
|
|
111
|
+
for (const card of open) {
|
|
112
|
+
const rule = ruleOf(card.payload);
|
|
113
|
+
if (!rule.ok || !rule.accountId)
|
|
114
|
+
continue;
|
|
115
|
+
const ownerHasWritten = await ownerHasWrittenAnywhere(host.db, rule.matcher);
|
|
116
|
+
const bulk = rule.scope === 'sender' ? await isBulkSender(host.db, rule.accountId, rule.matcher) : false;
|
|
117
|
+
const reason = mayKeepItself({ scope: rule.scope, action: rule.action, params: rule.params, ownerHasWritten, bulk, trusted: false });
|
|
118
|
+
if (reason !== 'bulk')
|
|
119
|
+
continue;
|
|
120
|
+
if (await policyForSender(host.db, rule.matcher, rule.accountId))
|
|
121
|
+
continue;
|
|
122
|
+
try {
|
|
123
|
+
await host.db.transaction((tx) => keepCardItself(host, tx, card, reason, now));
|
|
124
|
+
kept += 1;
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
if (!(err instanceof NotKept))
|
|
128
|
+
throw err;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return kept;
|
|
132
|
+
}
|
|
133
|
+
/** The kind an old card is, when it carries none (cards from before kinds). */
|
|
134
|
+
export function kindOfCard(card) {
|
|
135
|
+
if (typeof card.payload.kind === 'string' && card.payload.kind)
|
|
136
|
+
return card.payload.kind;
|
|
137
|
+
const params = (card.payload.params ?? {});
|
|
138
|
+
return learnedKind(String(card.payload.action ?? ''), params.category);
|
|
139
|
+
}
|
|
140
|
+
/* ------------------------------------------------------------------ *
|
|
141
|
+
* The owner hears about it once a day
|
|
142
|
+
* ------------------------------------------------------------------ */
|
|
143
|
+
/** The Mail page, where Learned lists them. */
|
|
144
|
+
export const LEARNED_ROUTE = '#/p/email/mail';
|
|
145
|
+
/** How many rules kept themselves on the owner's local day, by reason. Undone ones are not counted. */
|
|
146
|
+
export async function learnedOn(db, day, timezone) {
|
|
147
|
+
const { rows } = await db.query(`select count(*) filter (where auto_reason = 'bulk')::int as bulk,
|
|
148
|
+
count(*) filter (where auto_reason is distinct from 'bulk')::int as track
|
|
149
|
+
from email.policies
|
|
150
|
+
where kept_by = 'auto' and revoked_at is null
|
|
151
|
+
and (kept_at at time zone $2)::date = $1::date`, [day, timezone]);
|
|
152
|
+
return { bulk: Number(rows[0]?.bulk ?? 0), trackRecord: Number(rows[0]?.track ?? 0) };
|
|
153
|
+
}
|
|
154
|
+
function plural(n, one, many = `${one}s`) {
|
|
155
|
+
return `${n} ${n === 1 ? one : many}`;
|
|
156
|
+
}
|
|
157
|
+
/** "buddi learned 7 rules: quieted 5 newsletters and 2 senders — review". */
|
|
158
|
+
export function learnedLine(counts) {
|
|
159
|
+
const total = counts.bulk + counts.trackRecord;
|
|
160
|
+
if (total === 0)
|
|
161
|
+
return null;
|
|
162
|
+
const parts = [
|
|
163
|
+
counts.bulk > 0 ? plural(counts.bulk, 'newsletter') : null,
|
|
164
|
+
counts.trackRecord > 0 ? plural(counts.trackRecord, 'sender') : null,
|
|
165
|
+
].filter((p) => p !== null);
|
|
166
|
+
return `buddi learned ${plural(total, 'rule')}: quieted ${parts.join(' and ')} — review`;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Tell the owner what kept itself today, in one line. Keyed per local day,
|
|
170
|
+
* so every call on the same day updates the one waiting line rather than
|
|
171
|
+
* adding another, at the `today` urgency (the end-of-day message). Nothing is
|
|
172
|
+
* sent when nothing kept itself. Never throws: the rules stand either way.
|
|
173
|
+
*/
|
|
174
|
+
export async function tellOwnerLearned(host, now) {
|
|
175
|
+
const notify = host.owner.notify;
|
|
176
|
+
if (!notify)
|
|
177
|
+
return null;
|
|
178
|
+
try {
|
|
179
|
+
const timezone = host.owner.timezone || 'UTC';
|
|
180
|
+
const day = localDateString(now, timezone);
|
|
181
|
+
const title = learnedLine(await learnedOn(host.db, day, timezone));
|
|
182
|
+
if (!title)
|
|
183
|
+
return null;
|
|
184
|
+
await notify({
|
|
185
|
+
urgency: 'today',
|
|
186
|
+
title,
|
|
187
|
+
text: 'Each is under Learned on the Mail page, with Undo.',
|
|
188
|
+
link: { route: LEARNED_ROUTE },
|
|
189
|
+
dedupeKey: `learned:${day}`,
|
|
190
|
+
});
|
|
191
|
+
return title;
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
console.error(`email: could not tell the owner what it learned: ${err instanceof Error ? err.message : String(err)}`);
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** The rules that kept themselves, newest first, undone ones included (they say so). */
|
|
199
|
+
export async function learnedRules(db, limit = 50) {
|
|
200
|
+
const { rows } = await db.query(`select ${POLICY_COLUMNS},
|
|
201
|
+
coalesce((select array_agg(a.id::text order by a.created_at desc)
|
|
202
|
+
from email.mailbox_actions a
|
|
203
|
+
where a.policy_id = p.id and a.kind <> 'undo' and a.undone_at is null), '{}') as arrival_changes
|
|
204
|
+
from email.policies p
|
|
205
|
+
where p.kept_by = 'auto'
|
|
206
|
+
order by p.kept_at desc nulls last, p.id desc
|
|
207
|
+
limit $1`, [limit]);
|
|
208
|
+
return rows.map((row) => {
|
|
209
|
+
const policy = toPolicy(row);
|
|
210
|
+
return {
|
|
211
|
+
id: policy.id,
|
|
212
|
+
accountId: policy.accountId,
|
|
213
|
+
matcher: policy.matcher,
|
|
214
|
+
action: policy.action,
|
|
215
|
+
params: policy.params,
|
|
216
|
+
autoReason: policy.autoReason ?? null,
|
|
217
|
+
keptAt: policy.keptAt ?? null,
|
|
218
|
+
revokedAt: policy.revokedAt,
|
|
219
|
+
proposalId: policy.proposalId ?? null,
|
|
220
|
+
arrivalChanges: Array.isArray(row.arrival_changes) ? row.arrival_changes.map(String) : [],
|
|
221
|
+
};
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Undo a rule that kept itself: revoke it, and turn its card into the
|
|
226
|
+
* owner's discard — so the same rule is not learned again for 90 days and the
|
|
227
|
+
* kind's track record starts over. Returns the rule as it is now, or null.
|
|
228
|
+
*/
|
|
229
|
+
export async function undoLearnedRule(host, id, now) {
|
|
230
|
+
const rules = await learnedRules(host.db, 500);
|
|
231
|
+
const rule = rules.find((r) => r.id === id);
|
|
232
|
+
if (!rule)
|
|
233
|
+
return null;
|
|
234
|
+
await host.db.transaction(async (tx) => {
|
|
235
|
+
await revokePolicy(tx, id, now);
|
|
236
|
+
if (rule.proposalId)
|
|
237
|
+
await host.proposals.takeBack(rule.proposalId, { reason: 'undone by the owner', within: tx });
|
|
238
|
+
});
|
|
239
|
+
return { ...rule, revokedAt: rule.revokedAt ?? now.toISOString() };
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=auto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto.js","sourceRoot":"","sources":["../../src/policies/auto.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,18 +3,28 @@ export type PolicyScope = (typeof POLICY_SCOPES)[number];
|
|
|
3
3
|
export declare const POLICY_ACTIONS: readonly ["ignore", "archive", "label", "notify", "draft", "hand-to-agent", "wake"];
|
|
4
4
|
export type PolicyAction = (typeof POLICY_ACTIONS)[number];
|
|
5
5
|
export declare const POLICY_ORIGINS: readonly ["owner", "learned", "plugin"];
|
|
6
|
+
/** What a rule may do in the mailbox when a message it matches arrives. */
|
|
7
|
+
export declare const ARRIVAL_KINDS: readonly ["archive", "mark-read", "move"];
|
|
8
|
+
export type ArrivalKind = (typeof ARRIVAL_KINDS)[number];
|
|
9
|
+
export interface ArrivalAction {
|
|
10
|
+
kind: ArrivalKind;
|
|
11
|
+
/** `move`: the folder or Gmail label, by its server name. */
|
|
12
|
+
folder?: string;
|
|
13
|
+
}
|
|
14
|
+
/** The words a policy card and an approval use for an on-arrival action. */
|
|
15
|
+
export declare function arrivalWords(action: ArrivalAction | undefined | null): string | null;
|
|
6
16
|
export type PolicyOrigin = (typeof POLICY_ORIGINS)[number];
|
|
7
17
|
/**
|
|
8
|
-
* Actions that
|
|
18
|
+
* Actions that are vocabulary, not behaviour.
|
|
9
19
|
*
|
|
10
|
-
* `
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
20
|
+
* `archive` and `label` are what an owner might ask a rule to do, and refusing
|
|
21
|
+
* to *name* them would be a worse lie than refusing them. They are refused as
|
|
22
|
+
* a rule's action at the point a policy is created: a rule that should archive
|
|
23
|
+
* matching mail picks a real action and carries an on-arrival mailbox action
|
|
24
|
+
* (`params.onArrival`, carried out by `mailbox/arrival.ts`). Should a row
|
|
25
|
+
* carrying one reach the gate anyway (written by an older build, or by hand),
|
|
26
|
+
* the gate refuses it and falls through to a run rather than silently
|
|
27
|
+
* dropping the message.
|
|
18
28
|
*/
|
|
19
29
|
export declare const UNIMPLEMENTED_ACTIONS: readonly PolicyAction[];
|
|
20
30
|
export declare function isUnimplementedAction(action: PolicyAction): boolean;
|
|
@@ -31,6 +41,14 @@ export interface PolicyParams {
|
|
|
31
41
|
/** `ignore`: the triage row written from the policy. */
|
|
32
42
|
category?: string;
|
|
33
43
|
urgency?: 'urgent' | 'normal' | 'low';
|
|
44
|
+
/**
|
|
45
|
+
* What the rule also does in the mailbox itself, the moment a matching
|
|
46
|
+
* message arrives: archive it, mark it read, or move it to a folder that
|
|
47
|
+
* already exists. Any action may carry one (an `ignore` that also
|
|
48
|
+
* archives is the common case). Applied by `mailbox/arrival.ts` after the
|
|
49
|
+
* gate, recorded on the undo trail like any other mailbox change.
|
|
50
|
+
*/
|
|
51
|
+
onArrival?: ArrivalAction;
|
|
34
52
|
/**
|
|
35
53
|
* `thread` and `list-id`: the sender this policy was created about.
|
|
36
54
|
*
|
|
@@ -57,8 +75,14 @@ export interface PolicyRecord {
|
|
|
57
75
|
}>;
|
|
58
76
|
createdAt: string | null;
|
|
59
77
|
revokedAt: string | null;
|
|
60
|
-
/** When
|
|
78
|
+
/** When it was kept from Settings → Proposals, or kept itself; null for any other rule. */
|
|
61
79
|
keptAt?: string | null;
|
|
80
|
+
/** Who kept a learned rule: the owner, or the plugin itself under its own rule (`auto.ts`). */
|
|
81
|
+
keptBy?: 'owner' | 'auto' | null;
|
|
82
|
+
/** The `core.proposals` card it came from, when it came from one. */
|
|
83
|
+
proposalId?: string | null;
|
|
84
|
+
/** Why a rule kept itself: `bulk` or `track-record`. */
|
|
85
|
+
autoReason?: string | null;
|
|
62
86
|
}
|
|
63
87
|
/** Everything the gate is allowed to look at. Deliberately not the body. */
|
|
64
88
|
export interface MessageHeader {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/policies/gate.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,aAAa,oDAAqD,CAAC;AAChF,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,cAAc,qFAQjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,eAAO,MAAM,cAAc,yCAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/policies/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
* What the gate never does:
|
|
17
17
|
*
|
|
18
18
|
* - It never reads a *proposed* policy. Everything learned is a proposal on
|
|
19
|
-
* the settings page until the owner
|
|
20
|
-
*
|
|
21
|
-
*
|
|
19
|
+
* the settings page until it is kept — by the owner, or by itself for the
|
|
20
|
+
* narrow class `auto.ts` allows (a quiet rule for a bulk sender the owner
|
|
21
|
+
* never wrote to). A kept row is a kept row either way.
|
|
22
22
|
* - It never reads a revoked one. Revocation keeps the row as a record; it
|
|
23
23
|
* does not keep its effect.
|
|
24
24
|
* - It never trusts the message. A From header is forged as easily as it is
|
|
@@ -48,17 +48,32 @@ export const POLICY_ACTIONS = [
|
|
|
48
48
|
'wake',
|
|
49
49
|
];
|
|
50
50
|
export const POLICY_ORIGINS = ['owner', 'learned', 'plugin'];
|
|
51
|
+
/** What a rule may do in the mailbox when a message it matches arrives. */
|
|
52
|
+
export const ARRIVAL_KINDS = ['archive', 'mark-read', 'move'];
|
|
53
|
+
/** The words a policy card and an approval use for an on-arrival action. */
|
|
54
|
+
export function arrivalWords(action) {
|
|
55
|
+
if (!action)
|
|
56
|
+
return null;
|
|
57
|
+
switch (action.kind) {
|
|
58
|
+
case 'archive':
|
|
59
|
+
return 'archive it in your mailbox';
|
|
60
|
+
case 'mark-read':
|
|
61
|
+
return 'mark it read in your mailbox';
|
|
62
|
+
case 'move':
|
|
63
|
+
return `move it to ${action.folder ?? '(no folder named)'} in your mailbox`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
51
66
|
/**
|
|
52
|
-
* Actions that
|
|
67
|
+
* Actions that are vocabulary, not behaviour.
|
|
53
68
|
*
|
|
54
|
-
* `
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
69
|
+
* `archive` and `label` are what an owner might ask a rule to do, and refusing
|
|
70
|
+
* to *name* them would be a worse lie than refusing them. They are refused as
|
|
71
|
+
* a rule's action at the point a policy is created: a rule that should archive
|
|
72
|
+
* matching mail picks a real action and carries an on-arrival mailbox action
|
|
73
|
+
* (`params.onArrival`, carried out by `mailbox/arrival.ts`). Should a row
|
|
74
|
+
* carrying one reach the gate anyway (written by an older build, or by hand),
|
|
75
|
+
* the gate refuses it and falls through to a run rather than silently
|
|
76
|
+
* dropping the message.
|
|
62
77
|
*/
|
|
63
78
|
export const UNIMPLEMENTED_ACTIONS = ['archive', 'label'];
|
|
64
79
|
export function isUnimplementedAction(action) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/policies/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAGhF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,OAAO;IACP,eAAe;IACf,MAAM;CACE,CAAC;AAGX,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/policies/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,16 +9,18 @@
|
|
|
9
9
|
* sender judged promo, promo, reply-needed, promo is a sender the owner may
|
|
10
10
|
* well hear from, and the run is counted from the newest verdict back, so
|
|
11
11
|
* one dissenting judgement resets it.
|
|
12
|
-
* - **
|
|
13
|
-
* Settings → Proposals inbox (`core.proposals`,
|
|
14
|
-
* item 3), beside what the agents propose; this plugin
|
|
15
|
-
* the owner keeps it there, and then writes it through
|
|
16
|
-
* (`learned.ts`). The gate reads only kept rows.
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
12
|
+
* - **A card, unless the rule only quiets a bulk sender.** A proposal is a
|
|
13
|
+
* card on the owner's Settings → Proposals inbox (`core.proposals`,
|
|
14
|
+
* docs/learning.md §2 item 3), beside what the agents propose; this plugin
|
|
15
|
+
* writes no rule until the owner keeps it there, and then writes it through
|
|
16
|
+
* its own apply (`learned.ts`). The gate reads only kept rows. The
|
|
17
|
+
* exception is `auto.ts`: a rule that only quiets a sender the owner never
|
|
18
|
+
* wrote to keeps itself when the sender's mail is bulk (List-Unsubscribe,
|
|
19
|
+
* List-Id, Precedence, a no-reply address) or the owner has kept five of
|
|
20
|
+
* its kind running. It is still recorded as a kept card, listed under
|
|
21
|
+
* Learned on the Mail page with Undo, and the owner hears about it once a
|
|
22
|
+
* day. Anyone else stays a card: a mailbox is synced from *now*, and a
|
|
23
|
+
* person answered before buddi arrived still looks unanswered.
|
|
22
24
|
* - **The owner writing back vetoes silence.** Any proposal that would stop a
|
|
23
25
|
* run is refused for a sender the owner has actually sent mail to. A person
|
|
24
26
|
* who gets answers is not a newsletter, whatever the categories say.
|
|
@@ -29,8 +31,9 @@
|
|
|
29
31
|
* The rule is a pure function; the query around it is the only database part.
|
|
30
32
|
*/
|
|
31
33
|
import type { DbArea } from '@buddi/core/plugin';
|
|
32
|
-
import type {
|
|
34
|
+
import type { Proposal as CoreProposal, ToolContext } from '@buddi/core/plugin';
|
|
33
35
|
import type { PolicyAction } from './gate.js';
|
|
36
|
+
import { type AutoHost, type AutoReason } from './auto.js';
|
|
34
37
|
/** `ctx.buddi.db`, a transaction's handle, or anything that answers a query as they do. */
|
|
35
38
|
type Db = Pick<DbArea, 'query'>;
|
|
36
39
|
/** How many verdicts running make a pattern. Three: two is a coincidence. */
|
|
@@ -44,7 +47,9 @@ export interface Verdict {
|
|
|
44
47
|
}
|
|
45
48
|
export interface Proposal {
|
|
46
49
|
action: PolicyAction;
|
|
47
|
-
/**
|
|
50
|
+
/** The rule's kind (`learned.ts`, `LEARNED_KIND_LABELS`). */
|
|
51
|
+
kind: 'quiet-promo-sender' | 'quiet-low-sender' | 'notify-sender';
|
|
52
|
+
/** True: the pure rule proposes. Whether it keeps itself is `auto.ts`'s, on facts read around it. */
|
|
48
53
|
proposed: boolean;
|
|
49
54
|
/** The verdicts it was learned from, newest first. */
|
|
50
55
|
createdFrom: Array<{
|
|
@@ -112,17 +117,20 @@ export interface OwnerReplies {
|
|
|
112
117
|
* out of the average rather than guessed at.
|
|
113
118
|
*/
|
|
114
119
|
export declare function ownerReplies(db: Db, accountId: string, address: string): Promise<OwnerReplies>;
|
|
115
|
-
/** What `learnFromVerdict`
|
|
120
|
+
/** What `learnFromVerdict` learned: a new card on the owner's inbox, or a rule that kept itself. */
|
|
116
121
|
export interface LearnedPolicy {
|
|
117
122
|
proposal: CoreProposal;
|
|
118
123
|
action: PolicyAction;
|
|
119
124
|
matcher: string;
|
|
125
|
+
/** Set when the rule kept itself rather than waiting on a card, and why. */
|
|
126
|
+
keptItself: AutoReason | null;
|
|
120
127
|
}
|
|
121
128
|
/**
|
|
122
|
-
* Called after a verdict is recorded.
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
129
|
+
* Called after a verdict is recorded. Learns at most one rule and returns it,
|
|
130
|
+
* or null when nothing was learned — which is the usual answer. The rule is a
|
|
131
|
+
* card the owner keeps (`learned.ts`, `applyLearnedPolicy`), unless it only
|
|
132
|
+
* quiets a sender `auto.ts` allows it to keep itself for; then it is written
|
|
133
|
+
* at once, recorded as kept by `auto`, and the owner's daily line is updated.
|
|
126
134
|
*
|
|
127
135
|
* A sender that already has a live policy learns nothing: whatever is there is
|
|
128
136
|
* the owner's decision, and overwriting it would be this plugin arguing with
|
|
@@ -134,7 +142,7 @@ export interface LearnedPolicy {
|
|
|
134
142
|
* untrusted, so the messages are the proposal's sources — by subject and
|
|
135
143
|
* sender, never by body.
|
|
136
144
|
*/
|
|
137
|
-
export declare function learnFromVerdict(
|
|
145
|
+
export declare function learnFromVerdict(host: AutoHost, input: {
|
|
138
146
|
from: string;
|
|
139
147
|
accountId: string;
|
|
140
148
|
}, now: Date, run?: Pick<ToolContext, 'agentId' | 'conversationId' | 'toolUseId' | 'provenance'> | null): Promise<LearnedPolicy | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learn.d.ts","sourceRoot":"","sources":["../../src/policies/learn.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"learn.d.ts","sourceRoot":"","sources":["../../src/policies/learn.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { normalizeAddress } from '../mail.js';
|
|
2
2
|
import { policyForSender } from './store.js';
|
|
3
3
|
import { learnedPolicyInput, mailSources } from './learned.js';
|
|
4
|
+
import { isBulkSender, keepLearnedItself, mayKeepItself, ownerHasWrittenAnywhere, tellOwnerLearned } from './auto.js';
|
|
4
5
|
/** How many verdicts running make a pattern. Three: two is a coincidence. */
|
|
5
6
|
export const CONSISTENT_VERDICTS = 3;
|
|
6
7
|
/**
|
|
@@ -27,6 +28,7 @@ export function learnedProposal(verdicts, ownerHasReplied) {
|
|
|
27
28
|
if (sameCategory && category === 'promo' && !ownerHasReplied) {
|
|
28
29
|
return {
|
|
29
30
|
action: 'ignore',
|
|
31
|
+
kind: 'quiet-promo-sender',
|
|
30
32
|
proposed: true,
|
|
31
33
|
createdFrom,
|
|
32
34
|
why: `The last ${CONSISTENT_VERDICTS} messages from this sender were all marketing, and nothing here says you ever wrote back.`,
|
|
@@ -36,6 +38,7 @@ export function learnedProposal(verdicts, ownerHasReplied) {
|
|
|
36
38
|
if (allLow && !ownerHasReplied) {
|
|
37
39
|
return {
|
|
38
40
|
action: 'ignore',
|
|
41
|
+
kind: 'quiet-low-sender',
|
|
39
42
|
proposed: true,
|
|
40
43
|
createdFrom,
|
|
41
44
|
why: `The last ${CONSISTENT_VERDICTS} messages from this sender were all judged low — nothing is lost if you never read them.`,
|
|
@@ -45,6 +48,7 @@ export function learnedProposal(verdicts, ownerHasReplied) {
|
|
|
45
48
|
if (sameCategory && (category === 'reply-needed' || category === 'relationship')) {
|
|
46
49
|
return {
|
|
47
50
|
action: 'notify',
|
|
51
|
+
kind: 'notify-sender',
|
|
48
52
|
proposed: true,
|
|
49
53
|
createdFrom,
|
|
50
54
|
why: `The last ${CONSISTENT_VERDICTS} messages from this sender were all ${category}; a line when they write may be enough.`,
|
|
@@ -176,10 +180,11 @@ export async function ownerReplies(db, accountId, address) {
|
|
|
176
180
|
};
|
|
177
181
|
}
|
|
178
182
|
/**
|
|
179
|
-
* Called after a verdict is recorded.
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
+
* Called after a verdict is recorded. Learns at most one rule and returns it,
|
|
184
|
+
* or null when nothing was learned — which is the usual answer. The rule is a
|
|
185
|
+
* card the owner keeps (`learned.ts`, `applyLearnedPolicy`), unless it only
|
|
186
|
+
* quiets a sender `auto.ts` allows it to keep itself for; then it is written
|
|
187
|
+
* at once, recorded as kept by `auto`, and the owner's daily line is updated.
|
|
183
188
|
*
|
|
184
189
|
* A sender that already has a live policy learns nothing: whatever is there is
|
|
185
190
|
* the owner's decision, and overwriting it would be this plugin arguing with
|
|
@@ -191,7 +196,8 @@ export async function ownerReplies(db, accountId, address) {
|
|
|
191
196
|
* untrusted, so the messages are the proposal's sources — by subject and
|
|
192
197
|
* sender, never by body.
|
|
193
198
|
*/
|
|
194
|
-
export async function learnFromVerdict(
|
|
199
|
+
export async function learnFromVerdict(host, input, now, run = null) {
|
|
200
|
+
const db = host.db;
|
|
195
201
|
const address = normalizeAddress(input.from);
|
|
196
202
|
// No account is no learning. A policy learned from "every mailbox" would be a
|
|
197
203
|
// rule about mail it was never shown.
|
|
@@ -205,13 +211,14 @@ export async function learnFromVerdict(db, proposals, input, now, run = null) {
|
|
|
205
211
|
const proposal = learnedProposal(verdicts, replied);
|
|
206
212
|
if (!proposal)
|
|
207
213
|
return null;
|
|
214
|
+
const params = proposal.action === 'ignore'
|
|
215
|
+
? { category: verdicts[0]?.category ?? 'promo', urgency: 'low' }
|
|
216
|
+
: { note: proposal.why };
|
|
208
217
|
const ask = await learnedPolicyInput(db, {
|
|
209
218
|
accountId: input.accountId,
|
|
210
219
|
sender: address,
|
|
211
220
|
action: proposal.action,
|
|
212
|
-
params
|
|
213
|
-
? { category: verdicts[0]?.category ?? 'promo', urgency: 'low' }
|
|
214
|
-
: { note: proposal.why },
|
|
221
|
+
params,
|
|
215
222
|
verdicts: verdicts.slice(0, CONSISTENT_VERDICTS).map((v) => ({
|
|
216
223
|
messageId: v.messageId,
|
|
217
224
|
processingVersion: v.processingVersion,
|
|
@@ -220,10 +227,29 @@ export async function learnFromVerdict(db, proposals, input, now, run = null) {
|
|
|
220
227
|
})),
|
|
221
228
|
why: proposal.why,
|
|
222
229
|
sources: await mailSources(db, proposal.createdFrom.map((v) => v.messageId)),
|
|
230
|
+
kind: proposal.kind,
|
|
223
231
|
});
|
|
224
|
-
|
|
232
|
+
// Only a quiet rule is even asked about; the facts are read only then.
|
|
233
|
+
if (proposal.action === 'ignore') {
|
|
234
|
+
const reason = mayKeepItself({
|
|
235
|
+
scope: 'sender',
|
|
236
|
+
action: proposal.action,
|
|
237
|
+
params,
|
|
238
|
+
ownerHasWritten: replied || (await ownerHasWrittenAnywhere(db, address)),
|
|
239
|
+
bulk: await isBulkSender(db, input.accountId, address),
|
|
240
|
+
trusted: (await host.proposals.trackRecord(proposal.kind)).trusted,
|
|
241
|
+
});
|
|
242
|
+
if (reason) {
|
|
243
|
+
const kept = await keepLearnedItself(host, ask, reason, now, run);
|
|
244
|
+
if (kept) {
|
|
245
|
+
await tellOwnerLearned(host, now);
|
|
246
|
+
return { proposal: kept, action: proposal.action, matcher: address, keptItself: reason };
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
const result = await host.proposals.proposePolicy(run, ask);
|
|
225
251
|
if (!result.ok)
|
|
226
252
|
return null;
|
|
227
|
-
return { proposal: result.proposal, action: proposal.action, matcher: address };
|
|
253
|
+
return { proposal: result.proposal, action: proposal.action, matcher: address, keptItself: null };
|
|
228
254
|
}
|
|
229
255
|
//# sourceMappingURL=learn.js.map
|