@aitne/daemon 0.1.0
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/LICENSE +21 -0
- package/dist/adapters/composite-dashboard-stream.d.ts +42 -0
- package/dist/adapters/composite-dashboard-stream.d.ts.map +1 -0
- package/dist/adapters/composite-dashboard-stream.js +49 -0
- package/dist/adapters/composite-dashboard-stream.js.map +1 -0
- package/dist/adapters/dashboard-adapter.d.ts +104 -0
- package/dist/adapters/dashboard-adapter.d.ts.map +1 -0
- package/dist/adapters/dashboard-adapter.js +216 -0
- package/dist/adapters/dashboard-adapter.js.map +1 -0
- package/dist/adapters/discord.d.ts +77 -0
- package/dist/adapters/discord.d.ts.map +1 -0
- package/dist/adapters/discord.js +339 -0
- package/dist/adapters/discord.js.map +1 -0
- package/dist/adapters/docs-qa-adapter.d.ts +123 -0
- package/dist/adapters/docs-qa-adapter.d.ts.map +1 -0
- package/dist/adapters/docs-qa-adapter.js +218 -0
- package/dist/adapters/docs-qa-adapter.js.map +1 -0
- package/dist/adapters/message-hub.d.ts +70 -0
- package/dist/adapters/message-hub.d.ts.map +1 -0
- package/dist/adapters/message-hub.js +359 -0
- package/dist/adapters/message-hub.js.map +1 -0
- package/dist/adapters/notification-manager.d.ts +99 -0
- package/dist/adapters/notification-manager.d.ts.map +1 -0
- package/dist/adapters/notification-manager.js +498 -0
- package/dist/adapters/notification-manager.js.map +1 -0
- package/dist/adapters/outbound-text.d.ts +28 -0
- package/dist/adapters/outbound-text.d.ts.map +1 -0
- package/dist/adapters/outbound-text.js +58 -0
- package/dist/adapters/outbound-text.js.map +1 -0
- package/dist/adapters/slack-adapter.d.ts +82 -0
- package/dist/adapters/slack-adapter.d.ts.map +1 -0
- package/dist/adapters/slack-adapter.js +359 -0
- package/dist/adapters/slack-adapter.js.map +1 -0
- package/dist/adapters/telegram-adapter.d.ts +107 -0
- package/dist/adapters/telegram-adapter.d.ts.map +1 -0
- package/dist/adapters/telegram-adapter.js +477 -0
- package/dist/adapters/telegram-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +92 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/whatsapp-adapter.d.ts +213 -0
- package/dist/adapters/whatsapp-adapter.d.ts.map +1 -0
- package/dist/adapters/whatsapp-adapter.js +1216 -0
- package/dist/adapters/whatsapp-adapter.js.map +1 -0
- package/dist/api/chat-binding-query.d.ts +36 -0
- package/dist/api/chat-binding-query.d.ts.map +1 -0
- package/dist/api/chat-binding-query.js +63 -0
- package/dist/api/chat-binding-query.js.map +1 -0
- package/dist/api/chat-session-resume.d.ts +12 -0
- package/dist/api/chat-session-resume.d.ts.map +1 -0
- package/dist/api/chat-session-resume.js +21 -0
- package/dist/api/chat-session-resume.js.map +1 -0
- package/dist/api/delegated-proxy-helper.d.ts +33 -0
- package/dist/api/delegated-proxy-helper.d.ts.map +1 -0
- package/dist/api/delegated-proxy-helper.js +54 -0
- package/dist/api/delegated-proxy-helper.js.map +1 -0
- package/dist/api/directory-picker.d.ts +38 -0
- package/dist/api/directory-picker.d.ts.map +1 -0
- package/dist/api/directory-picker.js +278 -0
- package/dist/api/directory-picker.js.map +1 -0
- package/dist/api/env-writer.d.ts +25 -0
- package/dist/api/env-writer.d.ts.map +1 -0
- package/dist/api/env-writer.js +421 -0
- package/dist/api/env-writer.js.map +1 -0
- package/dist/api/integration-route-gate.d.ts +60 -0
- package/dist/api/integration-route-gate.d.ts.map +1 -0
- package/dist/api/integration-route-gate.js +83 -0
- package/dist/api/integration-route-gate.js.map +1 -0
- package/dist/api/json-body.d.ts +29 -0
- package/dist/api/json-body.d.ts.map +1 -0
- package/dist/api/json-body.js +87 -0
- package/dist/api/json-body.js.map +1 -0
- package/dist/api/routes/activity-sources.d.ts +20 -0
- package/dist/api/routes/activity-sources.d.ts.map +1 -0
- package/dist/api/routes/activity-sources.js +18 -0
- package/dist/api/routes/activity-sources.js.map +1 -0
- package/dist/api/routes/agent.d.ts +4 -0
- package/dist/api/routes/agent.d.ts.map +1 -0
- package/dist/api/routes/agent.js +619 -0
- package/dist/api/routes/agent.js.map +1 -0
- package/dist/api/routes/apple-calendar.d.ts +31 -0
- package/dist/api/routes/apple-calendar.d.ts.map +1 -0
- package/dist/api/routes/apple-calendar.js +310 -0
- package/dist/api/routes/apple-calendar.js.map +1 -0
- package/dist/api/routes/attachments.d.ts +36 -0
- package/dist/api/routes/attachments.d.ts.map +1 -0
- package/dist/api/routes/attachments.js +305 -0
- package/dist/api/routes/attachments.js.map +1 -0
- package/dist/api/routes/backends.d.ts +4 -0
- package/dist/api/routes/backends.d.ts.map +1 -0
- package/dist/api/routes/backends.js +1132 -0
- package/dist/api/routes/backends.js.map +1 -0
- package/dist/api/routes/books.d.ts +63 -0
- package/dist/api/routes/books.d.ts.map +1 -0
- package/dist/api/routes/books.js +467 -0
- package/dist/api/routes/books.js.map +1 -0
- package/dist/api/routes/calendar.d.ts +36 -0
- package/dist/api/routes/calendar.d.ts.map +1 -0
- package/dist/api/routes/calendar.js +351 -0
- package/dist/api/routes/calendar.js.map +1 -0
- package/dist/api/routes/commands.d.ts +4 -0
- package/dist/api/routes/commands.d.ts.map +1 -0
- package/dist/api/routes/commands.js +251 -0
- package/dist/api/routes/commands.js.map +1 -0
- package/dist/api/routes/context.d.ts +57 -0
- package/dist/api/routes/context.d.ts.map +1 -0
- package/dist/api/routes/context.js +1765 -0
- package/dist/api/routes/context.js.map +1 -0
- package/dist/api/routes/dashboard.d.ts +29 -0
- package/dist/api/routes/dashboard.d.ts.map +1 -0
- package/dist/api/routes/dashboard.js +2062 -0
- package/dist/api/routes/dashboard.js.map +1 -0
- package/dist/api/routes/delegated-sync.d.ts +4 -0
- package/dist/api/routes/delegated-sync.d.ts.map +1 -0
- package/dist/api/routes/delegated-sync.js +192 -0
- package/dist/api/routes/delegated-sync.js.map +1 -0
- package/dist/api/routes/delegated.d.ts +42 -0
- package/dist/api/routes/delegated.d.ts.map +1 -0
- package/dist/api/routes/delegated.js +250 -0
- package/dist/api/routes/delegated.js.map +1 -0
- package/dist/api/routes/docs.d.ts +34 -0
- package/dist/api/routes/docs.d.ts.map +1 -0
- package/dist/api/routes/docs.js +580 -0
- package/dist/api/routes/docs.js.map +1 -0
- package/dist/api/routes/entities.d.ts +9 -0
- package/dist/api/routes/entities.d.ts.map +1 -0
- package/dist/api/routes/entities.js +176 -0
- package/dist/api/routes/entities.js.map +1 -0
- package/dist/api/routes/git-accounts.d.ts +23 -0
- package/dist/api/routes/git-accounts.d.ts.map +1 -0
- package/dist/api/routes/git-accounts.js +227 -0
- package/dist/api/routes/git-accounts.js.map +1 -0
- package/dist/api/routes/git-templates.d.ts +50 -0
- package/dist/api/routes/git-templates.d.ts.map +1 -0
- package/dist/api/routes/git-templates.js +276 -0
- package/dist/api/routes/git-templates.js.map +1 -0
- package/dist/api/routes/git.d.ts +34 -0
- package/dist/api/routes/git.d.ts.map +1 -0
- package/dist/api/routes/git.js +126 -0
- package/dist/api/routes/git.js.map +1 -0
- package/dist/api/routes/github.d.ts +34 -0
- package/dist/api/routes/github.d.ts.map +1 -0
- package/dist/api/routes/github.js +465 -0
- package/dist/api/routes/github.js.map +1 -0
- package/dist/api/routes/health.d.ts +4 -0
- package/dist/api/routes/health.d.ts.map +1 -0
- package/dist/api/routes/health.js +257 -0
- package/dist/api/routes/health.js.map +1 -0
- package/dist/api/routes/integrations-reconcile.d.ts +33 -0
- package/dist/api/routes/integrations-reconcile.d.ts.map +1 -0
- package/dist/api/routes/integrations-reconcile.js +463 -0
- package/dist/api/routes/integrations-reconcile.js.map +1 -0
- package/dist/api/routes/integrations.d.ts +19 -0
- package/dist/api/routes/integrations.d.ts.map +1 -0
- package/dist/api/routes/integrations.js +1384 -0
- package/dist/api/routes/integrations.js.map +1 -0
- package/dist/api/routes/knowledge.d.ts +4 -0
- package/dist/api/routes/knowledge.d.ts.map +1 -0
- package/dist/api/routes/knowledge.js +224 -0
- package/dist/api/routes/knowledge.js.map +1 -0
- package/dist/api/routes/mail.d.ts +39 -0
- package/dist/api/routes/mail.d.ts.map +1 -0
- package/dist/api/routes/mail.js +1406 -0
- package/dist/api/routes/mail.js.map +1 -0
- package/dist/api/routes/managed-tasks.d.ts +48 -0
- package/dist/api/routes/managed-tasks.d.ts.map +1 -0
- package/dist/api/routes/managed-tasks.js +844 -0
- package/dist/api/routes/managed-tasks.js.map +1 -0
- package/dist/api/routes/mcp.d.ts +50 -0
- package/dist/api/routes/mcp.d.ts.map +1 -0
- package/dist/api/routes/mcp.js +470 -0
- package/dist/api/routes/mcp.js.map +1 -0
- package/dist/api/routes/metrics.d.ts +13 -0
- package/dist/api/routes/metrics.d.ts.map +1 -0
- package/dist/api/routes/metrics.js +117 -0
- package/dist/api/routes/metrics.js.map +1 -0
- package/dist/api/routes/notion.d.ts +35 -0
- package/dist/api/routes/notion.d.ts.map +1 -0
- package/dist/api/routes/notion.js +442 -0
- package/dist/api/routes/notion.js.map +1 -0
- package/dist/api/routes/observations.d.ts +4 -0
- package/dist/api/routes/observations.d.ts.map +1 -0
- package/dist/api/routes/observations.js +177 -0
- package/dist/api/routes/observations.js.map +1 -0
- package/dist/api/routes/obsidian.d.ts +16 -0
- package/dist/api/routes/obsidian.d.ts.map +1 -0
- package/dist/api/routes/obsidian.js +321 -0
- package/dist/api/routes/obsidian.js.map +1 -0
- package/dist/api/routes/profile-questions.d.ts +17 -0
- package/dist/api/routes/profile-questions.d.ts.map +1 -0
- package/dist/api/routes/profile-questions.js +115 -0
- package/dist/api/routes/profile-questions.js.map +1 -0
- package/dist/api/routes/receipts.d.ts +4 -0
- package/dist/api/routes/receipts.d.ts.map +1 -0
- package/dist/api/routes/receipts.js +155 -0
- package/dist/api/routes/receipts.js.map +1 -0
- package/dist/api/routes/recurring-schedules.d.ts +4 -0
- package/dist/api/routes/recurring-schedules.d.ts.map +1 -0
- package/dist/api/routes/recurring-schedules.js +137 -0
- package/dist/api/routes/recurring-schedules.js.map +1 -0
- package/dist/api/routes/repositories.d.ts +40 -0
- package/dist/api/routes/repositories.d.ts.map +1 -0
- package/dist/api/routes/repositories.js +857 -0
- package/dist/api/routes/repositories.js.map +1 -0
- package/dist/api/routes/setup-migrate.d.ts +74 -0
- package/dist/api/routes/setup-migrate.d.ts.map +1 -0
- package/dist/api/routes/setup-migrate.js +944 -0
- package/dist/api/routes/setup-migrate.js.map +1 -0
- package/dist/api/routes/setup.d.ts +4 -0
- package/dist/api/routes/setup.d.ts.map +1 -0
- package/dist/api/routes/setup.js +443 -0
- package/dist/api/routes/setup.js.map +1 -0
- package/dist/api/routes/skill-curation.d.ts +5 -0
- package/dist/api/routes/skill-curation.d.ts.map +1 -0
- package/dist/api/routes/skill-curation.js +728 -0
- package/dist/api/routes/skill-curation.js.map +1 -0
- package/dist/api/routes/skills.d.ts +52 -0
- package/dist/api/routes/skills.d.ts.map +1 -0
- package/dist/api/routes/skills.js +429 -0
- package/dist/api/routes/skills.js.map +1 -0
- package/dist/api/routes/sot-bindings.d.ts +20 -0
- package/dist/api/routes/sot-bindings.d.ts.map +1 -0
- package/dist/api/routes/sot-bindings.js +163 -0
- package/dist/api/routes/sot-bindings.js.map +1 -0
- package/dist/api/routes/sse.d.ts +86 -0
- package/dist/api/routes/sse.d.ts.map +1 -0
- package/dist/api/routes/sse.js +378 -0
- package/dist/api/routes/sse.js.map +1 -0
- package/dist/api/routes/system.d.ts +4 -0
- package/dist/api/routes/system.d.ts.map +1 -0
- package/dist/api/routes/system.js +207 -0
- package/dist/api/routes/system.js.map +1 -0
- package/dist/api/routes/task-flows.d.ts +30 -0
- package/dist/api/routes/task-flows.d.ts.map +1 -0
- package/dist/api/routes/task-flows.js +155 -0
- package/dist/api/routes/task-flows.js.map +1 -0
- package/dist/api/routes/travel-bookings.d.ts +4 -0
- package/dist/api/routes/travel-bookings.d.ts.map +1 -0
- package/dist/api/routes/travel-bookings.js +142 -0
- package/dist/api/routes/travel-bookings.js.map +1 -0
- package/dist/api/routes/travel-time.d.ts +8 -0
- package/dist/api/routes/travel-time.d.ts.map +1 -0
- package/dist/api/routes/travel-time.js +87 -0
- package/dist/api/routes/travel-time.js.map +1 -0
- package/dist/api/routes/triggers.d.ts +4 -0
- package/dist/api/routes/triggers.d.ts.map +1 -0
- package/dist/api/routes/triggers.js +101 -0
- package/dist/api/routes/triggers.js.map +1 -0
- package/dist/api/routes/voice.d.ts +48 -0
- package/dist/api/routes/voice.d.ts.map +1 -0
- package/dist/api/routes/voice.js +232 -0
- package/dist/api/routes/voice.js.map +1 -0
- package/dist/api/server.d.ts +428 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +558 -0
- package/dist/api/server.js.map +1 -0
- package/dist/config.d.ts +136 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +699 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-core.d.ts +517 -0
- package/dist/core/agent-core.d.ts.map +1 -0
- package/dist/core/agent-core.js +102 -0
- package/dist/core/agent-core.js.map +1 -0
- package/dist/core/alerts.d.ts +86 -0
- package/dist/core/alerts.d.ts.map +1 -0
- package/dist/core/alerts.js +304 -0
- package/dist/core/alerts.js.map +1 -0
- package/dist/core/atomic-write.d.ts +51 -0
- package/dist/core/atomic-write.d.ts.map +1 -0
- package/dist/core/atomic-write.js +135 -0
- package/dist/core/atomic-write.js.map +1 -0
- package/dist/core/backends/api-key-probe.d.ts +40 -0
- package/dist/core/backends/api-key-probe.d.ts.map +1 -0
- package/dist/core/backends/api-key-probe.js +116 -0
- package/dist/core/backends/api-key-probe.js.map +1 -0
- package/dist/core/backends/auth-health-monitor.d.ts +373 -0
- package/dist/core/backends/auth-health-monitor.d.ts.map +1 -0
- package/dist/core/backends/auth-health-monitor.js +950 -0
- package/dist/core/backends/auth-health-monitor.js.map +1 -0
- package/dist/core/backends/auth-recovery.d.ts +263 -0
- package/dist/core/backends/auth-recovery.d.ts.map +1 -0
- package/dist/core/backends/auth-recovery.js +1086 -0
- package/dist/core/backends/auth-recovery.js.map +1 -0
- package/dist/core/backends/auth-telemetry.d.ts +81 -0
- package/dist/core/backends/auth-telemetry.d.ts.map +1 -0
- package/dist/core/backends/auth-telemetry.js +108 -0
- package/dist/core/backends/auth-telemetry.js.map +1 -0
- package/dist/core/backends/backend-router.d.ts +272 -0
- package/dist/core/backends/backend-router.d.ts.map +1 -0
- package/dist/core/backends/backend-router.js +759 -0
- package/dist/core/backends/backend-router.js.map +1 -0
- package/dist/core/backends/claude-code-core.d.ts +299 -0
- package/dist/core/backends/claude-code-core.d.ts.map +1 -0
- package/dist/core/backends/claude-code-core.js +2541 -0
- package/dist/core/backends/claude-code-core.js.map +1 -0
- package/dist/core/backends/claude-credentials-store.d.ts +83 -0
- package/dist/core/backends/claude-credentials-store.d.ts.map +1 -0
- package/dist/core/backends/claude-credentials-store.js +243 -0
- package/dist/core/backends/claude-credentials-store.js.map +1 -0
- package/dist/core/backends/cli-utils.d.ts +95 -0
- package/dist/core/backends/cli-utils.d.ts.map +1 -0
- package/dist/core/backends/cli-utils.js +464 -0
- package/dist/core/backends/cli-utils.js.map +1 -0
- package/dist/core/backends/codex-core.d.ts +127 -0
- package/dist/core/backends/codex-core.d.ts.map +1 -0
- package/dist/core/backends/codex-core.js +1693 -0
- package/dist/core/backends/codex-core.js.map +1 -0
- package/dist/core/backends/gemini-cli-core.d.ts +367 -0
- package/dist/core/backends/gemini-cli-core.d.ts.map +1 -0
- package/dist/core/backends/gemini-cli-core.js +2331 -0
- package/dist/core/backends/gemini-cli-core.js.map +1 -0
- package/dist/core/backends/idle-watchdog.d.ts +77 -0
- package/dist/core/backends/idle-watchdog.d.ts.map +1 -0
- package/dist/core/backends/idle-watchdog.js +94 -0
- package/dist/core/backends/idle-watchdog.js.map +1 -0
- package/dist/core/backends/install-methods.d.ts +93 -0
- package/dist/core/backends/install-methods.d.ts.map +1 -0
- package/dist/core/backends/install-methods.js +267 -0
- package/dist/core/backends/install-methods.js.map +1 -0
- package/dist/core/backends/model-registry.d.ts +58 -0
- package/dist/core/backends/model-registry.d.ts.map +1 -0
- package/dist/core/backends/model-registry.js +539 -0
- package/dist/core/backends/model-registry.js.map +1 -0
- package/dist/core/backends/plan-presets.d.ts +123 -0
- package/dist/core/backends/plan-presets.d.ts.map +1 -0
- package/dist/core/backends/plan-presets.js +235 -0
- package/dist/core/backends/plan-presets.js.map +1 -0
- package/dist/core/backends/price-fetcher.d.ts +48 -0
- package/dist/core/backends/price-fetcher.d.ts.map +1 -0
- package/dist/core/backends/price-fetcher.js +248 -0
- package/dist/core/backends/price-fetcher.js.map +1 -0
- package/dist/core/backends/process-config-cascade.d.ts +68 -0
- package/dist/core/backends/process-config-cascade.d.ts.map +1 -0
- package/dist/core/backends/process-config-cascade.js +173 -0
- package/dist/core/backends/process-config-cascade.js.map +1 -0
- package/dist/core/backends/prompt-utils.d.ts +6 -0
- package/dist/core/backends/prompt-utils.d.ts.map +1 -0
- package/dist/core/backends/prompt-utils.js +80 -0
- package/dist/core/backends/prompt-utils.js.map +1 -0
- package/dist/core/backends/proxy-model-registry.d.ts +110 -0
- package/dist/core/backends/proxy-model-registry.d.ts.map +1 -0
- package/dist/core/backends/proxy-model-registry.js +195 -0
- package/dist/core/backends/proxy-model-registry.js.map +1 -0
- package/dist/core/backends/silent-api-error-detector.d.ts +31 -0
- package/dist/core/backends/silent-api-error-detector.d.ts.map +1 -0
- package/dist/core/backends/silent-api-error-detector.js +44 -0
- package/dist/core/backends/silent-api-error-detector.js.map +1 -0
- package/dist/core/bang-commands/commands-cost.d.ts +13 -0
- package/dist/core/bang-commands/commands-cost.d.ts.map +1 -0
- package/dist/core/bang-commands/commands-cost.js +91 -0
- package/dist/core/bang-commands/commands-cost.js.map +1 -0
- package/dist/core/bang-commands/commands-report.d.ts +18 -0
- package/dist/core/bang-commands/commands-report.d.ts.map +1 -0
- package/dist/core/bang-commands/commands-report.js +105 -0
- package/dist/core/bang-commands/commands-report.js.map +1 -0
- package/dist/core/bang-commands/commands-stop-start.d.ts +4 -0
- package/dist/core/bang-commands/commands-stop-start.d.ts.map +1 -0
- package/dist/core/bang-commands/commands-stop-start.js +88 -0
- package/dist/core/bang-commands/commands-stop-start.js.map +1 -0
- package/dist/core/bang-commands/format-utils.d.ts +34 -0
- package/dist/core/bang-commands/format-utils.d.ts.map +1 -0
- package/dist/core/bang-commands/format-utils.js +118 -0
- package/dist/core/bang-commands/format-utils.js.map +1 -0
- package/dist/core/bang-commands/index.d.ts +20 -0
- package/dist/core/bang-commands/index.d.ts.map +1 -0
- package/dist/core/bang-commands/index.js +31 -0
- package/dist/core/bang-commands/index.js.map +1 -0
- package/dist/core/bang-commands/registry.d.ts +72 -0
- package/dist/core/bang-commands/registry.d.ts.map +1 -0
- package/dist/core/bang-commands/registry.js +174 -0
- package/dist/core/bang-commands/registry.js.map +1 -0
- package/dist/core/bang-commands/user-commands.d.ts +86 -0
- package/dist/core/bang-commands/user-commands.d.ts.map +1 -0
- package/dist/core/bang-commands/user-commands.js +212 -0
- package/dist/core/bang-commands/user-commands.js.map +1 -0
- package/dist/core/channel-timeline.d.ts +28 -0
- package/dist/core/channel-timeline.d.ts.map +1 -0
- package/dist/core/channel-timeline.js +117 -0
- package/dist/core/channel-timeline.js.map +1 -0
- package/dist/core/character-block.d.ts +37 -0
- package/dist/core/character-block.d.ts.map +1 -0
- package/dist/core/character-block.js +162 -0
- package/dist/core/character-block.js.map +1 -0
- package/dist/core/context/activity-sources.d.ts +37 -0
- package/dist/core/context/activity-sources.d.ts.map +1 -0
- package/dist/core/context/activity-sources.js +69 -0
- package/dist/core/context/activity-sources.js.map +1 -0
- package/dist/core/context/activity-view-reconciler.d.ts +110 -0
- package/dist/core/context/activity-view-reconciler.d.ts.map +1 -0
- package/dist/core/context/activity-view-reconciler.js +252 -0
- package/dist/core/context/activity-view-reconciler.js.map +1 -0
- package/dist/core/context/activity-view-runner.d.ts +38 -0
- package/dist/core/context/activity-view-runner.d.ts.map +1 -0
- package/dist/core/context/activity-view-runner.js +402 -0
- package/dist/core/context/activity-view-runner.js.map +1 -0
- package/dist/core/context/default-schedules-reconciler.d.ts +85 -0
- package/dist/core/context/default-schedules-reconciler.d.ts.map +1 -0
- package/dist/core/context/default-schedules-reconciler.js +153 -0
- package/dist/core/context/default-schedules-reconciler.js.map +1 -0
- package/dist/core/context/default-schedules-runner.d.ts +40 -0
- package/dist/core/context/default-schedules-runner.d.ts.map +1 -0
- package/dist/core/context/default-schedules-runner.js +233 -0
- package/dist/core/context/default-schedules-runner.js.map +1 -0
- package/dist/core/context/domain-index-reconciler.d.ts +81 -0
- package/dist/core/context/domain-index-reconciler.d.ts.map +1 -0
- package/dist/core/context/domain-index-reconciler.js +199 -0
- package/dist/core/context/domain-index-reconciler.js.map +1 -0
- package/dist/core/context/domain-index-runner.d.ts +35 -0
- package/dist/core/context/domain-index-runner.d.ts.map +1 -0
- package/dist/core/context/domain-index-runner.js +223 -0
- package/dist/core/context/domain-index-runner.js.map +1 -0
- package/dist/core/context/entity-mirror.d.ts +227 -0
- package/dist/core/context/entity-mirror.d.ts.map +1 -0
- package/dist/core/context/entity-mirror.js +629 -0
- package/dist/core/context/entity-mirror.js.map +1 -0
- package/dist/core/context/entity-source-rename.d.ts +61 -0
- package/dist/core/context/entity-source-rename.d.ts.map +1 -0
- package/dist/core/context/entity-source-rename.js +237 -0
- package/dist/core/context/entity-source-rename.js.map +1 -0
- package/dist/core/context/index-reconciler.d.ts +61 -0
- package/dist/core/context/index-reconciler.d.ts.map +1 -0
- package/dist/core/context/index-reconciler.js +329 -0
- package/dist/core/context/index-reconciler.js.map +1 -0
- package/dist/core/context/policy-index-reconciler.d.ts +102 -0
- package/dist/core/context/policy-index-reconciler.d.ts.map +1 -0
- package/dist/core/context/policy-index-reconciler.js +202 -0
- package/dist/core/context/policy-index-reconciler.js.map +1 -0
- package/dist/core/context/policy-index-runner.d.ts +66 -0
- package/dist/core/context/policy-index-runner.d.ts.map +1 -0
- package/dist/core/context/policy-index-runner.js +406 -0
- package/dist/core/context/policy-index-runner.js.map +1 -0
- package/dist/core/context/reconciler-runner.d.ts +44 -0
- package/dist/core/context/reconciler-runner.d.ts.map +1 -0
- package/dist/core/context/reconciler-runner.js +273 -0
- package/dist/core/context/reconciler-runner.js.map +1 -0
- package/dist/core/context-builder.d.ts +115 -0
- package/dist/core/context-builder.d.ts.map +1 -0
- package/dist/core/context-builder.js +1148 -0
- package/dist/core/context-builder.js.map +1 -0
- package/dist/core/context-frontmatter-backfill.d.ts +33 -0
- package/dist/core/context-frontmatter-backfill.d.ts.map +1 -0
- package/dist/core/context-frontmatter-backfill.js +111 -0
- package/dist/core/context-frontmatter-backfill.js.map +1 -0
- package/dist/core/context-frontmatter.d.ts +13 -0
- package/dist/core/context-frontmatter.d.ts.map +1 -0
- package/dist/core/context-frontmatter.js +325 -0
- package/dist/core/context-frontmatter.js.map +1 -0
- package/dist/core/context-health.d.ts +51 -0
- package/dist/core/context-health.d.ts.map +1 -0
- package/dist/core/context-health.js +304 -0
- package/dist/core/context-health.js.map +1 -0
- package/dist/core/context-paths.d.ts +183 -0
- package/dist/core/context-paths.d.ts.map +1 -0
- package/dist/core/context-paths.js +241 -0
- package/dist/core/context-paths.js.map +1 -0
- package/dist/core/context-staleness.d.ts +45 -0
- package/dist/core/context-staleness.d.ts.map +1 -0
- package/dist/core/context-staleness.js +88 -0
- package/dist/core/context-staleness.js.map +1 -0
- package/dist/core/custom-routine-scheduler.d.ts +151 -0
- package/dist/core/custom-routine-scheduler.d.ts.map +1 -0
- package/dist/core/custom-routine-scheduler.js +335 -0
- package/dist/core/custom-routine-scheduler.js.map +1 -0
- package/dist/core/daemon-api-cli.d.ts +33 -0
- package/dist/core/daemon-api-cli.d.ts.map +1 -0
- package/dist/core/daemon-api-cli.js +614 -0
- package/dist/core/daemon-api-cli.js.map +1 -0
- package/dist/core/dashboard-session-cleanup.d.ts +39 -0
- package/dist/core/dashboard-session-cleanup.d.ts.map +1 -0
- package/dist/core/dashboard-session-cleanup.js +108 -0
- package/dist/core/dashboard-session-cleanup.js.map +1 -0
- package/dist/core/dashboard-session-controls.d.ts +41 -0
- package/dist/core/dashboard-session-controls.d.ts.map +1 -0
- package/dist/core/dashboard-session-controls.js +154 -0
- package/dist/core/dashboard-session-controls.js.map +1 -0
- package/dist/core/delegated-connector-health.d.ts +63 -0
- package/dist/core/delegated-connector-health.d.ts.map +1 -0
- package/dist/core/delegated-connector-health.js +157 -0
- package/dist/core/delegated-connector-health.js.map +1 -0
- package/dist/core/dispatcher.d.ts +999 -0
- package/dist/core/dispatcher.d.ts.map +1 -0
- package/dist/core/dispatcher.js +4378 -0
- package/dist/core/dispatcher.js.map +1 -0
- package/dist/core/dm-freshness-metrics.d.ts +73 -0
- package/dist/core/dm-freshness-metrics.d.ts.map +1 -0
- package/dist/core/dm-freshness-metrics.js +138 -0
- package/dist/core/dm-freshness-metrics.js.map +1 -0
- package/dist/core/docs/citation-validator.d.ts +73 -0
- package/dist/core/docs/citation-validator.d.ts.map +1 -0
- package/dist/core/docs/citation-validator.js +195 -0
- package/dist/core/docs/citation-validator.js.map +1 -0
- package/dist/core/docs/extract-terms.d.ts +78 -0
- package/dist/core/docs/extract-terms.d.ts.map +1 -0
- package/dist/core/docs/extract-terms.js +147 -0
- package/dist/core/docs/extract-terms.js.map +1 -0
- package/dist/core/docs/indexer.d.ts +104 -0
- package/dist/core/docs/indexer.d.ts.map +1 -0
- package/dist/core/docs/indexer.js +340 -0
- package/dist/core/docs/indexer.js.map +1 -0
- package/dist/core/drift-effects.d.ts +30 -0
- package/dist/core/drift-effects.d.ts.map +1 -0
- package/dist/core/drift-effects.js +384 -0
- package/dist/core/drift-effects.js.map +1 -0
- package/dist/core/event-bus.d.ts +56 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +135 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/git-project-docs.d.ts +77 -0
- package/dist/core/git-project-docs.d.ts.map +1 -0
- package/dist/core/git-project-docs.js +439 -0
- package/dist/core/git-project-docs.js.map +1 -0
- package/dist/core/health-monitor.d.ts +57 -0
- package/dist/core/health-monitor.d.ts.map +1 -0
- package/dist/core/health-monitor.js +137 -0
- package/dist/core/health-monitor.js.map +1 -0
- package/dist/core/heartbeat.d.ts +26 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +48 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/integration-health.d.ts +49 -0
- package/dist/core/integration-health.d.ts.map +1 -0
- package/dist/core/integration-health.js +89 -0
- package/dist/core/integration-health.js.map +1 -0
- package/dist/core/integration-lifecycle.d.ts +79 -0
- package/dist/core/integration-lifecycle.d.ts.map +1 -0
- package/dist/core/integration-lifecycle.js +153 -0
- package/dist/core/integration-lifecycle.js.map +1 -0
- package/dist/core/integration-main-backend.d.ts +36 -0
- package/dist/core/integration-main-backend.d.ts.map +1 -0
- package/dist/core/integration-main-backend.js +59 -0
- package/dist/core/integration-main-backend.js.map +1 -0
- package/dist/core/integration-probe.d.ts +98 -0
- package/dist/core/integration-probe.d.ts.map +1 -0
- package/dist/core/integration-probe.js +152 -0
- package/dist/core/integration-probe.js.map +1 -0
- package/dist/core/management-md-write-lock.d.ts +68 -0
- package/dist/core/management-md-write-lock.d.ts.map +1 -0
- package/dist/core/management-md-write-lock.js +93 -0
- package/dist/core/management-md-write-lock.js.map +1 -0
- package/dist/core/management-md.d.ts +186 -0
- package/dist/core/management-md.d.ts.map +1 -0
- package/dist/core/management-md.js +652 -0
- package/dist/core/management-md.js.map +1 -0
- package/dist/core/management-registry.d.ts +245 -0
- package/dist/core/management-registry.d.ts.map +1 -0
- package/dist/core/management-registry.js +906 -0
- package/dist/core/management-registry.js.map +1 -0
- package/dist/core/management-telemetry.d.ts +100 -0
- package/dist/core/management-telemetry.d.ts.map +1 -0
- package/dist/core/management-telemetry.js +156 -0
- package/dist/core/management-telemetry.js.map +1 -0
- package/dist/core/message-recorder.d.ts +38 -0
- package/dist/core/message-recorder.d.ts.map +1 -0
- package/dist/core/message-recorder.js +88 -0
- package/dist/core/message-recorder.js.map +1 -0
- package/dist/core/metrics.d.ts +338 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +747 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/migration-backup.d.ts +218 -0
- package/dist/core/migration-backup.d.ts.map +1 -0
- package/dist/core/migration-backup.js +934 -0
- package/dist/core/migration-backup.js.map +1 -0
- package/dist/core/overview-write-lock.d.ts +48 -0
- package/dist/core/overview-write-lock.d.ts.map +1 -0
- package/dist/core/overview-write-lock.js +56 -0
- package/dist/core/overview-write-lock.js.map +1 -0
- package/dist/core/path-compat.d.ts +22 -0
- package/dist/core/path-compat.d.ts.map +1 -0
- package/dist/core/path-compat.js +67 -0
- package/dist/core/path-compat.js.map +1 -0
- package/dist/core/path-rewrite.d.ts +58 -0
- package/dist/core/path-rewrite.d.ts.map +1 -0
- package/dist/core/path-rewrite.js +141 -0
- package/dist/core/path-rewrite.js.map +1 -0
- package/dist/core/policy-files.d.ts +108 -0
- package/dist/core/policy-files.d.ts.map +1 -0
- package/dist/core/policy-files.js +198 -0
- package/dist/core/policy-files.js.map +1 -0
- package/dist/core/profile-questions/seed.d.ts +44 -0
- package/dist/core/profile-questions/seed.d.ts.map +1 -0
- package/dist/core/profile-questions/seed.js +173 -0
- package/dist/core/profile-questions/seed.js.map +1 -0
- package/dist/core/profile-questions/slot-filled.d.ts +51 -0
- package/dist/core/profile-questions/slot-filled.d.ts.map +1 -0
- package/dist/core/profile-questions/slot-filled.js +118 -0
- package/dist/core/profile-questions/slot-filled.js.map +1 -0
- package/dist/core/prompts.d.ts +111 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +267 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/quiet-hours-sync.d.ts +15 -0
- package/dist/core/quiet-hours-sync.d.ts.map +1 -0
- package/dist/core/quiet-hours-sync.js +51 -0
- package/dist/core/quiet-hours-sync.js.map +1 -0
- package/dist/core/read-sensitive-token-manager.d.ts +19 -0
- package/dist/core/read-sensitive-token-manager.d.ts.map +1 -0
- package/dist/core/read-sensitive-token-manager.js +29 -0
- package/dist/core/read-sensitive-token-manager.js.map +1 -0
- package/dist/core/recurrence.d.ts +24 -0
- package/dist/core/recurrence.d.ts.map +1 -0
- package/dist/core/recurrence.js +162 -0
- package/dist/core/recurrence.js.map +1 -0
- package/dist/core/reinstall.d.ts +107 -0
- package/dist/core/reinstall.d.ts.map +1 -0
- package/dist/core/reinstall.js +163 -0
- package/dist/core/reinstall.js.map +1 -0
- package/dist/core/release-assets.d.ts +106 -0
- package/dist/core/release-assets.d.ts.map +1 -0
- package/dist/core/release-assets.js +434 -0
- package/dist/core/release-assets.js.map +1 -0
- package/dist/core/repository-management-docs.d.ts +216 -0
- package/dist/core/repository-management-docs.d.ts.map +1 -0
- package/dist/core/repository-management-docs.js +855 -0
- package/dist/core/repository-management-docs.js.map +1 -0
- package/dist/core/retention.d.ts +164 -0
- package/dist/core/retention.d.ts.map +1 -0
- package/dist/core/retention.js +1008 -0
- package/dist/core/retention.js.map +1 -0
- package/dist/core/review-context.d.ts +48 -0
- package/dist/core/review-context.d.ts.map +1 -0
- package/dist/core/review-context.js +282 -0
- package/dist/core/review-context.js.map +1 -0
- package/dist/core/roadmap-horizon.d.ts +48 -0
- package/dist/core/roadmap-horizon.d.ts.map +1 -0
- package/dist/core/roadmap-horizon.js +213 -0
- package/dist/core/roadmap-horizon.js.map +1 -0
- package/dist/core/roadmap-ids.d.ts +57 -0
- package/dist/core/roadmap-ids.d.ts.map +1 -0
- package/dist/core/roadmap-ids.js +118 -0
- package/dist/core/roadmap-ids.js.map +1 -0
- package/dist/core/roadmap-merge.d.ts +7 -0
- package/dist/core/roadmap-merge.d.ts.map +1 -0
- package/dist/core/roadmap-merge.js +187 -0
- package/dist/core/roadmap-merge.js.map +1 -0
- package/dist/core/roadmap-refresh-triggers.d.ts +32 -0
- package/dist/core/roadmap-refresh-triggers.d.ts.map +1 -0
- package/dist/core/roadmap-refresh-triggers.js +51 -0
- package/dist/core/roadmap-refresh-triggers.js.map +1 -0
- package/dist/core/roadmap-truncate.d.ts +49 -0
- package/dist/core/roadmap-truncate.d.ts.map +1 -0
- package/dist/core/roadmap-truncate.js +152 -0
- package/dist/core/roadmap-truncate.js.map +1 -0
- package/dist/core/roadmap-validate.d.ts +31 -0
- package/dist/core/roadmap-validate.d.ts.map +1 -0
- package/dist/core/roadmap-validate.js +403 -0
- package/dist/core/roadmap-validate.js.map +1 -0
- package/dist/core/roadmap-write-lock.d.ts +53 -0
- package/dist/core/roadmap-write-lock.d.ts.map +1 -0
- package/dist/core/roadmap-write-lock.js +59 -0
- package/dist/core/roadmap-write-lock.js.map +1 -0
- package/dist/core/schedule-insert-helper.d.ts +46 -0
- package/dist/core/schedule-insert-helper.d.ts.map +1 -0
- package/dist/core/schedule-insert-helper.js +52 -0
- package/dist/core/schedule-insert-helper.js.map +1 -0
- package/dist/core/schedule-maintenance.d.ts +22 -0
- package/dist/core/schedule-maintenance.d.ts.map +1 -0
- package/dist/core/schedule-maintenance.js +57 -0
- package/dist/core/schedule-maintenance.js.map +1 -0
- package/dist/core/scheduler.d.ts +208 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +896 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/semaphore.d.ts +13 -0
- package/dist/core/semaphore.d.ts.map +1 -0
- package/dist/core/semaphore.js +31 -0
- package/dist/core/semaphore.js.map +1 -0
- package/dist/core/session-gate.d.ts +37 -0
- package/dist/core/session-gate.d.ts.map +1 -0
- package/dist/core/session-gate.js +69 -0
- package/dist/core/session-gate.js.map +1 -0
- package/dist/core/session-manager.d.ts +252 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +716 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/signal-detector.d.ts +97 -0
- package/dist/core/signal-detector.d.ts.map +1 -0
- package/dist/core/signal-detector.js +215 -0
- package/dist/core/signal-detector.js.map +1 -0
- package/dist/core/skeleton.d.ts +83 -0
- package/dist/core/skeleton.d.ts.map +1 -0
- package/dist/core/skeleton.js +255 -0
- package/dist/core/skeleton.js.map +1 -0
- package/dist/core/skill-curation/apply-proposal.d.ts +71 -0
- package/dist/core/skill-curation/apply-proposal.d.ts.map +1 -0
- package/dist/core/skill-curation/apply-proposal.js +175 -0
- package/dist/core/skill-curation/apply-proposal.js.map +1 -0
- package/dist/core/skill-curation/auto-revert.d.ts +43 -0
- package/dist/core/skill-curation/auto-revert.d.ts.map +1 -0
- package/dist/core/skill-curation/auto-revert.js +155 -0
- package/dist/core/skill-curation/auto-revert.js.map +1 -0
- package/dist/core/skill-curation/classify-diff.d.ts +27 -0
- package/dist/core/skill-curation/classify-diff.d.ts.map +1 -0
- package/dist/core/skill-curation/classify-diff.js +0 -0
- package/dist/core/skill-curation/classify-diff.js.map +1 -0
- package/dist/core/skill-curation/declarations.d.ts +32 -0
- package/dist/core/skill-curation/declarations.d.ts.map +1 -0
- package/dist/core/skill-curation/declarations.js +171 -0
- package/dist/core/skill-curation/declarations.js.map +1 -0
- package/dist/core/skill-curation/knowledge-map.d.ts +26 -0
- package/dist/core/skill-curation/knowledge-map.d.ts.map +1 -0
- package/dist/core/skill-curation/knowledge-map.js +154 -0
- package/dist/core/skill-curation/knowledge-map.js.map +1 -0
- package/dist/core/skill-curation/orphan-overlay.d.ts +35 -0
- package/dist/core/skill-curation/orphan-overlay.d.ts.map +1 -0
- package/dist/core/skill-curation/orphan-overlay.js +167 -0
- package/dist/core/skill-curation/orphan-overlay.js.map +1 -0
- package/dist/core/skill-curation/overlay-store.d.ts +41 -0
- package/dist/core/skill-curation/overlay-store.d.ts.map +1 -0
- package/dist/core/skill-curation/overlay-store.js +143 -0
- package/dist/core/skill-curation/overlay-store.js.map +1 -0
- package/dist/core/skill-curation/render/convention-notes.d.ts +4 -0
- package/dist/core/skill-curation/render/convention-notes.d.ts.map +1 -0
- package/dist/core/skill-curation/render/convention-notes.js +13 -0
- package/dist/core/skill-curation/render/convention-notes.js.map +1 -0
- package/dist/core/skill-curation/render/cross-references.d.ts +4 -0
- package/dist/core/skill-curation/render/cross-references.d.ts.map +1 -0
- package/dist/core/skill-curation/render/cross-references.js +10 -0
- package/dist/core/skill-curation/render/cross-references.js.map +1 -0
- package/dist/core/skill-curation/render/frontmatter-schema.d.ts +4 -0
- package/dist/core/skill-curation/render/frontmatter-schema.d.ts.map +1 -0
- package/dist/core/skill-curation/render/frontmatter-schema.js +25 -0
- package/dist/core/skill-curation/render/frontmatter-schema.js.map +1 -0
- package/dist/core/skill-curation/render/index.d.ts +5 -0
- package/dist/core/skill-curation/render/index.d.ts.map +1 -0
- package/dist/core/skill-curation/render/index.js +42 -0
- package/dist/core/skill-curation/render/index.js.map +1 -0
- package/dist/core/skill-curation/render/knowledge-layout.d.ts +4 -0
- package/dist/core/skill-curation/render/knowledge-layout.d.ts.map +1 -0
- package/dist/core/skill-curation/render/knowledge-layout.js +36 -0
- package/dist/core/skill-curation/render/knowledge-layout.js.map +1 -0
- package/dist/core/skill-curation/render/routing-table.d.ts +4 -0
- package/dist/core/skill-curation/render/routing-table.d.ts.map +1 -0
- package/dist/core/skill-curation/render/routing-table.js +37 -0
- package/dist/core/skill-curation/render/routing-table.js.map +1 -0
- package/dist/core/skill-curation/render/search-recipes.d.ts +4 -0
- package/dist/core/skill-curation/render/search-recipes.d.ts.map +1 -0
- package/dist/core/skill-curation/render/search-recipes.js +39 -0
- package/dist/core/skill-curation/render/search-recipes.js.map +1 -0
- package/dist/core/skill-curation/run-token.d.ts +27 -0
- package/dist/core/skill-curation/run-token.d.ts.map +1 -0
- package/dist/core/skill-curation/run-token.js +81 -0
- package/dist/core/skill-curation/run-token.js.map +1 -0
- package/dist/core/skill-curation/signals.d.ts +49 -0
- package/dist/core/skill-curation/signals.d.ts.map +1 -0
- package/dist/core/skill-curation/signals.js +149 -0
- package/dist/core/skill-curation/signals.js.map +1 -0
- package/dist/core/skill-curation/smoke-test.d.ts +39 -0
- package/dist/core/skill-curation/smoke-test.d.ts.map +1 -0
- package/dist/core/skill-curation/smoke-test.js +313 -0
- package/dist/core/skill-curation/smoke-test.js.map +1 -0
- package/dist/core/skill-curation/splicer.d.ts +16 -0
- package/dist/core/skill-curation/splicer.d.ts.map +1 -0
- package/dist/core/skill-curation/splicer.js +78 -0
- package/dist/core/skill-curation/splicer.js.map +1 -0
- package/dist/core/skill-curation/workdir.d.ts +40 -0
- package/dist/core/skill-curation/workdir.d.ts.map +1 -0
- package/dist/core/skill-curation/workdir.js +242 -0
- package/dist/core/skill-curation/workdir.js.map +1 -0
- package/dist/core/skills-compiler.d.ts +391 -0
- package/dist/core/skills-compiler.d.ts.map +1 -0
- package/dist/core/skills-compiler.js +1271 -0
- package/dist/core/skills-compiler.js.map +1 -0
- package/dist/core/skills-manifest.d.ts +8 -0
- package/dist/core/skills-manifest.d.ts.map +1 -0
- package/dist/core/skills-manifest.js +408 -0
- package/dist/core/skills-manifest.js.map +1 -0
- package/dist/core/system-reset.d.ts +268 -0
- package/dist/core/system-reset.d.ts.map +1 -0
- package/dist/core/system-reset.js +816 -0
- package/dist/core/system-reset.js.map +1 -0
- package/dist/core/template-store.d.ts +170 -0
- package/dist/core/template-store.d.ts.map +1 -0
- package/dist/core/template-store.js +388 -0
- package/dist/core/template-store.js.map +1 -0
- package/dist/core/template-versions.d.ts +95 -0
- package/dist/core/template-versions.d.ts.map +1 -0
- package/dist/core/template-versions.js +175 -0
- package/dist/core/template-versions.js.map +1 -0
- package/dist/core/today-agent-plan.d.ts +33 -0
- package/dist/core/today-agent-plan.d.ts.map +1 -0
- package/dist/core/today-agent-plan.js +120 -0
- package/dist/core/today-agent-plan.js.map +1 -0
- package/dist/core/today-direct-writer.d.ts +62 -0
- package/dist/core/today-direct-writer.d.ts.map +1 -0
- package/dist/core/today-direct-writer.js +132 -0
- package/dist/core/today-direct-writer.js.map +1 -0
- package/dist/core/today-write-lock.d.ts +89 -0
- package/dist/core/today-write-lock.d.ts.map +1 -0
- package/dist/core/today-write-lock.js +154 -0
- package/dist/core/today-write-lock.js.map +1 -0
- package/dist/core/trigger-dispatch.d.ts +31 -0
- package/dist/core/trigger-dispatch.d.ts.map +1 -0
- package/dist/core/trigger-dispatch.js +100 -0
- package/dist/core/trigger-dispatch.js.map +1 -0
- package/dist/core/trigger-evaluator.d.ts +59 -0
- package/dist/core/trigger-evaluator.d.ts.map +1 -0
- package/dist/core/trigger-evaluator.js +243 -0
- package/dist/core/trigger-evaluator.js.map +1 -0
- package/dist/core/workdir.d.ts +241 -0
- package/dist/core/workdir.d.ts.map +1 -0
- package/dist/core/workdir.js +565 -0
- package/dist/core/workdir.js.map +1 -0
- package/dist/db/automation-triggers.d.ts +90 -0
- package/dist/db/automation-triggers.d.ts.map +1 -0
- package/dist/db/automation-triggers.js +199 -0
- package/dist/db/automation-triggers.js.map +1 -0
- package/dist/db/client.d.ts +6 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +47 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/entities-store.d.ts +92 -0
- package/dist/db/entities-store.d.ts.map +1 -0
- package/dist/db/entities-store.js +180 -0
- package/dist/db/entities-store.js.map +1 -0
- package/dist/db/hourly-check-signals.d.ts +78 -0
- package/dist/db/hourly-check-signals.d.ts.map +1 -0
- package/dist/db/hourly-check-signals.js +289 -0
- package/dist/db/hourly-check-signals.js.map +1 -0
- package/dist/db/integration-probe-store.d.ts +27 -0
- package/dist/db/integration-probe-store.d.ts.map +1 -0
- package/dist/db/integration-probe-store.js +75 -0
- package/dist/db/integration-probe-store.js.map +1 -0
- package/dist/db/integrations-store.d.ts +19 -0
- package/dist/db/integrations-store.d.ts.map +1 -0
- package/dist/db/integrations-store.js +85 -0
- package/dist/db/integrations-store.js.map +1 -0
- package/dist/db/managed-tasks-store.d.ts +130 -0
- package/dist/db/managed-tasks-store.d.ts.map +1 -0
- package/dist/db/managed-tasks-store.js +238 -0
- package/dist/db/managed-tasks-store.js.map +1 -0
- package/dist/db/management-parse-failures-store.d.ts +45 -0
- package/dist/db/management-parse-failures-store.d.ts.map +1 -0
- package/dist/db/management-parse-failures-store.js +36 -0
- package/dist/db/management-parse-failures-store.js.map +1 -0
- package/dist/db/observations.d.ts +145 -0
- package/dist/db/observations.d.ts.map +1 -0
- package/dist/db/observations.js +287 -0
- package/dist/db/observations.js.map +1 -0
- package/dist/db/recurring-schedules.d.ts +70 -0
- package/dist/db/recurring-schedules.d.ts.map +1 -0
- package/dist/db/recurring-schedules.js +213 -0
- package/dist/db/recurring-schedules.js.map +1 -0
- package/dist/db/repositories-store.d.ts +296 -0
- package/dist/db/repositories-store.d.ts.map +1 -0
- package/dist/db/repositories-store.js +754 -0
- package/dist/db/repositories-store.js.map +1 -0
- package/dist/db/runtime-state.d.ts +61 -0
- package/dist/db/runtime-state.d.ts.map +1 -0
- package/dist/db/runtime-state.js +104 -0
- package/dist/db/runtime-state.js.map +1 -0
- package/dist/db/schema.d.ts +4 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +1338 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sot-bindings-store.d.ts +41 -0
- package/dist/db/sot-bindings-store.d.ts.map +1 -0
- package/dist/db/sot-bindings-store.js +64 -0
- package/dist/db/sot-bindings-store.js.map +1 -0
- package/dist/db/test-schemas.d.ts +23 -0
- package/dist/db/test-schemas.d.ts.map +1 -0
- package/dist/db/test-schemas.js +111 -0
- package/dist/db/test-schemas.js.map +1 -0
- package/dist/db/voice-transcripts-store.d.ts +28 -0
- package/dist/db/voice-transcripts-store.d.ts.map +1 -0
- package/dist/db/voice-transcripts-store.js +43 -0
- package/dist/db/voice-transcripts-store.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2913 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +7 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +32 -0
- package/dist/init.js.map +1 -0
- package/dist/log-buffer.d.ts +71 -0
- package/dist/log-buffer.d.ts.map +1 -0
- package/dist/log-buffer.js +201 -0
- package/dist/log-buffer.js.map +1 -0
- package/dist/logging.d.ts +5 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +130 -0
- package/dist/logging.js.map +1 -0
- package/dist/management-rules.d.ts +2 -0
- package/dist/management-rules.d.ts.map +1 -0
- package/dist/management-rules.js +62 -0
- package/dist/management-rules.js.map +1 -0
- package/dist/messaging/constants.d.ts +33 -0
- package/dist/messaging/constants.d.ts.map +1 -0
- package/dist/messaging/constants.js +52 -0
- package/dist/messaging/constants.js.map +1 -0
- package/dist/messaging/magic-phrase.d.ts +16 -0
- package/dist/messaging/magic-phrase.d.ts.map +1 -0
- package/dist/messaging/magic-phrase.js +103 -0
- package/dist/messaging/magic-phrase.js.map +1 -0
- package/dist/messaging/owner-channels.d.ts +20 -0
- package/dist/messaging/owner-channels.d.ts.map +1 -0
- package/dist/messaging/owner-channels.js +41 -0
- package/dist/messaging/owner-channels.js.map +1 -0
- package/dist/observers/calendar-poller.d.ts +51 -0
- package/dist/observers/calendar-poller.d.ts.map +1 -0
- package/dist/observers/calendar-poller.js +128 -0
- package/dist/observers/calendar-poller.js.map +1 -0
- package/dist/observers/context-index-reconciler-observer.d.ts +72 -0
- package/dist/observers/context-index-reconciler-observer.d.ts.map +1 -0
- package/dist/observers/context-index-reconciler-observer.js +253 -0
- package/dist/observers/context-index-reconciler-observer.js.map +1 -0
- package/dist/observers/delegated-probe-observer.d.ts +83 -0
- package/dist/observers/delegated-probe-observer.d.ts.map +1 -0
- package/dist/observers/delegated-probe-observer.js +237 -0
- package/dist/observers/delegated-probe-observer.js.map +1 -0
- package/dist/observers/delegated-sync-worker.d.ts +375 -0
- package/dist/observers/delegated-sync-worker.d.ts.map +1 -0
- package/dist/observers/delegated-sync-worker.js +1087 -0
- package/dist/observers/delegated-sync-worker.js.map +1 -0
- package/dist/observers/entity-mirror-observer.d.ts +55 -0
- package/dist/observers/entity-mirror-observer.d.ts.map +1 -0
- package/dist/observers/entity-mirror-observer.js +73 -0
- package/dist/observers/entity-mirror-observer.js.map +1 -0
- package/dist/observers/git-delegated-cron.d.ts +41 -0
- package/dist/observers/git-delegated-cron.d.ts.map +1 -0
- package/dist/observers/git-delegated-cron.js +159 -0
- package/dist/observers/git-delegated-cron.js.map +1 -0
- package/dist/observers/git-event-classifier.d.ts +52 -0
- package/dist/observers/git-event-classifier.d.ts.map +1 -0
- package/dist/observers/git-event-classifier.js +70 -0
- package/dist/observers/git-event-classifier.js.map +1 -0
- package/dist/observers/git-watcher.d.ts +162 -0
- package/dist/observers/git-watcher.d.ts.map +1 -0
- package/dist/observers/git-watcher.js +768 -0
- package/dist/observers/git-watcher.js.map +1 -0
- package/dist/observers/github-poller-classifier.d.ts +101 -0
- package/dist/observers/github-poller-classifier.d.ts.map +1 -0
- package/dist/observers/github-poller-classifier.js +199 -0
- package/dist/observers/github-poller-classifier.js.map +1 -0
- package/dist/observers/github-poller.d.ts +291 -0
- package/dist/observers/github-poller.d.ts.map +1 -0
- package/dist/observers/github-poller.js +609 -0
- package/dist/observers/github-poller.js.map +1 -0
- package/dist/observers/imminent-event-scheduler.d.ts +34 -0
- package/dist/observers/imminent-event-scheduler.d.ts.map +1 -0
- package/dist/observers/imminent-event-scheduler.js +125 -0
- package/dist/observers/imminent-event-scheduler.js.map +1 -0
- package/dist/observers/mail-poller.d.ts +133 -0
- package/dist/observers/mail-poller.d.ts.map +1 -0
- package/dist/observers/mail-poller.js +563 -0
- package/dist/observers/mail-poller.js.map +1 -0
- package/dist/observers/mail-reconciliation.d.ts +87 -0
- package/dist/observers/mail-reconciliation.d.ts.map +1 -0
- package/dist/observers/mail-reconciliation.js +241 -0
- package/dist/observers/mail-reconciliation.js.map +1 -0
- package/dist/observers/manager.d.ts +67 -0
- package/dist/observers/manager.d.ts.map +1 -0
- package/dist/observers/manager.js +136 -0
- package/dist/observers/manager.js.map +1 -0
- package/dist/observers/notion-poller.d.ts +43 -0
- package/dist/observers/notion-poller.d.ts.map +1 -0
- package/dist/observers/notion-poller.js +184 -0
- package/dist/observers/notion-poller.js.map +1 -0
- package/dist/observers/observation-summarizer/index.d.ts +13 -0
- package/dist/observers/observation-summarizer/index.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/index.js +13 -0
- package/dist/observers/observation-summarizer/index.js.map +1 -0
- package/dist/observers/observation-summarizer/pre-filter.d.ts +62 -0
- package/dist/observers/observation-summarizer/pre-filter.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/pre-filter.js +189 -0
- package/dist/observers/observation-summarizer/pre-filter.js.map +1 -0
- package/dist/observers/observation-summarizer/response-parser.d.ts +30 -0
- package/dist/observers/observation-summarizer/response-parser.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/response-parser.js +106 -0
- package/dist/observers/observation-summarizer/response-parser.js.map +1 -0
- package/dist/observers/observation-summarizer/summarizer-client.d.ts +83 -0
- package/dist/observers/observation-summarizer/summarizer-client.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/summarizer-client.js +185 -0
- package/dist/observers/observation-summarizer/summarizer-client.js.map +1 -0
- package/dist/observers/observation-summarizer/summarizer-prompts.d.ts +51 -0
- package/dist/observers/observation-summarizer/summarizer-prompts.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/summarizer-prompts.js +286 -0
- package/dist/observers/observation-summarizer/summarizer-prompts.js.map +1 -0
- package/dist/observers/observation-summarizer/worker.d.ts +106 -0
- package/dist/observers/observation-summarizer/worker.d.ts.map +1 -0
- package/dist/observers/observation-summarizer/worker.js +311 -0
- package/dist/observers/observation-summarizer/worker.js.map +1 -0
- package/dist/observers/obsidian-watcher.d.ts +90 -0
- package/dist/observers/obsidian-watcher.d.ts.map +1 -0
- package/dist/observers/obsidian-watcher.js +166 -0
- package/dist/observers/obsidian-watcher.js.map +1 -0
- package/dist/observers/primary-vault-watcher.d.ts +73 -0
- package/dist/observers/primary-vault-watcher.d.ts.map +1 -0
- package/dist/observers/primary-vault-watcher.js +115 -0
- package/dist/observers/primary-vault-watcher.js.map +1 -0
- package/dist/observers/repository-management-cron.d.ts +70 -0
- package/dist/observers/repository-management-cron.d.ts.map +1 -0
- package/dist/observers/repository-management-cron.js +166 -0
- package/dist/observers/repository-management-cron.js.map +1 -0
- package/dist/observers/skill-curation-walker.d.ts +33 -0
- package/dist/observers/skill-curation-walker.d.ts.map +1 -0
- package/dist/observers/skill-curation-walker.js +216 -0
- package/dist/observers/skill-curation-walker.js.map +1 -0
- package/dist/safety/absolute-block-audit.d.ts +22 -0
- package/dist/safety/absolute-block-audit.d.ts.map +1 -0
- package/dist/safety/absolute-block-audit.js +32 -0
- package/dist/safety/absolute-block-audit.js.map +1 -0
- package/dist/safety/agent-write-tracker.d.ts +42 -0
- package/dist/safety/agent-write-tracker.d.ts.map +1 -0
- package/dist/safety/agent-write-tracker.js +82 -0
- package/dist/safety/agent-write-tracker.js.map +1 -0
- package/dist/safety/always-disallowed.d.ts +66 -0
- package/dist/safety/always-disallowed.d.ts.map +1 -0
- package/dist/safety/always-disallowed.js +347 -0
- package/dist/safety/always-disallowed.js.map +1 -0
- package/dist/safety/audit.d.ts +118 -0
- package/dist/safety/audit.d.ts.map +1 -0
- package/dist/safety/audit.js +324 -0
- package/dist/safety/audit.js.map +1 -0
- package/dist/safety/integration-write-tracker.d.ts +58 -0
- package/dist/safety/integration-write-tracker.d.ts.map +1 -0
- package/dist/safety/integration-write-tracker.js +41 -0
- package/dist/safety/integration-write-tracker.js.map +1 -0
- package/dist/safety/risk-classifier.d.ts +65 -0
- package/dist/safety/risk-classifier.d.ts.map +1 -0
- package/dist/safety/risk-classifier.js +763 -0
- package/dist/safety/risk-classifier.js.map +1 -0
- package/dist/scheduler/hourly-check-gate.d.ts +73 -0
- package/dist/scheduler/hourly-check-gate.d.ts.map +1 -0
- package/dist/scheduler/hourly-check-gate.js +128 -0
- package/dist/scheduler/hourly-check-gate.js.map +1 -0
- package/dist/secrets/backend-api-key-env.d.ts +104 -0
- package/dist/secrets/backend-api-key-env.d.ts.map +1 -0
- package/dist/secrets/backend-api-key-env.js +197 -0
- package/dist/secrets/backend-api-key-env.js.map +1 -0
- package/dist/secrets/codex-home-materializer.d.ts +35 -0
- package/dist/secrets/codex-home-materializer.d.ts.map +1 -0
- package/dist/secrets/codex-home-materializer.js +76 -0
- package/dist/secrets/codex-home-materializer.js.map +1 -0
- package/dist/secrets/encrypted-blob-store.d.ts +20 -0
- package/dist/secrets/encrypted-blob-store.d.ts.map +1 -0
- package/dist/secrets/encrypted-blob-store.js +80 -0
- package/dist/secrets/encrypted-blob-store.js.map +1 -0
- package/dist/secrets/platform-secret-store.d.ts +17 -0
- package/dist/secrets/platform-secret-store.d.ts.map +1 -0
- package/dist/secrets/platform-secret-store.js +37 -0
- package/dist/secrets/platform-secret-store.js.map +1 -0
- package/dist/secrets/redaction.d.ts +2 -0
- package/dist/secrets/redaction.d.ts.map +1 -0
- package/dist/secrets/redaction.js +2 -0
- package/dist/secrets/redaction.js.map +1 -0
- package/dist/secrets/secret-broker.d.ts +61 -0
- package/dist/secrets/secret-broker.d.ts.map +1 -0
- package/dist/secrets/secret-broker.js +160 -0
- package/dist/secrets/secret-broker.js.map +1 -0
- package/dist/secrets/secret-names.d.ts +34 -0
- package/dist/secrets/secret-names.d.ts.map +1 -0
- package/dist/secrets/secret-names.js +39 -0
- package/dist/secrets/secret-names.js.map +1 -0
- package/dist/secrets/secret-store.d.ts +8 -0
- package/dist/secrets/secret-store.d.ts.map +1 -0
- package/dist/secrets/secret-store.js +2 -0
- package/dist/secrets/secret-store.js.map +1 -0
- package/dist/secrets/types.d.ts +7 -0
- package/dist/secrets/types.d.ts.map +1 -0
- package/dist/secrets/types.js +2 -0
- package/dist/secrets/types.js.map +1 -0
- package/dist/services/apple-calendar/caldav-client.d.ts +48 -0
- package/dist/services/apple-calendar/caldav-client.d.ts.map +1 -0
- package/dist/services/apple-calendar/caldav-client.js +86 -0
- package/dist/services/apple-calendar/caldav-client.js.map +1 -0
- package/dist/services/apple-calendar/caldav-codec.d.ts +67 -0
- package/dist/services/apple-calendar/caldav-codec.d.ts.map +1 -0
- package/dist/services/apple-calendar/caldav-codec.js +341 -0
- package/dist/services/apple-calendar/caldav-codec.js.map +1 -0
- package/dist/services/apple-calendar/index.d.ts +3 -0
- package/dist/services/apple-calendar/index.d.ts.map +1 -0
- package/dist/services/apple-calendar/index.js +2 -0
- package/dist/services/apple-calendar/index.js.map +1 -0
- package/dist/services/apple-calendar/service.d.ts +75 -0
- package/dist/services/apple-calendar/service.d.ts.map +1 -0
- package/dist/services/apple-calendar/service.js +374 -0
- package/dist/services/apple-calendar/service.js.map +1 -0
- package/dist/services/apple-calendar/types.d.ts +78 -0
- package/dist/services/apple-calendar/types.d.ts.map +1 -0
- package/dist/services/apple-calendar/types.js +17 -0
- package/dist/services/apple-calendar/types.js.map +1 -0
- package/dist/services/attachments/hardlink.d.ts +11 -0
- package/dist/services/attachments/hardlink.d.ts.map +1 -0
- package/dist/services/attachments/hardlink.js +56 -0
- package/dist/services/attachments/hardlink.js.map +1 -0
- package/dist/services/attachments/sanitize.d.ts +21 -0
- package/dist/services/attachments/sanitize.d.ts.map +1 -0
- package/dist/services/attachments/sanitize.js +128 -0
- package/dist/services/attachments/sanitize.js.map +1 -0
- package/dist/services/attachments/store.d.ts +146 -0
- package/dist/services/attachments/store.d.ts.map +1 -0
- package/dist/services/attachments/store.js +477 -0
- package/dist/services/attachments/store.js.map +1 -0
- package/dist/services/calendar/outlook/graph-calendar-client.d.ts +114 -0
- package/dist/services/calendar/outlook/graph-calendar-client.d.ts.map +1 -0
- package/dist/services/calendar/outlook/graph-calendar-client.js +146 -0
- package/dist/services/calendar/outlook/graph-calendar-client.js.map +1 -0
- package/dist/services/calendar.d.ts +115 -0
- package/dist/services/calendar.d.ts.map +1 -0
- package/dist/services/calendar.js +281 -0
- package/dist/services/calendar.js.map +1 -0
- package/dist/services/delegated-backend-invoker.d.ts +414 -0
- package/dist/services/delegated-backend-invoker.d.ts.map +1 -0
- package/dist/services/delegated-backend-invoker.js +2372 -0
- package/dist/services/delegated-backend-invoker.js.map +1 -0
- package/dist/services/delegated-proxy-config.d.ts +93 -0
- package/dist/services/delegated-proxy-config.d.ts.map +1 -0
- package/dist/services/delegated-proxy-config.js +98 -0
- package/dist/services/delegated-proxy-config.js.map +1 -0
- package/dist/services/delegated-task-result-cache.d.ts +176 -0
- package/dist/services/delegated-task-result-cache.d.ts.map +1 -0
- package/dist/services/delegated-task-result-cache.js +0 -0
- package/dist/services/delegated-task-result-cache.js.map +1 -0
- package/dist/services/delegated-task-runtime.d.ts +346 -0
- package/dist/services/delegated-task-runtime.d.ts.map +1 -0
- package/dist/services/delegated-task-runtime.js +589 -0
- package/dist/services/delegated-task-runtime.js.map +1 -0
- package/dist/services/delegated-task-session-pool.d.ts +182 -0
- package/dist/services/delegated-task-session-pool.d.ts.map +1 -0
- package/dist/services/delegated-task-session-pool.js +292 -0
- package/dist/services/delegated-task-session-pool.js.map +1 -0
- package/dist/services/delegated-tool-runtime.d.ts +50 -0
- package/dist/services/delegated-tool-runtime.d.ts.map +1 -0
- package/dist/services/delegated-tool-runtime.js +120 -0
- package/dist/services/delegated-tool-runtime.js.map +1 -0
- package/dist/services/fts5.d.ts +40 -0
- package/dist/services/fts5.d.ts.map +1 -0
- package/dist/services/fts5.js +54 -0
- package/dist/services/fts5.js.map +1 -0
- package/dist/services/git-account-registry.d.ts +164 -0
- package/dist/services/git-account-registry.d.ts.map +1 -0
- package/dist/services/git-account-registry.js +297 -0
- package/dist/services/git-account-registry.js.map +1 -0
- package/dist/services/github.d.ts +49 -0
- package/dist/services/github.d.ts.map +1 -0
- package/dist/services/github.js +123 -0
- package/dist/services/github.js.map +1 -0
- package/dist/services/gmail-classifier.d.ts +62 -0
- package/dist/services/gmail-classifier.d.ts.map +1 -0
- package/dist/services/gmail-classifier.js +221 -0
- package/dist/services/gmail-classifier.js.map +1 -0
- package/dist/services/gmail.d.ts +192 -0
- package/dist/services/gmail.d.ts.map +1 -0
- package/dist/services/gmail.js +678 -0
- package/dist/services/gmail.js.map +1 -0
- package/dist/services/google-auth.d.ts +16 -0
- package/dist/services/google-auth.d.ts.map +1 -0
- package/dist/services/google-auth.js +37 -0
- package/dist/services/google-auth.js.map +1 -0
- package/dist/services/google-maps.d.ts +35 -0
- package/dist/services/google-maps.d.ts.map +1 -0
- package/dist/services/google-maps.js +82 -0
- package/dist/services/google-maps.js.map +1 -0
- package/dist/services/integrations/extract-write-item-id.d.ts +64 -0
- package/dist/services/integrations/extract-write-item-id.d.ts.map +1 -0
- package/dist/services/integrations/extract-write-item-id.js +188 -0
- package/dist/services/integrations/extract-write-item-id.js.map +1 -0
- package/dist/services/integrations/reconcile.d.ts +136 -0
- package/dist/services/integrations/reconcile.d.ts.map +1 -0
- package/dist/services/integrations/reconcile.js +218 -0
- package/dist/services/integrations/reconcile.js.map +1 -0
- package/dist/services/integrations/snapshot-partitions.d.ts +40 -0
- package/dist/services/integrations/snapshot-partitions.d.ts.map +1 -0
- package/dist/services/integrations/snapshot-partitions.js +113 -0
- package/dist/services/integrations/snapshot-partitions.js.map +1 -0
- package/dist/services/journal/render.d.ts +15 -0
- package/dist/services/journal/render.d.ts.map +1 -0
- package/dist/services/journal/render.js +17 -0
- package/dist/services/journal/render.js.map +1 -0
- package/dist/services/journal/writer.d.ts +26 -0
- package/dist/services/journal/writer.d.ts.map +1 -0
- package/dist/services/journal/writer.js +50 -0
- package/dist/services/journal/writer.js.map +1 -0
- package/dist/services/mail/account-registry.d.ts +208 -0
- package/dist/services/mail/account-registry.d.ts.map +1 -0
- package/dist/services/mail/account-registry.js +554 -0
- package/dist/services/mail/account-registry.js.map +1 -0
- package/dist/services/mail/gmail/auth-failure-classifier.d.ts +24 -0
- package/dist/services/mail/gmail/auth-failure-classifier.d.ts.map +1 -0
- package/dist/services/mail/gmail/auth-failure-classifier.js +67 -0
- package/dist/services/mail/gmail/auth-failure-classifier.js.map +1 -0
- package/dist/services/mail/gmail/gmail-provider.d.ts +58 -0
- package/dist/services/mail/gmail/gmail-provider.d.ts.map +1 -0
- package/dist/services/mail/gmail/gmail-provider.js +434 -0
- package/dist/services/mail/gmail/gmail-provider.js.map +1 -0
- package/dist/services/mail/gmail/legacy-row.d.ts +24 -0
- package/dist/services/mail/gmail/legacy-row.d.ts.map +1 -0
- package/dist/services/mail/gmail/legacy-row.js +71 -0
- package/dist/services/mail/gmail/legacy-row.js.map +1 -0
- package/dist/services/mail/gmail/poll-cursor.d.ts +12 -0
- package/dist/services/mail/gmail/poll-cursor.d.ts.map +1 -0
- package/dist/services/mail/gmail/poll-cursor.js +32 -0
- package/dist/services/mail/gmail/poll-cursor.js.map +1 -0
- package/dist/services/mail/html-to-plaintext.d.ts +27 -0
- package/dist/services/mail/html-to-plaintext.d.ts.map +1 -0
- package/dist/services/mail/html-to-plaintext.js +163 -0
- package/dist/services/mail/html-to-plaintext.js.map +1 -0
- package/dist/services/mail/imap/app-password.d.ts +27 -0
- package/dist/services/mail/imap/app-password.d.ts.map +1 -0
- package/dist/services/mail/imap/app-password.js +86 -0
- package/dist/services/mail/imap/app-password.js.map +1 -0
- package/dist/services/mail/imap/auth-failure-classifier.d.ts +21 -0
- package/dist/services/mail/imap/auth-failure-classifier.d.ts.map +1 -0
- package/dist/services/mail/imap/auth-failure-classifier.js +54 -0
- package/dist/services/mail/imap/auth-failure-classifier.js.map +1 -0
- package/dist/services/mail/imap/capabilities.d.ts +30 -0
- package/dist/services/mail/imap/capabilities.d.ts.map +1 -0
- package/dist/services/mail/imap/capabilities.js +70 -0
- package/dist/services/mail/imap/capabilities.js.map +1 -0
- package/dist/services/mail/imap/client.d.ts +15 -0
- package/dist/services/mail/imap/client.d.ts.map +1 -0
- package/dist/services/mail/imap/client.js +60 -0
- package/dist/services/mail/imap/client.js.map +1 -0
- package/dist/services/mail/imap/cursor.d.ts +19 -0
- package/dist/services/mail/imap/cursor.d.ts.map +1 -0
- package/dist/services/mail/imap/cursor.js +47 -0
- package/dist/services/mail/imap/cursor.js.map +1 -0
- package/dist/services/mail/imap/folder-resolver.d.ts +24 -0
- package/dist/services/mail/imap/folder-resolver.d.ts.map +1 -0
- package/dist/services/mail/imap/folder-resolver.js +58 -0
- package/dist/services/mail/imap/folder-resolver.js.map +1 -0
- package/dist/services/mail/imap/icloud-provider.d.ts +5 -0
- package/dist/services/mail/imap/icloud-provider.d.ts.map +1 -0
- package/dist/services/mail/imap/icloud-provider.js +5 -0
- package/dist/services/mail/imap/icloud-provider.js.map +1 -0
- package/dist/services/mail/imap/imap-provider-base.d.ts +173 -0
- package/dist/services/mail/imap/imap-provider-base.d.ts.map +1 -0
- package/dist/services/mail/imap/imap-provider-base.js +1004 -0
- package/dist/services/mail/imap/imap-provider-base.js.map +1 -0
- package/dist/services/mail/imap/query-translator.d.ts +13 -0
- package/dist/services/mail/imap/query-translator.d.ts.map +1 -0
- package/dist/services/mail/imap/query-translator.js +114 -0
- package/dist/services/mail/imap/query-translator.js.map +1 -0
- package/dist/services/mail/imap/reconcile-planner.d.ts +56 -0
- package/dist/services/mail/imap/reconcile-planner.d.ts.map +1 -0
- package/dist/services/mail/imap/reconcile-planner.js +52 -0
- package/dist/services/mail/imap/reconcile-planner.js.map +1 -0
- package/dist/services/mail/imap/reply-mime.d.ts +24 -0
- package/dist/services/mail/imap/reply-mime.d.ts.map +1 -0
- package/dist/services/mail/imap/reply-mime.js +77 -0
- package/dist/services/mail/imap/reply-mime.js.map +1 -0
- package/dist/services/mail/imap/yahoo-provider.d.ts +5 -0
- package/dist/services/mail/imap/yahoo-provider.d.ts.map +1 -0
- package/dist/services/mail/imap/yahoo-provider.js +5 -0
- package/dist/services/mail/imap/yahoo-provider.js.map +1 -0
- package/dist/services/mail/mail-search.d.ts +35 -0
- package/dist/services/mail/mail-search.d.ts.map +1 -0
- package/dist/services/mail/mail-search.js +59 -0
- package/dist/services/mail/mail-search.js.map +1 -0
- package/dist/services/mail/outlook/auth-failure-classifier.d.ts +38 -0
- package/dist/services/mail/outlook/auth-failure-classifier.d.ts.map +1 -0
- package/dist/services/mail/outlook/auth-failure-classifier.js +91 -0
- package/dist/services/mail/outlook/auth-failure-classifier.js.map +1 -0
- package/dist/services/mail/outlook/client-config.d.ts +34 -0
- package/dist/services/mail/outlook/client-config.d.ts.map +1 -0
- package/dist/services/mail/outlook/client-config.js +58 -0
- package/dist/services/mail/outlook/client-config.js.map +1 -0
- package/dist/services/mail/outlook/delta-cursor.d.ts +66 -0
- package/dist/services/mail/outlook/delta-cursor.d.ts.map +1 -0
- package/dist/services/mail/outlook/delta-cursor.js +85 -0
- package/dist/services/mail/outlook/delta-cursor.js.map +1 -0
- package/dist/services/mail/outlook/graph-client.d.ts +98 -0
- package/dist/services/mail/outlook/graph-client.d.ts.map +1 -0
- package/dist/services/mail/outlook/graph-client.js +198 -0
- package/dist/services/mail/outlook/graph-client.js.map +1 -0
- package/dist/services/mail/outlook/msal-app-factory.d.ts +20 -0
- package/dist/services/mail/outlook/msal-app-factory.d.ts.map +1 -0
- package/dist/services/mail/outlook/msal-app-factory.js +62 -0
- package/dist/services/mail/outlook/msal-app-factory.js.map +1 -0
- package/dist/services/mail/outlook/msal-cache-plugin.d.ts +19 -0
- package/dist/services/mail/outlook/msal-cache-plugin.d.ts.map +1 -0
- package/dist/services/mail/outlook/msal-cache-plugin.js +30 -0
- package/dist/services/mail/outlook/msal-cache-plugin.js.map +1 -0
- package/dist/services/mail/outlook/oauth-device-code.d.ts +26 -0
- package/dist/services/mail/outlook/oauth-device-code.d.ts.map +1 -0
- package/dist/services/mail/outlook/oauth-device-code.js +32 -0
- package/dist/services/mail/outlook/oauth-device-code.js.map +1 -0
- package/dist/services/mail/outlook/oauth-loopback.d.ts +41 -0
- package/dist/services/mail/outlook/oauth-loopback.d.ts.map +1 -0
- package/dist/services/mail/outlook/oauth-loopback.js +223 -0
- package/dist/services/mail/outlook/oauth-loopback.js.map +1 -0
- package/dist/services/mail/outlook/outlook-provider.d.ts +100 -0
- package/dist/services/mail/outlook/outlook-provider.d.ts.map +1 -0
- package/dist/services/mail/outlook/outlook-provider.js +619 -0
- package/dist/services/mail/outlook/outlook-provider.js.map +1 -0
- package/dist/services/mail/outlook/query-translator.d.ts +10 -0
- package/dist/services/mail/outlook/query-translator.d.ts.map +1 -0
- package/dist/services/mail/outlook/query-translator.js +103 -0
- package/dist/services/mail/outlook/query-translator.js.map +1 -0
- package/dist/services/mail/provider.d.ts +267 -0
- package/dist/services/mail/provider.d.ts.map +1 -0
- package/dist/services/mail/provider.js +34 -0
- package/dist/services/mail/provider.js.map +1 -0
- package/dist/services/mail/query-utils.d.ts +13 -0
- package/dist/services/mail/query-utils.d.ts.map +1 -0
- package/dist/services/mail/query-utils.js +18 -0
- package/dist/services/mail/query-utils.js.map +1 -0
- package/dist/services/mail-classifier.d.ts +25 -0
- package/dist/services/mail-classifier.d.ts.map +1 -0
- package/dist/services/mail-classifier.js +52 -0
- package/dist/services/mail-classifier.js.map +1 -0
- package/dist/services/mail-ingestion.d.ts +139 -0
- package/dist/services/mail-ingestion.d.ts.map +1 -0
- package/dist/services/mail-ingestion.js +223 -0
- package/dist/services/mail-ingestion.js.map +1 -0
- package/dist/services/mcp/auto-probe.d.ts +76 -0
- package/dist/services/mcp/auto-probe.d.ts.map +1 -0
- package/dist/services/mcp/auto-probe.js +147 -0
- package/dist/services/mcp/auto-probe.js.map +1 -0
- package/dist/services/mcp/generators/claude.d.ts +18 -0
- package/dist/services/mcp/generators/claude.d.ts.map +1 -0
- package/dist/services/mcp/generators/claude.js +90 -0
- package/dist/services/mcp/generators/claude.js.map +1 -0
- package/dist/services/mcp/generators/codex.d.ts +22 -0
- package/dist/services/mcp/generators/codex.d.ts.map +1 -0
- package/dist/services/mcp/generators/codex.js +102 -0
- package/dist/services/mcp/generators/codex.js.map +1 -0
- package/dist/services/mcp/generators/gemini.d.ts +20 -0
- package/dist/services/mcp/generators/gemini.d.ts.map +1 -0
- package/dist/services/mcp/generators/gemini.js +97 -0
- package/dist/services/mcp/generators/gemini.js.map +1 -0
- package/dist/services/mcp/generators/index.d.ts +20 -0
- package/dist/services/mcp/generators/index.d.ts.map +1 -0
- package/dist/services/mcp/generators/index.js +29 -0
- package/dist/services/mcp/generators/index.js.map +1 -0
- package/dist/services/mcp/generators/types.d.ts +47 -0
- package/dist/services/mcp/generators/types.d.ts.map +1 -0
- package/dist/services/mcp/generators/types.js +40 -0
- package/dist/services/mcp/generators/types.js.map +1 -0
- package/dist/services/mcp/probe.d.ts +31 -0
- package/dist/services/mcp/probe.d.ts.map +1 -0
- package/dist/services/mcp/probe.js +437 -0
- package/dist/services/mcp/probe.js.map +1 -0
- package/dist/services/mcp/registry.d.ts +84 -0
- package/dist/services/mcp/registry.d.ts.map +1 -0
- package/dist/services/mcp/registry.js +387 -0
- package/dist/services/mcp/registry.js.map +1 -0
- package/dist/services/mcp/risk.d.ts +82 -0
- package/dist/services/mcp/risk.d.ts.map +1 -0
- package/dist/services/mcp/risk.js +126 -0
- package/dist/services/mcp/risk.js.map +1 -0
- package/dist/services/mcp/session-materializer.d.ts +123 -0
- package/dist/services/mcp/session-materializer.d.ts.map +1 -0
- package/dist/services/mcp/session-materializer.js +361 -0
- package/dist/services/mcp/session-materializer.js.map +1 -0
- package/dist/services/mcp/tool-audit.d.ts +53 -0
- package/dist/services/mcp/tool-audit.d.ts.map +1 -0
- package/dist/services/mcp/tool-audit.js +74 -0
- package/dist/services/mcp/tool-audit.js.map +1 -0
- package/dist/services/mcp/types.d.ts +88 -0
- package/dist/services/mcp/types.d.ts.map +1 -0
- package/dist/services/mcp/types.js +94 -0
- package/dist/services/mcp/types.js.map +1 -0
- package/dist/services/notion.d.ts +134 -0
- package/dist/services/notion.d.ts.map +1 -0
- package/dist/services/notion.js +350 -0
- package/dist/services/notion.js.map +1 -0
- package/dist/services/obsidian.d.ts +116 -0
- package/dist/services/obsidian.d.ts.map +1 -0
- package/dist/services/obsidian.js +305 -0
- package/dist/services/obsidian.js.map +1 -0
- package/dist/services/service-registry.d.ts +31 -0
- package/dist/services/service-registry.d.ts.map +1 -0
- package/dist/services/service-registry.js +15 -0
- package/dist/services/service-registry.js.map +1 -0
- package/dist/services/voice/transcriber-impl.d.ts +15 -0
- package/dist/services/voice/transcriber-impl.d.ts.map +1 -0
- package/dist/services/voice/transcriber-impl.js +129 -0
- package/dist/services/voice/transcriber-impl.js.map +1 -0
- package/dist/services/voice/transcriber.d.ts +117 -0
- package/dist/services/voice/transcriber.d.ts.map +1 -0
- package/dist/services/voice/transcriber.js +201 -0
- package/dist/services/voice/transcriber.js.map +1 -0
- package/dist/settings/runtime-settings.d.ts +232 -0
- package/dist/settings/runtime-settings.d.ts.map +1 -0
- package/dist/settings/runtime-settings.js +769 -0
- package/dist/settings/runtime-settings.js.map +1 -0
- package/dist/settings/settings-store.d.ts +13 -0
- package/dist/settings/settings-store.d.ts.map +1 -0
- package/dist/settings/settings-store.js +87 -0
- package/dist/settings/settings-store.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,1384 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { BACKEND_IDS, DELEGATED_TASK_HARD_CAPS, INTEGRATION_DESCRIPTORS, INTEGRATION_KEYS, filterDeniedToolsForBackend, integrationPatchSchema, isIntegrationKey, recommendedStarterDeniedTools, validateDeniedTools, } from "@aitne/shared";
|
|
3
|
+
// `matchToolPattern` and `mapErrorClassToHttpStatus` were used by the
|
|
4
|
+
// dormant `/invoke` route reservation block-commented at lines ~708-896.
|
|
5
|
+
// They are removed from the import list because eslint flags them as
|
|
6
|
+
// unused; re-add when un-commenting that block.
|
|
7
|
+
import { checkOutputSchema } from "../../services/delegated-task-runtime.js";
|
|
8
|
+
import { readIntegrations, updateIntegrationState, } from "../../db/integrations-store.js";
|
|
9
|
+
import { writeManagementMd } from "../../core/management-md.js";
|
|
10
|
+
import { missingDelegatedVariants } from "../../core/skills-compiler.js";
|
|
11
|
+
import { evaluateProbe, getConnector, makeUserManagedProbeResult, } from "../../core/integration-probe.js";
|
|
12
|
+
import { LiveProbeUnsupportedError } from "../../core/agent-core.js";
|
|
13
|
+
import { deleteProbesForIntegration, readProbe, writeProbe, } from "../../db/integration-probe-store.js";
|
|
14
|
+
import { knownProxyModels, listProxyModelOptions, proxyModelIsKnown, resolveCanonicalDelegatedModel, } from "../../core/backends/proxy-model-registry.js";
|
|
15
|
+
import { readJsonBody } from "../json-body.js";
|
|
16
|
+
import { createLogger } from "../../logging.js";
|
|
17
|
+
import { extractWriteItemIds } from "../../services/integrations/extract-write-item-id.js";
|
|
18
|
+
import { markIntegrationWrite } from "../../safety/integration-write-tracker.js";
|
|
19
|
+
import { createSettingsStore } from "../../settings/settings-store.js";
|
|
20
|
+
const logger = createLogger("integrations-api");
|
|
21
|
+
/**
|
|
22
|
+
* Integration Delegation Framework — `/api/integrations` routes (Phase 1).
|
|
23
|
+
*
|
|
24
|
+
* Scope per `GOOGLE_AUTH_DELEGATION_DESIGN.md` Phase 1:
|
|
25
|
+
* - `GET /api/integrations` — list every registered integration with its
|
|
26
|
+
* descriptor metadata and current state.
|
|
27
|
+
* - `PATCH /api/integrations/:key` — change a single integration's mode.
|
|
28
|
+
* Runs a minimal lifecycle: validate → DB update → re-render
|
|
29
|
+
* `integrations.md` → audit row. Observer gating, route-410 middleware,
|
|
30
|
+
* skill variant selection, and the connector probe all land in later
|
|
31
|
+
* phases.
|
|
32
|
+
*
|
|
33
|
+
* Risk tier: Approve (dashboard-only mutation, registered in
|
|
34
|
+
* `risk-classifier.ts`).
|
|
35
|
+
*/
|
|
36
|
+
export function createIntegrationRoutes(deps) {
|
|
37
|
+
const app = new Hono();
|
|
38
|
+
const { db, config } = deps;
|
|
39
|
+
app.get("/integrations", (c) => {
|
|
40
|
+
const state = readIntegrations(db);
|
|
41
|
+
const integrations = INTEGRATION_KEYS.map((key) => {
|
|
42
|
+
const descriptor = INTEGRATION_DESCRIPTORS[key];
|
|
43
|
+
return {
|
|
44
|
+
key: descriptor.key,
|
|
45
|
+
displayName: descriptor.displayName,
|
|
46
|
+
supportedModes: descriptor.supportedModes,
|
|
47
|
+
directSetup: descriptor.directSetup ?? null,
|
|
48
|
+
backendConnectors: descriptor.backendConnectors,
|
|
49
|
+
skillsTouched: descriptor.skillsTouched,
|
|
50
|
+
taskFlowsTouched: descriptor.taskFlowsTouched,
|
|
51
|
+
observersTouched: descriptor.observersTouched,
|
|
52
|
+
apiRoutesTouched: descriptor.apiRoutesTouched,
|
|
53
|
+
userManagedConnector: descriptor.userManagedConnector ?? false,
|
|
54
|
+
state: state[key],
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
return c.json({ integrations });
|
|
58
|
+
});
|
|
59
|
+
// DELEGATED-PROXY-API-DESIGN.md §7 — last N delegated-proxy invocations for
|
|
60
|
+
// an integration. Drives the IntegrationCard's "Recent calls" collapsible
|
|
61
|
+
// table so the user can spot slow / failing connectors without leaving the
|
|
62
|
+
// /connections page. Daemon-side filter (rather than dashboard reading the
|
|
63
|
+
// generic cost table and post-filtering) because:
|
|
64
|
+
// - integrationKey lives inside `detail` JSON; SQLite-side JSON1 extract
|
|
65
|
+
// keeps the response payload small and skips the parent-event noise.
|
|
66
|
+
// - cost.ts dashboards already aggregate; a per-integration debug view
|
|
67
|
+
// belongs alongside the integration's other state for cohesion.
|
|
68
|
+
//
|
|
69
|
+
// Limit defaults to 50 (the design's stated cap), bounded at 200 so a
|
|
70
|
+
// typo-driven `?limit=99999` cannot DoS the response.
|
|
71
|
+
app.get("/integrations/:key/recent-proxy-calls", (c) => {
|
|
72
|
+
const key = c.req.param("key");
|
|
73
|
+
if (!isIntegrationKey(key)) {
|
|
74
|
+
return c.json({ error: "unknown_integration", key }, 404);
|
|
75
|
+
}
|
|
76
|
+
const rawLimit = c.req.query("limit");
|
|
77
|
+
let limit = 50;
|
|
78
|
+
if (rawLimit !== undefined) {
|
|
79
|
+
const parsed = Number.parseInt(rawLimit, 10);
|
|
80
|
+
if (!Number.isFinite(parsed) || parsed < 1) {
|
|
81
|
+
return c.json({
|
|
82
|
+
error: "invalid_limit",
|
|
83
|
+
message: "limit must be a positive integer (default 50, max 200)",
|
|
84
|
+
}, 400);
|
|
85
|
+
}
|
|
86
|
+
limit = Math.min(parsed, 200);
|
|
87
|
+
}
|
|
88
|
+
const rows = db
|
|
89
|
+
.prepare(`SELECT id, started_at, completed_at, model_used, backend,
|
|
90
|
+
cost_usd, tokens_input, tokens_output, duration_ms,
|
|
91
|
+
num_turns, result, error, detail
|
|
92
|
+
FROM agent_actions
|
|
93
|
+
WHERE action_type = 'delegated_proxy.invoke'
|
|
94
|
+
AND json_extract(detail, '$.integrationKey') = ?
|
|
95
|
+
ORDER BY id DESC
|
|
96
|
+
LIMIT ?`)
|
|
97
|
+
.all(key, limit);
|
|
98
|
+
const calls = rows.map((row) => {
|
|
99
|
+
const detail = row.detail ? safeParseJson(row.detail) : null;
|
|
100
|
+
return {
|
|
101
|
+
id: row.id,
|
|
102
|
+
startedAt: row.started_at,
|
|
103
|
+
completedAt: row.completed_at,
|
|
104
|
+
modelId: row.model_used,
|
|
105
|
+
backend: row.backend,
|
|
106
|
+
costUsd: row.cost_usd,
|
|
107
|
+
tokensInput: row.tokens_input,
|
|
108
|
+
tokensOutput: row.tokens_output,
|
|
109
|
+
durationMs: row.duration_ms,
|
|
110
|
+
numTurns: row.num_turns,
|
|
111
|
+
result: row.result,
|
|
112
|
+
// detail.errorClass is the structured DelegatedErrorClass when the
|
|
113
|
+
// call failed inside the proxy pipeline (auth_error, no_tool_call,
|
|
114
|
+
// etc.). detail.toolName is always present. We surface both so the
|
|
115
|
+
// table can render a human label without re-parsing on the client.
|
|
116
|
+
errorClass: detail?.errorClass ?? null,
|
|
117
|
+
toolName: detail?.toolName ?? null,
|
|
118
|
+
errorMessage: row.error,
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
return c.json({
|
|
122
|
+
key,
|
|
123
|
+
limit,
|
|
124
|
+
calls,
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
// DELEGATED-PROXY-API-DESIGN.md §6.1 / §7 — list known proxy-model options
|
|
128
|
+
// for a backend (registered + custom-pinned). Drives the dashboard model
|
|
129
|
+
// dropdown so the daemon stays the source of truth for the registered
|
|
130
|
+
// model surface; clients don't need to keep their own registry mirror.
|
|
131
|
+
app.get("/integrations/proxy-models/:backend", (c) => {
|
|
132
|
+
const backend = c.req.param("backend");
|
|
133
|
+
if (!BACKEND_IDS.includes(backend)) {
|
|
134
|
+
return c.json({
|
|
135
|
+
error: "invalid_backend",
|
|
136
|
+
message: `Unknown backend '${backend}'.`,
|
|
137
|
+
supportedBackends: BACKEND_IDS,
|
|
138
|
+
}, 400);
|
|
139
|
+
}
|
|
140
|
+
const backendId = backend;
|
|
141
|
+
const options = listProxyModelOptions(backendId);
|
|
142
|
+
const canonical = resolveCanonicalDelegatedModel(backendId, db);
|
|
143
|
+
return c.json({
|
|
144
|
+
backend: backendId,
|
|
145
|
+
canonical,
|
|
146
|
+
options,
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
app.patch("/integrations/:key", async (c) => {
|
|
150
|
+
const key = c.req.param("key");
|
|
151
|
+
if (!isIntegrationKey(key)) {
|
|
152
|
+
return c.json({ error: "unknown_integration", key }, 404);
|
|
153
|
+
}
|
|
154
|
+
const parsedBody = await readJsonBody(c);
|
|
155
|
+
if (!parsedBody.ok)
|
|
156
|
+
return parsedBody.response;
|
|
157
|
+
const parsed = integrationPatchSchema.safeParse(parsedBody.body);
|
|
158
|
+
if (!parsed.success) {
|
|
159
|
+
return c.json({
|
|
160
|
+
error: "validation_error",
|
|
161
|
+
issues: parsed.error.issues.map((i) => ({
|
|
162
|
+
path: i.path,
|
|
163
|
+
message: i.message,
|
|
164
|
+
})),
|
|
165
|
+
}, 400);
|
|
166
|
+
}
|
|
167
|
+
const descriptor = INTEGRATION_DESCRIPTORS[key];
|
|
168
|
+
if (!descriptor.supportedModes.includes(parsed.data.mode)) {
|
|
169
|
+
return c.json({
|
|
170
|
+
error: "unsupported_mode",
|
|
171
|
+
key,
|
|
172
|
+
mode: parsed.data.mode,
|
|
173
|
+
supportedModes: descriptor.supportedModes,
|
|
174
|
+
}, 400);
|
|
175
|
+
}
|
|
176
|
+
const previous = readIntegrations(db)[key];
|
|
177
|
+
// Compute the side-effect-relevant flags up-front:
|
|
178
|
+
// - modeChanged: probe-cache eviction + lifecycle observer flip + variants
|
|
179
|
+
// gate all key off this. A pure deniedTools edit must NOT trigger any of
|
|
180
|
+
// them — those are mode-change concerns.
|
|
181
|
+
// - effectiveBackend: which backend the post-PATCH state will run against.
|
|
182
|
+
// Used for both the missing-variants gate and the deniedTools validator.
|
|
183
|
+
// If the user omits delegatedBackend on a delegated→delegated edit
|
|
184
|
+
// (e.g. just toggling tool permissions), we keep the previous backend.
|
|
185
|
+
const modeChanged = parsed.data.mode !== previous.mode
|
|
186
|
+
|| (parsed.data.delegatedBackend ?? null) !==
|
|
187
|
+
(previous.delegatedBackend ?? null);
|
|
188
|
+
const effectiveBackend = parsed.data.mode === "delegated"
|
|
189
|
+
? (parsed.data.delegatedBackend ?? previous.delegatedBackend ?? null)
|
|
190
|
+
: null;
|
|
191
|
+
if (parsed.data.mode === "delegated") {
|
|
192
|
+
if (!effectiveBackend) {
|
|
193
|
+
return c.json({
|
|
194
|
+
error: "validation_error",
|
|
195
|
+
issues: [{
|
|
196
|
+
path: ["delegatedBackend"],
|
|
197
|
+
message: "delegatedBackend is required when mode is 'delegated'",
|
|
198
|
+
}],
|
|
199
|
+
}, 400);
|
|
200
|
+
}
|
|
201
|
+
// User-managed connector integrations (e.g. Outlook) skip the
|
|
202
|
+
// descriptor-driven connector check and the variant gate: the user
|
|
203
|
+
// installs an Outlook / Microsoft Graph MCP on their selected
|
|
204
|
+
// backend (Claude Code Connector / Codex MCP / Gemini extension)
|
|
205
|
+
// and the daemon trusts that wiring. Capability probing is the
|
|
206
|
+
// user's responsibility on the backend side.
|
|
207
|
+
if (!descriptor.userManagedConnector) {
|
|
208
|
+
if (!descriptor.backendConnectors[effectiveBackend]) {
|
|
209
|
+
return c.json({
|
|
210
|
+
error: "backend_not_supported",
|
|
211
|
+
key,
|
|
212
|
+
backend: effectiveBackend,
|
|
213
|
+
availableBackends: Object.keys(descriptor.backendConnectors),
|
|
214
|
+
}, 400);
|
|
215
|
+
}
|
|
216
|
+
// §4.7 "Missing-variant policy" — only re-run the gate when the user
|
|
217
|
+
// is actually changing mode or backend. A pure deniedTools edit on an
|
|
218
|
+
// already-delegated integration leaves the variant set unchanged, so
|
|
219
|
+
// re-walking the file system would be wasted work AND would surface a
|
|
220
|
+
// stale-during-author error if a variant was momentarily missing.
|
|
221
|
+
//
|
|
222
|
+
// DELEGATED-MODE-V2-DESIGN.md §11 (Phase 3) re-activated the
|
|
223
|
+
// legacy variant gate for every delegated integration. gmail and
|
|
224
|
+
// google_calendar now ship `SKILL.delegated.<sessionBackend>.md`
|
|
225
|
+
// (cross-backend) and resolve to `null` for same-backend, so
|
|
226
|
+
// missing variants are a real configuration error.
|
|
227
|
+
if (modeChanged) {
|
|
228
|
+
const missing = missingDelegatedVariants(config.workspaceDir, key, effectiveBackend);
|
|
229
|
+
if (missing.skills.length > 0 || missing.taskFlows.length > 0) {
|
|
230
|
+
return c.json({
|
|
231
|
+
error: "missing_variants",
|
|
232
|
+
key,
|
|
233
|
+
backend: effectiveBackend,
|
|
234
|
+
missingSkills: missing.skills,
|
|
235
|
+
missingTaskFlows: missing.taskFlows,
|
|
236
|
+
message: `Cannot enter delegated mode for '${key}' on backend '${effectiveBackend}' — ${missing.skills.length + missing.taskFlows.length} variant file(s) missing. Author the listed files or narrow the registry's skillsTouched / taskFlowsTouched before retrying.`,
|
|
237
|
+
}, 400);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// DELEGATED-PROXY-API-DESIGN.md §6.1 — `delegatedModel` validation.
|
|
243
|
+
// The schema rejects empty strings already; here we additionally
|
|
244
|
+
// reject values that don't appear in the registered model list for
|
|
245
|
+
// the effective backend (or in user-pinned `process_backend_config`
|
|
246
|
+
// rows for the same backend, per §4.2's "trust custom pins" rule).
|
|
247
|
+
// The value is *allowed* on any mode so the user can pre-stage a pin
|
|
248
|
+
// before flipping to delegated; validation only runs when we have a
|
|
249
|
+
// backend to validate against.
|
|
250
|
+
if (parsed.data.delegatedModel !== undefined
|
|
251
|
+
&& parsed.data.delegatedModel !== null
|
|
252
|
+
&& effectiveBackend) {
|
|
253
|
+
const candidate = parsed.data.delegatedModel;
|
|
254
|
+
if (!proxyModelIsKnown(db, effectiveBackend, candidate)) {
|
|
255
|
+
return c.json({
|
|
256
|
+
error: "unknown_model",
|
|
257
|
+
key,
|
|
258
|
+
backend: effectiveBackend,
|
|
259
|
+
model: candidate,
|
|
260
|
+
knownModels: knownProxyModels(db, effectiveBackend),
|
|
261
|
+
message: `Model '${candidate}' is not registered for backend '${effectiveBackend}'. Pick one of the known models or pass null to use the canonical light-tier default.`,
|
|
262
|
+
}, 400);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// §7.7 — `deniedTools` validation. We accept the field on any mode so
|
|
266
|
+
// the user can pre-stage a deny list before flipping to delegated, but
|
|
267
|
+
// validation only runs against the effective backend when one exists.
|
|
268
|
+
// For non-delegated modes, deniedTools persists as-is (no live backend
|
|
269
|
+
// to validate against — the value is inert until delegated).
|
|
270
|
+
//
|
|
271
|
+
// DELEGATED-MODE-V2-DESIGN.md §4.5.4 — first-time delegated setup
|
|
272
|
+
// pre-populates `deniedTools` with the recommended starter list when
|
|
273
|
+
// the caller didn't supply one (PATCH omits the field). This keeps the
|
|
274
|
+
// CLAUDE.md "destructive ops require user confirmation" invariant
|
|
275
|
+
// intact on a fresh install. The user opts out explicitly by passing
|
|
276
|
+
// `deniedTools: []` (empty array, distinct from undefined).
|
|
277
|
+
//
|
|
278
|
+
// The starter floor fires in two distinct shapes — both arrive at an
|
|
279
|
+
// effectively-empty deny set after the PATCH and would otherwise leave
|
|
280
|
+
// the agent unconstrained:
|
|
281
|
+
//
|
|
282
|
+
// (a) Entering delegated mode for the first time on this integration
|
|
283
|
+
// (previous mode was direct/disabled) AND no curated list was
|
|
284
|
+
// already pre-staged — re-entry from disabled with prior denies
|
|
285
|
+
// kept means the user already curated, don't overwrite.
|
|
286
|
+
//
|
|
287
|
+
// (b) Backend swap (delegated → delegated, different `delegatedBackend`)
|
|
288
|
+
// where every entry in `previous.deniedTools` is namespace-stale on
|
|
289
|
+
// the new backend. The user's curation referenced tools the new
|
|
290
|
+
// connector doesn't expose (e.g. Claude's `label_message` carried
|
|
291
|
+
// into a Codex session), so the materializer's stale-drop pass
|
|
292
|
+
// would empty the disallowedTools array silently — closing the
|
|
293
|
+
// same §4.5.4 floor the design wrote (a) to defend. The original
|
|
294
|
+
// design framed §4.5.4 as "first delegated setup only" and missed
|
|
295
|
+
// this case; surfaced during the 2026-04-26 implementation review.
|
|
296
|
+
//
|
|
297
|
+
// The wizard UI for the opt-out / "use recommended" / "I'll edit"
|
|
298
|
+
// branches is Phase 4 polish (see §Phase 4.2). For now the API default
|
|
299
|
+
// closes the safety floor; the dashboard editor card surfaces the
|
|
300
|
+
// populated list for editing.
|
|
301
|
+
const enteringDelegated = parsed.data.mode === "delegated" && previous.mode !== "delegated";
|
|
302
|
+
const omittedDeniedTools = parsed.data.deniedTools === undefined;
|
|
303
|
+
const previousDeniedToolsEmpty = (previous.deniedTools ?? []).length === 0;
|
|
304
|
+
const swappingDelegatedBackend = parsed.data.mode === "delegated"
|
|
305
|
+
&& previous.mode === "delegated"
|
|
306
|
+
&& effectiveBackend !== null
|
|
307
|
+
&& previous.delegatedBackend !== undefined
|
|
308
|
+
&& previous.delegatedBackend !== effectiveBackend;
|
|
309
|
+
// For shape (b): the previous list had at least one entry (otherwise the
|
|
310
|
+
// floor was already empty and shape (a)'s logic doesn't apply here either),
|
|
311
|
+
// and *every* entry is stale on the new backend.
|
|
312
|
+
const swapWipesAllDenies = swappingDelegatedBackend
|
|
313
|
+
&& (previous.deniedTools ?? []).length > 0
|
|
314
|
+
&& filterDeniedToolsForBackend(key, effectiveBackend, previous.deniedTools ?? []).active.length === 0;
|
|
315
|
+
const useStarter = effectiveBackend !== null
|
|
316
|
+
&& omittedDeniedTools
|
|
317
|
+
&& ((enteringDelegated && previousDeniedToolsEmpty)
|
|
318
|
+
|| swapWipesAllDenies);
|
|
319
|
+
const finalDeniedTools = useStarter
|
|
320
|
+
? recommendedStarterDeniedTools(key, effectiveBackend)
|
|
321
|
+
: parsed.data.deniedTools !== undefined
|
|
322
|
+
? parsed.data.deniedTools
|
|
323
|
+
: (previous.deniedTools ?? []);
|
|
324
|
+
if (useStarter && finalDeniedTools.length > 0) {
|
|
325
|
+
logger.info({
|
|
326
|
+
key,
|
|
327
|
+
backend: effectiveBackend,
|
|
328
|
+
starter: finalDeniedTools,
|
|
329
|
+
// Distinguish the two shapes so log readers can spot the
|
|
330
|
+
// backend-swap fallback separately from first-time setup.
|
|
331
|
+
// `enteringDelegated` covers shape (a); `swapWipesAllDenies`
|
|
332
|
+
// covers shape (b). They are mutually exclusive by construction
|
|
333
|
+
// (a requires `previous.mode !== "delegated"`, b requires
|
|
334
|
+
// `previous.mode === "delegated"`).
|
|
335
|
+
trigger: enteringDelegated ? "first_delegated" : "backend_swap_stale",
|
|
336
|
+
previousBackend: swappingDelegatedBackend
|
|
337
|
+
? previous.delegatedBackend
|
|
338
|
+
: null,
|
|
339
|
+
}, "applied starter deniedTools floor");
|
|
340
|
+
}
|
|
341
|
+
if (effectiveBackend && parsed.data.deniedTools !== undefined) {
|
|
342
|
+
const result = validateDeniedTools(key, effectiveBackend, finalDeniedTools);
|
|
343
|
+
if (!result.ok) {
|
|
344
|
+
if (result.error === "unknown_tool") {
|
|
345
|
+
return c.json({
|
|
346
|
+
error: "unknown_tool",
|
|
347
|
+
key,
|
|
348
|
+
backend: effectiveBackend,
|
|
349
|
+
tool: result.tool,
|
|
350
|
+
knownTools: result.knownTools,
|
|
351
|
+
message: `Tool '${result.tool}' is not declared in the ${effectiveBackend} connector for '${key}'. Pick a tool from the descriptor's capability list.`,
|
|
352
|
+
}, 400);
|
|
353
|
+
}
|
|
354
|
+
if (result.error === "denial_breaks_required_capability") {
|
|
355
|
+
return c.json({
|
|
356
|
+
error: "denial_breaks_required_capability",
|
|
357
|
+
key,
|
|
358
|
+
backend: effectiveBackend,
|
|
359
|
+
capability: result.capability,
|
|
360
|
+
remainingTools: result.remainingTools,
|
|
361
|
+
message: `Denying these tools removes the only path for required capability '${result.capability}'. Keep at least one of: ${result.remainingTools.join(", ")}.`,
|
|
362
|
+
}, 400);
|
|
363
|
+
}
|
|
364
|
+
// "no_connector" should be unreachable — we already validated
|
|
365
|
+
// `descriptor.backendConnectors[effectiveBackend]` above. Map to a
|
|
366
|
+
// 500 rather than a 400 because it indicates a server-side mismatch.
|
|
367
|
+
return c.json({ error: "internal_error" }, 500);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// DELEGATED-PROXY-API-DESIGN.md §4.2 — `delegatedModel` carry-over
|
|
371
|
+
// rules:
|
|
372
|
+
// - PATCH omits the field → preserve previous value (mode-flip
|
|
373
|
+
// idempotent: direct ↔ delegated keeps the pin).
|
|
374
|
+
// - PATCH passes `null` → clear the pin (canonical fallback at
|
|
375
|
+
// call time). Surfaced by the dashboard's "Reset to default"
|
|
376
|
+
// affordance after a backend swap.
|
|
377
|
+
// - PATCH passes a non-empty string → validated above and stored.
|
|
378
|
+
// Same shape for `delegatedMaxTurns` (forward-compat — no UI yet).
|
|
379
|
+
const finalDelegatedModel = parsed.data.delegatedModel === undefined
|
|
380
|
+
? (previous.delegatedModel ?? null)
|
|
381
|
+
: parsed.data.delegatedModel;
|
|
382
|
+
const finalDelegatedMaxTurns = parsed.data.delegatedMaxTurns === undefined
|
|
383
|
+
? (previous.delegatedMaxTurns ?? null)
|
|
384
|
+
: parsed.data.delegatedMaxTurns;
|
|
385
|
+
const finalDelegatedSyncEnabled = parsed.data.delegatedSyncEnabled === undefined
|
|
386
|
+
? previous.delegatedSyncEnabled
|
|
387
|
+
: parsed.data.delegatedSyncEnabled;
|
|
388
|
+
const stamped = new Date().toISOString();
|
|
389
|
+
try {
|
|
390
|
+
const next = updateIntegrationState(db, key, {
|
|
391
|
+
mode: parsed.data.mode,
|
|
392
|
+
// Only carry delegatedBackend when mode is delegated. The schema
|
|
393
|
+
// already enforces presence in that branch (superRefine), so a
|
|
394
|
+
// direct/disabled flip drops it cleanly. Don't fall back to the
|
|
395
|
+
// previous value here — that breaks the delegated → direct path
|
|
396
|
+
// (the integration would keep its old backend forever).
|
|
397
|
+
...(parsed.data.mode === "delegated" && parsed.data.delegatedBackend
|
|
398
|
+
? { delegatedBackend: parsed.data.delegatedBackend }
|
|
399
|
+
: {}),
|
|
400
|
+
// Always persist the resolved delegatedModel/delegatedMaxTurns —
|
|
401
|
+
// null clears, undefined was already collapsed above to the
|
|
402
|
+
// previous value or null. Keeps the JSON blob shape stable
|
|
403
|
+
// across PATCHes even when the field is inert (mode !== delegated).
|
|
404
|
+
...(finalDelegatedModel !== null
|
|
405
|
+
? { delegatedModel: finalDelegatedModel }
|
|
406
|
+
: {}),
|
|
407
|
+
...(finalDelegatedMaxTurns !== null
|
|
408
|
+
? { delegatedMaxTurns: finalDelegatedMaxTurns }
|
|
409
|
+
: {}),
|
|
410
|
+
...(finalDelegatedSyncEnabled === false
|
|
411
|
+
? { delegatedSyncEnabled: false }
|
|
412
|
+
: {}),
|
|
413
|
+
deniedTools: finalDeniedTools,
|
|
414
|
+
lastChangedAt: stamped,
|
|
415
|
+
});
|
|
416
|
+
await writeManagementMd(config.dataDir, next, {
|
|
417
|
+
externalObsidianVaultPath: config.externalObsidianVaultPath,
|
|
418
|
+
externalObsidianWatch: config.externalObsidianWatch,
|
|
419
|
+
});
|
|
420
|
+
// §4.11 probe-cache eviction is a *mode-change* concern. A pure
|
|
421
|
+
// deniedTools edit doesn't invalidate which capabilities the
|
|
422
|
+
// connector exposes — the live probe answer is identical, only what
|
|
423
|
+
// the agent is allowed to invoke from the skill body changes. So
|
|
424
|
+
// gate eviction on modeChanged.
|
|
425
|
+
if (modeChanged) {
|
|
426
|
+
const cleared = deleteProbesForIntegration(db, key);
|
|
427
|
+
if (cleared > 0) {
|
|
428
|
+
logger.info({ key, cleared }, "cleared stale probe cache after integration mode change");
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// DELEGATED-MODE-V2-DESIGN.md §4.4 #2 — a deniedTools-only edit must
|
|
432
|
+
// also re-materialize active DM workdirs, since the per-session
|
|
433
|
+
// `disallowedTools` array (Claude SDK), admin-policy TOML (Gemini),
|
|
434
|
+
// and AGENTS.md prose block (Codex) are derived from `state.deniedTools`
|
|
435
|
+
// at materialization time. A stale workdir would leak the old policy
|
|
436
|
+
// into the next turn. We compute the policy diff up front so we can
|
|
437
|
+
// gate the lifecycle callback on it.
|
|
438
|
+
const policyDiff = diffDeniedTools(previous.deniedTools ?? [], next[key].deniedTools ?? []);
|
|
439
|
+
const policyChanged = policyDiff.added.length > 0 || policyDiff.removed.length > 0;
|
|
440
|
+
const syncChanged = (previous.delegatedSyncEnabled ?? true)
|
|
441
|
+
!== (next[key].delegatedSyncEnabled ?? true);
|
|
442
|
+
// §4.10 lifecycle step 4 — observer flip side of the callback is
|
|
443
|
+
// gated on `wasDirect !== isDirect` inside `applyIntegrationModeChange`,
|
|
444
|
+
// so calling it on a deniedTools-only edit is safe: observer
|
|
445
|
+
// start/stop is a no-op, only `rematerializeDmSessions` fires.
|
|
446
|
+
if ((modeChanged || policyChanged || syncChanged) && deps.onIntegrationModeChange) {
|
|
447
|
+
void Promise.resolve()
|
|
448
|
+
.then(() => deps.onIntegrationModeChange?.(key, previous, next[key]))
|
|
449
|
+
.catch((err) => {
|
|
450
|
+
logger.error({ err, key }, "integration mode-change side-effects failed — DB state already updated");
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
// §7.7 audit. Two distinct action types so log readers can filter:
|
|
454
|
+
// - integration.mode_change: mode or delegatedBackend moved
|
|
455
|
+
// - integration.policy_change: deniedTools diff (with no mode flip)
|
|
456
|
+
// Both can fire on a single PATCH when the user changes mode AND
|
|
457
|
+
// deniedTools simultaneously — that's intentional, the diff is at
|
|
458
|
+
// different granularities.
|
|
459
|
+
if (modeChanged) {
|
|
460
|
+
recordAuditModeChange(db, key, previous, next[key]);
|
|
461
|
+
}
|
|
462
|
+
if (policyChanged) {
|
|
463
|
+
recordAuditPolicyChange(db, key, policyDiff);
|
|
464
|
+
}
|
|
465
|
+
logger.info({
|
|
466
|
+
key,
|
|
467
|
+
from: previous.mode,
|
|
468
|
+
to: next[key].mode,
|
|
469
|
+
delegatedBackend: next[key].delegatedBackend,
|
|
470
|
+
delegatedModelFrom: previous.delegatedModel ?? null,
|
|
471
|
+
delegatedModelTo: next[key].delegatedModel ?? null,
|
|
472
|
+
deniedToolsAdded: policyDiff.added,
|
|
473
|
+
deniedToolsRemoved: policyDiff.removed,
|
|
474
|
+
}, modeChanged
|
|
475
|
+
? "integration mode updated"
|
|
476
|
+
: "integration policy updated (deniedTools / delegatedModel)");
|
|
477
|
+
// Auto-enable the global task-mode flag the first time *any*
|
|
478
|
+
// integration enters delegated mode. Rationale:
|
|
479
|
+
// - The legacy `/integrations/:key/invoke` RPC is dead (commented
|
|
480
|
+
// out 2026-05-01 in this same file); every delegated skill body
|
|
481
|
+
// and task flow now talks to `/exec`.
|
|
482
|
+
// - `/exec` is gated by `delegatedTaskModeEnabled`, originally a
|
|
483
|
+
// Phase-1 canary that defaults `false`. With `/invoke` gone,
|
|
484
|
+
// "delegated mode + task mode off" is a degenerate state with
|
|
485
|
+
// no productive use — the agent calls `/exec`, gets 503,
|
|
486
|
+
// fails. So flipping an integration to delegated *is* the
|
|
487
|
+
// enablement signal.
|
|
488
|
+
// - We only flip on the transition into delegated, not on every
|
|
489
|
+
// PATCH against an already-delegated integration. A pure
|
|
490
|
+
// deniedTools edit must not silently re-enable a flag the
|
|
491
|
+
// operator manually toggled off; emergency-disable is the
|
|
492
|
+
// flag's remaining role.
|
|
493
|
+
const enteringDelegated = next[key].mode === "delegated" && previous.mode !== "delegated";
|
|
494
|
+
if (enteringDelegated && !config.delegatedTaskModeEnabled) {
|
|
495
|
+
try {
|
|
496
|
+
createSettingsStore(db).set("delegatedTaskModeEnabled", true);
|
|
497
|
+
config.delegatedTaskModeEnabled = true;
|
|
498
|
+
logger.info({ key, backend: effectiveBackend, trigger: "first_delegated" }, "auto-enabled delegatedTaskModeEnabled — first delegated integration");
|
|
499
|
+
}
|
|
500
|
+
catch (err) {
|
|
501
|
+
// Settings write is best-effort: even if persistence fails the
|
|
502
|
+
// in-memory config update above keeps /exec working for this
|
|
503
|
+
// process; a daemon restart would re-apply the same heal via
|
|
504
|
+
// the startup default-correction path in index.ts.
|
|
505
|
+
logger.error({ err, key }, "failed to persist delegatedTaskModeEnabled auto-enable; in-memory config still updated");
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return c.json({ ok: true, integration: next[key] });
|
|
509
|
+
}
|
|
510
|
+
catch (err) {
|
|
511
|
+
logger.error({ err, key }, "integration mode update failed");
|
|
512
|
+
return c.json({ error: "internal_error" }, 500);
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
516
|
+
// RESERVED — POST /integrations/:key/invoke (RPC-style tool dispatch)
|
|
517
|
+
//
|
|
518
|
+
// Commented out 2026-05-01 as part of the /exec-only migration. The
|
|
519
|
+
// RPC `{tool, args}` shape required the caller to know the delegated
|
|
520
|
+
// backend's exact bare tool name (Claude `search_threads` vs Codex
|
|
521
|
+
// `search_emails` vs Gemini `search`) and arg names (`pageSize` vs
|
|
522
|
+
// `max_results` vs `maxResults`). That coupling broke under:
|
|
523
|
+
// - cross-backend tool-name divergence (the alias-translation gap
|
|
524
|
+
// that caused the 2026-05-01 wrong_tool incidents),
|
|
525
|
+
// - any custom MCP server the user installs (registry-invisible),
|
|
526
|
+
// - backend swaps that should be transparent to the agent.
|
|
527
|
+
//
|
|
528
|
+
// `POST /integrations/:key/exec` (task mode) is the canonical surface
|
|
529
|
+
// now: the agent describes intent in natural language + outputSchema,
|
|
530
|
+
// the daemon's delegate picks the tool. The handler body and the
|
|
531
|
+
// supporting `resolveCanonicalBareTool` helper are preserved verbatim
|
|
532
|
+
// for **future reactivation** — possible reactivation scenarios:
|
|
533
|
+
// 1. A low-latency RPC fast path for cost-sensitive callers.
|
|
534
|
+
// 2. A debug/admin endpoint for direct tool dispatch.
|
|
535
|
+
// 3. A per-integration opt-in once full cross-backend alias
|
|
536
|
+
// translation is in place.
|
|
537
|
+
//
|
|
538
|
+
// DO NOT DELETE. The internal `DelegatedBackendInvoker.invoke()` API
|
|
539
|
+
// and each core's `runDelegatedTool()` remain wired (used by
|
|
540
|
+
// `delegated-sync-worker` for hourly drift detection — see
|
|
541
|
+
// `packages/daemon/src/observers/delegated-sync-worker.ts:504`).
|
|
542
|
+
//
|
|
543
|
+
// Original docstring (preserved for the reactivation-time author):
|
|
544
|
+
// POST /integrations/:key/invoke — DELEGATED-MODE-V2-DESIGN.md §4.2.
|
|
545
|
+
// Generic chokepoint for cross-backend delegated tool calls. The
|
|
546
|
+
// agent's cross-backend skill body
|
|
547
|
+
// (`SKILL.delegated.<sessionBackend>.md`) directs it here for any
|
|
548
|
+
// connector tool on a delegatedBackend that differs from the DM
|
|
549
|
+
// session backend. Body: `{tool, args}` — the daemon does NOT
|
|
550
|
+
// enumerate or validate the tool name (no per-tool routeMap
|
|
551
|
+
// maintenance); it forwards verbatim to `DelegatedBackendInvoker`.
|
|
552
|
+
//
|
|
553
|
+
// Pre-flight order (cheapest first, fail-fast):
|
|
554
|
+
// 1. Integration must be in `delegated` mode (409 mode_mismatch).
|
|
555
|
+
// 2. If `x-session-backend` is set and matches `state.delegatedBackend`,
|
|
556
|
+
// the caller is misusing the endpoint — same-backend agents have
|
|
557
|
+
// native MCP and the skill is not provisioned (§4.1.2). Surface as
|
|
558
|
+
// 409 to make accidental misuse loud rather than spawning a useless
|
|
559
|
+
// subprocess.
|
|
560
|
+
// 3. `state.deniedTools` patterns enforced via `matchToolPattern`. The
|
|
561
|
+
// stored entries are bare names (no `mcp__*` prefix), so we strip the
|
|
562
|
+
// connector's `toolNamespace` from the body's `tool` before matching.
|
|
563
|
+
//
|
|
564
|
+
// Risk tier: Autonomous (no Bearer required). Cost / failure
|
|
565
|
+
// attribution lands in `agent_actions` via the invoker
|
|
566
|
+
// (`action_type='delegated_proxy.invoke'`).
|
|
567
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
568
|
+
/*
|
|
569
|
+
app.post("/integrations/:key/invoke", async (c) => {
|
|
570
|
+
const key = c.req.param("key");
|
|
571
|
+
if (!isIntegrationKey(key)) {
|
|
572
|
+
return c.json({ error: "unknown_integration", key }, 404);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
const parsedBody = await readJsonBody(c);
|
|
576
|
+
if (!parsedBody.ok) return parsedBody.response;
|
|
577
|
+
|
|
578
|
+
const body = parsedBody.body as { tool?: unknown; args?: unknown } | null;
|
|
579
|
+
const toolRaw = body?.tool;
|
|
580
|
+
if (typeof toolRaw !== "string" || toolRaw.length === 0) {
|
|
581
|
+
return c.json(
|
|
582
|
+
{
|
|
583
|
+
error: "validation_error",
|
|
584
|
+
message: "`tool` must be a non-empty string (bare tool name or fully-qualified MCP name)",
|
|
585
|
+
},
|
|
586
|
+
400,
|
|
587
|
+
);
|
|
588
|
+
}
|
|
589
|
+
// §4.2.1 contract — `args` is `object`. Reject arrays, scalars, and null
|
|
590
|
+
// here so the failure surfaces at the route boundary with a precise 400
|
|
591
|
+
// rather than as a downstream invoker / connector parse error.
|
|
592
|
+
const argsRaw = body?.args;
|
|
593
|
+
if (
|
|
594
|
+
argsRaw !== undefined
|
|
595
|
+
&& (argsRaw === null
|
|
596
|
+
|| typeof argsRaw !== "object"
|
|
597
|
+
|| Array.isArray(argsRaw))
|
|
598
|
+
) {
|
|
599
|
+
return c.json(
|
|
600
|
+
{
|
|
601
|
+
error: "validation_error",
|
|
602
|
+
message: "`args` must be a JSON object (or omitted to send {})",
|
|
603
|
+
},
|
|
604
|
+
400,
|
|
605
|
+
);
|
|
606
|
+
}
|
|
607
|
+
const args = (argsRaw as Record<string, unknown> | undefined) ?? {};
|
|
608
|
+
|
|
609
|
+
if (!deps.delegatedInvoker) {
|
|
610
|
+
// Boot ordering / test wiring case — invoker not registered. Surface
|
|
611
|
+
// explicitly so the caller knows this isn't a precondition mismatch.
|
|
612
|
+
return c.json(
|
|
613
|
+
{
|
|
614
|
+
error: "unimplemented",
|
|
615
|
+
message: "delegated invoker is not wired into this daemon instance",
|
|
616
|
+
integration: key,
|
|
617
|
+
backend: null,
|
|
618
|
+
mode: "delegated",
|
|
619
|
+
},
|
|
620
|
+
501,
|
|
621
|
+
);
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
const state = readIntegrations(db)[key];
|
|
625
|
+
if (!state || state.mode !== "delegated" || !state.delegatedBackend) {
|
|
626
|
+
return c.json(
|
|
627
|
+
{
|
|
628
|
+
error: "mode_mismatch",
|
|
629
|
+
message: `${key} is not in delegated mode (mode=${state?.mode ?? "missing"})`,
|
|
630
|
+
integration: key,
|
|
631
|
+
backend: null,
|
|
632
|
+
mode: "delegated",
|
|
633
|
+
},
|
|
634
|
+
409,
|
|
635
|
+
);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
const sessionBackendHeader = c.req.header("x-session-backend");
|
|
639
|
+
if (
|
|
640
|
+
sessionBackendHeader
|
|
641
|
+
&& sessionBackendHeader === state.delegatedBackend
|
|
642
|
+
) {
|
|
643
|
+
return c.json(
|
|
644
|
+
{
|
|
645
|
+
error: "mode_mismatch",
|
|
646
|
+
message: `session backend matches delegatedBackend (${sessionBackendHeader}) — use native MCP instead`,
|
|
647
|
+
integration: key,
|
|
648
|
+
backend: state.delegatedBackend,
|
|
649
|
+
mode: "delegated",
|
|
650
|
+
},
|
|
651
|
+
409,
|
|
652
|
+
);
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
// Strip the connector's namespace prefix if the body included it,
|
|
656
|
+
// then translate cross-backend aliases to the delegated connector's
|
|
657
|
+
// canonical tool name. Translation runs BEFORE the deniedTools check
|
|
658
|
+
// because deny entries are stored as backend-canonical names (the
|
|
659
|
+
// skill body trains the user on that form): checking pre-translation
|
|
660
|
+
// silently lets a denied call through if the agent used a sibling
|
|
661
|
+
// backend's alias.
|
|
662
|
+
const connector = INTEGRATION_DESCRIPTORS[key].backendConnectors[state.delegatedBackend];
|
|
663
|
+
const namespace = connector?.toolNamespace ?? "";
|
|
664
|
+
const incomingBareTool = namespace && toolRaw.startsWith(namespace)
|
|
665
|
+
? toolRaw.slice(namespace.length)
|
|
666
|
+
: toolRaw;
|
|
667
|
+
const bareTool = resolveCanonicalBareTool(connector, incomingBareTool);
|
|
668
|
+
if (bareTool !== incomingBareTool) {
|
|
669
|
+
logger.debug(
|
|
670
|
+
{
|
|
671
|
+
integration: key,
|
|
672
|
+
backend: state.delegatedBackend,
|
|
673
|
+
from: incomingBareTool,
|
|
674
|
+
to: bareTool,
|
|
675
|
+
},
|
|
676
|
+
"delegated invoke: translated cross-backend tool alias",
|
|
677
|
+
);
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
if ((state.deniedTools ?? []).some((pattern) => matchToolPattern(pattern, bareTool))) {
|
|
681
|
+
return c.json(
|
|
682
|
+
{
|
|
683
|
+
error: "denied_tool",
|
|
684
|
+
message: `tool '${bareTool}' is denied by user settings for integration '${key}'`,
|
|
685
|
+
integration: key,
|
|
686
|
+
backend: state.delegatedBackend,
|
|
687
|
+
mode: "delegated",
|
|
688
|
+
tool: bareTool,
|
|
689
|
+
},
|
|
690
|
+
403,
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// The invoker forwards verbatim — connector validates the tool name and
|
|
695
|
+
// arg shape. We always send the fully-qualified tool string so the
|
|
696
|
+
// subprocess prompt unambiguously points at one tool.
|
|
697
|
+
const fullyQualifiedTool = namespace ? `${namespace}${bareTool}` : bareTool;
|
|
698
|
+
|
|
699
|
+
const result = await deps.delegatedInvoker.invoke({
|
|
700
|
+
integrationKey: key,
|
|
701
|
+
toolName: fullyQualifiedTool,
|
|
702
|
+
toolArgs: args,
|
|
703
|
+
parentEventId: c.req.header("x-event-id"),
|
|
704
|
+
parentProcessKey: c.req.header("x-process-key"),
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
if (result.ok) {
|
|
708
|
+
// INTEGRATION-DRIFT-DETECTION-PLAN.md §11 Phase 4 — actor attribution.
|
|
709
|
+
// Successful writes mark the persistent `integration_writes` table so
|
|
710
|
+
// the next reconcile diff resolves `actor='agent'` and the agent does
|
|
711
|
+
// not re-discover its own write as a user-originated observation.
|
|
712
|
+
// Decision tree:
|
|
713
|
+
// 1. `bareTool` in `connector.destructiveTools` → it's a write.
|
|
714
|
+
// 2. Walk `result.toolResult` for canonical id keys (extractor).
|
|
715
|
+
// 3. If the response had no id (label_message / label_thread /
|
|
716
|
+
// bulk_label_matching_emails return `{ ok: true }`), fall back
|
|
717
|
+
// to `args.messageId` / `args.threadId` / each entry of
|
|
718
|
+
// `args.messageIds` / `args.threadIds`.
|
|
719
|
+
// Failure to extract any id is logged at debug and the call still
|
|
720
|
+
// returns 2xx — losing one attribution mark causes one self-noticed
|
|
721
|
+
// observation, never data loss.
|
|
722
|
+
maybeMarkIntegrationWrite(deps.db, {
|
|
723
|
+
integration: key,
|
|
724
|
+
connector,
|
|
725
|
+
bareTool,
|
|
726
|
+
toolResult: result.toolResult,
|
|
727
|
+
args,
|
|
728
|
+
});
|
|
729
|
+
return c.json({
|
|
730
|
+
toolResult: result.toolResult,
|
|
731
|
+
cost: {
|
|
732
|
+
tokensInput: result.cost.tokensInput,
|
|
733
|
+
tokensOutput: result.cost.tokensOutput,
|
|
734
|
+
cacheCreationTokens: result.cost.cacheCreationTokens,
|
|
735
|
+
cacheReadTokens: result.cost.cacheReadTokens,
|
|
736
|
+
costUsd: result.cost.costUsd,
|
|
737
|
+
durationMs: result.cost.durationMs,
|
|
738
|
+
numTurns: result.cost.numTurns,
|
|
739
|
+
},
|
|
740
|
+
});
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
const status = mapErrorClassToHttpStatus(result.errorClass);
|
|
744
|
+
return c.json(
|
|
745
|
+
{
|
|
746
|
+
error: result.errorClass,
|
|
747
|
+
message: result.message,
|
|
748
|
+
integration: key,
|
|
749
|
+
backend: result.backendId ?? state.delegatedBackend,
|
|
750
|
+
mode: "delegated",
|
|
751
|
+
},
|
|
752
|
+
status,
|
|
753
|
+
);
|
|
754
|
+
});
|
|
755
|
+
*/
|
|
756
|
+
// ── end of reserved /invoke route ────────────────────────────────────
|
|
757
|
+
// POST /integrations/:key/exec — DELEGATED-TASK-MODE-DESIGN.md §4.1.
|
|
758
|
+
// Task-mode invocation: the calling agent describes intent in natural
|
|
759
|
+
// language and pins an `outputSchema`; the daemon spawns the
|
|
760
|
+
// delegatedBackend with `allowedTools` restricted to the integration's
|
|
761
|
+
// connector and validates the final assistant JSON against the schema.
|
|
762
|
+
//
|
|
763
|
+
// Pre-flight order (cheapest first; matches /invoke ordering):
|
|
764
|
+
// 1. Integration is registered (404 unknown_integration).
|
|
765
|
+
// 2. Body is valid JSON (400 invalid_json_body).
|
|
766
|
+
// 3. Body fields parse: task non-empty string, outputSchema present
|
|
767
|
+
// and within 4 KB, caps within hard bounds, allowDestructive bool.
|
|
768
|
+
// 4. Kill switch (config.delegatedTaskModeEnabled): 503 if false.
|
|
769
|
+
// 5. Integration is delegated with non-null delegatedBackend (409).
|
|
770
|
+
// 6. delegatedBackend ∈ {claude, gemini} — Codex returns 501.
|
|
771
|
+
// 7. x-session-backend header (if set) ≠ delegatedBackend (409 same
|
|
772
|
+
// defense-in-depth as /invoke — same-backend should use native MCP).
|
|
773
|
+
// 8. Invoker wired (501).
|
|
774
|
+
//
|
|
775
|
+
// Risk tier: Autonomous (no Bearer required). Same rationale as /invoke —
|
|
776
|
+
// tool-level safety lives in `state.deniedTools` + `destructiveTools`,
|
|
777
|
+
// both enforced at the chokepoint by the invoker.
|
|
778
|
+
app.post("/integrations/:key/exec", async (c) => {
|
|
779
|
+
const key = c.req.param("key");
|
|
780
|
+
if (!isIntegrationKey(key)) {
|
|
781
|
+
return c.json({ error: "unknown_integration", key }, 404);
|
|
782
|
+
}
|
|
783
|
+
const parsedBody = await readJsonBody(c);
|
|
784
|
+
if (!parsedBody.ok)
|
|
785
|
+
return parsedBody.response;
|
|
786
|
+
const body = parsedBody.body;
|
|
787
|
+
// Field-level validation. Each branch maps to `validation_error` /
|
|
788
|
+
// `schema_too_large` per §10.
|
|
789
|
+
if (typeof body?.task !== "string" || body.task.trim().length === 0) {
|
|
790
|
+
return c.json({
|
|
791
|
+
error: "validation_error",
|
|
792
|
+
message: "`task` must be a non-empty string",
|
|
793
|
+
}, 400);
|
|
794
|
+
}
|
|
795
|
+
const schemaCheck = checkOutputSchema(body.outputSchema);
|
|
796
|
+
if (!schemaCheck.ok) {
|
|
797
|
+
const errorCode = schemaCheck.reason === "too_large"
|
|
798
|
+
? "schema_too_large"
|
|
799
|
+
: "validation_error";
|
|
800
|
+
return c.json({
|
|
801
|
+
error: errorCode,
|
|
802
|
+
message: schemaCheck.message,
|
|
803
|
+
field: "outputSchema",
|
|
804
|
+
}, 400);
|
|
805
|
+
}
|
|
806
|
+
const outputSchema = body.outputSchema;
|
|
807
|
+
const config = deps.config;
|
|
808
|
+
if (!config.delegatedTaskModeEnabled) {
|
|
809
|
+
return c.json({
|
|
810
|
+
error: "task_mode_disabled",
|
|
811
|
+
// Auto-enable on `PATCH /api/integrations/:key` to delegated
|
|
812
|
+
// (and the matching startup heal in `index.ts`) make this
|
|
813
|
+
// path a deliberate operator action: the flag was either
|
|
814
|
+
// explicitly disabled via `PATCH /api/config` or its
|
|
815
|
+
// emergency-disable use case fired. Surface that fact rather
|
|
816
|
+
// than promising a dashboard toggle that does not exist.
|
|
817
|
+
message: "Task mode is currently disabled (config.delegatedTaskModeEnabled=false). Re-enable via PATCH /api/config { delegatedTaskModeEnabled: true }, or flip an integration to delegated to auto-enable.",
|
|
818
|
+
integration: key,
|
|
819
|
+
mode: "delegated",
|
|
820
|
+
}, 503);
|
|
821
|
+
}
|
|
822
|
+
const allowDestructive = body.allowDestructive === true;
|
|
823
|
+
const maxToolCalls = clampNumber(body.maxToolCalls, config.delegatedTaskDefaultMaxToolCalls, 1, DELEGATED_TASK_HARD_CAPS.maxToolCalls);
|
|
824
|
+
if (maxToolCalls === null) {
|
|
825
|
+
return c.json({
|
|
826
|
+
error: "validation_error",
|
|
827
|
+
message: `maxToolCalls must be an integer between 1 and ${DELEGATED_TASK_HARD_CAPS.maxToolCalls}`,
|
|
828
|
+
}, 400);
|
|
829
|
+
}
|
|
830
|
+
const maxBudgetUsd = clampNumber(body.maxBudgetUsd, config.delegatedTaskDefaultMaxBudgetUsd, 0, DELEGATED_TASK_HARD_CAPS.maxBudgetUsd, true);
|
|
831
|
+
if (maxBudgetUsd === null) {
|
|
832
|
+
return c.json({
|
|
833
|
+
error: "validation_error",
|
|
834
|
+
message: `maxBudgetUsd must be a number between 0 and ${DELEGATED_TASK_HARD_CAPS.maxBudgetUsd}`,
|
|
835
|
+
}, 400);
|
|
836
|
+
}
|
|
837
|
+
const timeoutMs = clampNumber(body.timeoutMs, config.delegatedTaskDefaultTimeoutMs, 1000, DELEGATED_TASK_HARD_CAPS.maxTimeoutMs);
|
|
838
|
+
if (timeoutMs === null) {
|
|
839
|
+
return c.json({
|
|
840
|
+
error: "validation_error",
|
|
841
|
+
message: `timeoutMs must be an integer between 1000 and ${DELEGATED_TASK_HARD_CAPS.maxTimeoutMs}`,
|
|
842
|
+
}, 400);
|
|
843
|
+
}
|
|
844
|
+
if (!deps.delegatedInvoker) {
|
|
845
|
+
return c.json({
|
|
846
|
+
error: "unimplemented",
|
|
847
|
+
message: "delegated invoker is not wired into this daemon instance",
|
|
848
|
+
integration: key,
|
|
849
|
+
backend: null,
|
|
850
|
+
mode: "delegated",
|
|
851
|
+
}, 501);
|
|
852
|
+
}
|
|
853
|
+
const state = readIntegrations(deps.db)[key];
|
|
854
|
+
if (!state || state.mode !== "delegated" || !state.delegatedBackend) {
|
|
855
|
+
return c.json({
|
|
856
|
+
error: "mode_mismatch",
|
|
857
|
+
message: `${key} is not in delegated mode (mode=${state?.mode ?? "missing"})`,
|
|
858
|
+
integration: key,
|
|
859
|
+
backend: null,
|
|
860
|
+
mode: "delegated",
|
|
861
|
+
}, 409);
|
|
862
|
+
}
|
|
863
|
+
// Codex task mode landed in Phase 1.5 — daemon-side stream pre-emption
|
|
864
|
+
// (see codex-core.ts `runDelegatedTask`) gates allowed-tools / destructive
|
|
865
|
+
// calls without relying on a CLI-level allowedTools surface. The 501
|
|
866
|
+
// short-circuit that previously fired here for `state.delegatedBackend
|
|
867
|
+
// === "codex"` is gone; Codex /exec requests now flow through the
|
|
868
|
+
// invoker like Claude and Gemini.
|
|
869
|
+
const sessionBackendHeader = c.req.header("x-session-backend");
|
|
870
|
+
if (sessionBackendHeader
|
|
871
|
+
&& sessionBackendHeader === state.delegatedBackend) {
|
|
872
|
+
return c.json({
|
|
873
|
+
error: "mode_mismatch",
|
|
874
|
+
message: `session backend matches delegatedBackend (${sessionBackendHeader}) — use native MCP instead`,
|
|
875
|
+
integration: key,
|
|
876
|
+
backend: state.delegatedBackend,
|
|
877
|
+
mode: "delegated",
|
|
878
|
+
}, 409);
|
|
879
|
+
}
|
|
880
|
+
const result = await deps.delegatedInvoker.task({
|
|
881
|
+
integrationKey: key,
|
|
882
|
+
task: body.task.trim(),
|
|
883
|
+
outputSchema,
|
|
884
|
+
maxToolCalls,
|
|
885
|
+
maxBudgetUsd,
|
|
886
|
+
timeoutMs,
|
|
887
|
+
allowDestructive,
|
|
888
|
+
heavy: body.heavy === true,
|
|
889
|
+
// §13 Phase 3.3 — pass-through opt-in. Defense-in-depth: the
|
|
890
|
+
// invoker also enforces `allowDestructive === false` before
|
|
891
|
+
// checking the cache, so a buggy caller that sets cacheable on a
|
|
892
|
+
// destructive task can't poison the cache.
|
|
893
|
+
cacheable: body.cacheable === true,
|
|
894
|
+
parentEventId: c.req.header("x-event-id"),
|
|
895
|
+
parentProcessKey: c.req.header("x-process-key"),
|
|
896
|
+
});
|
|
897
|
+
// INTEGRATION-DRIFT-DETECTION-PLAN.md §11 Phase 4 — actor
|
|
898
|
+
// attribution at the /exec chokepoint. /invoke called this once per
|
|
899
|
+
// request because there was a single tool. /exec is a loop: walk
|
|
900
|
+
// the trace and mark every successful destructive step.
|
|
901
|
+
//
|
|
902
|
+
// Runs BEFORE the result.ok / error split because failed tasks
|
|
903
|
+
// still strand real side effects in the trace:
|
|
904
|
+
// - timeout / subprocess_crashed / loop_aborted / budget_exhausted:
|
|
905
|
+
// earlier ok steps already landed before the wall-clock /
|
|
906
|
+
// budget / turn cap fired.
|
|
907
|
+
// - schema_violation / parse_error: the model called the tool
|
|
908
|
+
// successfully and then mis-formatted its final JSON. The §6.2
|
|
909
|
+
// retry is suppressed when `writeClassToolFired` is true, so
|
|
910
|
+
// the side effect landed exactly once and needs marking
|
|
911
|
+
// exactly once.
|
|
912
|
+
// - policy_violation: the violating step is `status: "error"`
|
|
913
|
+
// (Codex aborts before pairing) but earlier ok destructive
|
|
914
|
+
// steps in the same task are still real.
|
|
915
|
+
// Skipping the loop on failure was the same shape of bug as the
|
|
916
|
+
// old /invoke→/exec migration miss: an agent-issued send_email
|
|
917
|
+
// that schema-violates on output would land in Gmail, return 502,
|
|
918
|
+
// and surface as "I noticed you sent…" on the next reconcile.
|
|
919
|
+
//
|
|
920
|
+
// Bare-tool resolution: trace `toolName` is the fully-qualified
|
|
921
|
+
// `mcp__server__tool` (or dotted `server.tool`) form the core
|
|
922
|
+
// observed mid-stream. Strip `connector.toolNamespace` to recover
|
|
923
|
+
// the bare name for the destructiveTools membership check; if the
|
|
924
|
+
// namespace doesn't match, the tool wasn't from this connector
|
|
925
|
+
// (e.g. an internal Read/Write step) and we ignore it.
|
|
926
|
+
//
|
|
927
|
+
// Each trace step carries the upstream `toolResult` (the cores
|
|
928
|
+
// JSON-parse the connector response when possible, fall back to
|
|
929
|
+
// raw string). extractWriteItemIds first walks the response
|
|
930
|
+
// shape (recovers id-in-response writes — send_email,
|
|
931
|
+
// create_event, notion-create-pages) and then falls back to
|
|
932
|
+
// args-side extraction (recovers id-in-args writes — delete /
|
|
933
|
+
// update / label / archive). Older snapshots / stub cores that
|
|
934
|
+
// don't populate toolResult degrade to args-only without crashing.
|
|
935
|
+
//
|
|
936
|
+
// `result.trace` is required on the success union and optional on
|
|
937
|
+
// the error union — guard with truthiness.
|
|
938
|
+
if (result.trace && result.trace.length > 0) {
|
|
939
|
+
const descriptor = INTEGRATION_DESCRIPTORS[key];
|
|
940
|
+
const connector = descriptor.backendConnectors[state.delegatedBackend];
|
|
941
|
+
if (connector) {
|
|
942
|
+
const namespace = connector.toolNamespace;
|
|
943
|
+
for (const step of result.trace) {
|
|
944
|
+
if (step.status !== "ok")
|
|
945
|
+
continue;
|
|
946
|
+
if (!step.toolName.startsWith(namespace))
|
|
947
|
+
continue;
|
|
948
|
+
const bareTool = step.toolName.slice(namespace.length);
|
|
949
|
+
if (!connector.destructiveTools.includes(bareTool))
|
|
950
|
+
continue;
|
|
951
|
+
maybeMarkIntegrationWrite(deps.db, {
|
|
952
|
+
integration: key,
|
|
953
|
+
connector,
|
|
954
|
+
bareTool,
|
|
955
|
+
toolResult: step.toolResult,
|
|
956
|
+
args: step.toolArgs,
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
if (result.ok) {
|
|
962
|
+
return c.json({
|
|
963
|
+
result: result.result,
|
|
964
|
+
needsConfirmation: result.needsConfirmation,
|
|
965
|
+
confirmationPlan: result.confirmationPlan,
|
|
966
|
+
trace: result.trace,
|
|
967
|
+
cost: result.cost,
|
|
968
|
+
});
|
|
969
|
+
}
|
|
970
|
+
const status = mapTaskErrorClassToHttpStatus(result.errorClass);
|
|
971
|
+
return c.json({
|
|
972
|
+
error: result.errorClass,
|
|
973
|
+
message: result.message,
|
|
974
|
+
...(result.raw !== undefined ? { raw: result.raw } : {}),
|
|
975
|
+
...(result.trace ? { trace: result.trace } : {}),
|
|
976
|
+
...(result.cost ? { cost: result.cost } : {}),
|
|
977
|
+
integration: key,
|
|
978
|
+
backend: result.backendId ?? state.delegatedBackend,
|
|
979
|
+
mode: "delegated",
|
|
980
|
+
}, status);
|
|
981
|
+
});
|
|
982
|
+
// POST /integrations/:key/probe — evaluate or read the cached connector
|
|
983
|
+
// probe for a given backend. Phase 2 supports two modes:
|
|
984
|
+
// - Live probe: caller passes `{tools: [...]}` (the names the agent
|
|
985
|
+
// subprocess reported). The evaluator computes presence + persists.
|
|
986
|
+
// - Cached read: body omits `tools`. Returns the latest stored row, or
|
|
987
|
+
// a 404 marker if no probe has been taken yet. The dashboard's
|
|
988
|
+
// refresh button and post-Apply background refresh use the live path;
|
|
989
|
+
// /health and the setup wizard's initial render use the cached path.
|
|
990
|
+
// No live agent subprocess is launched here — keeping that out of the
|
|
991
|
+
// boot critical path is what saves the per-Opus probe cost called out
|
|
992
|
+
// in the §7 POC.
|
|
993
|
+
app.post("/integrations/:key/probe", async (c) => {
|
|
994
|
+
const key = c.req.param("key");
|
|
995
|
+
if (!isIntegrationKey(key)) {
|
|
996
|
+
return c.json({ error: "unknown_integration", key }, 404);
|
|
997
|
+
}
|
|
998
|
+
const body = await readOptionalJsonBody(c);
|
|
999
|
+
if (body === null) {
|
|
1000
|
+
return c.json({ error: "invalid_json_body" }, 400);
|
|
1001
|
+
}
|
|
1002
|
+
const backend = resolveProbeBackend(body.backend, db, key);
|
|
1003
|
+
if (!backend.ok)
|
|
1004
|
+
return c.json(backend.error, backend.status);
|
|
1005
|
+
const descriptorForProbe = INTEGRATION_DESCRIPTORS[key];
|
|
1006
|
+
const isUserManaged = descriptorForProbe.userManagedConnector === true;
|
|
1007
|
+
// Connector existence is a descriptor-driven precondition. User-
|
|
1008
|
+
// managed integrations (Outlook today) intentionally ship with an
|
|
1009
|
+
// empty `backendConnectors` and skip this check — the user's MCP /
|
|
1010
|
+
// connector on the chosen backend is the source of truth, not the
|
|
1011
|
+
// registry. Backend availability + auth still get verified for
|
|
1012
|
+
// user-managed in the live-probe branch below.
|
|
1013
|
+
if (!isUserManaged) {
|
|
1014
|
+
const connector = getConnector(key, backend.value);
|
|
1015
|
+
if (!connector) {
|
|
1016
|
+
return c.json({
|
|
1017
|
+
error: "backend_not_supported",
|
|
1018
|
+
key,
|
|
1019
|
+
backend: backend.value,
|
|
1020
|
+
availableBackends: Object.keys(descriptorForProbe.backendConnectors),
|
|
1021
|
+
}, 400);
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
// §4.11 live probe — `liveProbe: true` asks the daemon to spawn the
|
|
1025
|
+
// target backend and enumerate its MCP tool list. User-initiated only;
|
|
1026
|
+
// never fired from boot or PATCH. The descriptor + cached read paths
|
|
1027
|
+
// cover the other two calling conventions.
|
|
1028
|
+
//
|
|
1029
|
+
// For user-managed integrations the spawn + probeTools() call still
|
|
1030
|
+
// fires (this is what enforces §4.12.2 checks #1 backend resolvable
|
|
1031
|
+
// and #2 backend auth valid). Only the descriptor-side capability
|
|
1032
|
+
// evaluation is replaced by `makeUserManagedProbeResult`, which
|
|
1033
|
+
// carries the full live tool list as `presentTools` so dashboards
|
|
1034
|
+
// can show "we found N tools on your backend."
|
|
1035
|
+
if (body.liveProbe === true) {
|
|
1036
|
+
const core = deps.agentBackends?.find((c) => c.backendId === backend.value);
|
|
1037
|
+
if (!core) {
|
|
1038
|
+
return c.json({
|
|
1039
|
+
error: "backend_core_unavailable",
|
|
1040
|
+
backend: backend.value,
|
|
1041
|
+
message: `Backend '${backend.value}' is not registered in this daemon — cannot run live probe.`,
|
|
1042
|
+
}, 503);
|
|
1043
|
+
}
|
|
1044
|
+
try {
|
|
1045
|
+
const tools = await core.probeTools();
|
|
1046
|
+
const result = isUserManaged
|
|
1047
|
+
? makeUserManagedProbeResult(key, backend.value, tools)
|
|
1048
|
+
: evaluateProbe({
|
|
1049
|
+
tools,
|
|
1050
|
+
integration: key,
|
|
1051
|
+
backend: backend.value,
|
|
1052
|
+
});
|
|
1053
|
+
writeProbe(db, result);
|
|
1054
|
+
logger.info({
|
|
1055
|
+
key,
|
|
1056
|
+
backend: backend.value,
|
|
1057
|
+
present: result.present,
|
|
1058
|
+
missingRequired: result.missingRequired,
|
|
1059
|
+
toolCount: result.presentTools.length,
|
|
1060
|
+
userManaged: isUserManaged,
|
|
1061
|
+
}, "integration live probe persisted");
|
|
1062
|
+
return c.json({
|
|
1063
|
+
ok: true,
|
|
1064
|
+
cached: false,
|
|
1065
|
+
liveProbe: true,
|
|
1066
|
+
...(isUserManaged ? { userManaged: true } : {}),
|
|
1067
|
+
result,
|
|
1068
|
+
});
|
|
1069
|
+
}
|
|
1070
|
+
catch (err) {
|
|
1071
|
+
if (err instanceof LiveProbeUnsupportedError) {
|
|
1072
|
+
return c.json({
|
|
1073
|
+
error: "live_probe_unsupported",
|
|
1074
|
+
backend: backend.value,
|
|
1075
|
+
message: err.reason,
|
|
1076
|
+
}, 501);
|
|
1077
|
+
}
|
|
1078
|
+
logger.error({ err, key, backend: backend.value }, "live probe failed");
|
|
1079
|
+
return c.json({
|
|
1080
|
+
error: "live_probe_failed",
|
|
1081
|
+
backend: backend.value,
|
|
1082
|
+
message: err instanceof Error ? err.message : String(err),
|
|
1083
|
+
}, 500);
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
const tools = body?.tools;
|
|
1087
|
+
if (tools === undefined) {
|
|
1088
|
+
const cached = readProbe(db, key, backend.value);
|
|
1089
|
+
// 200 + result:null when there's no cached row — distinguishes
|
|
1090
|
+
// "endpoint missing" (which the unknown_integration / 404 above
|
|
1091
|
+
// covers) from "endpoint worked but the cache is empty," so the
|
|
1092
|
+
// dashboard callers can branch without parsing error codes.
|
|
1093
|
+
return c.json({
|
|
1094
|
+
ok: true,
|
|
1095
|
+
cached: cached !== null,
|
|
1096
|
+
...(isUserManaged ? { userManaged: true } : {}),
|
|
1097
|
+
result: cached,
|
|
1098
|
+
});
|
|
1099
|
+
}
|
|
1100
|
+
if (!Array.isArray(tools) || tools.some((t) => typeof t !== "string")) {
|
|
1101
|
+
return c.json({
|
|
1102
|
+
error: "invalid_body",
|
|
1103
|
+
message: "`tools` must be an array of MCP tool names (strings).",
|
|
1104
|
+
}, 400);
|
|
1105
|
+
}
|
|
1106
|
+
try {
|
|
1107
|
+
const result = isUserManaged
|
|
1108
|
+
? makeUserManagedProbeResult(key, backend.value, tools)
|
|
1109
|
+
: evaluateProbe({
|
|
1110
|
+
tools: tools,
|
|
1111
|
+
integration: key,
|
|
1112
|
+
backend: backend.value,
|
|
1113
|
+
});
|
|
1114
|
+
writeProbe(db, result);
|
|
1115
|
+
logger.info({
|
|
1116
|
+
key,
|
|
1117
|
+
backend: backend.value,
|
|
1118
|
+
present: result.present,
|
|
1119
|
+
missingRequired: result.missingRequired,
|
|
1120
|
+
toolCount: result.presentTools.length,
|
|
1121
|
+
userManaged: isUserManaged,
|
|
1122
|
+
}, "integration probe persisted");
|
|
1123
|
+
return c.json({
|
|
1124
|
+
ok: true,
|
|
1125
|
+
cached: false,
|
|
1126
|
+
...(isUserManaged ? { userManaged: true } : {}),
|
|
1127
|
+
result,
|
|
1128
|
+
});
|
|
1129
|
+
}
|
|
1130
|
+
catch (err) {
|
|
1131
|
+
logger.error({ err, key, backend: backend.value }, "probe evaluation failed");
|
|
1132
|
+
return c.json({ error: "internal_error" }, 500);
|
|
1133
|
+
}
|
|
1134
|
+
});
|
|
1135
|
+
return app;
|
|
1136
|
+
}
|
|
1137
|
+
/**
|
|
1138
|
+
* Tolerant JSON body reader for POST routes that accept an empty body
|
|
1139
|
+
* (e.g. `POST /integrations/:key/probe` with no `tools` defaults to a
|
|
1140
|
+
* cached read). Returns `{}` for an empty body, `null` for invalid JSON,
|
|
1141
|
+
* and the parsed value otherwise.
|
|
1142
|
+
*/
|
|
1143
|
+
async function readOptionalJsonBody(c) {
|
|
1144
|
+
try {
|
|
1145
|
+
const raw = await c.req.text();
|
|
1146
|
+
if (raw.trim() === "")
|
|
1147
|
+
return {};
|
|
1148
|
+
return JSON.parse(raw);
|
|
1149
|
+
}
|
|
1150
|
+
catch {
|
|
1151
|
+
return null;
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
function resolveProbeBackend(raw, db, key) {
|
|
1155
|
+
if (typeof raw === "string") {
|
|
1156
|
+
if (!BACKEND_IDS.includes(raw)) {
|
|
1157
|
+
return {
|
|
1158
|
+
ok: false,
|
|
1159
|
+
status: 400,
|
|
1160
|
+
error: {
|
|
1161
|
+
error: "invalid_backend",
|
|
1162
|
+
message: `Unknown backend '${raw}'.`,
|
|
1163
|
+
supportedBackends: BACKEND_IDS,
|
|
1164
|
+
},
|
|
1165
|
+
};
|
|
1166
|
+
}
|
|
1167
|
+
return { ok: true, value: raw };
|
|
1168
|
+
}
|
|
1169
|
+
if (raw !== undefined) {
|
|
1170
|
+
return {
|
|
1171
|
+
ok: false,
|
|
1172
|
+
status: 400,
|
|
1173
|
+
error: {
|
|
1174
|
+
error: "invalid_backend",
|
|
1175
|
+
message: "`backend` must be a string when provided.",
|
|
1176
|
+
},
|
|
1177
|
+
};
|
|
1178
|
+
}
|
|
1179
|
+
// Default to the integration's `delegatedBackend` when one is
|
|
1180
|
+
// configured — this is the backend the wizard would commit against.
|
|
1181
|
+
const state = readIntegrations(db)[key];
|
|
1182
|
+
if (state.delegatedBackend) {
|
|
1183
|
+
return { ok: true, value: state.delegatedBackend };
|
|
1184
|
+
}
|
|
1185
|
+
return {
|
|
1186
|
+
ok: false,
|
|
1187
|
+
status: 400,
|
|
1188
|
+
error: {
|
|
1189
|
+
error: "backend_required",
|
|
1190
|
+
message: "Pass `backend` in the request body — this integration is not currently delegated, so the daemon cannot infer one.",
|
|
1191
|
+
},
|
|
1192
|
+
};
|
|
1193
|
+
}
|
|
1194
|
+
function recordAuditModeChange(db, key, previous, next) {
|
|
1195
|
+
try {
|
|
1196
|
+
db.prepare(`INSERT INTO agent_actions
|
|
1197
|
+
(event_id, action_type, trigger, result, detail, started_at, completed_at)
|
|
1198
|
+
VALUES (?, 'integration.mode_change', 'reactive', 'success', ?, datetime('now'), datetime('now'))`).run(`integration:${key}:${Date.now()}`, JSON.stringify({
|
|
1199
|
+
key,
|
|
1200
|
+
from: {
|
|
1201
|
+
mode: previous.mode,
|
|
1202
|
+
delegatedBackend: previous.delegatedBackend ?? null,
|
|
1203
|
+
},
|
|
1204
|
+
to: {
|
|
1205
|
+
mode: next.mode,
|
|
1206
|
+
delegatedBackend: next.delegatedBackend ?? null,
|
|
1207
|
+
},
|
|
1208
|
+
}));
|
|
1209
|
+
}
|
|
1210
|
+
catch (err) {
|
|
1211
|
+
logger.warn({ err, key }, "failed to write integration audit row");
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
function recordAuditPolicyChange(db, key, diff) {
|
|
1215
|
+
try {
|
|
1216
|
+
db.prepare(`INSERT INTO agent_actions
|
|
1217
|
+
(event_id, action_type, trigger, result, detail, started_at, completed_at)
|
|
1218
|
+
VALUES (?, 'integration.policy_change', 'reactive', 'success', ?, datetime('now'), datetime('now'))`).run(`integration:${key}:policy:${Date.now()}`, JSON.stringify({ key, deniedTools: diff }));
|
|
1219
|
+
}
|
|
1220
|
+
catch (err) {
|
|
1221
|
+
logger.warn({ err, key }, "failed to write integration policy audit row");
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1224
|
+
function diffDeniedTools(previous, next) {
|
|
1225
|
+
const prevSet = new Set(previous);
|
|
1226
|
+
const nextSet = new Set(next);
|
|
1227
|
+
const added = next.filter((t) => !prevSet.has(t));
|
|
1228
|
+
const removed = previous.filter((t) => !nextSet.has(t));
|
|
1229
|
+
return { added, removed };
|
|
1230
|
+
}
|
|
1231
|
+
/**
|
|
1232
|
+
* Clamp a numeric request-body field to [min, max], applying `defaultValue`
|
|
1233
|
+
* when omitted. Returns null on invalid input (NaN / wrong type), letting
|
|
1234
|
+
* the caller surface a validation_error. When `allowFloat` is true (used
|
|
1235
|
+
* for USD budgets), accepts floating-point; otherwise integer-only.
|
|
1236
|
+
*/
|
|
1237
|
+
function clampNumber(raw, defaultValue, min, max, allowFloat = false) {
|
|
1238
|
+
if (raw === undefined || raw === null)
|
|
1239
|
+
return defaultValue;
|
|
1240
|
+
if (typeof raw !== "number" || !Number.isFinite(raw))
|
|
1241
|
+
return null;
|
|
1242
|
+
if (!allowFloat && !Number.isInteger(raw))
|
|
1243
|
+
return null;
|
|
1244
|
+
if (raw < min || raw > max)
|
|
1245
|
+
return null;
|
|
1246
|
+
return raw;
|
|
1247
|
+
}
|
|
1248
|
+
/**
|
|
1249
|
+
* DELEGATED-TASK-MODE-DESIGN.md §10 — map the task-mode error class to an
|
|
1250
|
+
* HTTP status code. Mirrors the design's table 1:1.
|
|
1251
|
+
*/
|
|
1252
|
+
function mapTaskErrorClassToHttpStatus(errorClass) {
|
|
1253
|
+
switch (errorClass) {
|
|
1254
|
+
case "task_mode_disabled":
|
|
1255
|
+
return 503;
|
|
1256
|
+
case "task_quota_exhausted":
|
|
1257
|
+
return 429;
|
|
1258
|
+
case "task_mode_unsupported":
|
|
1259
|
+
return 501;
|
|
1260
|
+
case "delegated_proxy_busy":
|
|
1261
|
+
return 503;
|
|
1262
|
+
case "denied_tool":
|
|
1263
|
+
return 403;
|
|
1264
|
+
case "precondition":
|
|
1265
|
+
return 409;
|
|
1266
|
+
case "auth_error":
|
|
1267
|
+
return 502;
|
|
1268
|
+
case "tool_failed":
|
|
1269
|
+
case "tool_unavailable":
|
|
1270
|
+
case "parse_error":
|
|
1271
|
+
case "schema_violation":
|
|
1272
|
+
case "policy_violation":
|
|
1273
|
+
case "post_write_format_failure":
|
|
1274
|
+
case "loop_aborted":
|
|
1275
|
+
case "budget_exhausted":
|
|
1276
|
+
return 502;
|
|
1277
|
+
case "timeout":
|
|
1278
|
+
case "cancelled":
|
|
1279
|
+
return 504;
|
|
1280
|
+
case "subprocess_crashed":
|
|
1281
|
+
default:
|
|
1282
|
+
return 500;
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
function safeParseJson(s) {
|
|
1286
|
+
try {
|
|
1287
|
+
const parsed = JSON.parse(s);
|
|
1288
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
1289
|
+
return parsed;
|
|
1290
|
+
}
|
|
1291
|
+
return null;
|
|
1292
|
+
}
|
|
1293
|
+
catch {
|
|
1294
|
+
return null;
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
/**
|
|
1298
|
+
* INTEGRATION-DRIFT-DETECTION-PLAN.md §11 Phase 4 — delegated chokepoint
|
|
1299
|
+
* actor attribution. Branches on `connector.destructiveTools` membership;
|
|
1300
|
+
* non-destructive tools (search / read / list) are left untouched. For
|
|
1301
|
+
* write tools we run the response-shape extractor and fall back to args-
|
|
1302
|
+
* shape extraction (for `{ ok: true }`-only label / archive responses);
|
|
1303
|
+
* each surfaced id is marked in the persistent `integration_writes`
|
|
1304
|
+
* table with the per-integration default TTL.
|
|
1305
|
+
*
|
|
1306
|
+
* Called from two surfaces:
|
|
1307
|
+
* - The `/exec` success path (active) — once per successful destructive
|
|
1308
|
+
* trace step. Each trace entry carries the parsed upstream
|
|
1309
|
+
* `toolResult`, so the response-shape extractor and the args-side
|
|
1310
|
+
* fallback both fire normally — symmetric to the legacy /invoke path
|
|
1311
|
+
* (id-in-response writes like send_email / create_event /
|
|
1312
|
+
* notion-create-pages are recovered in addition to id-in-args
|
|
1313
|
+
* deletes / updates / labels).
|
|
1314
|
+
* - The reserved `/invoke` route (commented) — once per call with the
|
|
1315
|
+
* full upstream `result.toolResult`. Same response-shape walk.
|
|
1316
|
+
*
|
|
1317
|
+
* Idempotent on extraction miss: returning early without any mark is the
|
|
1318
|
+
* documented degradation path (causes one self-noticed observation, not
|
|
1319
|
+
* data loss). The route handler always returns 2xx on a successful
|
|
1320
|
+
* upstream call — this helper never throws back.
|
|
1321
|
+
*/
|
|
1322
|
+
function maybeMarkIntegrationWrite(db, args) {
|
|
1323
|
+
if (!args.connector)
|
|
1324
|
+
return;
|
|
1325
|
+
if (!args.connector.destructiveTools.includes(args.bareTool))
|
|
1326
|
+
return;
|
|
1327
|
+
const extracted = extractWriteItemIds({
|
|
1328
|
+
integration: args.integration,
|
|
1329
|
+
bareTool: args.bareTool,
|
|
1330
|
+
toolResult: args.toolResult,
|
|
1331
|
+
args: args.args,
|
|
1332
|
+
});
|
|
1333
|
+
if (extracted.itemIds.length === 0) {
|
|
1334
|
+
logger.debug({
|
|
1335
|
+
integration: args.integration,
|
|
1336
|
+
bareTool: args.bareTool,
|
|
1337
|
+
reason: extracted.reason,
|
|
1338
|
+
}, "destructive tool succeeded but no item id extracted — actor attribution will fall through to 'user' on next reconcile");
|
|
1339
|
+
return;
|
|
1340
|
+
}
|
|
1341
|
+
for (const id of extracted.itemIds) {
|
|
1342
|
+
markIntegrationWrite(db, args.integration, id);
|
|
1343
|
+
}
|
|
1344
|
+
logger.debug({
|
|
1345
|
+
integration: args.integration,
|
|
1346
|
+
bareTool: args.bareTool,
|
|
1347
|
+
reason: extracted.reason,
|
|
1348
|
+
itemCount: extracted.itemIds.length,
|
|
1349
|
+
}, "marked integration_writes for destructive delegated call");
|
|
1350
|
+
}
|
|
1351
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
1352
|
+
// RESERVED — `resolveCanonicalBareTool`
|
|
1353
|
+
//
|
|
1354
|
+
// Helper for the commented-out RPC `/invoke` route. Preserved verbatim
|
|
1355
|
+
// alongside the route handler for future reactivation.
|
|
1356
|
+
//
|
|
1357
|
+
// The /exec migration removed the brittle "agent supplies the bare
|
|
1358
|
+
// tool name" coupling that this helper compensated for; future RPC
|
|
1359
|
+
// re-introduction (admin endpoint, cost-sensitive fast path) would
|
|
1360
|
+
// likely want a *more* complete cross-backend alias translator
|
|
1361
|
+
// (walk every connector under the integration, not just the active
|
|
1362
|
+
// one) — see the alias-divergence root-cause notes in the route
|
|
1363
|
+
// handler comment above for context.
|
|
1364
|
+
//
|
|
1365
|
+
// DO NOT DELETE.
|
|
1366
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
1367
|
+
/*
|
|
1368
|
+
function resolveCanonicalBareTool(
|
|
1369
|
+
connector: IntegrationBackendConnector | undefined,
|
|
1370
|
+
bare: string,
|
|
1371
|
+
): string {
|
|
1372
|
+
if (!connector) return bare;
|
|
1373
|
+
const capTools = connector.capabilityTools;
|
|
1374
|
+
for (const aliases of Object.values(capTools)) {
|
|
1375
|
+
if (aliases.includes(bare)) return bare;
|
|
1376
|
+
}
|
|
1377
|
+
const aliasesForKey = capTools[bare];
|
|
1378
|
+
if (aliasesForKey && aliasesForKey.length > 0) {
|
|
1379
|
+
return aliasesForKey[0];
|
|
1380
|
+
}
|
|
1381
|
+
return bare;
|
|
1382
|
+
}
|
|
1383
|
+
*/
|
|
1384
|
+
//# sourceMappingURL=integrations.js.map
|