@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,1693 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { INTEGRATION_DESCRIPTORS, INTEGRATION_KEYS, isAutonomousProcessKey, isPlausibleOpenAiApiKey, matchRunAllowedToolPattern, } from "@aitne/shared";
|
|
5
|
+
import { getContextDir } from "../../config.js";
|
|
6
|
+
import { cleanupSessionWorkdir, createSessionWorkdir } from "../workdir.js";
|
|
7
|
+
import { BackendDecisiveFailure, BackendQuotaError, DelegatedProxyTimeoutError, classifyAbortReason, } from "../agent-core.js";
|
|
8
|
+
import { IdleWatchdog } from "./idle-watchdog.js";
|
|
9
|
+
import { DELEGATED_PROXY_DEFAULTS } from "../../services/delegated-proxy-config.js";
|
|
10
|
+
import { buildDelegatedToolPrompt, emptyCost, flattenToolResultContent, tryParseToolResult, withDurationMs, } from "../../services/delegated-tool-runtime.js";
|
|
11
|
+
import { materializeMcpForSession } from "../../services/mcp/session-materializer.js";
|
|
12
|
+
import { parseMcpToolName } from "../../services/mcp/risk.js";
|
|
13
|
+
import { logMcpToolCall } from "../../services/mcp/tool-audit.js";
|
|
14
|
+
import { buildDaemonApiCliEnv } from "../daemon-api-cli.js";
|
|
15
|
+
import { createOutputCapturePath, CliPathCache, parseJsonLine, readFileIfExists, removeFileIfExists, runLineCommand, } from "./cli-utils.js";
|
|
16
|
+
import { probeApiKeyServerSide } from "./api-key-probe.js";
|
|
17
|
+
import { extractSilentApiErrors, logSilentApiErrors, } from "./silent-api-error-detector.js";
|
|
18
|
+
import { estimateTextInputTokens, findRegisteredModel, getModelsForBackend, latestLiteFor, } from "./model-registry.js";
|
|
19
|
+
import { PriceFetcher } from "./price-fetcher.js";
|
|
20
|
+
import { buildExecutionPrompt, buildSummaryPrompt } from "./prompt-utils.js";
|
|
21
|
+
import { createLogger } from "../../logging.js";
|
|
22
|
+
const logger = createLogger("codex-core");
|
|
23
|
+
const EMPTY_USAGE = {
|
|
24
|
+
inputTokens: 0,
|
|
25
|
+
outputTokens: 0,
|
|
26
|
+
cacheCreationInputTokens: 0,
|
|
27
|
+
cacheReadInputTokens: 0,
|
|
28
|
+
};
|
|
29
|
+
// Probe prompt is derived from `INTEGRATION_DESCRIPTORS.backendConnectors.codex`
|
|
30
|
+
// so adding a new delegated integration (Slack, GitHub, …) requires only the
|
|
31
|
+
// registry update. The line-based filter below (`l.startsWith("mcp__")`) is
|
|
32
|
+
// permissive enough to accept any namespace the registry declares; the prompt
|
|
33
|
+
// is what actually drives ToolSearch to enumerate them. See
|
|
34
|
+
// `docs/design/17-delegated-mode-v2.md` §7.1.
|
|
35
|
+
export const CODEX_PROBE_TOOLS_PROMPT = (() => {
|
|
36
|
+
const meta = [];
|
|
37
|
+
for (const key of INTEGRATION_KEYS) {
|
|
38
|
+
const descriptor = INTEGRATION_DESCRIPTORS[key];
|
|
39
|
+
const connector = descriptor.backendConnectors.codex;
|
|
40
|
+
if (!connector)
|
|
41
|
+
continue;
|
|
42
|
+
const seen = new Set();
|
|
43
|
+
for (const tools of Object.values(connector.capabilityTools)) {
|
|
44
|
+
for (const t of tools)
|
|
45
|
+
seen.add(t);
|
|
46
|
+
}
|
|
47
|
+
meta.push({
|
|
48
|
+
displayName: descriptor.displayName,
|
|
49
|
+
toolNamespace: connector.toolNamespace,
|
|
50
|
+
requiredCapabilities: connector.requiredCapabilities,
|
|
51
|
+
capabilityToolNames: Array.from(seen),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const prefixes = meta.map((m) => `'${m.toolNamespace}'`).join(", ");
|
|
55
|
+
const lines = [];
|
|
56
|
+
const queries = meta.map((m) => {
|
|
57
|
+
// Same semantic query approach as the Claude probe — display name +
|
|
58
|
+
// requiredCapabilities expanded to word tokens. Avoids the
|
|
59
|
+
// bag-of-fragments dilution that all-tool-name splitting causes.
|
|
60
|
+
const queryWords = [
|
|
61
|
+
m.displayName,
|
|
62
|
+
...m.requiredCapabilities.flatMap((c) => c.split(/[-_]/)),
|
|
63
|
+
"connector tools",
|
|
64
|
+
]
|
|
65
|
+
.join(" ")
|
|
66
|
+
.replace(/\s+/g, " ")
|
|
67
|
+
.trim();
|
|
68
|
+
return `'${queryWords}'`;
|
|
69
|
+
});
|
|
70
|
+
lines.push(`Use \`tool_search\` for each of these queries with the highest result limit available: ${queries.join("; ")}.`);
|
|
71
|
+
lines.push("Do not call any of the searched tools.");
|
|
72
|
+
lines.push(`After the searches, print only full tool names from the search results that start with one of: ${prefixes}.`);
|
|
73
|
+
for (const m of meta) {
|
|
74
|
+
if (m.capabilityToolNames.length === 0)
|
|
75
|
+
continue;
|
|
76
|
+
const fullNames = m.capabilityToolNames
|
|
77
|
+
.map((n) => m.toolNamespace + n)
|
|
78
|
+
.join(", ");
|
|
79
|
+
lines.push(`Include these ${m.displayName} tools if present: ${fullNames}.`);
|
|
80
|
+
}
|
|
81
|
+
lines.push("One tool name per line. No markdown fences. No explanation. If no such tools are available, print NONE.");
|
|
82
|
+
return lines.join(" ");
|
|
83
|
+
})();
|
|
84
|
+
export class CodexCore {
|
|
85
|
+
config;
|
|
86
|
+
priceFetcher;
|
|
87
|
+
backendId = "codex";
|
|
88
|
+
// Lazily re-resolved with a 60 s TTL — see ClaudeCodeCore for rationale (§9.4).
|
|
89
|
+
cliPathCache;
|
|
90
|
+
get cliPath() {
|
|
91
|
+
return this.cliPathCache.get();
|
|
92
|
+
}
|
|
93
|
+
constructor(config, priceFetcher = new PriceFetcher(config.dataDir)) {
|
|
94
|
+
this.config = config;
|
|
95
|
+
this.priceFetcher = priceFetcher;
|
|
96
|
+
this.cliPathCache = new CliPathCache("codex");
|
|
97
|
+
}
|
|
98
|
+
mcpContext;
|
|
99
|
+
setMcpContext(context) {
|
|
100
|
+
this.mcpContext = context;
|
|
101
|
+
}
|
|
102
|
+
async materializeMcp(sessionDir, processKey) {
|
|
103
|
+
if (!this.mcpContext) {
|
|
104
|
+
return {
|
|
105
|
+
servers: [],
|
|
106
|
+
env: {},
|
|
107
|
+
configPath: null,
|
|
108
|
+
claudeMcpServers: null,
|
|
109
|
+
disallowedTools: [],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// Allow mode bypasses the approve-tier MCP strip (see claude-code-core
|
|
113
|
+
// for the rationale — "strong permission mode" enables every MCP tool,
|
|
114
|
+
// autonomous routines included).
|
|
115
|
+
const allowMode = this.config.codexExecutionPermissionMode === "allow";
|
|
116
|
+
const autonomous = !allowMode && (processKey ? isAutonomousProcessKey(processKey) : false);
|
|
117
|
+
return materializeMcpForSession({
|
|
118
|
+
db: this.mcpContext.db,
|
|
119
|
+
blobStore: this.mcpContext.blobStore,
|
|
120
|
+
sessionDir,
|
|
121
|
+
backendId: this.backendId,
|
|
122
|
+
autonomous,
|
|
123
|
+
contextDir: getContextDir(this.config),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async execute(params, streamCallbacks) {
|
|
127
|
+
return await this.runTurn({
|
|
128
|
+
prompt: buildExecutionPrompt(params.prompt, params.context, params.event, params.conversationHistory),
|
|
129
|
+
modelId: params.modelId,
|
|
130
|
+
eventType: params.event.type,
|
|
131
|
+
processKey: params.processKey,
|
|
132
|
+
sessionDir: params.sessionDir,
|
|
133
|
+
maxBudgetUsd: params.maxBudgetUsd,
|
|
134
|
+
persistSession: params.persistSession ?? false,
|
|
135
|
+
turnToken: params.turnToken,
|
|
136
|
+
stagedAttachments: params.stagedAttachments,
|
|
137
|
+
sessionDbId: params.sessionDbId,
|
|
138
|
+
eventCorrelationId: params.event.correlationId,
|
|
139
|
+
}, streamCallbacks);
|
|
140
|
+
}
|
|
141
|
+
async executeResume(params, streamCallbacks) {
|
|
142
|
+
return await this.runTurn({
|
|
143
|
+
prompt: params.message,
|
|
144
|
+
modelId: params.modelId,
|
|
145
|
+
eventType: "message.received",
|
|
146
|
+
sessionDir: params.sessionDir,
|
|
147
|
+
resumeSessionId: params.sessionId,
|
|
148
|
+
maxBudgetUsd: params.maxBudgetUsd,
|
|
149
|
+
persistSession: true,
|
|
150
|
+
turnToken: params.turnToken,
|
|
151
|
+
stagedAttachments: params.stagedAttachments,
|
|
152
|
+
sessionDbId: params.sessionDbId,
|
|
153
|
+
eventCorrelationId: params.eventCorrelationId,
|
|
154
|
+
}, streamCallbacks);
|
|
155
|
+
}
|
|
156
|
+
async summarize(conversationText) {
|
|
157
|
+
const result = await this.runTurn({
|
|
158
|
+
prompt: buildSummaryPrompt(conversationText),
|
|
159
|
+
modelId: this.pickSummaryModel(),
|
|
160
|
+
eventType: "message.received",
|
|
161
|
+
persistSession: false,
|
|
162
|
+
});
|
|
163
|
+
return result.output;
|
|
164
|
+
}
|
|
165
|
+
async checkAuth() {
|
|
166
|
+
if (!this.cliPath) {
|
|
167
|
+
return { ok: false, reason: "Codex CLI is not installed or not on PATH." };
|
|
168
|
+
}
|
|
169
|
+
const rawApiKey = process.env.OPENAI_API_KEY?.trim();
|
|
170
|
+
if (rawApiKey) {
|
|
171
|
+
if (!isPlausibleOpenAiApiKey(rawApiKey)) {
|
|
172
|
+
return {
|
|
173
|
+
ok: false,
|
|
174
|
+
reason: "OPENAI_API_KEY is set but does not look like an OpenAI key (expected `sk-…`).",
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
return { ok: true, method: "api_key" };
|
|
178
|
+
}
|
|
179
|
+
if (existsSync(join(homedir(), ".codex", "auth.json"))) {
|
|
180
|
+
return { ok: true, method: "oauth" };
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
ok: false,
|
|
184
|
+
reason: "Codex is not authenticated. Run `codex login` or set OPENAI_API_KEY.",
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Detailed auth probe. Two modes:
|
|
189
|
+
* - **API key** (`OPENAI_API_KEY`): format check + server-side probe via
|
|
190
|
+
* `probeApiKeyServerSide("openai", ...)` (roadmap §9.1). Throws on
|
|
191
|
+
* network/timeout so `checkAll()` records `probe_network_error`.
|
|
192
|
+
* - **OAuth** (`codex login`): relies on `codex login status` exit code —
|
|
193
|
+
* Phase 0 confirmed that `auth.json.last_refresh` age is not a
|
|
194
|
+
* trustworthy staleness signal (CLI returns exit 0 even after 10+ days).
|
|
195
|
+
*/
|
|
196
|
+
async checkAuthDetailed() {
|
|
197
|
+
if (!this.cliPath) {
|
|
198
|
+
return {
|
|
199
|
+
ok: false,
|
|
200
|
+
status: "missing",
|
|
201
|
+
method: "cli_login",
|
|
202
|
+
detail: "Codex CLI not found on PATH",
|
|
203
|
+
recoveryCommand: "npm install -g @openai/codex",
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const rawApiKey = process.env.OPENAI_API_KEY?.trim();
|
|
207
|
+
if (rawApiKey) {
|
|
208
|
+
if (!isPlausibleOpenAiApiKey(rawApiKey)) {
|
|
209
|
+
return {
|
|
210
|
+
ok: false,
|
|
211
|
+
status: "expired",
|
|
212
|
+
method: "api_key",
|
|
213
|
+
detail: "OPENAI_API_KEY does not match OpenAI key format (expected `sk-…`).",
|
|
214
|
+
recoveryCommand: "Unset OPENAI_API_KEY or replace it with a valid OpenAI API key",
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// Format is plausible — attempt a server-side probe to detect
|
|
218
|
+
// revoked keys within 1 hourly cycle (roadmap §9.1).
|
|
219
|
+
const probe = await probeApiKeyServerSide("openai", rawApiKey);
|
|
220
|
+
return {
|
|
221
|
+
ok: probe.ok,
|
|
222
|
+
status: probe.ok ? "ok" : "expired",
|
|
223
|
+
method: "api_key",
|
|
224
|
+
detail: probe.detail,
|
|
225
|
+
...(!probe.ok && {
|
|
226
|
+
recoveryCommand: "Unset OPENAI_API_KEY or replace it with a valid OpenAI API key",
|
|
227
|
+
}),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
const result = await runLineCommand({
|
|
232
|
+
command: this.cliPath,
|
|
233
|
+
args: ["login", "status"],
|
|
234
|
+
cwd: process.cwd(),
|
|
235
|
+
timeoutMs: 10_000,
|
|
236
|
+
});
|
|
237
|
+
if (result.exitCode === 0) {
|
|
238
|
+
return { ok: true, status: "ok", method: "oauth" };
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
ok: false,
|
|
242
|
+
status: "expired",
|
|
243
|
+
method: "oauth",
|
|
244
|
+
detail: "Codex login status reported failure",
|
|
245
|
+
recoveryCommand: "codex login",
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
logger.warn({ err }, "codex login status probe failed");
|
|
250
|
+
return {
|
|
251
|
+
ok: false,
|
|
252
|
+
status: "expired",
|
|
253
|
+
method: "oauth",
|
|
254
|
+
detail: err instanceof Error ? err.message : "Codex login status failed",
|
|
255
|
+
recoveryCommand: "codex login",
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
listModels() {
|
|
260
|
+
return getModelsForBackend(this.backendId);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Phase 5 §4.11 live probe. Codex doesn't expose a zero-turn tool
|
|
264
|
+
* manifest, so we prompt the agent to discover and print connector tool
|
|
265
|
+
* names. Codex apps are lazy-loaded behind `tool_search` on current CLI
|
|
266
|
+
* builds, so the prompt explicitly opens that catalog before printing
|
|
267
|
+
* `mcp__...` names. The output is plain-text (one per line), one
|
|
268
|
+
* minimum-tokens turn.
|
|
269
|
+
*
|
|
270
|
+
* Tools whose names don't start with `mcp__` (built-ins like `Bash`,
|
|
271
|
+
* `Read`) are out of scope — probes are only used to evaluate
|
|
272
|
+
* connector-namespaced tools via `evaluateProbe`.
|
|
273
|
+
*/
|
|
274
|
+
async probeTools() {
|
|
275
|
+
if (!this.cliPath) {
|
|
276
|
+
throw new Error("Codex CLI is not installed or not on PATH");
|
|
277
|
+
}
|
|
278
|
+
const sessionDir = createSessionWorkdir(this.config.workspaceDir, "message.received", undefined, { backendId: this.backendId, character: this.config.character });
|
|
279
|
+
const outputPath = createOutputCapturePath(sessionDir, "probe");
|
|
280
|
+
const prompt = CODEX_PROBE_TOOLS_PROMPT;
|
|
281
|
+
const modelId = this.pickSummaryModel();
|
|
282
|
+
const args = [
|
|
283
|
+
"exec",
|
|
284
|
+
"--json",
|
|
285
|
+
"--color",
|
|
286
|
+
"never",
|
|
287
|
+
"--dangerously-bypass-approvals-and-sandbox",
|
|
288
|
+
"--skip-git-repo-check",
|
|
289
|
+
"--output-last-message",
|
|
290
|
+
outputPath,
|
|
291
|
+
"--model",
|
|
292
|
+
modelId,
|
|
293
|
+
"--ephemeral",
|
|
294
|
+
prompt,
|
|
295
|
+
];
|
|
296
|
+
const lines = [];
|
|
297
|
+
try {
|
|
298
|
+
const result = await runLineCommand({
|
|
299
|
+
command: this.cliPath,
|
|
300
|
+
args,
|
|
301
|
+
cwd: sessionDir,
|
|
302
|
+
env: buildDaemonApiCliEnv(sessionDir, this.config.apiPort, { sessionBackend: "codex" }),
|
|
303
|
+
timeoutMs: 60_000,
|
|
304
|
+
onStdoutLine: (line) => {
|
|
305
|
+
const event = parseJsonLine(line);
|
|
306
|
+
if (!event)
|
|
307
|
+
return;
|
|
308
|
+
const text = extractCodexText(event);
|
|
309
|
+
if (text)
|
|
310
|
+
lines.push(...text.split(/\r?\n/));
|
|
311
|
+
},
|
|
312
|
+
});
|
|
313
|
+
if (result.exitCode !== 0 && result.exitCode !== null) {
|
|
314
|
+
throw new Error(`codex exec exited with code ${result.exitCode}: ${result.stderrLines.slice(-3).join(" | ")}`);
|
|
315
|
+
}
|
|
316
|
+
const finalMessage = readFileIfExists(outputPath);
|
|
317
|
+
const combined = [
|
|
318
|
+
...lines,
|
|
319
|
+
...(finalMessage ? finalMessage.split(/\r?\n/) : []),
|
|
320
|
+
];
|
|
321
|
+
const tools = combined
|
|
322
|
+
.map((l) => l.trim())
|
|
323
|
+
.filter((l) => l.startsWith("mcp__"));
|
|
324
|
+
const deduped = Array.from(new Set(tools));
|
|
325
|
+
logger.info({ toolCount: deduped.length }, "Live probe collected tool manifest via codex exec");
|
|
326
|
+
return deduped;
|
|
327
|
+
}
|
|
328
|
+
finally {
|
|
329
|
+
removeFileIfExists(outputPath);
|
|
330
|
+
cleanupSessionWorkdir(sessionDir);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async runTurn(params, streamCallbacks) {
|
|
334
|
+
// Pre-flight auth gate — ClaudeCodeCore does NOT have this because
|
|
335
|
+
// the Agent SDK's first HTTP round-trip returns a decisive 401 on
|
|
336
|
+
// its own, so a Claude pre-flight would double-read credentials
|
|
337
|
+
// for no benefit. For Codex we're about to spawn a CLI subprocess
|
|
338
|
+
// (costly TTFB), so it is cheaper to read credentials once here
|
|
339
|
+
// and surface `BackendDecisiveFailure("auth")` before the subprocess
|
|
340
|
+
// even boots. See the class-level comment on `ClaudeCodeCore` for
|
|
341
|
+
// the full rationale and `IAgentCore.checkAuth` for the contract.
|
|
342
|
+
const auth = await this.checkAuth();
|
|
343
|
+
if (!auth.ok) {
|
|
344
|
+
logger.warn({ reason: auth.reason }, "Codex auth check failed");
|
|
345
|
+
throw new BackendDecisiveFailure(this.backendId, "auth", new Error(auth.reason));
|
|
346
|
+
}
|
|
347
|
+
this.assertPromptWithinMaxBudget(params.prompt, params.maxBudgetUsd, params.modelId);
|
|
348
|
+
const startMs = Date.now();
|
|
349
|
+
const sessionDir = params.sessionDir ?? createSessionWorkdir(this.config.workspaceDir, params.eventType, `${this.config.dataDir}/skills`, {
|
|
350
|
+
backendId: this.backendId,
|
|
351
|
+
processKey: params.processKey,
|
|
352
|
+
character: this.config.character,
|
|
353
|
+
});
|
|
354
|
+
const ownsSessionDir = !params.sessionDir;
|
|
355
|
+
const outputPath = createOutputCapturePath(sessionDir, "codex-last-message");
|
|
356
|
+
const mcp = await this.materializeMcp(sessionDir, params.processKey);
|
|
357
|
+
logger.info({ eventType: params.eventType, model: params.modelId, promptLen: params.prompt.length, mcpServers: mcp.servers.map((s) => s.id) }, "Codex execute started");
|
|
358
|
+
let streamed = false;
|
|
359
|
+
const deferStreamingUntilBudgetCheck = params.maxBudgetUsd !== undefined;
|
|
360
|
+
try {
|
|
361
|
+
let sessionId = params.resumeSessionId ?? null;
|
|
362
|
+
let actualModelId = params.modelId;
|
|
363
|
+
let usage = { ...EMPTY_USAGE };
|
|
364
|
+
let lastError = null;
|
|
365
|
+
let sawCompletion = false;
|
|
366
|
+
let numTurns = 0;
|
|
367
|
+
let stopReason = null;
|
|
368
|
+
const outputChunks = [];
|
|
369
|
+
// Accumulate every scrap of subprocess text (tool-output item fields +
|
|
370
|
+
// raw stderr lines) so we can scan once for `PA_API_ERROR` markers after
|
|
371
|
+
// the run. Collecting up front — rather than scanning per-line — keeps
|
|
372
|
+
// each occurrence logged exactly once across multi-line payloads.
|
|
373
|
+
const apiOutputBuffer = [];
|
|
374
|
+
const runResult = await runLineCommand({
|
|
375
|
+
command: "codex",
|
|
376
|
+
args: this.buildArgs(params, outputPath),
|
|
377
|
+
cwd: sessionDir,
|
|
378
|
+
env: {
|
|
379
|
+
...buildDaemonApiCliEnv(sessionDir, this.config.apiPort, {
|
|
380
|
+
sessionBackend: "codex",
|
|
381
|
+
sessionId: params.sessionDbId,
|
|
382
|
+
eventCorrelationId: params.eventCorrelationId,
|
|
383
|
+
}),
|
|
384
|
+
...mcp.env,
|
|
385
|
+
...(params.turnToken ? { PA_TURN_TOKEN: params.turnToken } : {}),
|
|
386
|
+
},
|
|
387
|
+
timeoutMs: this.config.executeTimeoutMinutes * 60 * 1000,
|
|
388
|
+
onStdoutLine: (line) => {
|
|
389
|
+
const event = parseJsonLine(line);
|
|
390
|
+
if (!event?.type) {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
if (event.type === "thread.started" && typeof event.thread_id === "string") {
|
|
394
|
+
sessionId = event.thread_id;
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
if (event.type === "turn.started") {
|
|
398
|
+
numTurns += 1;
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
if (event.type === "turn.completed") {
|
|
402
|
+
sawCompletion = true;
|
|
403
|
+
usage = extractCodexUsage(event) ?? usage;
|
|
404
|
+
actualModelId = event.model ?? actualModelId;
|
|
405
|
+
stopReason = event.stop_reason ?? event.reason ?? stopReason;
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
if (event.type === "turn.failed") {
|
|
409
|
+
lastError = event.error?.message ?? lastError;
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
if (event.type === "error") {
|
|
413
|
+
const message = event.message?.trim();
|
|
414
|
+
if (message && !message.startsWith("Reconnecting...")) {
|
|
415
|
+
lastError = message;
|
|
416
|
+
}
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
collectCodexItemText(event, apiOutputBuffer);
|
|
420
|
+
// B-003 Phase 4.4 — persist MCP tool call to `mcp_tool_calls`.
|
|
421
|
+
const mcpCall = extractMcpToolCall(event);
|
|
422
|
+
if (mcpCall) {
|
|
423
|
+
logger.debug({
|
|
424
|
+
serverId: mcpCall.serverId,
|
|
425
|
+
toolName: mcpCall.toolName,
|
|
426
|
+
sessionId,
|
|
427
|
+
eventType: params.eventType,
|
|
428
|
+
}, "mcp.tool_call");
|
|
429
|
+
if (this.mcpContext?.db) {
|
|
430
|
+
try {
|
|
431
|
+
logMcpToolCall(this.mcpContext.db, {
|
|
432
|
+
serverId: mcpCall.serverId,
|
|
433
|
+
toolName: mcpCall.toolName,
|
|
434
|
+
eventType: params.eventType,
|
|
435
|
+
sessionId: sessionId ?? undefined,
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
catch (err) {
|
|
439
|
+
logger.warn({ err, serverId: mcpCall.serverId }, "mcp.tool_call audit insert failed");
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
const delta = extractCodexText(event);
|
|
444
|
+
if (!delta) {
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
outputChunks.push(delta);
|
|
448
|
+
if (!deferStreamingUntilBudgetCheck) {
|
|
449
|
+
streamCallbacks?.onText?.(delta);
|
|
450
|
+
streamed = true;
|
|
451
|
+
}
|
|
452
|
+
},
|
|
453
|
+
onStderrLine: (line) => {
|
|
454
|
+
apiOutputBuffer.push(line);
|
|
455
|
+
if (isLikelyCodexFailure(line)) {
|
|
456
|
+
lastError = line.trim();
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
});
|
|
460
|
+
const apiErrors = extractSilentApiErrors(apiOutputBuffer.join("\n"));
|
|
461
|
+
if (apiErrors.length > 0) {
|
|
462
|
+
logSilentApiErrors(logger, apiErrors, {
|
|
463
|
+
backendId: this.backendId,
|
|
464
|
+
sessionId,
|
|
465
|
+
eventType: params.eventType,
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
if (runResult.timedOut) {
|
|
469
|
+
const err = new BackendDecisiveFailure(this.backendId, "timeout", new Error(`Codex execution exceeded timeout of ${this.config.executeTimeoutMinutes} minutes`));
|
|
470
|
+
logger.error({ err, eventType: params.eventType, model: params.modelId, durationMs: Date.now() - startMs }, "Codex execute timed out");
|
|
471
|
+
throw err;
|
|
472
|
+
}
|
|
473
|
+
const capturedOutput = readFileIfExists(outputPath);
|
|
474
|
+
const outputSource = capturedOutput && capturedOutput.trim().length > 0
|
|
475
|
+
? capturedOutput
|
|
476
|
+
: outputChunks.join("");
|
|
477
|
+
const output = outputSource.trim();
|
|
478
|
+
const combinedFailure = lastError
|
|
479
|
+
?? firstFailureLine(runResult.stderrLines)
|
|
480
|
+
?? firstFailureLine(runResult.stdoutLines);
|
|
481
|
+
if (!sawCompletion || runResult.exitCode !== 0) {
|
|
482
|
+
const failureMsg = combinedFailure ?? "Codex execution did not complete successfully.";
|
|
483
|
+
const classified = this.classifyFailure(failureMsg);
|
|
484
|
+
logger.error({ err: classified, eventType: params.eventType, model: params.modelId, exitCode: runResult.exitCode, durationMs: Date.now() - startMs }, "Codex execute failed");
|
|
485
|
+
throw classified;
|
|
486
|
+
}
|
|
487
|
+
const { costUsd, costSource } = this.priceFetcher.estimateUsageCost({
|
|
488
|
+
backendId: this.backendId,
|
|
489
|
+
modelId: actualModelId,
|
|
490
|
+
usage,
|
|
491
|
+
fallbackModel: findRegisteredModel(this.backendId, actualModelId),
|
|
492
|
+
});
|
|
493
|
+
this.assertWithinMaxBudget(costUsd, params.maxBudgetUsd, actualModelId);
|
|
494
|
+
if (output && !streamed) {
|
|
495
|
+
streamCallbacks?.onText?.(output);
|
|
496
|
+
}
|
|
497
|
+
const durationMs = Date.now() - startMs;
|
|
498
|
+
logger.info({ eventType: params.eventType, model: actualModelId, durationMs, costUsd, numTurns: numTurns || 1 }, "Codex execute completed");
|
|
499
|
+
return {
|
|
500
|
+
output,
|
|
501
|
+
sessionId,
|
|
502
|
+
backendId: this.backendId,
|
|
503
|
+
modelId: actualModelId,
|
|
504
|
+
costSource,
|
|
505
|
+
costUsd,
|
|
506
|
+
usage,
|
|
507
|
+
modelUsage: usage.inputTokens || usage.outputTokens
|
|
508
|
+
? {
|
|
509
|
+
[actualModelId]: {
|
|
510
|
+
inputTokens: usage.inputTokens,
|
|
511
|
+
outputTokens: usage.outputTokens,
|
|
512
|
+
costUsd,
|
|
513
|
+
},
|
|
514
|
+
}
|
|
515
|
+
: {},
|
|
516
|
+
numTurns: numTurns || 1,
|
|
517
|
+
durationMs,
|
|
518
|
+
durationApiMs: durationMs,
|
|
519
|
+
model: actualModelId,
|
|
520
|
+
isError: false,
|
|
521
|
+
stopReason,
|
|
522
|
+
contextUpdated: false,
|
|
523
|
+
// advisorCallCount omitted — non-Anthropic backends never populate
|
|
524
|
+
// this field, consumers treat undefined as 0.
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
finally {
|
|
528
|
+
removeFileIfExists(outputPath);
|
|
529
|
+
streamCallbacks?.onEnd?.();
|
|
530
|
+
if (ownsSessionDir) {
|
|
531
|
+
cleanupSessionWorkdir(sessionDir);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
buildArgs(params, outputPath) {
|
|
536
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
537
|
+
// Sandbox network-access asymmetry (known limitation).
|
|
538
|
+
//
|
|
539
|
+
// `-c sandbox_workspace_write.network_access=true` is required for the
|
|
540
|
+
// agent to reach the daemon API at http://localhost:${apiPort}/... under
|
|
541
|
+
// the workspace-write sandbox. Without it, Seatbelt/sandbox-exec blocks
|
|
542
|
+
// ALL network egress and `curl http://localhost:8321/api/health` fails
|
|
543
|
+
// with a connection-refused sandbox denial (verified 2026-04-11, Codex
|
|
544
|
+
// v0.118.0).
|
|
545
|
+
//
|
|
546
|
+
// HOWEVER: this flag is a binary on/off switch in Codex's sandbox model.
|
|
547
|
+
// There is no host-scoped allowlist. Once enabled, the agent can reach
|
|
548
|
+
// ANY external host (verified: curl https://example.com → HTTP 200).
|
|
549
|
+
//
|
|
550
|
+
// This is MORE PERMISSIVE than the Claude Code backend, which uses a
|
|
551
|
+
// PreToolUse hook (`bashCurlHook` in claude-code-core.ts) to restrict
|
|
552
|
+
// curl targets to localhost:${apiPort}. The Gemini backend achieves the
|
|
553
|
+
// same localhost restriction via a generated TOML admin policy
|
|
554
|
+
// (`generateAdminPolicy()` in gemini-cli-core.ts).
|
|
555
|
+
//
|
|
556
|
+
// Codex has neither a hook system nor an admin-policy layer for shell
|
|
557
|
+
// commands, so the localhost-only restriction cannot currently be
|
|
558
|
+
// enforced on this backend. As long as `message.dm` is routed primarily
|
|
559
|
+
// to Claude Code (the default), this asymmetry is latent. If the default
|
|
560
|
+
// binding changes to Codex, revisit by either:
|
|
561
|
+
// (a) generating a config.toml with a stricter sandbox profile, or
|
|
562
|
+
// (b) wrapping curl with a shim that validates URLs before exec.
|
|
563
|
+
//
|
|
564
|
+
// Tracked: BUG-DM-BACKEND-PERMISSIONS.md §5 / §9.
|
|
565
|
+
//
|
|
566
|
+
// Allow mode: `--dangerously-bypass-approvals-and-sandbox` skips both
|
|
567
|
+
// approvals AND sandboxing. No workspace-write network override needed
|
|
568
|
+
// because the sandbox itself is off.
|
|
569
|
+
//
|
|
570
|
+
// `codex exec resume` argv narrowing (verified on 0.121.0):
|
|
571
|
+
// `codex exec resume` rejects `--sandbox` and `--color`. Both are
|
|
572
|
+
// accepted by the fresh `codex exec` subcommand but not by the
|
|
573
|
+
// resume subcommand. We therefore:
|
|
574
|
+
// - Use `-c sandbox_mode="workspace-write"` (config-override form)
|
|
575
|
+
// for strict mode instead of `--sandbox workspace-write`, since
|
|
576
|
+
// `-c` IS accepted by both exec and resume. Functionally
|
|
577
|
+
// equivalent; keeps one branch for both code paths.
|
|
578
|
+
// - Drop `--color never` from the resume invocation. It remains
|
|
579
|
+
// in fresh exec where it is still accepted.
|
|
580
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
581
|
+
const allowMode = this.config.codexExecutionPermissionMode === "allow";
|
|
582
|
+
//
|
|
583
|
+
// EXECUTION-MODE-DESIGN.md §6 absolute-block layer — Codex gap.
|
|
584
|
+
//
|
|
585
|
+
// The absolute-block list (rm -rf, sudo, curl | sh, secret-path reads)
|
|
586
|
+
// cannot be enforced at the daemon layer on Codex:
|
|
587
|
+
//
|
|
588
|
+
// - Strict mode: the workspace-write sandbox blocks file writes
|
|
589
|
+
// outside `cwd`, which contains some of the damage (e.g. a
|
|
590
|
+
// `Write(~/.ssh/authorized_keys)` would be denied by the
|
|
591
|
+
// sandbox). It does NOT pattern-match shell commands — `rm -rf`
|
|
592
|
+
// INSIDE the session workdir, `sudo`, and `curl | sh` are not
|
|
593
|
+
// intercepted.
|
|
594
|
+
//
|
|
595
|
+
// - Allow mode: `--dangerously-bypass-approvals-and-sandbox` turns
|
|
596
|
+
// off both approvals and the sandbox entirely. There is no hook
|
|
597
|
+
// or admin-policy layer we can attach to. The user has
|
|
598
|
+
// explicitly opted in.
|
|
599
|
+
//
|
|
600
|
+
// Accepted gap per design sign-off. If / when Codex ships a hook
|
|
601
|
+
// system or admin-policy layer for shell commands, wire
|
|
602
|
+
// `ALWAYS_DISALLOWED_TOOLS` + the `classifyAbsoluteBlock` helper
|
|
603
|
+
// from `safety/always-disallowed.ts` here, mirroring the Claude
|
|
604
|
+
// Code implementation.
|
|
605
|
+
//
|
|
606
|
+
// DELEGATED-MODE-V2-DESIGN.md §4.3.4 — same-backend MCP-tool deny
|
|
607
|
+
// shares the same accepted-gap surface (γ outcome). Codex's built-in
|
|
608
|
+
// connector apps (`mcp__codex_apps__*`) are not exposed in
|
|
609
|
+
// `.codex/config.toml` and there is no per-tool disable flag at the
|
|
610
|
+
// CLI layer. Enforcement is prose-only via the `## Denied tools
|
|
611
|
+
// (per-integration)` block in AGENTS.md (rendered by
|
|
612
|
+
// `skills-compiler.buildSameBackendDenyBlock`). Cross-backend
|
|
613
|
+
// delegation provides hard enforcement at the
|
|
614
|
+
// `/api/integrations/:key/invoke` chokepoint, so users requiring
|
|
615
|
+
// strict deny should pick a non-Codex DM backend.
|
|
616
|
+
//
|
|
617
|
+
const sandboxArgs = allowMode
|
|
618
|
+
? ["--dangerously-bypass-approvals-and-sandbox"]
|
|
619
|
+
: [
|
|
620
|
+
"-c",
|
|
621
|
+
'sandbox_mode="workspace-write"',
|
|
622
|
+
"-c",
|
|
623
|
+
"sandbox_workspace_write.network_access=true",
|
|
624
|
+
];
|
|
625
|
+
const imageArgs = buildCodexImageArgs(params.stagedAttachments, CODEX_ARGV_BUDGET_BYTES);
|
|
626
|
+
if (params.resumeSessionId) {
|
|
627
|
+
return [
|
|
628
|
+
"exec",
|
|
629
|
+
"resume",
|
|
630
|
+
params.resumeSessionId,
|
|
631
|
+
"--json",
|
|
632
|
+
// NOTE: `--color never` omitted — rejected by `codex exec resume`.
|
|
633
|
+
...sandboxArgs,
|
|
634
|
+
"--skip-git-repo-check",
|
|
635
|
+
"--output-last-message",
|
|
636
|
+
outputPath,
|
|
637
|
+
"--model",
|
|
638
|
+
params.modelId,
|
|
639
|
+
...imageArgs,
|
|
640
|
+
params.prompt,
|
|
641
|
+
];
|
|
642
|
+
}
|
|
643
|
+
return [
|
|
644
|
+
"exec",
|
|
645
|
+
"--json",
|
|
646
|
+
"--color",
|
|
647
|
+
"never",
|
|
648
|
+
...sandboxArgs,
|
|
649
|
+
"--skip-git-repo-check",
|
|
650
|
+
"--output-last-message",
|
|
651
|
+
outputPath,
|
|
652
|
+
"--model",
|
|
653
|
+
params.modelId,
|
|
654
|
+
...(params.persistSession ? [] : ["--ephemeral"]),
|
|
655
|
+
...imageArgs,
|
|
656
|
+
params.prompt,
|
|
657
|
+
];
|
|
658
|
+
}
|
|
659
|
+
pickSummaryModel() {
|
|
660
|
+
// Registry-derived lite-tier model is the canonical pick (compaction
|
|
661
|
+
// summaries are short-shape and benefit from the cheapest model).
|
|
662
|
+
// Falls through to "any registered model" when the registry has no
|
|
663
|
+
// available lite entry, then throws when the registry is empty for
|
|
664
|
+
// this backend — preferable to the prior silent literal fallback
|
|
665
|
+
// that hid registry misconfiguration.
|
|
666
|
+
const liteFromRegistry = latestLiteFor(this.backendId);
|
|
667
|
+
if (liteFromRegistry)
|
|
668
|
+
return liteFromRegistry;
|
|
669
|
+
const anyFromRegistry = this.listModels()[0]?.modelId;
|
|
670
|
+
if (anyFromRegistry)
|
|
671
|
+
return anyFromRegistry;
|
|
672
|
+
throw new Error(`pickSummaryModel: no models registered for backend ${this.backendId}`);
|
|
673
|
+
}
|
|
674
|
+
classifyFailure(message) {
|
|
675
|
+
if (isMaxBudgetMessage(message)) {
|
|
676
|
+
return new BackendQuotaError(this.backendId, "max_budget_usd", null, message);
|
|
677
|
+
}
|
|
678
|
+
if (/rate limit|usage limit|quota/i.test(message)) {
|
|
679
|
+
return new BackendQuotaError(this.backendId, "rate_limited", null, message);
|
|
680
|
+
}
|
|
681
|
+
if (/unauthorized|forbidden|api key|login/i.test(message)) {
|
|
682
|
+
return new BackendDecisiveFailure(this.backendId, "auth", new Error(message));
|
|
683
|
+
}
|
|
684
|
+
if (/timed out|timeout/i.test(message)) {
|
|
685
|
+
return new BackendDecisiveFailure(this.backendId, "timeout", new Error(message));
|
|
686
|
+
}
|
|
687
|
+
return new BackendDecisiveFailure(this.backendId, "other_non_retryable", new Error(message));
|
|
688
|
+
}
|
|
689
|
+
assertWithinMaxBudget(costUsd, maxBudgetUsd, modelId) {
|
|
690
|
+
if (maxBudgetUsd === undefined || costUsd <= maxBudgetUsd) {
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
throw new BackendQuotaError(this.backendId, "max_budget_usd", null, `Codex estimated cost $${costUsd.toFixed(4)} exceeded the per-turn budget limit $${maxBudgetUsd.toFixed(2)} for ${modelId}.`);
|
|
694
|
+
}
|
|
695
|
+
assertPromptWithinMaxBudget(prompt, maxBudgetUsd, modelId) {
|
|
696
|
+
if (maxBudgetUsd === undefined) {
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
699
|
+
const estimatedUsage = {
|
|
700
|
+
inputTokens: estimateTextInputTokens(prompt),
|
|
701
|
+
outputTokens: 0,
|
|
702
|
+
cacheCreationInputTokens: 0,
|
|
703
|
+
cacheReadInputTokens: 0,
|
|
704
|
+
};
|
|
705
|
+
const { costUsd } = this.priceFetcher.estimateUsageCost({
|
|
706
|
+
backendId: this.backendId,
|
|
707
|
+
modelId,
|
|
708
|
+
usage: estimatedUsage,
|
|
709
|
+
fallbackModel: findRegisteredModel(this.backendId, modelId),
|
|
710
|
+
});
|
|
711
|
+
if (costUsd <= maxBudgetUsd) {
|
|
712
|
+
return;
|
|
713
|
+
}
|
|
714
|
+
throw new BackendQuotaError(this.backendId, "max_budget_usd", null, `Codex estimated prompt cost $${costUsd.toFixed(4)} exceeded the per-turn budget limit $${maxBudgetUsd.toFixed(2)} for ${modelId}.`);
|
|
715
|
+
}
|
|
716
|
+
/**
|
|
717
|
+
* Delegated proxy invocation — Codex CLI path.
|
|
718
|
+
*
|
|
719
|
+
* Spawns `codex exec --json --ephemeral --skip-git-repo-check
|
|
720
|
+
* --output-last-message <path> --model <m> <prompt>` in the
|
|
721
|
+
* pre-materialized `sessionDir`, parses JSONL events, and matches the
|
|
722
|
+
* first `mcp__codex_apps__*` tool call whose name equals the requested
|
|
723
|
+
* tool. The tool result is extracted from item-output fields (`output`,
|
|
724
|
+
* `aggregated_output`, `stdout`) emitted on the same item or on a
|
|
725
|
+
* subsequent paired item — the precise pairing semantics differ across
|
|
726
|
+
* Codex CLI versions, so the implementation is defensive: it captures
|
|
727
|
+
* the first non-empty output that arrives after the matching call and
|
|
728
|
+
* within the same turn. The captured-last-message file is the final
|
|
729
|
+
* fallback (model-text path; less reliable but better than 502 if the
|
|
730
|
+
* structured pairing changes shape upstream).
|
|
731
|
+
*
|
|
732
|
+
* Error classes mirror the Claude path. `auth_error` is detected via
|
|
733
|
+
* the existing `classifyFailure` regex; `tool_error` arrives as a
|
|
734
|
+
* `turn.failed` event or as a non-zero subprocess exit code with a
|
|
735
|
+
* recognisable message.
|
|
736
|
+
*/
|
|
737
|
+
async runDelegatedTool(params) {
|
|
738
|
+
const startMs = Date.now();
|
|
739
|
+
const { toolName, toolArgs, modelId, sessionDir, abortSignal } = params;
|
|
740
|
+
if (!this.cliPath) {
|
|
741
|
+
return {
|
|
742
|
+
ok: false,
|
|
743
|
+
errorClass: "subprocess_crashed",
|
|
744
|
+
message: "codex CLI not found on PATH",
|
|
745
|
+
cost: withDurationMs(emptyCost(), startMs),
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
const auth = await this.checkAuth();
|
|
749
|
+
if (!auth.ok) {
|
|
750
|
+
return {
|
|
751
|
+
ok: false,
|
|
752
|
+
errorClass: "auth_error",
|
|
753
|
+
message: auth.reason,
|
|
754
|
+
cost: withDurationMs(emptyCost(), startMs),
|
|
755
|
+
};
|
|
756
|
+
}
|
|
757
|
+
const prompt = buildDelegatedToolPrompt(toolName, toolArgs);
|
|
758
|
+
const outputPath = createOutputCapturePath(sessionDir, "codex-delegated-last-message");
|
|
759
|
+
// Mirror the user's execution mode rather than hard-coding strict
|
|
760
|
+
// sandbox. The proxy session itself runs proxy.md (one tool call,
|
|
761
|
+
// no Bash / Edit / Write), so the sandbox is purely defensive — but
|
|
762
|
+
// forcing strict on a user who explicitly opted into allow mode is
|
|
763
|
+
// an inconsistency that surfaces when delegated.
|
|
764
|
+
const allowMode = this.config.codexExecutionPermissionMode === "allow";
|
|
765
|
+
const sandboxArgs = allowMode
|
|
766
|
+
? ["--dangerously-bypass-approvals-and-sandbox"]
|
|
767
|
+
: [
|
|
768
|
+
"-c",
|
|
769
|
+
'sandbox_mode="workspace-write"',
|
|
770
|
+
"-c",
|
|
771
|
+
"sandbox_workspace_write.network_access=true",
|
|
772
|
+
];
|
|
773
|
+
const args = [
|
|
774
|
+
"exec",
|
|
775
|
+
"--json",
|
|
776
|
+
"--color",
|
|
777
|
+
"never",
|
|
778
|
+
...sandboxArgs,
|
|
779
|
+
"--skip-git-repo-check",
|
|
780
|
+
"--output-last-message",
|
|
781
|
+
outputPath,
|
|
782
|
+
"--model",
|
|
783
|
+
modelId,
|
|
784
|
+
"--ephemeral",
|
|
785
|
+
prompt,
|
|
786
|
+
];
|
|
787
|
+
let capturedToolItemId = null;
|
|
788
|
+
let capturedResultRaw = null;
|
|
789
|
+
let capturedToolError = null;
|
|
790
|
+
let wrongToolName = null;
|
|
791
|
+
let usage = { ...EMPTY_USAGE };
|
|
792
|
+
let actualModelId = modelId;
|
|
793
|
+
let numTurns = 0;
|
|
794
|
+
let lastError = null;
|
|
795
|
+
let sawTurnCompleted = false;
|
|
796
|
+
const stderrBuffer = [];
|
|
797
|
+
// Local aborter bridged from the caller's signal so we can also
|
|
798
|
+
// trigger an early abort on wrong-tool detection. See gemini-cli-core
|
|
799
|
+
// for the full rationale: this caps wrong_tool failures at ~5s
|
|
800
|
+
// instead of waiting for the wall-clock or natural completion.
|
|
801
|
+
const proxyAborter = new AbortController();
|
|
802
|
+
const callerAbortListener = () => {
|
|
803
|
+
proxyAborter.abort(abortSignal?.reason);
|
|
804
|
+
};
|
|
805
|
+
if (abortSignal) {
|
|
806
|
+
if (abortSignal.aborted) {
|
|
807
|
+
proxyAborter.abort(abortSignal.reason);
|
|
808
|
+
}
|
|
809
|
+
else {
|
|
810
|
+
abortSignal.addEventListener("abort", callerAbortListener, {
|
|
811
|
+
once: true,
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
// Idle watchdog — same pattern as gemini-cli-core. Catches a hung
|
|
816
|
+
// codex CLI subprocess (no stream events at all) before the local
|
|
817
|
+
// safety-net timer or the caller's wall-clock signal fires. Tuned
|
|
818
|
+
// for codex's typical first-event time (5-15 s); tripping at 60 s
|
|
819
|
+
// is well outside the healthy distribution.
|
|
820
|
+
let idleTimedOut = false;
|
|
821
|
+
const idleTimeoutMs = DELEGATED_PROXY_DEFAULTS.idleTimeoutMsByBackend.codex
|
|
822
|
+
?? DELEGATED_PROXY_DEFAULTS.idleTimeoutMs;
|
|
823
|
+
const idleWatchdog = new IdleWatchdog({
|
|
824
|
+
idleTimeoutMs,
|
|
825
|
+
onTimeout: (idleMs) => {
|
|
826
|
+
idleTimedOut = true;
|
|
827
|
+
logger.warn({ idleMs, idleTimeoutMs, toolName }, "codex delegated proxy idle watchdog tripped");
|
|
828
|
+
proxyAborter.abort(new DelegatedProxyTimeoutError(`codex stream idle for ${idleMs}ms (limit ${idleTimeoutMs}ms)`));
|
|
829
|
+
},
|
|
830
|
+
});
|
|
831
|
+
try {
|
|
832
|
+
idleWatchdog.start();
|
|
833
|
+
const runResult = await runLineCommand({
|
|
834
|
+
command: this.cliPath,
|
|
835
|
+
args,
|
|
836
|
+
cwd: sessionDir,
|
|
837
|
+
env: buildDaemonApiCliEnv(sessionDir, this.config.apiPort, { sessionBackend: "codex" }),
|
|
838
|
+
// Wall-clock is enforced by the invoker via abortSignal — we still
|
|
839
|
+
// pass a generous local timeout as a safety net (callers can
|
|
840
|
+
// disable it by setting their own abortSignal).
|
|
841
|
+
timeoutMs: 120_000,
|
|
842
|
+
abortSignal: proxyAborter.signal,
|
|
843
|
+
onStdoutLine: (line) => {
|
|
844
|
+
idleWatchdog.beat();
|
|
845
|
+
const event = parseJsonLine(line);
|
|
846
|
+
if (!event?.type)
|
|
847
|
+
return;
|
|
848
|
+
if (event.type === "turn.started") {
|
|
849
|
+
numTurns += 1;
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
if (event.type === "turn.completed") {
|
|
853
|
+
sawTurnCompleted = true;
|
|
854
|
+
usage = extractCodexUsage(event) ?? usage;
|
|
855
|
+
actualModelId = event.model ?? actualModelId;
|
|
856
|
+
return;
|
|
857
|
+
}
|
|
858
|
+
if (event.type === "turn.failed") {
|
|
859
|
+
lastError = event.error?.message ?? lastError;
|
|
860
|
+
return;
|
|
861
|
+
}
|
|
862
|
+
if (event.type === "error") {
|
|
863
|
+
const message = event.message?.trim();
|
|
864
|
+
if (message && !message.startsWith("Reconnecting...")) {
|
|
865
|
+
lastError = message;
|
|
866
|
+
}
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
// Match MCP tool calls by item.name / item.tool. We accept the
|
|
870
|
+
// first item that resolves to the requested tool name; any
|
|
871
|
+
// earlier item resolving to a different MCP tool flips the
|
|
872
|
+
// wrong_tool flag.
|
|
873
|
+
const item = event.item;
|
|
874
|
+
if (item && typeof item === "object") {
|
|
875
|
+
const bag = item;
|
|
876
|
+
const itemId = typeof bag.id === "string"
|
|
877
|
+
? bag.id
|
|
878
|
+
: typeof bag.call_id === "string"
|
|
879
|
+
? bag.call_id
|
|
880
|
+
: null;
|
|
881
|
+
const callMatch = extractMcpToolCall(event);
|
|
882
|
+
if (callMatch && itemId !== null && capturedToolItemId === null) {
|
|
883
|
+
const fullName = callMatch.toolName.startsWith("mcp__")
|
|
884
|
+
? callMatch.toolName
|
|
885
|
+
: `mcp__${callMatch.serverId}__${callMatch.toolName}`;
|
|
886
|
+
if (callMatch.toolName === toolName
|
|
887
|
+
|| fullName === toolName
|
|
888
|
+
|| itemMatchesToolName(bag, toolName)) {
|
|
889
|
+
capturedToolItemId = itemId;
|
|
890
|
+
}
|
|
891
|
+
else if (wrongToolName === null) {
|
|
892
|
+
wrongToolName = fullName;
|
|
893
|
+
// Early abort: see gemini-cli-core comment on the same
|
|
894
|
+
// pattern. The post-await classifier checks
|
|
895
|
+
// `wrongToolName` before `abortSignal?.aborted` so the
|
|
896
|
+
// failure is attributed correctly.
|
|
897
|
+
proxyAborter.abort(new Error("wrong_tool"));
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
// Pair tool result by call_id / parent_id when available;
|
|
901
|
+
// otherwise treat the first non-empty output that arrives
|
|
902
|
+
// after the matching call as the result. The output may live
|
|
903
|
+
// on the call item itself (some Codex versions backfill it)
|
|
904
|
+
// or on a separate function_call_output item.
|
|
905
|
+
if (capturedToolItemId !== null && capturedResultRaw === null) {
|
|
906
|
+
const pairedId = typeof bag.call_id === "string"
|
|
907
|
+
? bag.call_id
|
|
908
|
+
: typeof bag.parent_id === "string"
|
|
909
|
+
? bag.parent_id
|
|
910
|
+
: itemId;
|
|
911
|
+
const paired = pairedId === capturedToolItemId;
|
|
912
|
+
if (paired || itemId === capturedToolItemId) {
|
|
913
|
+
const collected = collectItemOutput(bag);
|
|
914
|
+
if (collected !== null) {
|
|
915
|
+
capturedResultRaw = collected;
|
|
916
|
+
// Codex marks tool errors with `is_error` or `error`
|
|
917
|
+
// fields on the output item.
|
|
918
|
+
if (bag.is_error === true
|
|
919
|
+
|| (typeof bag.error === "string"
|
|
920
|
+
&& bag.error.trim().length > 0)) {
|
|
921
|
+
capturedToolError =
|
|
922
|
+
typeof bag.error === "string"
|
|
923
|
+
? bag.error
|
|
924
|
+
: capturedResultRaw;
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
},
|
|
931
|
+
onStderrLine: (line) => {
|
|
932
|
+
idleWatchdog.beat();
|
|
933
|
+
stderrBuffer.push(line);
|
|
934
|
+
if (isLikelyCodexFailure(line)) {
|
|
935
|
+
lastError = line.trim();
|
|
936
|
+
}
|
|
937
|
+
},
|
|
938
|
+
});
|
|
939
|
+
if (capturedResultRaw === null && capturedToolItemId !== null) {
|
|
940
|
+
// Structured stream pairing did not yield a result block — fall
|
|
941
|
+
// back to the captured `--output-last-message` content. The
|
|
942
|
+
// proxy.md prompt instructs the model to return the tool's raw
|
|
943
|
+
// result, so the assistant's final message should already be the
|
|
944
|
+
// tool output (less reliable than structured matching, but a
|
|
945
|
+
// graceful degradation when pairing semantics drift across
|
|
946
|
+
// Codex versions).
|
|
947
|
+
const lastMessage = readFileIfExists(outputPath);
|
|
948
|
+
if (lastMessage && lastMessage.trim().length > 0) {
|
|
949
|
+
capturedResultRaw = lastMessage.trim();
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
const cost = withDurationMs({
|
|
953
|
+
tokensInput: usage.inputTokens,
|
|
954
|
+
tokensOutput: usage.outputTokens,
|
|
955
|
+
cacheCreationTokens: usage.cacheCreationInputTokens,
|
|
956
|
+
cacheReadTokens: usage.cacheReadInputTokens,
|
|
957
|
+
costUsd: this.priceFetcher.estimateUsageCost({
|
|
958
|
+
backendId: this.backendId,
|
|
959
|
+
modelId: actualModelId,
|
|
960
|
+
usage,
|
|
961
|
+
fallbackModel: findRegisteredModel(this.backendId, actualModelId),
|
|
962
|
+
}).costUsd,
|
|
963
|
+
durationMs: 0,
|
|
964
|
+
numTurns: numTurns || (sawTurnCompleted ? 1 : 0),
|
|
965
|
+
}, startMs);
|
|
966
|
+
// wrong_tool check is hoisted above the abort branch because the
|
|
967
|
+
// early-abort path (proxyAborter.abort) sets `wrongToolName` and
|
|
968
|
+
// triggers a kill — without this ordering the failure would
|
|
969
|
+
// surface as `cancelled` instead of the actual upstream cause.
|
|
970
|
+
// The idle-watchdog branch sits between wrong_tool and the
|
|
971
|
+
// caller's abortSignal: an idle hang aborts via proxyAborter and
|
|
972
|
+
// does not propagate to abortSignal, so without this ordering the
|
|
973
|
+
// failure would mis-classify as `no_tool_call`.
|
|
974
|
+
if (wrongToolName !== null) {
|
|
975
|
+
return {
|
|
976
|
+
ok: false,
|
|
977
|
+
errorClass: "wrong_tool",
|
|
978
|
+
message: `model called '${wrongToolName}' instead of requested '${toolName}'`,
|
|
979
|
+
cost,
|
|
980
|
+
};
|
|
981
|
+
}
|
|
982
|
+
if (idleTimedOut) {
|
|
983
|
+
return {
|
|
984
|
+
ok: false,
|
|
985
|
+
errorClass: "timeout",
|
|
986
|
+
message: `delegated proxy stream went idle (no codex events for ${idleTimeoutMs}ms)`,
|
|
987
|
+
cost,
|
|
988
|
+
};
|
|
989
|
+
}
|
|
990
|
+
if (abortSignal?.aborted) {
|
|
991
|
+
const errorClass = classifyAbortReason(abortSignal.reason);
|
|
992
|
+
return {
|
|
993
|
+
ok: false,
|
|
994
|
+
errorClass,
|
|
995
|
+
message: errorClass === "timeout"
|
|
996
|
+
? "delegated proxy timed out (wall-clock)"
|
|
997
|
+
: "delegated proxy cancelled by caller",
|
|
998
|
+
cost,
|
|
999
|
+
};
|
|
1000
|
+
}
|
|
1001
|
+
if (runResult.timedOut) {
|
|
1002
|
+
return {
|
|
1003
|
+
ok: false,
|
|
1004
|
+
errorClass: "timeout",
|
|
1005
|
+
message: "codex subprocess exceeded local safety-net timeout",
|
|
1006
|
+
cost,
|
|
1007
|
+
};
|
|
1008
|
+
}
|
|
1009
|
+
if (capturedResultRaw !== null && capturedToolError === null) {
|
|
1010
|
+
return {
|
|
1011
|
+
ok: true,
|
|
1012
|
+
toolResult: tryParseToolResult(capturedResultRaw),
|
|
1013
|
+
cost,
|
|
1014
|
+
};
|
|
1015
|
+
}
|
|
1016
|
+
if (capturedToolError !== null) {
|
|
1017
|
+
return {
|
|
1018
|
+
ok: false,
|
|
1019
|
+
errorClass: "tool_error",
|
|
1020
|
+
message: flattenToolResultContent(capturedToolError),
|
|
1021
|
+
cost,
|
|
1022
|
+
};
|
|
1023
|
+
}
|
|
1024
|
+
const failure = lastError ?? firstFailureLine(stderrBuffer);
|
|
1025
|
+
if (failure && /unauthorized|forbidden|api key|login|auth/i.test(failure)) {
|
|
1026
|
+
return {
|
|
1027
|
+
ok: false,
|
|
1028
|
+
errorClass: "auth_error",
|
|
1029
|
+
message: failure,
|
|
1030
|
+
cost,
|
|
1031
|
+
};
|
|
1032
|
+
}
|
|
1033
|
+
if (runResult.exitCode !== 0 && runResult.exitCode !== null) {
|
|
1034
|
+
return {
|
|
1035
|
+
ok: false,
|
|
1036
|
+
errorClass: "subprocess_crashed",
|
|
1037
|
+
message: failure ?? `codex exec exited ${runResult.exitCode}`,
|
|
1038
|
+
cost,
|
|
1039
|
+
};
|
|
1040
|
+
}
|
|
1041
|
+
if (capturedToolItemId === null) {
|
|
1042
|
+
return {
|
|
1043
|
+
ok: false,
|
|
1044
|
+
errorClass: "no_tool_call",
|
|
1045
|
+
message: failure
|
|
1046
|
+
?? `model did not invoke '${toolName}' (sawTurnCompleted=${sawTurnCompleted})`,
|
|
1047
|
+
cost,
|
|
1048
|
+
};
|
|
1049
|
+
}
|
|
1050
|
+
return {
|
|
1051
|
+
ok: false,
|
|
1052
|
+
errorClass: "parse_error",
|
|
1053
|
+
message: failure
|
|
1054
|
+
?? `codex emitted '${toolName}' call but no output payload could be paired`,
|
|
1055
|
+
cost,
|
|
1056
|
+
};
|
|
1057
|
+
}
|
|
1058
|
+
catch (err) {
|
|
1059
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
1060
|
+
const cost = withDurationMs(emptyCost(), startMs);
|
|
1061
|
+
if (abortSignal?.aborted) {
|
|
1062
|
+
return {
|
|
1063
|
+
ok: false,
|
|
1064
|
+
errorClass: classifyAbortReason(abortSignal.reason),
|
|
1065
|
+
message,
|
|
1066
|
+
cost,
|
|
1067
|
+
};
|
|
1068
|
+
}
|
|
1069
|
+
return { ok: false, errorClass: "subprocess_crashed", message, cost };
|
|
1070
|
+
}
|
|
1071
|
+
finally {
|
|
1072
|
+
idleWatchdog.stop();
|
|
1073
|
+
removeFileIfExists(outputPath);
|
|
1074
|
+
if (abortSignal && !abortSignal.aborted) {
|
|
1075
|
+
abortSignal.removeEventListener("abort", callerAbortListener);
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
/**
|
|
1080
|
+
* DELEGATED-TASK-MODE-DESIGN.md §9 — Codex task mode (Phase 1.5+).
|
|
1081
|
+
*
|
|
1082
|
+
* Codex CLI has no per-spawn allowedTools surface for MCP calls and no
|
|
1083
|
+
* PreToolUse hook, so allowed-tools enforcement lives entirely in
|
|
1084
|
+
* daemon-side stream pre-emption: we observe each `tool_use` item on
|
|
1085
|
+
* stdout, gate it against `allowedTools` and the destructive denylist,
|
|
1086
|
+
* and abort the subprocess (via the local AbortController) when the
|
|
1087
|
+
* model reaches outside the per-task envelope.
|
|
1088
|
+
*
|
|
1089
|
+
* Race window (accepted): a fast tool's side effect can land before our
|
|
1090
|
+
* SIGTERM arrives. The session's materialized `.codex/` config restricts
|
|
1091
|
+
* the MCP surface to the integration's connector (so out-of-scope tools
|
|
1092
|
+
* are unreachable to begin with), and `allowDestructive=false` removes
|
|
1093
|
+
* destructive entries from `allowedTools` upstream — but a destructive
|
|
1094
|
+
* connector tool that the prompt instructs the model NOT to call could
|
|
1095
|
+
* still race a SIGTERM. The prompt's destructive-section + the
|
|
1096
|
+
* `needsConfirmation` envelope are the load-bearing guardrails for that
|
|
1097
|
+
* narrow case; stream pre-emption is the second line.
|
|
1098
|
+
*
|
|
1099
|
+
* Output extraction: Codex CLI does not expose a structured-output API
|
|
1100
|
+
* (Anthropic-style `outputFormat: 'json_schema'`), so we pin
|
|
1101
|
+
* `--output-last-message` to a file and let the runtime helper
|
|
1102
|
+
* (`extractAndValidateResult`) handle fence-stripping + Ajv validation.
|
|
1103
|
+
* The `structuredOutput` field on the result is intentionally omitted
|
|
1104
|
+
* for Codex; the invoker falls back to text-extract automatically.
|
|
1105
|
+
*/
|
|
1106
|
+
async runDelegatedTask(params) {
|
|
1107
|
+
const startMs = Date.now();
|
|
1108
|
+
const { systemPrompt, allowedTools, destructiveTools, writeClassTools, modelId, maxToolCalls, timeoutMs, sessionDir, abortSignal, onToolStep, allowDestructive, } = params;
|
|
1109
|
+
const trace = [];
|
|
1110
|
+
let writeClassToolFired = false;
|
|
1111
|
+
const writeClassMatcher = (name) => writeClassTools.some((pattern) => matchRunAllowedToolPattern(pattern, name));
|
|
1112
|
+
if (!this.cliPath) {
|
|
1113
|
+
return {
|
|
1114
|
+
ok: false,
|
|
1115
|
+
errorClass: "subprocess_crashed",
|
|
1116
|
+
message: "codex CLI not found on PATH",
|
|
1117
|
+
cost: withDurationMs(emptyCost(), startMs),
|
|
1118
|
+
trace,
|
|
1119
|
+
writeClassToolFired,
|
|
1120
|
+
};
|
|
1121
|
+
}
|
|
1122
|
+
const auth = await this.checkAuth();
|
|
1123
|
+
if (!auth.ok) {
|
|
1124
|
+
return {
|
|
1125
|
+
ok: false,
|
|
1126
|
+
errorClass: "auth_error",
|
|
1127
|
+
message: auth.reason,
|
|
1128
|
+
cost: withDurationMs(emptyCost(), startMs),
|
|
1129
|
+
trace,
|
|
1130
|
+
writeClassToolFired,
|
|
1131
|
+
};
|
|
1132
|
+
}
|
|
1133
|
+
const outputPath = createOutputCapturePath(sessionDir, "codex-delegated-task-last-message");
|
|
1134
|
+
// Mirror runDelegatedTool's sandbox decision so the proxy session's
|
|
1135
|
+
// posture matches the user's configured execution mode (Allow vs Safe).
|
|
1136
|
+
// In both modes the per-task allowed-tools envelope is enforced by
|
|
1137
|
+
// stream pre-emption below — sandbox bypass only relaxes shell/file
|
|
1138
|
+
// restrictions, which the task subprocess does not exercise anyway.
|
|
1139
|
+
const allowMode = this.config.codexExecutionPermissionMode === "allow";
|
|
1140
|
+
const sandboxArgs = allowMode
|
|
1141
|
+
? ["--dangerously-bypass-approvals-and-sandbox"]
|
|
1142
|
+
: [
|
|
1143
|
+
"-c",
|
|
1144
|
+
'sandbox_mode="workspace-write"',
|
|
1145
|
+
"-c",
|
|
1146
|
+
"sandbox_workspace_write.network_access=true",
|
|
1147
|
+
];
|
|
1148
|
+
const args = [
|
|
1149
|
+
"exec",
|
|
1150
|
+
"--json",
|
|
1151
|
+
"--color",
|
|
1152
|
+
"never",
|
|
1153
|
+
...sandboxArgs,
|
|
1154
|
+
"--skip-git-repo-check",
|
|
1155
|
+
"--output-last-message",
|
|
1156
|
+
outputPath,
|
|
1157
|
+
"--model",
|
|
1158
|
+
modelId,
|
|
1159
|
+
"--ephemeral",
|
|
1160
|
+
systemPrompt,
|
|
1161
|
+
];
|
|
1162
|
+
// Local aborter bridged from the caller's signal so we can also
|
|
1163
|
+
// trigger an early abort on policy_violation / loop_aborted detection.
|
|
1164
|
+
// Mirrors the pattern in runDelegatedTool and gemini-cli-core's
|
|
1165
|
+
// task-mode implementation.
|
|
1166
|
+
const aborter = new AbortController();
|
|
1167
|
+
const callerListener = () => {
|
|
1168
|
+
aborter.abort(abortSignal?.reason);
|
|
1169
|
+
};
|
|
1170
|
+
if (abortSignal) {
|
|
1171
|
+
if (abortSignal.aborted) {
|
|
1172
|
+
aborter.abort(abortSignal.reason);
|
|
1173
|
+
}
|
|
1174
|
+
else {
|
|
1175
|
+
abortSignal.addEventListener("abort", callerListener, { once: true });
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
const isAllowedTool = (name) => allowedTools.some((pattern) => matchRunAllowedToolPattern(pattern, name));
|
|
1179
|
+
const destructiveSet = allowDestructive
|
|
1180
|
+
? new Set()
|
|
1181
|
+
: new Set(destructiveTools);
|
|
1182
|
+
const pendingByItemId = new Map();
|
|
1183
|
+
let toolCallCount = 0;
|
|
1184
|
+
let loopAborted = false;
|
|
1185
|
+
let policyViolationTool = null;
|
|
1186
|
+
let usage = { ...EMPTY_USAGE };
|
|
1187
|
+
let actualModelId = modelId;
|
|
1188
|
+
let numTurns = 0;
|
|
1189
|
+
let lastError = null;
|
|
1190
|
+
let sawTurnCompleted = false;
|
|
1191
|
+
const stderrBuffer = [];
|
|
1192
|
+
try {
|
|
1193
|
+
const runResult = await runLineCommand({
|
|
1194
|
+
command: this.cliPath,
|
|
1195
|
+
args,
|
|
1196
|
+
cwd: sessionDir,
|
|
1197
|
+
env: buildDaemonApiCliEnv(sessionDir, this.config.apiPort, {
|
|
1198
|
+
sessionBackend: "codex",
|
|
1199
|
+
}),
|
|
1200
|
+
// Wall-clock is enforced by the caller's abortSignal (the route
|
|
1201
|
+
// handler clamps timeoutMs to DELEGATED_TASK_HARD_CAPS.maxTimeoutMs
|
|
1202
|
+
// = 5min). Local timeoutMs is a safety net pegged to the caller
|
|
1203
|
+
// bound + 60s grace so the abort fires first and gives a clean
|
|
1204
|
+
// errorClass=timeout via classifyAbortReason.
|
|
1205
|
+
timeoutMs: timeoutMs + 60_000,
|
|
1206
|
+
abortSignal: aborter.signal,
|
|
1207
|
+
onStdoutLine: (line) => {
|
|
1208
|
+
const event = parseJsonLine(line);
|
|
1209
|
+
if (!event?.type)
|
|
1210
|
+
return;
|
|
1211
|
+
if (event.type === "turn.started") {
|
|
1212
|
+
numTurns += 1;
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
1215
|
+
if (event.type === "turn.completed") {
|
|
1216
|
+
sawTurnCompleted = true;
|
|
1217
|
+
usage = extractCodexUsage(event) ?? usage;
|
|
1218
|
+
actualModelId = event.model ?? actualModelId;
|
|
1219
|
+
return;
|
|
1220
|
+
}
|
|
1221
|
+
if (event.type === "turn.failed") {
|
|
1222
|
+
lastError = event.error?.message ?? lastError;
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
if (event.type === "error") {
|
|
1226
|
+
const message = event.message?.trim();
|
|
1227
|
+
if (message && !message.startsWith("Reconnecting...")) {
|
|
1228
|
+
lastError = message;
|
|
1229
|
+
}
|
|
1230
|
+
return;
|
|
1231
|
+
}
|
|
1232
|
+
const item = event.item;
|
|
1233
|
+
if (!item || typeof item !== "object")
|
|
1234
|
+
return;
|
|
1235
|
+
const bag = item;
|
|
1236
|
+
const itemId = typeof bag.id === "string"
|
|
1237
|
+
? bag.id
|
|
1238
|
+
: typeof bag.call_id === "string"
|
|
1239
|
+
? bag.call_id
|
|
1240
|
+
: null;
|
|
1241
|
+
// Stream pre-emption: gate every MCP tool_use against the
|
|
1242
|
+
// per-task allowed-tools / destructive envelope before the
|
|
1243
|
+
// subprocess can act on it. The race-window caveat (model side
|
|
1244
|
+
// effect lands before SIGTERM) is documented at the top of this
|
|
1245
|
+
// method.
|
|
1246
|
+
const callMatch = extractMcpToolCall(event);
|
|
1247
|
+
if (callMatch && itemId !== null) {
|
|
1248
|
+
// Prefer the verbatim `bag.name` (or `bag.tool_name`) when
|
|
1249
|
+
// it's already the fully-qualified `mcp__server__tool` form —
|
|
1250
|
+
// splitting + reconstructing via serverId+toolName loses
|
|
1251
|
+
// dotted namespace prefixes like `gmail.` (e.g. Codex's gmail
|
|
1252
|
+
// MCP registers `gmail._search_emails`, but `bag.tool` carries
|
|
1253
|
+
// only `_search_emails`, dropping the `gmail.` segment).
|
|
1254
|
+
const verbatim = typeof bag.name === "string" && bag.name.startsWith("mcp__")
|
|
1255
|
+
? bag.name
|
|
1256
|
+
: typeof bag.tool_name === "string"
|
|
1257
|
+
&& bag.tool_name.startsWith("mcp__")
|
|
1258
|
+
? bag.tool_name
|
|
1259
|
+
: null;
|
|
1260
|
+
const fullName = verbatim
|
|
1261
|
+
?? (callMatch.toolName.startsWith("mcp__")
|
|
1262
|
+
? callMatch.toolName
|
|
1263
|
+
: `mcp__${callMatch.serverId}__${callMatch.toolName}`);
|
|
1264
|
+
if (!pendingByItemId.has(itemId)) {
|
|
1265
|
+
if (!isAllowedTool(fullName) || destructiveSet.has(fullName)) {
|
|
1266
|
+
policyViolationTool = fullName;
|
|
1267
|
+
loopAborted = true;
|
|
1268
|
+
aborter.abort(new Error("policy_violation"));
|
|
1269
|
+
return;
|
|
1270
|
+
}
|
|
1271
|
+
toolCallCount += 1;
|
|
1272
|
+
if (toolCallCount > maxToolCalls) {
|
|
1273
|
+
loopAborted = true;
|
|
1274
|
+
aborter.abort(new Error("loop_aborted"));
|
|
1275
|
+
return;
|
|
1276
|
+
}
|
|
1277
|
+
if (writeClassMatcher(fullName)) {
|
|
1278
|
+
writeClassToolFired = true;
|
|
1279
|
+
}
|
|
1280
|
+
pendingByItemId.set(itemId, {
|
|
1281
|
+
name: fullName,
|
|
1282
|
+
args: extractCodexCallArgs(bag),
|
|
1283
|
+
startedAt: Date.now(),
|
|
1284
|
+
});
|
|
1285
|
+
return;
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
// Tool result pairing: bind the first non-empty output that
|
|
1289
|
+
// arrives for a known pending tool_use. Codex emits the output
|
|
1290
|
+
// either backfilled on the call item itself (older versions) or
|
|
1291
|
+
// on a paired function_call_output item.
|
|
1292
|
+
if (pendingByItemId.size > 0) {
|
|
1293
|
+
const pairedId = typeof bag.call_id === "string"
|
|
1294
|
+
? bag.call_id
|
|
1295
|
+
: typeof bag.parent_id === "string"
|
|
1296
|
+
? bag.parent_id
|
|
1297
|
+
: itemId;
|
|
1298
|
+
if (pairedId !== null && pendingByItemId.has(pairedId)) {
|
|
1299
|
+
const pending = pendingByItemId.get(pairedId);
|
|
1300
|
+
const collected = collectItemOutput(bag);
|
|
1301
|
+
if (pending && collected !== null) {
|
|
1302
|
+
pendingByItemId.delete(pairedId);
|
|
1303
|
+
const isErrorResult = bag.is_error === true
|
|
1304
|
+
|| (typeof bag.error === "string"
|
|
1305
|
+
&& bag.error.trim().length > 0);
|
|
1306
|
+
// `collected` is the connector response as a string —
|
|
1307
|
+
// either a JSON-encoded object (the common path:
|
|
1308
|
+
// `bag.output` was the Codex-side tool_result envelope)
|
|
1309
|
+
// or a free-form text reply (`stdout` / `stderr`). Try
|
|
1310
|
+
// JSON-parse for the response-shape walker downstream;
|
|
1311
|
+
// fall back to the raw string so the field is always
|
|
1312
|
+
// populated for ok steps.
|
|
1313
|
+
let parsedToolResult = collected;
|
|
1314
|
+
try {
|
|
1315
|
+
parsedToolResult = JSON.parse(collected);
|
|
1316
|
+
}
|
|
1317
|
+
catch {
|
|
1318
|
+
/* keep raw string */
|
|
1319
|
+
}
|
|
1320
|
+
const step = {
|
|
1321
|
+
toolName: pending.name,
|
|
1322
|
+
toolArgs: pending.args,
|
|
1323
|
+
durationMs: Date.now() - pending.startedAt,
|
|
1324
|
+
status: isErrorResult ? "error" : "ok",
|
|
1325
|
+
costUsd: null,
|
|
1326
|
+
tokensInput: null,
|
|
1327
|
+
tokensOutput: null,
|
|
1328
|
+
toolResult: parsedToolResult,
|
|
1329
|
+
};
|
|
1330
|
+
trace.push(step);
|
|
1331
|
+
onToolStep?.(step);
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
},
|
|
1336
|
+
onStderrLine: (line) => {
|
|
1337
|
+
stderrBuffer.push(line);
|
|
1338
|
+
if (isLikelyCodexFailure(line)) {
|
|
1339
|
+
lastError = line.trim();
|
|
1340
|
+
}
|
|
1341
|
+
},
|
|
1342
|
+
});
|
|
1343
|
+
const cost = withDurationMs({
|
|
1344
|
+
tokensInput: usage.inputTokens,
|
|
1345
|
+
tokensOutput: usage.outputTokens,
|
|
1346
|
+
cacheCreationTokens: usage.cacheCreationInputTokens,
|
|
1347
|
+
cacheReadTokens: usage.cacheReadInputTokens,
|
|
1348
|
+
costUsd: this.priceFetcher.estimateUsageCost({
|
|
1349
|
+
backendId: this.backendId,
|
|
1350
|
+
modelId: actualModelId,
|
|
1351
|
+
usage,
|
|
1352
|
+
fallbackModel: findRegisteredModel(this.backendId, actualModelId),
|
|
1353
|
+
}).costUsd,
|
|
1354
|
+
durationMs: 0,
|
|
1355
|
+
numTurns: numTurns || (sawTurnCompleted ? 1 : 0),
|
|
1356
|
+
}, startMs);
|
|
1357
|
+
if (policyViolationTool) {
|
|
1358
|
+
return {
|
|
1359
|
+
ok: false,
|
|
1360
|
+
errorClass: "policy_violation",
|
|
1361
|
+
message: `subprocess attempted to call '${policyViolationTool}' which is outside the per-task allowlist`,
|
|
1362
|
+
cost,
|
|
1363
|
+
trace,
|
|
1364
|
+
writeClassToolFired,
|
|
1365
|
+
};
|
|
1366
|
+
}
|
|
1367
|
+
if (loopAborted) {
|
|
1368
|
+
return {
|
|
1369
|
+
ok: false,
|
|
1370
|
+
errorClass: "loop_aborted",
|
|
1371
|
+
message: `subprocess exceeded maxToolCalls=${maxToolCalls}`,
|
|
1372
|
+
cost,
|
|
1373
|
+
trace,
|
|
1374
|
+
writeClassToolFired,
|
|
1375
|
+
};
|
|
1376
|
+
}
|
|
1377
|
+
if (abortSignal?.aborted) {
|
|
1378
|
+
const errorClass = classifyAbortReason(abortSignal.reason);
|
|
1379
|
+
return {
|
|
1380
|
+
ok: false,
|
|
1381
|
+
errorClass,
|
|
1382
|
+
message: errorClass === "timeout"
|
|
1383
|
+
? "delegated task timed out (wall-clock)"
|
|
1384
|
+
: "delegated task cancelled by caller",
|
|
1385
|
+
cost,
|
|
1386
|
+
trace,
|
|
1387
|
+
writeClassToolFired,
|
|
1388
|
+
};
|
|
1389
|
+
}
|
|
1390
|
+
if (runResult.timedOut) {
|
|
1391
|
+
return {
|
|
1392
|
+
ok: false,
|
|
1393
|
+
errorClass: "timeout",
|
|
1394
|
+
message: "codex subprocess exceeded local safety-net timeout",
|
|
1395
|
+
cost,
|
|
1396
|
+
trace,
|
|
1397
|
+
writeClassToolFired,
|
|
1398
|
+
};
|
|
1399
|
+
}
|
|
1400
|
+
const lastMessage = readFileIfExists(outputPath);
|
|
1401
|
+
const finalText = lastMessage?.trim() ?? "";
|
|
1402
|
+
if (finalText.length === 0) {
|
|
1403
|
+
const failure = lastError ?? firstFailureLine(stderrBuffer);
|
|
1404
|
+
if (failure
|
|
1405
|
+
&& /unauthorized|forbidden|api key|login|auth/i.test(failure)) {
|
|
1406
|
+
return {
|
|
1407
|
+
ok: false,
|
|
1408
|
+
errorClass: "auth_error",
|
|
1409
|
+
message: failure,
|
|
1410
|
+
cost,
|
|
1411
|
+
trace,
|
|
1412
|
+
writeClassToolFired,
|
|
1413
|
+
};
|
|
1414
|
+
}
|
|
1415
|
+
return {
|
|
1416
|
+
ok: false,
|
|
1417
|
+
errorClass: "parse_error",
|
|
1418
|
+
message: failure
|
|
1419
|
+
?? `codex emitted no final assistant message (sawTurnCompleted=${sawTurnCompleted})`,
|
|
1420
|
+
cost,
|
|
1421
|
+
trace,
|
|
1422
|
+
writeClassToolFired,
|
|
1423
|
+
};
|
|
1424
|
+
}
|
|
1425
|
+
return {
|
|
1426
|
+
ok: true,
|
|
1427
|
+
rawAssistantText: finalText,
|
|
1428
|
+
cost,
|
|
1429
|
+
trace,
|
|
1430
|
+
writeClassToolFired,
|
|
1431
|
+
};
|
|
1432
|
+
}
|
|
1433
|
+
catch (err) {
|
|
1434
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
1435
|
+
const cost = withDurationMs(emptyCost(), startMs);
|
|
1436
|
+
if (abortSignal?.aborted || aborter.signal.aborted) {
|
|
1437
|
+
return {
|
|
1438
|
+
ok: false,
|
|
1439
|
+
errorClass: classifyAbortReason(abortSignal?.reason ?? aborter.signal.reason),
|
|
1440
|
+
message,
|
|
1441
|
+
cost,
|
|
1442
|
+
trace,
|
|
1443
|
+
writeClassToolFired,
|
|
1444
|
+
};
|
|
1445
|
+
}
|
|
1446
|
+
return {
|
|
1447
|
+
ok: false,
|
|
1448
|
+
errorClass: "subprocess_crashed",
|
|
1449
|
+
message,
|
|
1450
|
+
cost,
|
|
1451
|
+
trace,
|
|
1452
|
+
writeClassToolFired,
|
|
1453
|
+
};
|
|
1454
|
+
}
|
|
1455
|
+
finally {
|
|
1456
|
+
removeFileIfExists(outputPath);
|
|
1457
|
+
if (abortSignal) {
|
|
1458
|
+
abortSignal.removeEventListener("abort", callerListener);
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
}
|
|
1463
|
+
/**
|
|
1464
|
+
* Best-effort extraction of tool-call arguments from a Codex
|
|
1465
|
+
* `function_call` / `mcp_call` item. Codex serialises args as a JSON
|
|
1466
|
+
* string in `bag.arguments`; older versions may use `bag.input` instead.
|
|
1467
|
+
* Returns `null` when nothing parseable is present so the trace's
|
|
1468
|
+
* `toolArgs` field stays informative.
|
|
1469
|
+
*/
|
|
1470
|
+
function extractCodexCallArgs(bag) {
|
|
1471
|
+
const candidates = ["arguments", "input", "args"];
|
|
1472
|
+
for (const key of candidates) {
|
|
1473
|
+
const value = bag[key];
|
|
1474
|
+
if (value === undefined || value === null)
|
|
1475
|
+
continue;
|
|
1476
|
+
if (typeof value === "string") {
|
|
1477
|
+
const trimmed = value.trim();
|
|
1478
|
+
if (trimmed.length === 0)
|
|
1479
|
+
continue;
|
|
1480
|
+
try {
|
|
1481
|
+
return JSON.parse(trimmed);
|
|
1482
|
+
}
|
|
1483
|
+
catch {
|
|
1484
|
+
return trimmed;
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1487
|
+
if (typeof value === "object")
|
|
1488
|
+
return value;
|
|
1489
|
+
}
|
|
1490
|
+
return null;
|
|
1491
|
+
}
|
|
1492
|
+
/**
|
|
1493
|
+
* Codex MCP items can carry the tool name on multiple fields depending on
|
|
1494
|
+
* CLI version (`name`, `tool`, `tool_name`). Returns true when any of
|
|
1495
|
+
* them match the requested tool — used as a belt-and-suspenders check
|
|
1496
|
+
* after `extractMcpToolCall` has run, in case the parsing path missed.
|
|
1497
|
+
*/
|
|
1498
|
+
function itemMatchesToolName(bag, toolName) {
|
|
1499
|
+
const candidates = ["name", "tool", "tool_name"];
|
|
1500
|
+
for (const key of candidates) {
|
|
1501
|
+
const v = bag[key];
|
|
1502
|
+
if (typeof v === "string" && (v === toolName || `mcp__${v}` === toolName)) {
|
|
1503
|
+
return true;
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
return false;
|
|
1507
|
+
}
|
|
1508
|
+
/**
|
|
1509
|
+
* Pull the first non-empty output payload from a Codex item. Tries the
|
|
1510
|
+
* structured `output` field first (object → JSON); falls back to the
|
|
1511
|
+
* text-shaped fields the existing `collectCodexItemText` helper scans.
|
|
1512
|
+
*/
|
|
1513
|
+
function collectItemOutput(bag) {
|
|
1514
|
+
const structured = bag.output;
|
|
1515
|
+
if (structured !== undefined && structured !== null) {
|
|
1516
|
+
if (typeof structured === "string" && structured.length > 0) {
|
|
1517
|
+
return structured;
|
|
1518
|
+
}
|
|
1519
|
+
if (typeof structured === "object") {
|
|
1520
|
+
try {
|
|
1521
|
+
return JSON.stringify(structured);
|
|
1522
|
+
}
|
|
1523
|
+
catch {
|
|
1524
|
+
/* fall through to text fields */
|
|
1525
|
+
}
|
|
1526
|
+
}
|
|
1527
|
+
}
|
|
1528
|
+
const fields = ["aggregated_output", "stdout", "stderr"];
|
|
1529
|
+
for (const key of fields) {
|
|
1530
|
+
const v = bag[key];
|
|
1531
|
+
if (typeof v === "string" && v.length > 0) {
|
|
1532
|
+
return v;
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1535
|
+
return null;
|
|
1536
|
+
}
|
|
1537
|
+
function isMaxBudgetMessage(message) {
|
|
1538
|
+
return /max(?:imum)? budget|max_budget_usd|budget limit|per-turn budget/i.test(message);
|
|
1539
|
+
}
|
|
1540
|
+
/**
|
|
1541
|
+
* Codex argv byte budget. macOS `ARG_MAX` is ~1 MB and the kernel counts
|
|
1542
|
+
* env vars too, so we cap our contribution at 120 KB to leave plenty of
|
|
1543
|
+
* headroom for the prompt body (which can exceed 50 KB on long-context
|
|
1544
|
+
* routines) + env. Matches the chat-file-attachments envelope (see
|
|
1545
|
+
* `docs/design/04-daemon-api.md` §4.3.23).
|
|
1546
|
+
*/
|
|
1547
|
+
export const CODEX_ARGV_BUDGET_BYTES = 120_000;
|
|
1548
|
+
/**
|
|
1549
|
+
* Translate staged image attachments into repeated `--image <absolutePath>`
|
|
1550
|
+
* argv pairs. Non-image attachments stay staged-only (the agent opens them
|
|
1551
|
+
* via shell `cat` / `grep`). If emitting flags for every image would push
|
|
1552
|
+
* argv past the budget, drop the entire list — partial emission would
|
|
1553
|
+
* silently bias the model's attention toward the first N images in an
|
|
1554
|
+
* order that's not visible in the prompt. All-or-nothing is easier to
|
|
1555
|
+
* diagnose and the `[Attached files]` text block still names every file.
|
|
1556
|
+
*
|
|
1557
|
+
* Pure function — unit-testable without a CLI subprocess.
|
|
1558
|
+
*/
|
|
1559
|
+
export function buildCodexImageArgs(staged, budgetBytes) {
|
|
1560
|
+
if (!staged || staged.length === 0)
|
|
1561
|
+
return [];
|
|
1562
|
+
const images = staged.filter((att) => att.mimeType.toLowerCase().startsWith("image/"));
|
|
1563
|
+
if (images.length === 0)
|
|
1564
|
+
return [];
|
|
1565
|
+
let totalBytes = 0;
|
|
1566
|
+
const args = [];
|
|
1567
|
+
for (const img of images) {
|
|
1568
|
+
// Approximate argv cost: flag name + path + null separators the kernel
|
|
1569
|
+
// adds between args. utf-8 covers macOS paths with non-ASCII chars.
|
|
1570
|
+
totalBytes += Buffer.byteLength("--image", "utf8") + 1;
|
|
1571
|
+
totalBytes += Buffer.byteLength(img.absolutePath, "utf8") + 1;
|
|
1572
|
+
args.push("--image", img.absolutePath);
|
|
1573
|
+
}
|
|
1574
|
+
if (totalBytes > budgetBytes) {
|
|
1575
|
+
logger.warn({ imageCount: images.length, totalBytes, budgetBytes }, "Codex --image argv would exceed budget — dropping to staged-only references");
|
|
1576
|
+
return [];
|
|
1577
|
+
}
|
|
1578
|
+
return args;
|
|
1579
|
+
}
|
|
1580
|
+
function extractCodexUsage(event) {
|
|
1581
|
+
const usage = event.usage;
|
|
1582
|
+
if (!usage || typeof usage !== "object") {
|
|
1583
|
+
return null;
|
|
1584
|
+
}
|
|
1585
|
+
const totalInputTokens = readNumber(usage.input_tokens);
|
|
1586
|
+
const cacheReadInputTokens = readNumber(usage.cached_input_tokens);
|
|
1587
|
+
return {
|
|
1588
|
+
inputTokens: nonCachedInputTokens(totalInputTokens, cacheReadInputTokens),
|
|
1589
|
+
outputTokens: readNumber(usage.output_tokens),
|
|
1590
|
+
cacheCreationInputTokens: 0,
|
|
1591
|
+
cacheReadInputTokens,
|
|
1592
|
+
};
|
|
1593
|
+
}
|
|
1594
|
+
function nonCachedInputTokens(totalInputTokens, cacheReadInputTokens, cacheCreationInputTokens = 0) {
|
|
1595
|
+
return Math.max(totalInputTokens - cacheReadInputTokens - cacheCreationInputTokens, 0);
|
|
1596
|
+
}
|
|
1597
|
+
function extractCodexText(event) {
|
|
1598
|
+
if (typeof event.output_text === "string") {
|
|
1599
|
+
return event.output_text;
|
|
1600
|
+
}
|
|
1601
|
+
if (typeof event.delta === "string") {
|
|
1602
|
+
return event.delta;
|
|
1603
|
+
}
|
|
1604
|
+
if (typeof event.text === "string") {
|
|
1605
|
+
return event.text;
|
|
1606
|
+
}
|
|
1607
|
+
const item = event.item;
|
|
1608
|
+
if (!item || typeof item !== "object") {
|
|
1609
|
+
return "";
|
|
1610
|
+
}
|
|
1611
|
+
if (typeof item.delta === "string") {
|
|
1612
|
+
return item.delta;
|
|
1613
|
+
}
|
|
1614
|
+
if (typeof item.text === "string") {
|
|
1615
|
+
return item.text;
|
|
1616
|
+
}
|
|
1617
|
+
return "";
|
|
1618
|
+
}
|
|
1619
|
+
function isLikelyCodexFailure(line) {
|
|
1620
|
+
return /error|failed|unauthorized|forbidden|rate limit|quota/i.test(line);
|
|
1621
|
+
}
|
|
1622
|
+
/**
|
|
1623
|
+
* Copy any string-valued subprocess-output fields from a Codex JSONL event's
|
|
1624
|
+
* `item` into the given sink. Codex emits tool/command output under a small
|
|
1625
|
+
* set of well-known fields; we scan these (not the whole event graph) so that
|
|
1626
|
+
* a command echo like `echo PA_API_ERROR` never false-positives on the
|
|
1627
|
+
* command-text itself.
|
|
1628
|
+
*/
|
|
1629
|
+
/**
|
|
1630
|
+
* Detect an MCP tool call in a Codex JSONL event. Returns null when the
|
|
1631
|
+
* event does not describe an MCP invocation (plain function calls, text
|
|
1632
|
+
* deltas, turn events, etc.). Two shapes are recognised:
|
|
1633
|
+
*
|
|
1634
|
+
* 1. Items whose `name` matches the cross-runtime `mcp__<server>__<tool>`
|
|
1635
|
+
* convention. This is the form emitted by Codex's function-call items
|
|
1636
|
+
* when the underlying tool is an MCP export.
|
|
1637
|
+
* 2. Items that declare `server` + `tool` (or `server_label` + `name`)
|
|
1638
|
+
* fields directly. Surfaced by newer Codex builds for MCP tools and
|
|
1639
|
+
* preferred when present because no string parsing is required.
|
|
1640
|
+
*
|
|
1641
|
+
* Logging is fire-and-forget — unparseable inputs silently return null so
|
|
1642
|
+
* benign shape changes upstream don't spam the log.
|
|
1643
|
+
*/
|
|
1644
|
+
function extractMcpToolCall(event) {
|
|
1645
|
+
const item = event.item;
|
|
1646
|
+
if (!item || typeof item !== "object")
|
|
1647
|
+
return null;
|
|
1648
|
+
const bag = item;
|
|
1649
|
+
const serverField = typeof bag.server === "string"
|
|
1650
|
+
? bag.server
|
|
1651
|
+
: typeof bag.server_label === "string"
|
|
1652
|
+
? bag.server_label
|
|
1653
|
+
: null;
|
|
1654
|
+
const toolField = typeof bag.tool === "string"
|
|
1655
|
+
? bag.tool
|
|
1656
|
+
: typeof bag.tool_name === "string"
|
|
1657
|
+
? bag.tool_name
|
|
1658
|
+
: null;
|
|
1659
|
+
if (serverField && toolField) {
|
|
1660
|
+
return { serverId: serverField, toolName: toolField };
|
|
1661
|
+
}
|
|
1662
|
+
const name = typeof bag.name === "string"
|
|
1663
|
+
? bag.name
|
|
1664
|
+
: typeof bag.tool_name === "string"
|
|
1665
|
+
? bag.tool_name
|
|
1666
|
+
: null;
|
|
1667
|
+
if (name) {
|
|
1668
|
+
const parsed = parseMcpToolName(name);
|
|
1669
|
+
if (parsed)
|
|
1670
|
+
return parsed;
|
|
1671
|
+
}
|
|
1672
|
+
return null;
|
|
1673
|
+
}
|
|
1674
|
+
function collectCodexItemText(event, sink) {
|
|
1675
|
+
const item = event.item;
|
|
1676
|
+
if (!item || typeof item !== "object")
|
|
1677
|
+
return;
|
|
1678
|
+
const fields = ["output", "stdout", "stderr", "aggregated_output"];
|
|
1679
|
+
for (const key of fields) {
|
|
1680
|
+
const value = item[key];
|
|
1681
|
+
if (typeof value === "string" && value.length > 0) {
|
|
1682
|
+
sink.push(value);
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
}
|
|
1686
|
+
function firstFailureLine(lines) {
|
|
1687
|
+
const line = lines.find((candidate) => isLikelyCodexFailure(candidate));
|
|
1688
|
+
return line?.trim() ?? null;
|
|
1689
|
+
}
|
|
1690
|
+
function readNumber(value) {
|
|
1691
|
+
return typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
1692
|
+
}
|
|
1693
|
+
//# sourceMappingURL=codex-core.js.map
|