@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,1271 @@
|
|
|
1
|
+
import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { dirname, join, relative } from "node:path";
|
|
3
|
+
import { APP_NAME, BACKEND_IDS, INTEGRATION_DESCRIPTORS, INTEGRATION_KEYS, applyIntegrationModeFilter, collectSessionDeniedTools, filterDeniedToolsForBackend, selectSkillVariantFile, selectTaskFlowVariantSuffix, substituteBrandTokens, } from "@aitne/shared";
|
|
4
|
+
import { getProfileForEvent, getProfileForProcess, getSkillsForEvent, getSkillsForProcess } from "./skills-manifest.js";
|
|
5
|
+
import { applyCharacterBlockRewrite, buildCharacterBlock } from "./character-block.js";
|
|
6
|
+
import { createLogger } from "../logging.js";
|
|
7
|
+
import { loadCurationDeclaration, } from "./skill-curation/declarations.js";
|
|
8
|
+
import { OverlayStore } from "./skill-curation/overlay-store.js";
|
|
9
|
+
import { hasCurationAnchors, spliceCurationAnchors, } from "./skill-curation/splicer.js";
|
|
10
|
+
// Exported so tests can spy on `logger.warn` (e.g. the missing-reference
|
|
11
|
+
// branch of `renderReferenceIncludes`). Production callers do not import it.
|
|
12
|
+
export const logger = createLogger("skills-compiler");
|
|
13
|
+
/**
|
|
14
|
+
* Check whether the skill AND task-flow variants a given integration would
|
|
15
|
+
* require when delegated to `delegatedBackend` are all present on disk.
|
|
16
|
+
* Returns missing file paths split by kind.
|
|
17
|
+
*
|
|
18
|
+
* DELEGATED-MODE-V2-DESIGN.md §4.1.1 — variant filenames are keyed on
|
|
19
|
+
* **session backend**, not the delegated backend. Three resolutions:
|
|
20
|
+
* - sessionBackend === delegatedBackend → `null` (no skill body, native MCP)
|
|
21
|
+
* - sessionBackend !== delegatedBackend → `SKILL.delegated.<sessionBackend>.md`
|
|
22
|
+
* (cross-backend; the daemon proxy spawns delegatedBackend)
|
|
23
|
+
* - non-delegated touch → `SKILL.md` (no delegated variant required)
|
|
24
|
+
*
|
|
25
|
+
* Task flow variants always fire as `delegated.<sessionBackend>` whenever
|
|
26
|
+
* any touched integration is delegated, regardless of same- vs cross-backend
|
|
27
|
+
* (`selectTaskFlowVariantSuffix`).
|
|
28
|
+
*
|
|
29
|
+
* The gate enumerates every potential session backend (`BACKEND_IDS`) and
|
|
30
|
+
* defers to the resolvers; that keeps the gate automatically aligned with
|
|
31
|
+
* `selectSkillVariantFile` / `selectTaskFlowVariantSuffix` if those grow new
|
|
32
|
+
* cases. We pin the integration's mode locally as `delegated` with the
|
|
33
|
+
* supplied `delegatedBackend` so the resolvers see the post-PATCH state.
|
|
34
|
+
*
|
|
35
|
+
* Consumed by:
|
|
36
|
+
* - `SkillsCompiler.validateDelegatedVariants()` — startup aggregate
|
|
37
|
+
* - `PATCH /api/integrations/:key` — pre-commit hard reject (§4.7)
|
|
38
|
+
* - `buildIntegrationHealthMap` — surfaces the list in
|
|
39
|
+
* `/health.integrationModes.<key>.variantsMissing`
|
|
40
|
+
*/
|
|
41
|
+
/**
|
|
42
|
+
* Walk a materialized session subdirectory and rewrite every `.md` file with
|
|
43
|
+
* `{APP_NAME}` tokens resolved. Called immediately after `cpSync(src, dest, …)`
|
|
44
|
+
* so the verbatim copy from `agent-assets/` becomes brand-substituted before
|
|
45
|
+
* any downstream transform (renderReferenceIncludes, applyIntegrationModeFilter,
|
|
46
|
+
* tool-deny filter) reads it. Idempotent — running it twice is a no-op.
|
|
47
|
+
*/
|
|
48
|
+
function substituteBrandTokensInDir(dir) {
|
|
49
|
+
if (!existsSync(dir))
|
|
50
|
+
return;
|
|
51
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
52
|
+
const full = join(dir, entry.name);
|
|
53
|
+
if (entry.isDirectory()) {
|
|
54
|
+
substituteBrandTokensInDir(full);
|
|
55
|
+
}
|
|
56
|
+
else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
57
|
+
const original = readFileSync(full, "utf-8");
|
|
58
|
+
const substituted = substituteBrandTokens(original);
|
|
59
|
+
if (substituted !== original) {
|
|
60
|
+
writeFileSync(full, substituted, "utf-8");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function missingDelegatedVariants(workspaceDir, integrationKey, delegatedBackend) {
|
|
66
|
+
const descriptor = INTEGRATION_DESCRIPTORS[integrationKey];
|
|
67
|
+
const skillsRoot = join(workspaceDir, "agent-assets", "skills");
|
|
68
|
+
const taskFlowsRoot = join(workspaceDir, "agent-assets", "task-flows");
|
|
69
|
+
// Synthetic post-PATCH state. The resolvers consume only `mode` and
|
|
70
|
+
// `delegatedBackend`; `lastChangedAt` is required by the type but not
|
|
71
|
+
// read here.
|
|
72
|
+
const integrationsState = {
|
|
73
|
+
[integrationKey]: {
|
|
74
|
+
mode: "delegated",
|
|
75
|
+
delegatedBackend,
|
|
76
|
+
deniedTools: [],
|
|
77
|
+
lastChangedAt: "1970-01-01T00:00:00.000Z",
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
// De-dup with sets — the same file path can come up under multiple
|
|
81
|
+
// session backends when descriptors share a slug, even though the
|
|
82
|
+
// current registry doesn't produce that today.
|
|
83
|
+
const skills = new Set();
|
|
84
|
+
for (const slug of descriptor.skillsTouched) {
|
|
85
|
+
for (const sessionBackend of BACKEND_IDS) {
|
|
86
|
+
const variantFile = selectSkillVariantFile(slug, sessionBackend, integrationsState);
|
|
87
|
+
// null → same-backend, no body materialized; no file required.
|
|
88
|
+
// SKILL.md → resolver fell back to direct/disabled; no delegated file.
|
|
89
|
+
if (variantFile === null || variantFile === "SKILL.md")
|
|
90
|
+
continue;
|
|
91
|
+
const variantPath = join(skillsRoot, slug, variantFile);
|
|
92
|
+
if (!existsSync(variantPath))
|
|
93
|
+
skills.add(variantPath);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const taskFlows = new Set();
|
|
97
|
+
for (const flowKey of descriptor.taskFlowsTouched) {
|
|
98
|
+
for (const sessionBackend of BACKEND_IDS) {
|
|
99
|
+
const suffix = selectTaskFlowVariantSuffix(flowKey, sessionBackend, integrationsState);
|
|
100
|
+
if (suffix === "direct")
|
|
101
|
+
continue;
|
|
102
|
+
const variantPath = join(taskFlowsRoot, `${flowKey}.${suffix}.md`);
|
|
103
|
+
if (!existsSync(variantPath))
|
|
104
|
+
taskFlows.add(variantPath);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { skills: [...skills], taskFlows: [...taskFlows] };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Materializes backend-specific instruction files for session workdirs
|
|
111
|
+
* by reading directly from the source tree (agent-assets/agent-profiles/ and
|
|
112
|
+
* agent-assets/skills/). User-authored skills are managed separately via workdir.ts.
|
|
113
|
+
*
|
|
114
|
+
* Previous versions maintained a "deploy" layer at {dataDir}/prompts/{backendId}/
|
|
115
|
+
* that was an exact copy of source. That layer was removed in favour of reading
|
|
116
|
+
* source directly — every session now always gets the latest files.
|
|
117
|
+
*/
|
|
118
|
+
export class SkillsCompiler {
|
|
119
|
+
workspaceDir;
|
|
120
|
+
configuredServices;
|
|
121
|
+
mailAccounts;
|
|
122
|
+
integrations;
|
|
123
|
+
character;
|
|
124
|
+
constructor(workspaceDir,
|
|
125
|
+
/** Set of configured service names (e.g. 'calendar', 'obsidian', 'notion', 'github'). */
|
|
126
|
+
configuredServices = new Set(),
|
|
127
|
+
/**
|
|
128
|
+
* Snapshot of active mail accounts (§Phase 5). When non-empty and the
|
|
129
|
+
* `mail` skill is part of the session, an `accounts.md` file is written
|
|
130
|
+
* into the session's mail skill dir so the agent can resolve labels →
|
|
131
|
+
* accountId without a round-trip to the daemon.
|
|
132
|
+
*
|
|
133
|
+
* Intentionally generated at session-materialization time (not into the
|
|
134
|
+
* checked-in `agent-assets/skills/mail/` source tree) so the repo stays
|
|
135
|
+
* git-clean. Deviation from the design-doc phrasing — see
|
|
136
|
+
* `docs/design/appendices/multi-mail-provider.md` §7.
|
|
137
|
+
*/
|
|
138
|
+
mailAccounts = [],
|
|
139
|
+
/**
|
|
140
|
+
* Current integration states (Phase 3). Used by `selectSkillVariantFile`
|
|
141
|
+
* to choose the right SKILL.*.md variant at session-materialization time.
|
|
142
|
+
* Defaults to empty (all integrations treated as non-delegated → SKILL.md).
|
|
143
|
+
*/
|
|
144
|
+
integrations = {},
|
|
145
|
+
/**
|
|
146
|
+
* User-defined communication style / persona (design §15.4). When
|
|
147
|
+
* non-empty, a `## Character (user-defined)` block is rendered into
|
|
148
|
+
* every backend's instruction file (CLAUDE.md / AGENTS.md / GEMINI.md)
|
|
149
|
+
* between the safety preamble and the profile body. Defaults to the
|
|
150
|
+
* empty string, which omits the block.
|
|
151
|
+
*/
|
|
152
|
+
character = "") {
|
|
153
|
+
this.workspaceDir = workspaceDir;
|
|
154
|
+
this.configuredServices = configuredServices;
|
|
155
|
+
this.mailAccounts = mailAccounts;
|
|
156
|
+
this.integrations = integrations;
|
|
157
|
+
this.character = character;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* P22 — skill-curation overlay context. When set, the materializer runs an
|
|
161
|
+
* extra pass that resolves `<!-- CURATION:<kind> id="<id>" -->` anchors in
|
|
162
|
+
* each skill's SKILL.md against `<dataDir>/skills/overlays/<slug>/<id>.json`
|
|
163
|
+
* (overlay) or `agent-assets/skills/<slug>/seeds/<id>.seed.json` (seed).
|
|
164
|
+
*
|
|
165
|
+
* Optional and default-OFF — daemon code is expected to call
|
|
166
|
+
* `setSkillCurationContext({ dataDir })` at startup. Test workspaces and
|
|
167
|
+
* lint passes that don't need overlays leave it unset, which short-circuits
|
|
168
|
+
* the pass and is safe (anchors already render to nothing if there's no
|
|
169
|
+
* overlay AND no seed; a missing context_dir simply skips the pass).
|
|
170
|
+
*/
|
|
171
|
+
skillCurationDataDir = null;
|
|
172
|
+
skillCurationCacheInvalidated = new Set();
|
|
173
|
+
setSkillCurationContext(opts) {
|
|
174
|
+
this.skillCurationDataDir = opts.dataDir;
|
|
175
|
+
}
|
|
176
|
+
/** Called by the apply / revert flow so future session materializations
|
|
177
|
+
* re-render the affected skill's anchors. The cache itself is per-session
|
|
178
|
+
* (we always read overlays from disk fresh inside the materializer) — this
|
|
179
|
+
* flag exists so an in-process consumer can react to writes. */
|
|
180
|
+
invalidateSkillCurationCache(skillSlug) {
|
|
181
|
+
this.skillCurationCacheInvalidated.add(skillSlug);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Validate that all skill AND task-flow variants required by
|
|
185
|
+
* currently-delegated integrations exist on disk. Called at daemon
|
|
186
|
+
* startup after integration state is loaded; returns missing variant
|
|
187
|
+
* paths grouped by kind (empty arrays = everything present).
|
|
188
|
+
*
|
|
189
|
+
* §4.7 "Missing-variant policy": if any paths come back, the caller
|
|
190
|
+
* should refuse to enter delegated mode or at least log a loud warning.
|
|
191
|
+
* The per-integration variant for the hypothetical PATCH path lives in
|
|
192
|
+
* the standalone `missingDelegatedVariants` helper below; this method
|
|
193
|
+
* aggregates across every currently-delegated integration using its
|
|
194
|
+
* declared `delegatedBackend` (not the session backend — see the helper
|
|
195
|
+
* docstring for the rationale).
|
|
196
|
+
*/
|
|
197
|
+
validateDelegatedVariants() {
|
|
198
|
+
const skills = [];
|
|
199
|
+
const taskFlows = [];
|
|
200
|
+
for (const key of INTEGRATION_KEYS) {
|
|
201
|
+
const state = this.integrations[key];
|
|
202
|
+
if (state?.mode !== "delegated" || !state.delegatedBackend)
|
|
203
|
+
continue;
|
|
204
|
+
const result = missingDelegatedVariants(this.workspaceDir, key, state.delegatedBackend);
|
|
205
|
+
skills.push(...result.skills);
|
|
206
|
+
taskFlows.push(...result.taskFlows);
|
|
207
|
+
}
|
|
208
|
+
return { skills, taskFlows };
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Resolve the effective SKILL.md filename for a skill + session backend pair.
|
|
212
|
+
*
|
|
213
|
+
* - `"SKILL.md"` — direct/default body
|
|
214
|
+
* - `"SKILL.delegated.<backend>.md"` — cross-backend variant (only if it
|
|
215
|
+
* exists on disk; falls back to
|
|
216
|
+
* `"SKILL.md"` when missing)
|
|
217
|
+
* - `null` — same-backend native MCP; do NOT
|
|
218
|
+
* materialize the skill at all
|
|
219
|
+
* (DELEGATED-MODE-V2-DESIGN.md §4.1.2).
|
|
220
|
+
*/
|
|
221
|
+
resolveSkillVariantFile(skillSlug, backendId) {
|
|
222
|
+
const candidate = selectSkillVariantFile(skillSlug, backendId, this.integrations);
|
|
223
|
+
if (candidate === null)
|
|
224
|
+
return null;
|
|
225
|
+
if (candidate === "SKILL.md")
|
|
226
|
+
return "SKILL.md";
|
|
227
|
+
const candidatePath = join(this.getSourceSkillsRoot(), skillSlug, candidate);
|
|
228
|
+
return existsSync(candidatePath) ? candidate : "SKILL.md";
|
|
229
|
+
}
|
|
230
|
+
getSourceSkillsRoot() {
|
|
231
|
+
return join(this.workspaceDir, "agent-assets", "skills");
|
|
232
|
+
}
|
|
233
|
+
getSourceProfilesRoot() {
|
|
234
|
+
return join(this.workspaceDir, "agent-assets", "agent-profiles");
|
|
235
|
+
}
|
|
236
|
+
getSourceTaskFlowsRoot() {
|
|
237
|
+
return join(this.workspaceDir, "agent-assets", "task-flows");
|
|
238
|
+
}
|
|
239
|
+
/** Read all source skill and profile files (for dashboard inspection). */
|
|
240
|
+
readSourceFiles() {
|
|
241
|
+
const files = [];
|
|
242
|
+
const profilesRoot = this.getSourceProfilesRoot();
|
|
243
|
+
const skillsRoot = this.getSourceSkillsRoot();
|
|
244
|
+
if (existsSync(profilesRoot)) {
|
|
245
|
+
for (const file of readTreeFiles(profilesRoot)) {
|
|
246
|
+
files.push({ ...file, path: join("agent-profiles", file.path) });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (existsSync(skillsRoot)) {
|
|
250
|
+
for (const file of readTreeFiles(skillsRoot)) {
|
|
251
|
+
files.push({ ...file, path: join("skills", file.path) });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return files;
|
|
255
|
+
}
|
|
256
|
+
materializeSessionBundle(params) {
|
|
257
|
+
const profileName = params.processKey
|
|
258
|
+
? getProfileForProcess(params.processKey)
|
|
259
|
+
: getProfileForEvent(params.eventType);
|
|
260
|
+
const manifestSkills = params.processKey
|
|
261
|
+
? getSkillsForProcess(params.processKey)
|
|
262
|
+
: getSkillsForEvent(params.eventType);
|
|
263
|
+
// Custom bang command override: when the dispatcher passes a slug array
|
|
264
|
+
// we use it verbatim, ignoring the manifest. Empty array is allowed and
|
|
265
|
+
// means "no skills." `null` keeps manifest behavior — the override is a
|
|
266
|
+
// partial replacement so a future caller can pass just `profileBody`
|
|
267
|
+
// without affecting skill selection.
|
|
268
|
+
const skills = params.override?.skillSlugs !== null
|
|
269
|
+
&& params.override?.skillSlugs !== undefined
|
|
270
|
+
? [...params.override.skillSlugs]
|
|
271
|
+
: manifestSkills;
|
|
272
|
+
const profileBodyOverride = params.override?.profileBody ?? null;
|
|
273
|
+
// Always materialize the `mail` skill when the manifest asks for it —
|
|
274
|
+
// even if the current account list is empty. The skill is inert when
|
|
275
|
+
// `accounts.md` is empty (it carries an explicit "no accounts
|
|
276
|
+
// configured" marker), and materializing unconditionally gives
|
|
277
|
+
// `refreshSessionMailAccountsMd` a skill dir to target when the user
|
|
278
|
+
// adds their first account mid-session (0→N transition). Filtering
|
|
279
|
+
// here would leave the skill dir absent forever since refresh only
|
|
280
|
+
// writes into existing dirs.
|
|
281
|
+
if (params.backendId === "claude") {
|
|
282
|
+
this.materializeClaudeSession(params.sessionDir, profileName, skills, profileBodyOverride);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
this.materializeCliSession(params.sessionDir, profileName, skills, params.backendId, params.processKey ?? params.eventType, profileBodyOverride);
|
|
286
|
+
}
|
|
287
|
+
return { profile: profileName, skills };
|
|
288
|
+
}
|
|
289
|
+
/** Read raw profile .md without safety injection. */
|
|
290
|
+
readProfile(profileName) {
|
|
291
|
+
const profilePath = join(this.getSourceProfilesRoot(), `${profileName}.md`);
|
|
292
|
+
if (!existsSync(profilePath))
|
|
293
|
+
return null;
|
|
294
|
+
return substituteBrandTokens(readFileSync(profilePath, "utf-8"));
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Read the shared safety preamble (_safety.md) and append the
|
|
298
|
+
* `<!-- safety:end -->` sentinel so downstream helpers (notably
|
|
299
|
+
* `insertCharacterBlock` in `character-block.ts`) can place the
|
|
300
|
+
* Character block directly below safety rather than above whichever
|
|
301
|
+
* `## ` heading the preamble opens with. See design §15.4.2 / §15.5.
|
|
302
|
+
*/
|
|
303
|
+
readSafetyPreamble() {
|
|
304
|
+
const safetyPath = join(this.getSourceProfilesRoot(), "_safety.md");
|
|
305
|
+
if (!existsSync(safetyPath))
|
|
306
|
+
return null;
|
|
307
|
+
const content = substituteBrandTokens(readFileSync(safetyPath, "utf-8")).trim();
|
|
308
|
+
if (!content)
|
|
309
|
+
return null;
|
|
310
|
+
return `${content}\n\n<!-- safety:end -->`;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Read a profile .md and prepend the shared safety preamble (_safety.md).
|
|
314
|
+
* Used for Claude SDK sessions where skills are separate files.
|
|
315
|
+
* Returns null if the profile file doesn't exist.
|
|
316
|
+
*
|
|
317
|
+
* The safety preamble is emitted with a trailing `<!-- safety:end -->`
|
|
318
|
+
* sentinel so the Character-block rewriter can insert below safety even
|
|
319
|
+
* when the preamble itself starts with `## Safety Invariants` (design
|
|
320
|
+
* §15.4.2 / §15.5).
|
|
321
|
+
*/
|
|
322
|
+
readProfileWithSafety(profileName) {
|
|
323
|
+
const profilePath = join(this.getSourceProfilesRoot(), `${profileName}.md`);
|
|
324
|
+
if (!existsSync(profilePath))
|
|
325
|
+
return null;
|
|
326
|
+
const profile = substituteBrandTokens(readFileSync(profilePath, "utf-8"));
|
|
327
|
+
const safety = this.readSafetyPreamble();
|
|
328
|
+
if (!safety)
|
|
329
|
+
return profile;
|
|
330
|
+
// Inject safety preamble after the first heading line
|
|
331
|
+
const lines = profile.split("\n");
|
|
332
|
+
const headingIdx = lines.findIndex((l) => l.startsWith("# "));
|
|
333
|
+
if (headingIdx >= 0) {
|
|
334
|
+
// Insert after heading + its following blank line (if any)
|
|
335
|
+
let insertIdx = headingIdx + 1;
|
|
336
|
+
while (insertIdx < lines.length && lines[insertIdx].trim() === "")
|
|
337
|
+
insertIdx++;
|
|
338
|
+
// Insert before the first non-blank content after heading
|
|
339
|
+
const descriptionEnd = lines.findIndex((l, i) => i > headingIdx && l.startsWith("## "));
|
|
340
|
+
const insertAt = descriptionEnd >= 0 ? descriptionEnd : insertIdx;
|
|
341
|
+
lines.splice(insertAt, 0, safety, "");
|
|
342
|
+
return lines.join("\n");
|
|
343
|
+
}
|
|
344
|
+
// No heading found — prepend
|
|
345
|
+
return `${safety}\n\n${profile}`;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Compose a synthesized profile document from a user-supplied body — used
|
|
349
|
+
* by custom bang commands whose `instruction_md` replaces the
|
|
350
|
+
* conversational profile. Wraps the body in a top-level heading so the
|
|
351
|
+
* downstream `applyCharacterBlockRewrite` insertion logic finds the
|
|
352
|
+
* `# ` anchor it expects, then prepends the safety preamble using the
|
|
353
|
+
* same shape as `readProfileWithSafety` so safety always lands above
|
|
354
|
+
* Character + body. Empty body inputs are caller-responsibility — the
|
|
355
|
+
* storage layer normalises whitespace-only strings to null.
|
|
356
|
+
*/
|
|
357
|
+
composeClaudeProfileFromBody(body) {
|
|
358
|
+
const safety = this.readSafetyPreamble();
|
|
359
|
+
const heading = "# Custom command instructions";
|
|
360
|
+
const trimmedBody = body.trim();
|
|
361
|
+
if (!safety) {
|
|
362
|
+
return `${heading}\n\n${trimmedBody}\n`;
|
|
363
|
+
}
|
|
364
|
+
return `${heading}\n\n${safety}\n\n${trimmedBody}\n`;
|
|
365
|
+
}
|
|
366
|
+
materializeClaudeSession(sessionDir, profileName, skillSlugs, profileBodyOverride) {
|
|
367
|
+
let profileContent = profileBodyOverride !== null
|
|
368
|
+
? this.composeClaudeProfileFromBody(profileBodyOverride)
|
|
369
|
+
: this.readProfileWithSafety(profileName);
|
|
370
|
+
if (profileContent) {
|
|
371
|
+
// Insert the user-defined character block between the safety
|
|
372
|
+
// preamble and the first profile `## ` section (design §15.4.2).
|
|
373
|
+
// `applyCharacterBlockRewrite` is idempotent — the input here is
|
|
374
|
+
// a fresh render with no existing block, so this is always the
|
|
375
|
+
// "insert" branch.
|
|
376
|
+
profileContent = applyCharacterBlockRewrite(profileContent, this.character);
|
|
377
|
+
profileContent += "\n\n" + renderDaemonApiUsageSection(true);
|
|
378
|
+
mkdirSync(dirname(join(sessionDir, "CLAUDE.md")), { recursive: true });
|
|
379
|
+
writeFileSync(join(sessionDir, "CLAUDE.md"), profileContent, "utf-8");
|
|
380
|
+
}
|
|
381
|
+
const skillsRoot = this.getSourceSkillsRoot();
|
|
382
|
+
const destSkillsRoot = join(sessionDir, ".claude", "skills");
|
|
383
|
+
mkdirSync(destSkillsRoot, { recursive: true });
|
|
384
|
+
// Re-materialize cleanup: a previous turn (especially one with a wider
|
|
385
|
+
// skill set or a different custom-command override) may have left
|
|
386
|
+
// built-in skill dirs that aren't in the current `skillSlugs`. Remove
|
|
387
|
+
// them so the next turn's tool inventory matches expectations.
|
|
388
|
+
// User-authored skills live alongside built-ins in the same dir but
|
|
389
|
+
// are recognised by absence-from-source — those we never touch here;
|
|
390
|
+
// `syncAllUserSkills` is the authoritative writer for that subset.
|
|
391
|
+
pruneStaleBuiltinSkillDirs(destSkillsRoot, skillsRoot, skillSlugs);
|
|
392
|
+
for (const skillSlug of skillSlugs) {
|
|
393
|
+
const src = join(skillsRoot, skillSlug);
|
|
394
|
+
if (!existsSync(join(src, "SKILL.md"))) {
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
const variantFile = this.resolveSkillVariantFile(skillSlug, "claude");
|
|
398
|
+
const destDir = join(destSkillsRoot, skillSlug);
|
|
399
|
+
// DELEGATED-MODE-V2-DESIGN.md §4.1.2 — same-backend native MCP. The
|
|
400
|
+
// agent already has the connector's tools in its inventory; a skill
|
|
401
|
+
// body would mis-direct it at the daemon proxy (which 409s in this
|
|
402
|
+
// case). Remove any prior-materialization leftovers from disk so a
|
|
403
|
+
// mode flip (direct ↔ delegated.same-backend) doesn't leave stale
|
|
404
|
+
// prose in the workdir.
|
|
405
|
+
if (variantFile === null) {
|
|
406
|
+
if (existsSync(destDir)) {
|
|
407
|
+
rmSync(destDir, { recursive: true, force: true });
|
|
408
|
+
}
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
cpSync(src, destDir, { recursive: true });
|
|
412
|
+
// Resolve `{APP_NAME}` brand tokens in the verbatim copy before any
|
|
413
|
+
// downstream transform reads them. Source-of-truth: branding.ts.
|
|
414
|
+
substituteBrandTokensInDir(destDir);
|
|
415
|
+
if (variantFile !== "SKILL.md") {
|
|
416
|
+
// Render variant (resolving {{> base }} partials) and overwrite SKILL.md.
|
|
417
|
+
// Wrap the inliner output: renderPartialIncludes reads from src verbatim,
|
|
418
|
+
// so an `{APP_NAME}` token in SKILL.base.md would slip through if we only
|
|
419
|
+
// substituted `raw`. Idempotent — re-running on already-substituted text
|
|
420
|
+
// is a no-op.
|
|
421
|
+
const raw = substituteBrandTokens(readFileSync(join(src, variantFile), "utf-8"));
|
|
422
|
+
const rendered = substituteBrandTokens(renderPartialIncludes(raw, join(src, "SKILL.base.md")));
|
|
423
|
+
writeFileSync(join(destDir, "SKILL.md"), rendered, "utf-8");
|
|
424
|
+
}
|
|
425
|
+
// Resolve `{{> ref:<name> }}` directives by inlining
|
|
426
|
+
// `references/<name>.md` from the SOURCE skill dir. Read from src so
|
|
427
|
+
// the references content is canonical (the directory copy under
|
|
428
|
+
// `destDir/references/` is identical, but reading from src makes the
|
|
429
|
+
// dependency direction explicit and matches the CLI path).
|
|
430
|
+
//
|
|
431
|
+
// Order: refs BEFORE strip-services. The CLI paths
|
|
432
|
+
// (`materializeCliSession` inline + directory copy) both run refs
|
|
433
|
+
// before strip; aligning Claude here preserves the byte-equivalence
|
|
434
|
+
// contract (plan §3.1) for the case where a reference file carries
|
|
435
|
+
// `<!-- service:* -->` markers — strip-first would leak those on
|
|
436
|
+
// Claude while CLI scrubs them.
|
|
437
|
+
const destSkillMdForRefs = join(destDir, "SKILL.md");
|
|
438
|
+
if (existsSync(destSkillMdForRefs)) {
|
|
439
|
+
const raw = readFileSync(destSkillMdForRefs, "utf-8");
|
|
440
|
+
// renderReferenceIncludes inlines `references/*.md` directly from src,
|
|
441
|
+
// bypassing the post-cpSync substitution walk. Wrap the result so a
|
|
442
|
+
// future `{APP_NAME}` token added to a reference file resolves cleanly.
|
|
443
|
+
const expanded = substituteBrandTokens(renderReferenceIncludes(raw, src));
|
|
444
|
+
if (expanded !== raw) {
|
|
445
|
+
writeFileSync(destSkillMdForRefs, expanded, "utf-8");
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
// Strip unconfigured service sections from external-services
|
|
449
|
+
if (skillSlug === "external-services" && this.configuredServices.size > 0) {
|
|
450
|
+
const destSkillMd = join(destDir, "SKILL.md");
|
|
451
|
+
const raw = readFileSync(destSkillMd, "utf-8");
|
|
452
|
+
const stripped = stripUnconfiguredServices(raw, this.configuredServices);
|
|
453
|
+
if (stripped !== raw) {
|
|
454
|
+
writeFileSync(destSkillMd, stripped, "utf-8");
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
// Mode-conditional sections (`<!-- mode:<predicate>:<key> -->`)
|
|
458
|
+
// collapse to the right branch for the current integration state.
|
|
459
|
+
// Runs AFTER service-strip so unrelated service sections that carry
|
|
460
|
+
// mode markers still see them. Runs BEFORE the deny pass so any
|
|
461
|
+
// `allowed-tools` entry inside a struck branch gets removed before
|
|
462
|
+
// deny-list filtering inspects the frontmatter.
|
|
463
|
+
const destSkillMdForMode = join(destDir, "SKILL.md");
|
|
464
|
+
if (existsSync(destSkillMdForMode)) {
|
|
465
|
+
const raw = readFileSync(destSkillMdForMode, "utf-8");
|
|
466
|
+
const filtered = applyIntegrationModeFilter(raw, this.integrations, "claude");
|
|
467
|
+
if (filtered !== raw) {
|
|
468
|
+
writeFileSync(destSkillMdForMode, filtered, "utf-8");
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
// §7.7 — apply tool-deny policy AFTER partial includes and
|
|
472
|
+
// service-section stripping. For Claude this rewrites the
|
|
473
|
+
// `allowed-tools` frontmatter; the SDK enforces hard.
|
|
474
|
+
const destSkillMdForDeny = join(destDir, "SKILL.md");
|
|
475
|
+
if (existsSync(destSkillMdForDeny)) {
|
|
476
|
+
const raw = readFileSync(destSkillMdForDeny, "utf-8");
|
|
477
|
+
const filtered = applyAllDeniedToolsForSkill(raw, skillSlug, "claude", this.integrations);
|
|
478
|
+
if (filtered !== raw) {
|
|
479
|
+
writeFileSync(destSkillMdForDeny, filtered, "utf-8");
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
// P22 — skill-curation anchor splicer pass. Runs LAST so anchors
|
|
483
|
+
// resolve over the fully transformed body (mode-conditional + deny
|
|
484
|
+
// already applied). No-op when no curation context is configured or
|
|
485
|
+
// when the skill ships no curation.json.
|
|
486
|
+
this.spliceCurationAnchorsInSkill(destDir, skillSlug);
|
|
487
|
+
if (skillSlug === "mail") {
|
|
488
|
+
// Always write accounts.md — the empty marker (rendered when the
|
|
489
|
+
// list is empty) tells the agent not to guess ids, and having the
|
|
490
|
+
// file unconditionally keeps the refresh hook's existsSync checks
|
|
491
|
+
// truthful on both 0→N and N→0 transitions.
|
|
492
|
+
writeFileSync(join(destDir, "accounts.md"), this.mailAccounts.length > 0
|
|
493
|
+
? renderMailAccountsMd(this.mailAccounts)
|
|
494
|
+
: EMPTY_MAIL_ACCOUNTS_MD, "utf-8");
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* P22 §1.5 — splice CURATION anchors in a single skill's materialized
|
|
500
|
+
* SKILL.md against overlay/seed JSON. Pure file I/O — overlay store
|
|
501
|
+
* dictates payload precedence (overlay > seed > strip-line). No-op when
|
|
502
|
+
* no curation context is configured or when the skill has no anchors.
|
|
503
|
+
*/
|
|
504
|
+
spliceCurationAnchorsInSkill(destDir, skillSlug) {
|
|
505
|
+
if (!this.skillCurationDataDir)
|
|
506
|
+
return;
|
|
507
|
+
const skillMdPath = join(destDir, "SKILL.md");
|
|
508
|
+
if (!existsSync(skillMdPath))
|
|
509
|
+
return;
|
|
510
|
+
const md = readFileSync(skillMdPath, "utf-8");
|
|
511
|
+
if (!hasCurationAnchors(md))
|
|
512
|
+
return;
|
|
513
|
+
let decl;
|
|
514
|
+
try {
|
|
515
|
+
decl = loadCurationDeclaration(this.getSourceSkillsRoot(), skillSlug);
|
|
516
|
+
}
|
|
517
|
+
catch (err) {
|
|
518
|
+
logger.warn({ skillSlug, err: err instanceof Error ? err.message : String(err) }, "skill_curation.declaration.invalid");
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
const overlay = new OverlayStore(this.skillCurationDataDir, this.getSourceSkillsRoot());
|
|
522
|
+
const knownIds = decl ? new Set(decl.sections.map((s) => s.id)) : undefined;
|
|
523
|
+
const result = spliceCurationAnchors(md, (sectionId, kind) => overlay.readPayload(skillSlug, sectionId, kind), { knownSectionIds: knownIds });
|
|
524
|
+
if (result.warnings.length > 0) {
|
|
525
|
+
for (const w of result.warnings) {
|
|
526
|
+
logger.warn({ skillSlug, anchorId: w.anchorId, code: w.code, message: w.message }, w.code);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
if (result.body !== md) {
|
|
530
|
+
writeFileSync(skillMdPath, result.body, "utf-8");
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
materializeCliSession(sessionDir, profileName, skillSlugs, backendId, processKey, profileBodyOverride) {
|
|
534
|
+
// Skills are inlined in the instruction file (AGENTS.md / GEMINI.md) for
|
|
535
|
+
// guaranteed availability AND copied to the backend-specific skill
|
|
536
|
+
// directory for native CLI skill discovery. The directory copy only adds
|
|
537
|
+
// ~20 tokens per skill at session start (name + description); full body
|
|
538
|
+
// is lazy-loaded on activation. Belt-and-suspenders: inline ensures task
|
|
539
|
+
// flow prompts always have API references in context; directories let the
|
|
540
|
+
// CLI's native skill activation and tooling work.
|
|
541
|
+
const skillsRoot = this.getSourceSkillsRoot();
|
|
542
|
+
const skillContents = {};
|
|
543
|
+
for (const skillSlug of skillSlugs) {
|
|
544
|
+
const src = join(skillsRoot, skillSlug);
|
|
545
|
+
const variantFile = this.resolveSkillVariantFile(skillSlug, backendId);
|
|
546
|
+
// DELEGATED-MODE-V2-DESIGN.md §4.1.2 — same-backend native MCP path:
|
|
547
|
+
// skip the inline. The connector's own tool descriptions, present in
|
|
548
|
+
// the CLI's tool inventory at session-init, are the authoritative
|
|
549
|
+
// surface for the agent.
|
|
550
|
+
if (variantFile === null)
|
|
551
|
+
continue;
|
|
552
|
+
const skillMdPath = join(src, variantFile);
|
|
553
|
+
if (!existsSync(skillMdPath)) {
|
|
554
|
+
continue;
|
|
555
|
+
}
|
|
556
|
+
let raw = substituteBrandTokens(readFileSync(skillMdPath, "utf-8"));
|
|
557
|
+
// Resolve {{> base }} partials before inlining. Wrap the result —
|
|
558
|
+
// SKILL.base.md is read directly from src and would slip past the
|
|
559
|
+
// single-point-of-change contract if it grew an `{APP_NAME}` token.
|
|
560
|
+
raw = substituteBrandTokens(renderPartialIncludes(raw, join(src, "SKILL.base.md")));
|
|
561
|
+
// Resolve `{{> ref:<name> }}` directives by inlining
|
|
562
|
+
// `references/<name>.md` from the source skill dir. Runs AFTER the
|
|
563
|
+
// base-partial resolver so a base-partial fragment can itself carry
|
|
564
|
+
// `{{> ref:* }}` markers (one-level nesting cap; references inside
|
|
565
|
+
// references are intentionally NOT resolved per §4.7 / NG5). Same
|
|
566
|
+
// src-bypass concern as above — wrap the result.
|
|
567
|
+
raw = substituteBrandTokens(renderReferenceIncludes(raw, src));
|
|
568
|
+
// Strip unconfigured service sections before inlining
|
|
569
|
+
if (skillSlug === "external-services" && this.configuredServices.size > 0) {
|
|
570
|
+
raw = stripUnconfiguredServices(raw, this.configuredServices);
|
|
571
|
+
}
|
|
572
|
+
// Mode-conditional sections — see materializeClaudeSession for the
|
|
573
|
+
// ordering rationale. Same filter, same ordering: service-strip
|
|
574
|
+
// then mode-filter then deny.
|
|
575
|
+
raw = applyIntegrationModeFilter(raw, this.integrations, backendId);
|
|
576
|
+
// §7.7 — apply tool-deny policy. For CLI backends this appends the
|
|
577
|
+
// soft-enforcement prose block; the inline-into-AGENTS.md path
|
|
578
|
+
// strips frontmatter below, so the deny block must already be in
|
|
579
|
+
// body content before that strip.
|
|
580
|
+
raw = applyAllDeniedToolsForSkill(raw, skillSlug, backendId, this.integrations);
|
|
581
|
+
// Inline content for instruction file — strip frontmatter (Claude-specific
|
|
582
|
+
// YAML metadata like allowed-tools has no meaning for CLI backends).
|
|
583
|
+
skillContents[skillSlug] = stripFrontmatter(raw);
|
|
584
|
+
}
|
|
585
|
+
// Read profile and safety separately so renderCliInstructionFile can
|
|
586
|
+
// place safety at the top level for prominence (instead of burying it
|
|
587
|
+
// inside the profile section). For custom bang commands the dispatcher
|
|
588
|
+
// passes a `profileBodyOverride` that replaces the persona body; the
|
|
589
|
+
// safety + character + skills sections still wrap around it via
|
|
590
|
+
// `renderCliInstructionFile`.
|
|
591
|
+
const profileContent = profileBodyOverride !== null
|
|
592
|
+
? profileBodyOverride.trim()
|
|
593
|
+
: (this.readProfile(profileName) ?? "");
|
|
594
|
+
const safetyContent = this.readSafetyPreamble();
|
|
595
|
+
const characterBlock = buildCharacterBlock(this.character);
|
|
596
|
+
// DELEGATED-MODE-V2-DESIGN.md §4.3.3-§4.3.4 — same-backend deny prose.
|
|
597
|
+
// Codex's connector apps (`mcp__codex_apps__*`) are built into the CLI
|
|
598
|
+
// and have no admin-policy or per-tool deny surface (γ outcome). Prose
|
|
599
|
+
// injection into AGENTS.md is the only enforcement available. For
|
|
600
|
+
// Gemini, the admin-policy already hard-denies the same tools; the
|
|
601
|
+
// prose duplicates intent so the agent doesn't waste tokens drafting
|
|
602
|
+
// calls that will be denied at the policy layer.
|
|
603
|
+
const sameBackendDenyBlock = buildSameBackendDenyBlock(this.integrations, backendId);
|
|
604
|
+
const instruction = renderCliInstructionFile({
|
|
605
|
+
backendId,
|
|
606
|
+
processKey,
|
|
607
|
+
profileName,
|
|
608
|
+
profileContent,
|
|
609
|
+
safetyContent,
|
|
610
|
+
characterBlock,
|
|
611
|
+
skillSlugs,
|
|
612
|
+
skillContents,
|
|
613
|
+
sameBackendDenyBlock,
|
|
614
|
+
});
|
|
615
|
+
writeFileSync(join(sessionDir, backendId === "codex" ? "AGENTS.md" : "GEMINI.md"), instruction, "utf-8");
|
|
616
|
+
// Copy skills to the backend-specific skill directory for native CLI
|
|
617
|
+
// discovery: .codex/skills/<slug>/ or .gemini/skills/<slug>/
|
|
618
|
+
const cliSkillsDir = cliSkillsDirName(backendId);
|
|
619
|
+
const destSkillsRoot = join(sessionDir, cliSkillsDir, "skills");
|
|
620
|
+
mkdirSync(destSkillsRoot, { recursive: true });
|
|
621
|
+
// See `materializeClaudeSession` — same prune contract for CLI workdirs.
|
|
622
|
+
pruneStaleBuiltinSkillDirs(destSkillsRoot, skillsRoot, skillSlugs);
|
|
623
|
+
for (const skillSlug of skillSlugs) {
|
|
624
|
+
const src = join(skillsRoot, skillSlug);
|
|
625
|
+
const variantFile = this.resolveSkillVariantFile(skillSlug, backendId);
|
|
626
|
+
const destDir = join(destSkillsRoot, skillSlug);
|
|
627
|
+
// §4.1.2 same-backend short-circuit: no SKILL.md / .codex/skills/<slug>
|
|
628
|
+
// / .gemini/skills/<slug> directory written. The connector ships its
|
|
629
|
+
// own descriptions; injecting prose only confuses the dispatch.
|
|
630
|
+
// Remove any prior-materialization leftovers so a mode flip doesn't
|
|
631
|
+
// leak stale prose into the workdir.
|
|
632
|
+
if (variantFile === null) {
|
|
633
|
+
if (existsSync(destDir)) {
|
|
634
|
+
rmSync(destDir, { recursive: true, force: true });
|
|
635
|
+
}
|
|
636
|
+
continue;
|
|
637
|
+
}
|
|
638
|
+
const variantPath = join(src, variantFile);
|
|
639
|
+
if (!existsSync(variantPath)) {
|
|
640
|
+
continue;
|
|
641
|
+
}
|
|
642
|
+
// Copy the whole skill directory (scripts/, references/, etc.)
|
|
643
|
+
cpSync(src, destDir, { recursive: true });
|
|
644
|
+
// Resolve `{APP_NAME}` brand tokens in the verbatim copy before any
|
|
645
|
+
// downstream transform reads them. Source-of-truth: branding.ts.
|
|
646
|
+
substituteBrandTokensInDir(destDir);
|
|
647
|
+
// Render variant (resolving partials), adapt frontmatter for CLI, and
|
|
648
|
+
// write as SKILL.md in the dest dir.
|
|
649
|
+
let adapted = substituteBrandTokens(readFileSync(variantPath, "utf-8"));
|
|
650
|
+
// SKILL.base.md and references/*.md are read directly from src by these
|
|
651
|
+
// inliners; wrap the results so future tokens added to those files still
|
|
652
|
+
// reach single-point-of-change. Idempotent.
|
|
653
|
+
adapted = substituteBrandTokens(renderPartialIncludes(adapted, join(src, "SKILL.base.md")));
|
|
654
|
+
// Resolve `{{> ref:<name> }}` directives — keeps the
|
|
655
|
+
// `.codex/skills/<slug>/SKILL.md` and `.gemini/skills/<slug>/SKILL.md`
|
|
656
|
+
// bodies byte-identical to the inline-into-AGENTS.md / GEMINI.md
|
|
657
|
+
// copy emitted above (modulo CLI frontmatter strip), preserving the
|
|
658
|
+
// "guaranteed availability" contract that motivated this resolver.
|
|
659
|
+
adapted = substituteBrandTokens(renderReferenceIncludes(adapted, src));
|
|
660
|
+
if (skillSlug === "external-services" && this.configuredServices.size > 0) {
|
|
661
|
+
adapted = stripUnconfiguredServices(adapted, this.configuredServices);
|
|
662
|
+
}
|
|
663
|
+
// Mode-conditional filter — keep this dest-dir copy byte-aligned with
|
|
664
|
+
// the inline copy emitted into AGENTS.md / GEMINI.md (modulo
|
|
665
|
+
// adaptSkillForCli's frontmatter strip). The filter is idempotent so
|
|
666
|
+
// running it on both copies independently is safe.
|
|
667
|
+
adapted = applyIntegrationModeFilter(adapted, this.integrations, backendId);
|
|
668
|
+
// §7.7 — apply tool-deny policy BEFORE adaptSkillForCli strips
|
|
669
|
+
// frontmatter so the soft-enforcement prose block lands in body
|
|
670
|
+
// content (CLI skills carry only `name` + `description` in
|
|
671
|
+
// frontmatter, no `allowed-tools` to filter).
|
|
672
|
+
adapted = applyAllDeniedToolsForSkill(adapted, skillSlug, backendId, this.integrations);
|
|
673
|
+
adapted = adaptSkillForCli(adapted);
|
|
674
|
+
writeFileSync(join(destDir, "SKILL.md"), adapted, "utf-8");
|
|
675
|
+
// P22 — splice CURATION anchors against overlay/seed JSON so the
|
|
676
|
+
// CLI-side .codex/.gemini skill copy stays byte-equivalent to the
|
|
677
|
+
// Claude-side copy after curation. No-op when no curation context.
|
|
678
|
+
this.spliceCurationAnchorsInSkill(destDir, skillSlug);
|
|
679
|
+
if (skillSlug === "mail") {
|
|
680
|
+
writeFileSync(join(destDir, "accounts.md"), this.mailAccounts.length > 0
|
|
681
|
+
? renderMailAccountsMd(this.mailAccounts)
|
|
682
|
+
: EMPTY_MAIL_ACCOUNTS_MD, "utf-8");
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
export const EMPTY_MAIL_ACCOUNTS_MD = [
|
|
688
|
+
"# Mail accounts",
|
|
689
|
+
"",
|
|
690
|
+
"No active mail accounts are configured right now. The `mail` skill's API",
|
|
691
|
+
"calls will fail without an `accountId` — do NOT guess account ids. If no",
|
|
692
|
+
"account matches, tell the user no active mail account is configured and",
|
|
693
|
+
"stop — account setup is outside this skill's scope.",
|
|
694
|
+
"",
|
|
695
|
+
].join("\n");
|
|
696
|
+
export function renderMailAccountsMd(accounts) {
|
|
697
|
+
const rows = accounts.map((a) => {
|
|
698
|
+
const label = a.label ? ` (${a.label})` : "";
|
|
699
|
+
return `| \`${a.id}\` | ${a.kind} | ${a.email}${label} | ${a.idleEnabled ? "IDLE" : "poll"} |`;
|
|
700
|
+
});
|
|
701
|
+
return [
|
|
702
|
+
"# Mail accounts",
|
|
703
|
+
"",
|
|
704
|
+
"Active mail accounts this session can use. Resolve `accountId` from this",
|
|
705
|
+
"table before calling `/api/mail/:accountId/*`. Inactive / unhealthy",
|
|
706
|
+
"accounts are omitted by design — no global \"primary\" default exists;",
|
|
707
|
+
"pick the account from conversation context (reply thread, user mention,",
|
|
708
|
+
"or a single active row) and ask when ambiguous.",
|
|
709
|
+
"",
|
|
710
|
+
"| accountId | kind | email | transport |",
|
|
711
|
+
"|---|---|---|---|",
|
|
712
|
+
...rows,
|
|
713
|
+
"",
|
|
714
|
+
].join("\n");
|
|
715
|
+
}
|
|
716
|
+
/**
|
|
717
|
+
* Return the backend-specific skills directory name for a given backend.
|
|
718
|
+
* Returns null for Claude (which uses `.claude/skills/` managed separately).
|
|
719
|
+
*/
|
|
720
|
+
export function cliSkillsDirName(backendId) {
|
|
721
|
+
switch (backendId) {
|
|
722
|
+
case "codex": return ".codex";
|
|
723
|
+
case "gemini": return ".gemini";
|
|
724
|
+
default: return null;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
/**
|
|
728
|
+
* Session instruction files the live-overwrite path (design §15.6.1 /
|
|
729
|
+
* §15.9) walks when the owner PATCHes `character` mid-session. Each file
|
|
730
|
+
* corresponds to a backend (CLAUDE.md = Claude Code SDK, AGENTS.md =
|
|
731
|
+
* Codex CLI, GEMINI.md = Gemini CLI). A workdir that has already seen a
|
|
732
|
+
* heavy-tier fallback can contain two of these side-by-side — see
|
|
733
|
+
* CLAUDE.md "Fallback re-materialization".
|
|
734
|
+
*/
|
|
735
|
+
const CHARACTER_INSTRUCTION_FILES = [
|
|
736
|
+
"CLAUDE.md",
|
|
737
|
+
"AGENTS.md",
|
|
738
|
+
"GEMINI.md",
|
|
739
|
+
];
|
|
740
|
+
/**
|
|
741
|
+
* Rewrite the `## Character (user-defined)` block inside every backend
|
|
742
|
+
* instruction file that currently lives in `workdir`. Used by the
|
|
743
|
+
* `PATCH /api/config` live-overwrite path (§15.6.1) so an owner editing
|
|
744
|
+
* character on the dashboard doesn't have to wait for the next session
|
|
745
|
+
* spawn for the change to land.
|
|
746
|
+
*
|
|
747
|
+
* Multi-backend aware: a workdir that has seen a Claude→Codex fallback
|
|
748
|
+
* contains both CLAUDE.md and AGENTS.md, and both must end up byte-
|
|
749
|
+
* identical in their character block. Each write is atomic (tmp +
|
|
750
|
+
* rename, both on the same filesystem so rename stays cheap) and
|
|
751
|
+
* per-file errors are logged without failing the whole call.
|
|
752
|
+
*
|
|
753
|
+
* Returns a summary of how many files were rewritten. Useful for
|
|
754
|
+
* instrumentation and for the dashboard PATCH handler to log.
|
|
755
|
+
*
|
|
756
|
+
* The helper is an FS wrapper: its pure parse/compose half lives in
|
|
757
|
+
* `character-block.ts` and is covered 100% there. This side is excluded
|
|
758
|
+
* from coverage along with the rest of `skills-compiler.ts`.
|
|
759
|
+
*/
|
|
760
|
+
export function rewriteCharacterBlock(workdir, character) {
|
|
761
|
+
const summary = { rewritten: 0, skipped: 0, failed: 0 };
|
|
762
|
+
for (const name of CHARACTER_INSTRUCTION_FILES) {
|
|
763
|
+
const target = join(workdir, name);
|
|
764
|
+
if (!existsSync(target)) {
|
|
765
|
+
summary.skipped++;
|
|
766
|
+
continue;
|
|
767
|
+
}
|
|
768
|
+
try {
|
|
769
|
+
const current = readFileSync(target, "utf-8");
|
|
770
|
+
const next = applyCharacterBlockRewrite(current, character);
|
|
771
|
+
if (next === current) {
|
|
772
|
+
summary.skipped++;
|
|
773
|
+
continue;
|
|
774
|
+
}
|
|
775
|
+
// `.tmp` lives next to the target so the rename stays on one
|
|
776
|
+
// filesystem (design R1 mitigation).
|
|
777
|
+
const tmp = `${target}.tmp`;
|
|
778
|
+
writeFileSync(tmp, next, "utf-8");
|
|
779
|
+
renameSync(tmp, target);
|
|
780
|
+
summary.rewritten++;
|
|
781
|
+
}
|
|
782
|
+
catch (err) {
|
|
783
|
+
// Per-file logging so a partial failure (e.g. CLAUDE.md written,
|
|
784
|
+
// AGENTS.md EACCES) is recoverable post-hoc — the outer PATCH
|
|
785
|
+
// handler only sees aggregate totals.
|
|
786
|
+
logger.warn({ err, target }, "rewriteCharacterBlock failed to update instruction file");
|
|
787
|
+
summary.failed++;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
return summary;
|
|
791
|
+
}
|
|
792
|
+
function renderCliInstructionFile(params) {
|
|
793
|
+
const toolName = params.backendId === "codex" ? "AGENTS.md" : "GEMINI.md";
|
|
794
|
+
const parts = [
|
|
795
|
+
`# ${APP_NAME} ${toolName}`,
|
|
796
|
+
"",
|
|
797
|
+
`Process key: \`${params.processKey}\``,
|
|
798
|
+
`Profile: \`${params.profileName}\``,
|
|
799
|
+
"",
|
|
800
|
+
];
|
|
801
|
+
// Safety invariants at top level for prominence — CLI backends don't
|
|
802
|
+
// have a separate project-instruction layer, so burying safety inside
|
|
803
|
+
// the profile section risks it being overlooked by weaker models.
|
|
804
|
+
if (params.safetyContent) {
|
|
805
|
+
parts.push(params.safetyContent, "");
|
|
806
|
+
}
|
|
807
|
+
// User-defined character sits immediately after safety so it strictly
|
|
808
|
+
// outranks every profile / skill / task-flow layer below it, and
|
|
809
|
+
// strictly below safety (design §15.4.2 / §15.5).
|
|
810
|
+
if (params.characterBlock) {
|
|
811
|
+
parts.push(params.characterBlock, "");
|
|
812
|
+
}
|
|
813
|
+
// DELEGATED-MODE-V2-DESIGN.md §4.3.4 — same-backend integration deny block.
|
|
814
|
+
// Sits right after character / safety (above behavioral rules + skills) so
|
|
815
|
+
// weak models cannot miss it. For Codex this is the only enforcement
|
|
816
|
+
// surface; for Gemini it duplicates the admin-policy hard-deny.
|
|
817
|
+
if (params.sameBackendDenyBlock) {
|
|
818
|
+
parts.push(params.sameBackendDenyBlock, "");
|
|
819
|
+
}
|
|
820
|
+
// Behavioral rules that Claude Code receives via system prompt append but
|
|
821
|
+
// CLI backends don't have a system prompt layer for.
|
|
822
|
+
parts.push("## Behavioral rules", "", "- WhatsApp outbound messages are prefixed by the daemon. Do not add that prefix yourself unless the user explicitly asks.", "");
|
|
823
|
+
// Daemon-API usage hoisted ABOVE the skills (was: appended at the end
|
|
824
|
+
// of the file). Skill bodies inline below carry hundreds of `curl
|
|
825
|
+
// http://localhost:8321/api/...` examples; for Codex specifically those
|
|
826
|
+
// examples target endpoints that return 401 because Codex does not
|
|
827
|
+
// hold the read-sensitive token. Surfacing the constraint up-front
|
|
828
|
+
// gives the agent the routing rule before it reads the first skill.
|
|
829
|
+
// For Gemini / Claude the section is informational; the position is
|
|
830
|
+
// kept consistent so the rendered file shape is uniform.
|
|
831
|
+
parts.push(renderDaemonApiUsageSection(params.backendId !== "codex"), "");
|
|
832
|
+
parts.push("## Runtime profile", "", params.profileContent.trim(), "", "## Skills", "");
|
|
833
|
+
if (params.skillSlugs.length === 0) {
|
|
834
|
+
parts.push("No process-scoped built-in skills were selected for this turn.");
|
|
835
|
+
}
|
|
836
|
+
else {
|
|
837
|
+
for (const slug of params.skillSlugs) {
|
|
838
|
+
const content = params.skillContents[slug];
|
|
839
|
+
if (content) {
|
|
840
|
+
parts.push(`### ${slug}`, "", content.trim(), "");
|
|
841
|
+
}
|
|
842
|
+
else {
|
|
843
|
+
parts.push(`### ${slug}`, "", `See \`skills/${slug}/SKILL.md\` for details.`, "");
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
parts.push("", "User-authored skills may also exist under `skills/<name>/SKILL.md`.");
|
|
848
|
+
return parts.join("\n");
|
|
849
|
+
}
|
|
850
|
+
function renderDaemonApiUsageSection(readSensitiveAvailable) {
|
|
851
|
+
const lines = [
|
|
852
|
+
"## Daemon API Usage",
|
|
853
|
+
"",
|
|
854
|
+
"- Use plain `curl` for daemon API calls. The daemon prepends a session-local wrapper on PATH.",
|
|
855
|
+
"- Never use absolute curl paths, alternative HTTP clients, connection overrides, or custom auth headers.",
|
|
856
|
+
];
|
|
857
|
+
if (readSensitiveAvailable) {
|
|
858
|
+
lines.push("- The wrapper auto-attaches session auth for read-sensitive endpoints.");
|
|
859
|
+
}
|
|
860
|
+
else {
|
|
861
|
+
lines.push("", "### Read-sensitive endpoints are UNAVAILABLE on this backend", "", "Codex sessions do not receive the read-sensitive daemon token. The", "wrapper still prepends headers it can supply, but the daemon answers", "personal-data reads with `401 Unauthorized` regardless. Endpoints", "below are affected; the skill bodies in `## Skills` describe them", "as if they were available — treat the section as a contract you", "cannot satisfy on this backend.", "", "- Context vault: `GET /api/context/*`, `GET /api/context/list/*`", "- Mail (multi-provider): `GET /api/mail/*` (read), search, providers", "- Calendar (direct mode): `GET /api/calendar/*`", "- Notion (direct mode): `GET /api/notion/{query,search,pages}`", "- Obsidian: `GET /api/obsidian/*`", "- Observations: `GET /api/observations`", "- Reading list / receipts / travel bookings", "", "If a skill body directs you at one of these reads, stop and tell", "the user the task needs a different backend (Claude or Gemini).", "Do not hammer the endpoint — the 401 is permanent for this", "session, not transient. Writes and autonomous-tier endpoints", "stay reachable; the gate is read-sensitive scope only.");
|
|
862
|
+
}
|
|
863
|
+
return lines.join("\n");
|
|
864
|
+
}
|
|
865
|
+
/**
|
|
866
|
+
* Strip service sections from external-services/SKILL.md that correspond to
|
|
867
|
+
* unconfigured integrations. Sections are delimited by HTML comments:
|
|
868
|
+
* <!-- service:calendar --> ... <!-- /service:calendar -->
|
|
869
|
+
* When `configuredServices` is empty the content is returned unchanged — the
|
|
870
|
+
* "no services configured yet" case keeps every section so the agent can see
|
|
871
|
+
* the full menu. Only strips once the user has configured at least one
|
|
872
|
+
* service (and therefore expressed an intent to narrow the surface).
|
|
873
|
+
*/
|
|
874
|
+
export function stripUnconfiguredServices(content, configuredServices) {
|
|
875
|
+
if (configuredServices.size === 0)
|
|
876
|
+
return content;
|
|
877
|
+
const servicePattern = /<!-- service:(\w+) -->\n([\s\S]*?)<!-- \/service:\1 -->\n?/g;
|
|
878
|
+
return content.replace(servicePattern, (match, service) => configuredServices.has(service) ? match : "");
|
|
879
|
+
}
|
|
880
|
+
/** Strip YAML frontmatter (--- ... ---) from markdown content. */
|
|
881
|
+
function stripFrontmatter(content) {
|
|
882
|
+
if (!content.startsWith("---"))
|
|
883
|
+
return content;
|
|
884
|
+
const endIdx = content.indexOf("\n---", 3);
|
|
885
|
+
if (endIdx < 0)
|
|
886
|
+
return content;
|
|
887
|
+
return content.slice(endIdx + 4).replace(/^\n+/, "");
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* Adapt a SKILL.md for CLI backends (Codex / Gemini): retain only `name`,
|
|
891
|
+
* `description`, and `when_to_use` frontmatter fields, stripping
|
|
892
|
+
* Claude-specific fields like `allowed-tools`. The body content is
|
|
893
|
+
* preserved unchanged.
|
|
894
|
+
*
|
|
895
|
+
* `when_to_use` is the secondary trigger-shape clarification documented
|
|
896
|
+
* in `SKILLS-PHASE-2-PLAN.md` §3.2 / §5; the Claude Agent SDK reads it
|
|
897
|
+
* verbatim from `q.when_to_use` (verified against
|
|
898
|
+
* `claude-agent-sdk@0.2.98/cli.js`). Preserving it on the CLI side keeps
|
|
899
|
+
* the per-backend skill frontmatter aligned even though Codex / Gemini
|
|
900
|
+
* do not currently consume the field — drift would surface as a missing
|
|
901
|
+
* activation hint when they eventually do.
|
|
902
|
+
*
|
|
903
|
+
* Assumes `name`, `description`, and `when_to_use` are each single-line
|
|
904
|
+
* YAML scalars (no `|` / `>` block forms). A multi-line `when_to_use:`
|
|
905
|
+
* is matched only by its first line — the `.+` regex stops at the
|
|
906
|
+
* newline — but since YAML block scalars start with the line that
|
|
907
|
+
* contains only `|` or `>`, the captured value would be the empty
|
|
908
|
+
* indicator and the inlined value would be useless. Phase 2 v1 keeps
|
|
909
|
+
* this conservative: callers must use single-line scalars (NG5).
|
|
910
|
+
*/
|
|
911
|
+
export function adaptSkillForCli(content) {
|
|
912
|
+
if (!content.startsWith("---"))
|
|
913
|
+
return content;
|
|
914
|
+
const endIdx = content.indexOf("\n---", 3);
|
|
915
|
+
if (endIdx < 0)
|
|
916
|
+
return content;
|
|
917
|
+
const frontmatter = content.slice(4, endIdx);
|
|
918
|
+
const body = content.slice(endIdx + 4);
|
|
919
|
+
const nameMatch = frontmatter.match(/^name:\s*(.+)$/m);
|
|
920
|
+
const descMatch = frontmatter.match(/^description:\s*(.+)$/m);
|
|
921
|
+
const whenMatch = frontmatter.match(/^when_to_use:\s*(.+)$/m);
|
|
922
|
+
// Reject multi-line block scalars (`when_to_use: |` / `when_to_use: >`):
|
|
923
|
+
// their first-line capture would just be the indicator. Falling through
|
|
924
|
+
// to "no when_to_use" matches the documented contract (§3.4.2 #9).
|
|
925
|
+
const whenIsBlockScalar = whenMatch !== null && /^[|>][-+]?\s*$/.test(whenMatch[1].trim());
|
|
926
|
+
const parts = ["---"];
|
|
927
|
+
if (nameMatch)
|
|
928
|
+
parts.push(`name: ${nameMatch[1].trim()}`);
|
|
929
|
+
if (descMatch)
|
|
930
|
+
parts.push(`description: ${descMatch[1].trim()}`);
|
|
931
|
+
if (whenMatch && !whenIsBlockScalar) {
|
|
932
|
+
parts.push(`when_to_use: ${whenMatch[1].trim()}`);
|
|
933
|
+
}
|
|
934
|
+
parts.push("---");
|
|
935
|
+
return parts.join("\n") + body;
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* Resolve `{{> base }}` include directives in a skill/task-flow variant file.
|
|
939
|
+
* Reads `SKILL.base.md` (or `<key>.base.md` for task flows) from `basePath`
|
|
940
|
+
* and replaces every occurrence of `{{> base }}` with the base file's content
|
|
941
|
+
* (frontmatter stripped). A missing or empty base file is silently ignored.
|
|
942
|
+
*
|
|
943
|
+
* Only `{{> base }}` is supported — this is intentionally minimal (§4.7
|
|
944
|
+
* design note: "~40 lines of pure TS").
|
|
945
|
+
*
|
|
946
|
+
* @deprecated DELEGATED-PROXY-API-DESIGN.md §11 — after Phase D no in-tree
|
|
947
|
+
* skill uses `{{> base }}`: mail / external-services unified their bodies
|
|
948
|
+
* during Phase D, and the lone surviving `notion/SKILL.base.md` was
|
|
949
|
+
* removed in Phase 9 (its hourly-check read-only constraint moved to
|
|
950
|
+
* `routine.hourly_check.md` task-flow where the rule applies in every
|
|
951
|
+
* integration mode, including same-backend delegated where the skill
|
|
952
|
+
* body is dropped). The helper is retained for future composition needs;
|
|
953
|
+
* remove the call sites in `materializeClaudeSession` /
|
|
954
|
+
* `materializeCliSession` when no consumer reappears.
|
|
955
|
+
*/
|
|
956
|
+
export function renderPartialIncludes(content, basePath) {
|
|
957
|
+
if (!content.includes("{{> base }}"))
|
|
958
|
+
return content;
|
|
959
|
+
if (!existsSync(basePath))
|
|
960
|
+
return content.replace(/\{\{> base \}\}/g, "");
|
|
961
|
+
const baseRaw = readFileSync(basePath, "utf-8");
|
|
962
|
+
const baseContent = stripFrontmatter(baseRaw).trim();
|
|
963
|
+
return content.replace(/\{\{> base \}\}/g, baseContent);
|
|
964
|
+
}
|
|
965
|
+
/**
|
|
966
|
+
* Resolve `{{> ref:<name> }}` directives in a skill body by inlining
|
|
967
|
+
* `references/<name>.md` (frontmatter stripped) from the skill's source dir.
|
|
968
|
+
*
|
|
969
|
+
* Mirrors `renderPartialIncludes` but is intra-skill, not cross-skill: each
|
|
970
|
+
* skill carries its own `references/` dir. Used by progressive-disclosure
|
|
971
|
+
* skills (planned for `mail`, `roadmap`, `reading`, `user-interview` after
|
|
972
|
+
* Phase 2-B) so heavy reference tables can live next to the skill body
|
|
973
|
+
* without bloating the navigation overview.
|
|
974
|
+
*
|
|
975
|
+
* Behaviour:
|
|
976
|
+
* - Missing `references/<name>.md` → directive replaced with empty string;
|
|
977
|
+
* logged at WARN. (Mirrors the deprecated helper's missing-base behaviour.)
|
|
978
|
+
* - The directive matches `{{> ref:<name> }}` with the strict-kebab name
|
|
979
|
+
* pattern `[a-z][a-z0-9-]*`. Path-traversal (`../`, leading underscore,
|
|
980
|
+
* uppercase) is rejected at the regex level — `existsSync` is never
|
|
981
|
+
* consulted for invalid names.
|
|
982
|
+
* - Multiple occurrences each inline the same file's content (re-read per
|
|
983
|
+
* occurrence — pinned by the unit tests so a later caching refactor must
|
|
984
|
+
* surface as a deliberate change).
|
|
985
|
+
* - Frontmatter on the reference file (if present) is stripped before
|
|
986
|
+
* inline, so reference files can carry `---\nkind: reference\n---`
|
|
987
|
+
* headers for tooling without leaking YAML into skill bodies.
|
|
988
|
+
* - The resolver is NOT fence-aware; a directive inside a triple-backtick
|
|
989
|
+
* fence is still expanded. This matches `renderPartialIncludes` and is
|
|
990
|
+
* deliberate for v1 — fence-aware resolution would be a separate refactor.
|
|
991
|
+
*
|
|
992
|
+
* Phase 2-A ships compiler-only; no in-tree skill carries a directive yet
|
|
993
|
+
* (`skills-manifest.test.ts` pins `0` as the lockstep count). Phase 2-B
|
|
994
|
+
* starts emitting them per the migration map in `SKILLS-PHASE-2-PLAN.md`.
|
|
995
|
+
*/
|
|
996
|
+
export function renderReferenceIncludes(content, skillSrcDir) {
|
|
997
|
+
return content.replace(/\{\{> ref:([a-z][a-z0-9-]*) \}\}/g, (_match, name) => {
|
|
998
|
+
const refPath = join(skillSrcDir, "references", `${name}.md`);
|
|
999
|
+
if (!existsSync(refPath)) {
|
|
1000
|
+
logger.warn({ skillSrcDir, name }, "renderReferenceIncludes: missing reference file");
|
|
1001
|
+
return "";
|
|
1002
|
+
}
|
|
1003
|
+
return stripFrontmatter(readFileSync(refPath, "utf-8")).trim();
|
|
1004
|
+
});
|
|
1005
|
+
}
|
|
1006
|
+
/**
|
|
1007
|
+
* §7.7 — apply the per-integration tool-deny policy to a delegated skill
|
|
1008
|
+
* body. Two enforcement modes:
|
|
1009
|
+
*
|
|
1010
|
+
* - **Claude (hard enforcement):** parse the YAML frontmatter and remove
|
|
1011
|
+
* every `allowed-tools` entry whose unsuffixed name (after the
|
|
1012
|
+
* descriptor's `toolNamespace`) is in `deniedTools`. The Claude Agent
|
|
1013
|
+
* SDK refuses to invoke any tool not present in `allowed-tools`, so
|
|
1014
|
+
* this is hard enforcement at the SDK boundary.
|
|
1015
|
+
*
|
|
1016
|
+
* - **Codex / Gemini (soft enforcement):** append a "Denied tools (do
|
|
1017
|
+
* not invoke)" prose block at the end of the skill body listing the
|
|
1018
|
+
* full namespaced tool names. The CLI surfaces have no per-tool deny
|
|
1019
|
+
* mechanism comparable to Claude's `allowed-tools`; the prose is the
|
|
1020
|
+
* only guard. Documented soft-enforcement gap.
|
|
1021
|
+
*
|
|
1022
|
+
* Stale entries (a deniedTools name that doesn't match any tool in the
|
|
1023
|
+
* active backend's `capabilityTools`) are silently ignored — the API
|
|
1024
|
+
* already rejects them at PATCH time, but a delegatedBackend swap can
|
|
1025
|
+
* leave Claude-namespaced names in a list now active for Codex.
|
|
1026
|
+
*
|
|
1027
|
+
* Run AFTER `renderPartialIncludes` and `stripUnconfiguredServices` so
|
|
1028
|
+
* partial includes and service-section gating land first.
|
|
1029
|
+
*/
|
|
1030
|
+
export function applyDeniedTools(content, integrationKey, backendId, deniedTools) {
|
|
1031
|
+
if (deniedTools.length === 0)
|
|
1032
|
+
return content;
|
|
1033
|
+
const descriptor = INTEGRATION_DESCRIPTORS[integrationKey];
|
|
1034
|
+
const connector = descriptor.backendConnectors[backendId];
|
|
1035
|
+
if (!connector)
|
|
1036
|
+
return content;
|
|
1037
|
+
const { active } = filterDeniedToolsForBackend(integrationKey, backendId, deniedTools);
|
|
1038
|
+
if (active.length === 0)
|
|
1039
|
+
return content;
|
|
1040
|
+
const namespacedDenied = active.map((t) => `${connector.toolNamespace}${t}`);
|
|
1041
|
+
if (backendId === "claude") {
|
|
1042
|
+
return filterClaudeAllowedTools(content, new Set(namespacedDenied));
|
|
1043
|
+
}
|
|
1044
|
+
return appendCliDenyBlock(content, namespacedDenied);
|
|
1045
|
+
}
|
|
1046
|
+
/**
|
|
1047
|
+
* Strip every `allowed-tools` frontmatter entry whose name appears in
|
|
1048
|
+
* `deniedSet`. Preserves frontmatter ordering, line breaks, and any other
|
|
1049
|
+
* fields. Tolerates two YAML shapes:
|
|
1050
|
+
*
|
|
1051
|
+
* allowed-tools:
|
|
1052
|
+
* - name1
|
|
1053
|
+
* - name2
|
|
1054
|
+
*
|
|
1055
|
+
* allowed-tools: [name1, name2]
|
|
1056
|
+
*
|
|
1057
|
+
* The first form is what every skill in `agent-assets/skills/` uses today;
|
|
1058
|
+
* the inline form is supported because it's valid YAML and the API + UI
|
|
1059
|
+
* have no way to prevent a hand-edited skill from using it.
|
|
1060
|
+
*/
|
|
1061
|
+
function filterClaudeAllowedTools(content, deniedSet) {
|
|
1062
|
+
if (!content.startsWith("---"))
|
|
1063
|
+
return content;
|
|
1064
|
+
const endIdx = content.indexOf("\n---", 3);
|
|
1065
|
+
if (endIdx < 0)
|
|
1066
|
+
return content;
|
|
1067
|
+
const frontmatter = content.slice(4, endIdx);
|
|
1068
|
+
const body = content.slice(endIdx + 4);
|
|
1069
|
+
const lines = frontmatter.split("\n");
|
|
1070
|
+
const out = [];
|
|
1071
|
+
let inAllowedTools = false;
|
|
1072
|
+
for (const line of lines) {
|
|
1073
|
+
if (/^allowed-tools:\s*\[/.test(line)) {
|
|
1074
|
+
// Inline-array form: parse, filter, re-emit on one line.
|
|
1075
|
+
const m = /^(allowed-tools:\s*)\[([^\]]*)\]/.exec(line);
|
|
1076
|
+
if (m) {
|
|
1077
|
+
const items = m[2]
|
|
1078
|
+
.split(",")
|
|
1079
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ""))
|
|
1080
|
+
.filter((s) => s.length > 0 && !deniedSet.has(s));
|
|
1081
|
+
out.push(`${m[1]}[${items.join(", ")}]`);
|
|
1082
|
+
continue;
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
if (/^allowed-tools:\s*$/.test(line)) {
|
|
1086
|
+
inAllowedTools = true;
|
|
1087
|
+
out.push(line);
|
|
1088
|
+
continue;
|
|
1089
|
+
}
|
|
1090
|
+
if (inAllowedTools) {
|
|
1091
|
+
// Block-list form continuation. A block-list item is ` - <name>`;
|
|
1092
|
+
// anything else (next top-level key, blank, or end of frontmatter)
|
|
1093
|
+
// ends the section.
|
|
1094
|
+
const itemMatch = /^\s*-\s*(.+?)\s*$/.exec(line);
|
|
1095
|
+
if (itemMatch) {
|
|
1096
|
+
const name = itemMatch[1].replace(/^["']|["']$/g, "");
|
|
1097
|
+
if (!deniedSet.has(name))
|
|
1098
|
+
out.push(line);
|
|
1099
|
+
continue;
|
|
1100
|
+
}
|
|
1101
|
+
// Anything else closes the block.
|
|
1102
|
+
inAllowedTools = false;
|
|
1103
|
+
}
|
|
1104
|
+
out.push(line);
|
|
1105
|
+
}
|
|
1106
|
+
return `---\n${out.join("\n")}\n---${body}`;
|
|
1107
|
+
}
|
|
1108
|
+
/**
|
|
1109
|
+
* DELEGATED-MODE-V2-DESIGN.md §4.3.3-§4.3.4 — render a top-level prose
|
|
1110
|
+
* deny block listing every same-backend integration tool the user has
|
|
1111
|
+
* denied. Returns `null` when no integration is in same-backend mode for
|
|
1112
|
+
* this backend or the deny lists are empty.
|
|
1113
|
+
*
|
|
1114
|
+
* Codex (γ outcome): this prose is the ONLY enforcement surface — the
|
|
1115
|
+
* Codex CLI's connector apps have no admin-policy or per-tool deny config.
|
|
1116
|
+
* The agent profile (`AGENTS.md`) inlines this block above the behavioral
|
|
1117
|
+
* rules so it is impossible to miss.
|
|
1118
|
+
*
|
|
1119
|
+
* Gemini: duplicate intent — admin-policy already hard-denies these tools
|
|
1120
|
+
* (§4.3.3 hard enforcement), but echoing the deny in prose saves tokens
|
|
1121
|
+
* the model would otherwise spend drafting a doomed call.
|
|
1122
|
+
*/
|
|
1123
|
+
export function buildSameBackendDenyBlock(integrations, sessionBackend) {
|
|
1124
|
+
const map = collectSessionDeniedTools(integrations, sessionBackend);
|
|
1125
|
+
if (map.size === 0)
|
|
1126
|
+
return null;
|
|
1127
|
+
const lines = [
|
|
1128
|
+
"## Denied tools (per-integration)",
|
|
1129
|
+
"",
|
|
1130
|
+
"The user has restricted the following connector tools for this session.",
|
|
1131
|
+
"Do NOT invoke them in any flow — including hourly check, morning routine,",
|
|
1132
|
+
"or DM responses. If a workflow appears to require one, stop and tell the",
|
|
1133
|
+
"user the tool is denied.",
|
|
1134
|
+
];
|
|
1135
|
+
for (const [key, names] of map.entries()) {
|
|
1136
|
+
lines.push("", `### ${key}`, "");
|
|
1137
|
+
for (const n of names)
|
|
1138
|
+
lines.push(`- \`${n}\``);
|
|
1139
|
+
}
|
|
1140
|
+
return lines.join("\n");
|
|
1141
|
+
}
|
|
1142
|
+
/**
|
|
1143
|
+
* Append a soft-enforcement deny block to a CLI skill body. The block is
|
|
1144
|
+
* idempotent — re-running with the same denied set produces identical
|
|
1145
|
+
* output.
|
|
1146
|
+
*/
|
|
1147
|
+
function appendCliDenyBlock(content, namespacedDenied) {
|
|
1148
|
+
// Strip any prior deny block we wrote, so re-materialization with a
|
|
1149
|
+
// changed list doesn't accumulate stale ones. The block starts with
|
|
1150
|
+
// `\n## Denied tools (do not invoke)` (one preceding newline, the join
|
|
1151
|
+
// contributes the second) and runs until either the next `## ` heading
|
|
1152
|
+
// or end of file.
|
|
1153
|
+
const stripped = content.replace(/\n+## Denied tools \(do not invoke\)[\s\S]*?(?=\n## (?!Denied tools)|$)/, "");
|
|
1154
|
+
const items = namespacedDenied.map((n) => `- \`${n}\``).join("\n");
|
|
1155
|
+
// Two leading empty strings → block begins with "\n\n## " so the heading
|
|
1156
|
+
// sits on its own paragraph (markdown convention) regardless of what
|
|
1157
|
+
// trailing whitespace the body carried.
|
|
1158
|
+
const block = [
|
|
1159
|
+
"",
|
|
1160
|
+
"",
|
|
1161
|
+
"## Denied tools (do not invoke)",
|
|
1162
|
+
"",
|
|
1163
|
+
"The user has restricted these connector tools for this integration. Do",
|
|
1164
|
+
"NOT invoke them in any flow — including hourly check, morning routine,",
|
|
1165
|
+
"or DM responses. If a workflow appears to require one, stop and tell",
|
|
1166
|
+
"the user the tool is denied.",
|
|
1167
|
+
"",
|
|
1168
|
+
items,
|
|
1169
|
+
"",
|
|
1170
|
+
].join("\n");
|
|
1171
|
+
return stripped.replace(/\s*$/, "") + block;
|
|
1172
|
+
}
|
|
1173
|
+
/**
|
|
1174
|
+
* Apply the deny pass for every integration whose `skillsTouched` OR
|
|
1175
|
+
* `deniedToolsAppliesToSkills` includes the given skill slug. A skill that
|
|
1176
|
+
* touches no integration leaves content unchanged. Touching multiple
|
|
1177
|
+
* integrations runs the pass once per integration so each contributes its
|
|
1178
|
+
* own deny list.
|
|
1179
|
+
*
|
|
1180
|
+
* Hard enforcement of the same deny list for cross-backend delegated
|
|
1181
|
+
* calls lives at the `POST /api/integrations/:key/invoke` chokepoint
|
|
1182
|
+
* (DELEGATED-MODE-V2-DESIGN.md §4.3.2). For same-backend native MCP it
|
|
1183
|
+
* is enforced via SDK `disallowedTools` (Claude) / admin policy
|
|
1184
|
+
* (Gemini); see `collectSessionDeniedTools` (§4.3.3).
|
|
1185
|
+
*/
|
|
1186
|
+
export function applyAllDeniedToolsForSkill(content, skillSlug, backendId, integrations) {
|
|
1187
|
+
let result = content;
|
|
1188
|
+
for (const key of INTEGRATION_KEYS) {
|
|
1189
|
+
const descriptor = INTEGRATION_DESCRIPTORS[key];
|
|
1190
|
+
const touched = descriptor.skillsTouched.includes(skillSlug)
|
|
1191
|
+
|| (descriptor.deniedToolsAppliesToSkills?.includes(skillSlug) ?? false);
|
|
1192
|
+
if (!touched)
|
|
1193
|
+
continue;
|
|
1194
|
+
const state = integrations[key];
|
|
1195
|
+
if (!state)
|
|
1196
|
+
continue;
|
|
1197
|
+
if (state.mode !== "delegated")
|
|
1198
|
+
continue;
|
|
1199
|
+
if (!state.delegatedBackend || state.delegatedBackend !== backendId)
|
|
1200
|
+
continue;
|
|
1201
|
+
const denied = state.deniedTools ?? [];
|
|
1202
|
+
if (denied.length === 0)
|
|
1203
|
+
continue;
|
|
1204
|
+
result = applyDeniedTools(result, key, backendId, denied);
|
|
1205
|
+
}
|
|
1206
|
+
return result;
|
|
1207
|
+
}
|
|
1208
|
+
/**
|
|
1209
|
+
* Remove any built-in skill directory under `destRoot` whose slug is not
|
|
1210
|
+
* in `keep`. Recognises a directory as a built-in by its presence under
|
|
1211
|
+
* the source `agent-assets/skills/` tree — anything else (user-authored
|
|
1212
|
+
* skill, accounts.md, etc.) is left alone, since `syncAllUserSkills` is
|
|
1213
|
+
* the canonical writer for those.
|
|
1214
|
+
*
|
|
1215
|
+
* Idempotent and side-effect-free when there is nothing to prune.
|
|
1216
|
+
* Exported for unit testing only.
|
|
1217
|
+
*/
|
|
1218
|
+
export function pruneStaleBuiltinSkillDirs(destRoot, sourceSkillsRoot, keep) {
|
|
1219
|
+
if (!existsSync(destRoot))
|
|
1220
|
+
return;
|
|
1221
|
+
if (!existsSync(sourceSkillsRoot))
|
|
1222
|
+
return;
|
|
1223
|
+
const keepSet = new Set(keep);
|
|
1224
|
+
const builtinSlugs = new Set();
|
|
1225
|
+
for (const entry of readdirSync(sourceSkillsRoot, { withFileTypes: true })) {
|
|
1226
|
+
if (entry.isDirectory())
|
|
1227
|
+
builtinSlugs.add(entry.name);
|
|
1228
|
+
}
|
|
1229
|
+
for (const entry of readdirSync(destRoot, { withFileTypes: true })) {
|
|
1230
|
+
if (!entry.isDirectory())
|
|
1231
|
+
continue;
|
|
1232
|
+
if (!builtinSlugs.has(entry.name))
|
|
1233
|
+
continue;
|
|
1234
|
+
if (keepSet.has(entry.name))
|
|
1235
|
+
continue;
|
|
1236
|
+
rmSync(join(destRoot, entry.name), { recursive: true, force: true });
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
function readTreeFiles(root) {
|
|
1240
|
+
if (!existsSync(root)) {
|
|
1241
|
+
return [];
|
|
1242
|
+
}
|
|
1243
|
+
const files = [];
|
|
1244
|
+
for (const relPath of walkTree(root)) {
|
|
1245
|
+
const absPath = join(root, relPath);
|
|
1246
|
+
const stat = statSync(absPath);
|
|
1247
|
+
files.push({
|
|
1248
|
+
path: relPath,
|
|
1249
|
+
content: readFileSync(absPath, "utf-8"),
|
|
1250
|
+
updatedAt: stat.mtime.toISOString(),
|
|
1251
|
+
});
|
|
1252
|
+
}
|
|
1253
|
+
return files;
|
|
1254
|
+
}
|
|
1255
|
+
function walkTree(root, current = root) {
|
|
1256
|
+
if (!existsSync(current)) {
|
|
1257
|
+
return [];
|
|
1258
|
+
}
|
|
1259
|
+
const entries = readdirSync(current, { withFileTypes: true });
|
|
1260
|
+
const files = [];
|
|
1261
|
+
for (const entry of entries) {
|
|
1262
|
+
const absPath = join(current, entry.name);
|
|
1263
|
+
if (entry.isDirectory()) {
|
|
1264
|
+
files.push(...walkTree(root, absPath));
|
|
1265
|
+
continue;
|
|
1266
|
+
}
|
|
1267
|
+
files.push(relative(root, absPath));
|
|
1268
|
+
}
|
|
1269
|
+
return files.sort();
|
|
1270
|
+
}
|
|
1271
|
+
//# sourceMappingURL=skills-compiler.js.map
|