vellum 0.0.16 → 0.2.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/.dockerignore +27 -0
- package/.env.example +22 -0
- package/Dockerfile +99 -0
- package/Dockerfile.sandbox +5 -0
- package/README.md +150 -3
- package/bun.lock +1768 -0
- package/bunfig.toml +2 -0
- package/docs/skills.md +158 -0
- package/drizzle/0000_dizzy_maggott.sql +301 -0
- package/drizzle/meta/0000_snapshot.json +1999 -0
- package/drizzle/meta/_journal.json +13 -0
- package/drizzle.config.ts +7 -0
- package/eslint.config.mjs +17 -0
- package/hook-templates/debug-prompt-logger/hook.json +7 -0
- package/hook-templates/debug-prompt-logger/run.sh +68 -0
- package/knip.json +9 -0
- package/package.json +60 -10
- package/scripts/ipc/check-contract-inventory.ts +104 -0
- package/scripts/ipc/check-swift-decoder-drift.ts +163 -0
- package/scripts/ipc/generate-swift.ts +492 -0
- package/scripts/test-filesystem-tools.sh +48 -0
- package/scripts/test.sh +122 -0
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +2079 -0
- package/src/__tests__/account-registry.test.ts +244 -0
- package/src/__tests__/active-skill-tools.test.ts +378 -0
- package/src/__tests__/agent-loop-thinking.test.ts +81 -0
- package/src/__tests__/agent-loop.test.ts +1135 -0
- package/src/__tests__/anthropic-provider.test.ts +778 -0
- package/src/__tests__/app-builder-tool-scripts.test.ts +290 -0
- package/src/__tests__/app-bundler.test.ts +313 -0
- package/src/__tests__/app-executors.test.ts +613 -0
- package/src/__tests__/app-open-proxy.test.ts +62 -0
- package/src/__tests__/asset-materialize-tool.test.ts +451 -0
- package/src/__tests__/asset-search-tool.test.ts +476 -0
- package/src/__tests__/assistant-attachment-directive.test.ts +401 -0
- package/src/__tests__/assistant-attachments.test.ts +437 -0
- package/src/__tests__/assistant-event-hub.test.ts +226 -0
- package/src/__tests__/assistant-event.test.ts +123 -0
- package/src/__tests__/attachments-store.test.ts +547 -0
- package/src/__tests__/attachments.test.ts +134 -0
- package/src/__tests__/audit-log-rotation.test.ts +154 -0
- package/src/__tests__/browser-fill-credential.test.ts +309 -0
- package/src/__tests__/browser-manager.test.ts +203 -0
- package/src/__tests__/browser-runtime-check.test.ts +55 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +67 -0
- package/src/__tests__/browser-skill-endstate.test.ts +198 -0
- package/src/__tests__/bundle-scanner.test.ts +313 -0
- package/src/__tests__/checker.test.ts +3856 -0
- package/src/__tests__/clarification-resolver.test.ts +159 -0
- package/src/__tests__/classifier.test.ts +67 -0
- package/src/__tests__/claude-code-skill-regression.test.ts +127 -0
- package/src/__tests__/claude-code-tool-profiles.test.ts +88 -0
- package/src/__tests__/cli-discover.test.ts +85 -0
- package/src/__tests__/cli.test.ts +81 -0
- package/src/__tests__/clipboard.test.ts +80 -0
- package/src/__tests__/commit-guarantee.test.ts +335 -0
- package/src/__tests__/computer-use-session-compaction.test.ts +132 -0
- package/src/__tests__/computer-use-session-lifecycle.test.ts +293 -0
- package/src/__tests__/computer-use-session-working-dir.test.ts +117 -0
- package/src/__tests__/computer-use-skill-baseline.test.ts +74 -0
- package/src/__tests__/computer-use-skill-endstate.test.ts +89 -0
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +217 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +107 -0
- package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +54 -0
- package/src/__tests__/config-schema.test.ts +720 -0
- package/src/__tests__/conflict-store.test.ts +329 -0
- package/src/__tests__/connection-policy.test.ts +102 -0
- package/src/__tests__/context-memory-e2e.test.ts +434 -0
- package/src/__tests__/context-token-estimator.test.ts +135 -0
- package/src/__tests__/context-window-manager.test.ts +376 -0
- package/src/__tests__/contradiction-checker.test.ts +216 -0
- package/src/__tests__/conversation-store.test.ts +614 -0
- package/src/__tests__/credential-broker-browser-fill.test.ts +517 -0
- package/src/__tests__/credential-broker-server-use.test.ts +554 -0
- package/src/__tests__/credential-broker.test.ts +167 -0
- package/src/__tests__/credential-host-pattern-match.test.ts +104 -0
- package/src/__tests__/credential-metadata-store.test.ts +779 -0
- package/src/__tests__/credential-policy-validate.test.ts +121 -0
- package/src/__tests__/credential-resolve.test.ts +328 -0
- package/src/__tests__/credential-security-e2e.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +563 -0
- package/src/__tests__/credential-selection.test.ts +354 -0
- package/src/__tests__/credential-vault.test.ts +852 -0
- package/src/__tests__/daemon-assistant-events.test.ts +164 -0
- package/src/__tests__/daemon-server-session-init.test.ts +522 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +97 -0
- package/src/__tests__/diff.test.ts +121 -0
- package/src/__tests__/domain-normalize.test.ts +112 -0
- package/src/__tests__/domain-policy.test.ts +124 -0
- package/src/__tests__/doordash-client.test.ts +186 -0
- package/src/__tests__/doordash-session.test.ts +143 -0
- package/src/__tests__/dynamic-page-surface.test.ts +91 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +132 -0
- package/src/__tests__/edit-engine.test.ts +180 -0
- package/src/__tests__/email-cli.test.ts +283 -0
- package/src/__tests__/encrypted-store.test.ts +332 -0
- package/src/__tests__/entity-extractor.test.ts +190 -0
- package/src/__tests__/ephemeral-permissions.test.ts +312 -0
- package/src/__tests__/evaluate-typescript-tool.test.ts +286 -0
- package/src/__tests__/event-bus.test.ts +222 -0
- package/src/__tests__/file-edit-tool.test.ts +122 -0
- package/src/__tests__/file-ops-service.test.ts +330 -0
- package/src/__tests__/file-read-tool.test.ts +75 -0
- package/src/__tests__/file-write-tool.test.ts +113 -0
- package/src/__tests__/fixtures/credential-security-fixtures.ts +181 -0
- package/src/__tests__/fixtures/media-reuse-fixtures.ts +126 -0
- package/src/__tests__/fixtures/mock-signup-server.ts +387 -0
- package/src/__tests__/fixtures/proxy-fixtures.ts +147 -0
- package/src/__tests__/fuzzy-match-property.test.ts +216 -0
- package/src/__tests__/fuzzy-match.test.ts +138 -0
- package/src/__tests__/gemini-image-service.test.ts +261 -0
- package/src/__tests__/gemini-provider.test.ts +651 -0
- package/src/__tests__/get-weather.test.ts +318 -0
- package/src/__tests__/gmail-integration.test.ts +73 -0
- package/src/__tests__/handlers-cu-observation-blob.test.ts +351 -0
- package/src/__tests__/handlers-ipc-blob-probe.test.ts +190 -0
- package/src/__tests__/handlers-slack-config.test.ts +199 -0
- package/src/__tests__/handlers-task-submit-slash.test.ts +38 -0
- package/src/__tests__/headless-browser-interactions.test.ts +536 -0
- package/src/__tests__/headless-browser-navigate.test.ts +211 -0
- package/src/__tests__/headless-browser-read-tools.test.ts +261 -0
- package/src/__tests__/headless-browser-snapshot.test.ts +185 -0
- package/src/__tests__/history-repair-observability.test.ts +56 -0
- package/src/__tests__/history-repair.test.ts +510 -0
- package/src/__tests__/home-base-bootstrap.test.ts +77 -0
- package/src/__tests__/hooks-blocking.test.ts +128 -0
- package/src/__tests__/hooks-cli.test.ts +144 -0
- package/src/__tests__/hooks-config.test.ts +93 -0
- package/src/__tests__/hooks-discovery.test.ts +199 -0
- package/src/__tests__/hooks-integration.test.ts +189 -0
- package/src/__tests__/hooks-manager.test.ts +187 -0
- package/src/__tests__/hooks-runner.test.ts +178 -0
- package/src/__tests__/hooks-settings.test.ts +154 -0
- package/src/__tests__/hooks-templates.test.ts +137 -0
- package/src/__tests__/hooks-ts-runner.test.ts +125 -0
- package/src/__tests__/hooks-watch.test.ts +100 -0
- package/src/__tests__/host-file-edit-tool.test.ts +104 -0
- package/src/__tests__/host-file-read-tool.test.ts +61 -0
- package/src/__tests__/host-file-write-tool.test.ts +77 -0
- package/src/__tests__/host-shell-tool.test.ts +311 -0
- package/src/__tests__/intent-routing.test.ts +255 -0
- package/src/__tests__/ipc-blob-store.test.ts +315 -0
- package/src/__tests__/ipc-contract-inventory.test.ts +54 -0
- package/src/__tests__/ipc-contract.test.ts +74 -0
- package/src/__tests__/ipc-protocol.test.ts +113 -0
- package/src/__tests__/ipc-snapshot.test.ts +1560 -0
- package/src/__tests__/ipc-validate.test.ts +357 -0
- package/src/__tests__/key-migration.test.ts +183 -0
- package/src/__tests__/keychain.test.ts +258 -0
- package/src/__tests__/llm-usage-store.test.ts +226 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +257 -0
- package/src/__tests__/managed-store.test.ts +608 -0
- package/src/__tests__/media-generate-image.test.ts +238 -0
- package/src/__tests__/media-reuse-story.e2e.test.ts +676 -0
- package/src/__tests__/media-visibility-policy.test.ts +141 -0
- package/src/__tests__/memory-context-benchmark.test.ts +235 -0
- package/src/__tests__/memory-lifecycle-e2e.test.ts +481 -0
- package/src/__tests__/memory-query-builder.test.ts +59 -0
- package/src/__tests__/memory-recall-quality.test.ts +846 -0
- package/src/__tests__/memory-regressions.experimental.test.ts +538 -0
- package/src/__tests__/memory-regressions.test.ts +4238 -0
- package/src/__tests__/memory-retrieval-budget.test.ts +49 -0
- package/src/__tests__/migration-cli-flows.test.ts +169 -0
- package/src/__tests__/migration-ordering.test.ts +249 -0
- package/src/__tests__/mock-signup-server.test.ts +528 -0
- package/src/__tests__/onboarding-starter-tasks.test.ts +166 -0
- package/src/__tests__/onboarding-template-contract.test.ts +58 -0
- package/src/__tests__/openai-provider.test.ts +753 -0
- package/src/__tests__/parser.test.ts +472 -0
- package/src/__tests__/path-classifier.test.ts +73 -0
- package/src/__tests__/path-policy.test.ts +435 -0
- package/src/__tests__/platform-move-helper.test.ts +99 -0
- package/src/__tests__/platform-socket-path.test.ts +52 -0
- package/src/__tests__/platform-workspace-migration.test.ts +1000 -0
- package/src/__tests__/platform.test.ts +131 -0
- package/src/__tests__/prebuilt-home-base-seed.test.ts +71 -0
- package/src/__tests__/pricing.test.ts +256 -0
- package/src/__tests__/profile-compiler.test.ts +373 -0
- package/src/__tests__/provider-registry-ollama.test.ts +16 -0
- package/src/__tests__/proxy-approval-callback.test.ts +601 -0
- package/src/__tests__/ratelimit.test.ts +297 -0
- package/src/__tests__/registry.test.ts +487 -0
- package/src/__tests__/reminder-store.test.ts +220 -0
- package/src/__tests__/reminder.test.ts +263 -0
- package/src/__tests__/request-file-tool.test.ts +158 -0
- package/src/__tests__/run-orchestrator.test.ts +200 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +190 -0
- package/src/__tests__/runtime-runs-http.test.ts +451 -0
- package/src/__tests__/runtime-runs.test.ts +273 -0
- package/src/__tests__/sandbox-diagnostics.test.ts +408 -0
- package/src/__tests__/sandbox-host-parity.test.ts +950 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +253 -0
- package/src/__tests__/script-proxy-certs.test.ts +90 -0
- package/src/__tests__/script-proxy-connect-tunnel.test.ts +177 -0
- package/src/__tests__/script-proxy-decision-trace.test.ts +156 -0
- package/src/__tests__/script-proxy-http-forwarder.test.ts +281 -0
- package/src/__tests__/script-proxy-injection-runtime.test.ts +401 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +407 -0
- package/src/__tests__/script-proxy-policy-runtime.test.ts +287 -0
- package/src/__tests__/script-proxy-policy.test.ts +310 -0
- package/src/__tests__/script-proxy-rewrite-specificity.test.ts +135 -0
- package/src/__tests__/script-proxy-router.test.ts +180 -0
- package/src/__tests__/script-proxy-session-manager.test.ts +382 -0
- package/src/__tests__/script-proxy-session-runtime.test.ts +113 -0
- package/src/__tests__/secret-allowlist.test.ts +229 -0
- package/src/__tests__/secret-ingress-handler.test.ts +99 -0
- package/src/__tests__/secret-onetime-send.test.ts +130 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +106 -0
- package/src/__tests__/secret-response-routing.test.ts +93 -0
- package/src/__tests__/secret-scanner-executor.test.ts +348 -0
- package/src/__tests__/secret-scanner.test.ts +857 -0
- package/src/__tests__/secure-keys.test.ts +323 -0
- package/src/__tests__/server-history-render.test.ts +430 -0
- package/src/__tests__/session-abort-tool-results.test.ts +240 -0
- package/src/__tests__/session-conflict-gate.test.ts +697 -0
- package/src/__tests__/session-error.test.ts +341 -0
- package/src/__tests__/session-evictor.test.ts +188 -0
- package/src/__tests__/session-load-history-repair.test.ts +222 -0
- package/src/__tests__/session-pre-run-repair.test.ts +213 -0
- package/src/__tests__/session-profile-injection.test.ts +444 -0
- package/src/__tests__/session-provider-retry-repair.test.ts +306 -0
- package/src/__tests__/session-queue.test.ts +1462 -0
- package/src/__tests__/session-runtime-assembly.test.ts +315 -0
- package/src/__tests__/session-runtime-workspace.test.ts +183 -0
- package/src/__tests__/session-skill-tools.test.ts +2431 -0
- package/src/__tests__/session-slash-known.test.ts +368 -0
- package/src/__tests__/session-slash-queue.test.ts +288 -0
- package/src/__tests__/session-slash-unknown.test.ts +271 -0
- package/src/__tests__/session-tool-setup-app-refresh.test.ts +473 -0
- package/src/__tests__/session-tool-setup-memory-scope.test.ts +140 -0
- package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +140 -0
- package/src/__tests__/session-undo.test.ts +75 -0
- package/src/__tests__/session-workspace-cache-state.test.ts +246 -0
- package/src/__tests__/session-workspace-injection.test.ts +327 -0
- package/src/__tests__/session-workspace-tool-tracking.test.ts +240 -0
- package/src/__tests__/shared-filesystem-errors.test.ts +78 -0
- package/src/__tests__/shell-credential-ref.test.ts +187 -0
- package/src/__tests__/shell-parser-fuzz.test.ts +544 -0
- package/src/__tests__/shell-parser-property.test.ts +433 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +272 -0
- package/src/__tests__/signup-e2e.test.ts +352 -0
- package/src/__tests__/size-guard.test.ts +117 -0
- package/src/__tests__/skill-include-graph.test.ts +303 -0
- package/src/__tests__/skill-load-tool.test.ts +409 -0
- package/src/__tests__/skill-script-runner-host.test.ts +489 -0
- package/src/__tests__/skill-script-runner-sandbox.test.ts +349 -0
- package/src/__tests__/skill-tool-factory.test.ts +252 -0
- package/src/__tests__/skill-tool-manifest.test.ts +658 -0
- package/src/__tests__/skill-version-hash.test.ts +182 -0
- package/src/__tests__/skills.test.ts +597 -0
- package/src/__tests__/slash-commands-catalog.test.ts +86 -0
- package/src/__tests__/slash-commands-parser.test.ts +119 -0
- package/src/__tests__/slash-commands-resolver.test.ts +193 -0
- package/src/__tests__/slash-commands-rewrite.test.ts +39 -0
- package/src/__tests__/starter-bundle.test.ts +136 -0
- package/src/__tests__/starter-task-flow.test.ts +143 -0
- package/src/__tests__/subagent-manager-notify.test.ts +372 -0
- package/src/__tests__/subagent-tools.test.ts +118 -0
- package/src/__tests__/subagent-types.test.ts +78 -0
- package/src/__tests__/swarm-orchestrator.test.ts +428 -0
- package/src/__tests__/swarm-plan-validator.test.ts +330 -0
- package/src/__tests__/swarm-recursion.test.ts +165 -0
- package/src/__tests__/swarm-router-planner.test.ts +208 -0
- package/src/__tests__/swarm-session-integration.test.ts +274 -0
- package/src/__tests__/swarm-tool.test.ts +145 -0
- package/src/__tests__/swarm-worker-backend.test.ts +129 -0
- package/src/__tests__/swarm-worker-runner.test.ts +272 -0
- package/src/__tests__/system-prompt.test.ts +461 -0
- package/src/__tests__/task-compiler.test.ts +283 -0
- package/src/__tests__/task-runner.test.ts +215 -0
- package/src/__tests__/task-scheduler.test.ts +216 -0
- package/src/__tests__/task-tools.test.ts +602 -0
- package/src/__tests__/terminal-sandbox-docker.test.ts +1064 -0
- package/src/__tests__/terminal-sandbox.integration.test.ts +178 -0
- package/src/__tests__/terminal-sandbox.test.ts +202 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +90 -0
- package/src/__tests__/test-support/computer-use-skill-harness.ts +45 -0
- package/src/__tests__/tool-audit-listener.test.ts +112 -0
- package/src/__tests__/tool-domain-event-publisher.test.ts +251 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +516 -0
- package/src/__tests__/tool-executor-redaction.test.ts +289 -0
- package/src/__tests__/tool-executor.test.ts +1971 -0
- package/src/__tests__/tool-metrics-listener.test.ts +225 -0
- package/src/__tests__/tool-notification-listener.test.ts +49 -0
- package/src/__tests__/tool-policy.test.ts +54 -0
- package/src/__tests__/tool-profiling-listener.test.ts +268 -0
- package/src/__tests__/tool-result-truncation.test.ts +217 -0
- package/src/__tests__/tool-trace-listener.test.ts +226 -0
- package/src/__tests__/top-level-renderer.test.ts +121 -0
- package/src/__tests__/top-level-scanner.test.ts +141 -0
- package/src/__tests__/trace-emitter.test.ts +173 -0
- package/src/__tests__/trust-store.test.ts +2030 -0
- package/src/__tests__/turn-commit.test.ts +219 -0
- package/src/__tests__/url-safety.test.ts +418 -0
- package/src/__tests__/weather-skill-regression.test.ts +225 -0
- package/src/__tests__/web-fetch.test.ts +869 -0
- package/src/__tests__/web-search.test.ts +584 -0
- package/src/__tests__/workspace-git-service.test.ts +750 -0
- package/src/__tests__/workspace-heartbeat-service.test.ts +347 -0
- package/src/__tests__/workspace-lifecycle.test.ts +292 -0
- package/src/agent/attachments.ts +35 -0
- package/src/agent/loop.ts +500 -0
- package/src/agent/message-types.ts +17 -0
- package/src/autonomy/autonomy-resolver.ts +60 -0
- package/src/autonomy/autonomy-store.ts +122 -0
- package/src/autonomy/disposition-mapper.ts +31 -0
- package/src/autonomy/index.ts +11 -0
- package/src/autonomy/types.ts +39 -0
- package/src/bundler/app-bundler.ts +274 -0
- package/src/bundler/bundle-scanner.ts +535 -0
- package/src/bundler/bundle-signer.ts +124 -0
- package/src/bundler/manifest.ts +21 -0
- package/src/bundler/signature-verifier.ts +184 -0
- package/src/cli/autonomy.ts +188 -0
- package/src/cli/contacts.ts +149 -0
- package/src/cli/doordash.ts +824 -0
- package/src/cli/email-guardrails.ts +200 -0
- package/src/cli/email.ts +405 -0
- package/src/cli/main-screen.tsx +155 -0
- package/src/cli.ts +935 -0
- package/src/config/bundled-skills/.gitkeep +0 -0
- package/src/config/bundled-skills/agentmail/SKILL.md +128 -0
- package/src/config/bundled-skills/agentmail/icon.svg +21 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +1348 -0
- package/src/config/bundled-skills/app-builder/TOOLS.json +279 -0
- package/src/config/bundled-skills/app-builder/icon.svg +9 -0
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +15 -0
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +10 -0
- package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +11 -0
- package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +10 -0
- package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +18 -0
- package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +11 -0
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +10 -0
- package/src/config/bundled-skills/app-builder/tools/app-query.ts +10 -0
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +20 -0
- package/src/config/bundled-skills/browser/SKILL.md +28 -0
- package/src/config/bundled-skills/browser/TOOLS.json +234 -0
- package/src/config/bundled-skills/browser/tools/browser-click.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-close.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-type.ts +9 -0
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +9 -0
- package/src/config/bundled-skills/claude-code/SKILL.md +50 -0
- package/src/config/bundled-skills/claude-code/TOOLS.json +40 -0
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +9 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +17 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +326 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +9 -0
- package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +9 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +51 -0
- package/src/config/bundled-skills/google-calendar/TOOLS.json +108 -0
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +165 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +21 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +42 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +13 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +30 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +41 -0
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +18 -0
- package/src/config/bundled-skills/google-calendar/types.ts +97 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +32 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +42 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +137 -0
- package/src/config/bundled-skills/messaging/SKILL.md +126 -0
- package/src/config/bundled-skills/messaging/TOOLS.json +357 -0
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +23 -0
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +23 -0
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +25 -0
- package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +26 -0
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +25 -0
- package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +23 -0
- package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +84 -0
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +18 -0
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +124 -0
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +16 -0
- package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +49 -0
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +21 -0
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +25 -0
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +28 -0
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +29 -0
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +22 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +27 -0
- package/src/config/bundled-skills/messaging/tools/shared.ts +71 -0
- package/src/config/bundled-skills/messaging/tools/slack-add-reaction.ts +25 -0
- package/src/config/bundled-skills/messaging/tools/slack-leave-channel.ts +23 -0
- package/src/config/bundled-skills/self-upgrade/SKILL.md +74 -0
- package/src/config/bundled-skills/start-the-day/SKILL.md +70 -0
- package/src/config/bundled-skills/start-the-day/icon.svg +13 -0
- package/src/config/bundled-skills/weather/SKILL.md +37 -0
- package/src/config/bundled-skills/weather/TOOLS.json +32 -0
- package/src/config/bundled-skills/weather/icon.svg +24 -0
- package/src/config/bundled-skills/weather/tools/get-weather.ts +9 -0
- package/src/config/computer-use-prompt.ts +97 -0
- package/src/config/defaults.ts +186 -0
- package/src/config/loader.ts +336 -0
- package/src/config/schema.ts +1004 -0
- package/src/config/skill-state.ts +95 -0
- package/src/config/skills.ts +972 -0
- package/src/config/system-prompt.ts +927 -0
- package/src/config/templates/BOOTSTRAP.md +70 -0
- package/src/config/templates/IDENTITY.md +18 -0
- package/src/config/templates/LOOKS.md +25 -0
- package/src/config/templates/SOUL.md +37 -0
- package/src/config/templates/USER.md +19 -0
- package/src/config/types.ts +32 -0
- package/src/config/vellum-skills/deploy-fullstack-vercel/SKILL.md +179 -0
- package/src/config/vellum-skills/document-writer/SKILL.md +195 -0
- package/src/config/vellum-skills/google-oauth-setup/SKILL.md +194 -0
- package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +147 -0
- package/src/config/vellum-skills/telegram-setup/SKILL.md +105 -0
- package/src/contacts/contact-store.ts +410 -0
- package/src/contacts/index.ts +11 -0
- package/src/contacts/types.ts +28 -0
- package/src/context/token-estimator.ts +108 -0
- package/src/context/tool-result-truncation.ts +128 -0
- package/src/context/window-manager.ts +531 -0
- package/src/daemon/assistant-attachments.ts +679 -0
- package/src/daemon/classifier.ts +108 -0
- package/src/daemon/computer-use-session.ts +900 -0
- package/src/daemon/connection-policy.ts +41 -0
- package/src/daemon/handlers/apps.ts +446 -0
- package/src/daemon/handlers/computer-use.ts +181 -0
- package/src/daemon/handlers/config.ts +434 -0
- package/src/daemon/handlers/diagnostics.ts +334 -0
- package/src/daemon/handlers/documents.ts +184 -0
- package/src/daemon/handlers/home-base.ts +73 -0
- package/src/daemon/handlers/index.ts +355 -0
- package/src/daemon/handlers/misc.ts +323 -0
- package/src/daemon/handlers/open-bundle-handler.ts +80 -0
- package/src/daemon/handlers/publish.ts +182 -0
- package/src/daemon/handlers/sessions.ts +486 -0
- package/src/daemon/handlers/shared.ts +533 -0
- package/src/daemon/handlers/skills.ts +487 -0
- package/src/daemon/handlers/subagents.ts +122 -0
- package/src/daemon/handlers/work-items.ts +176 -0
- package/src/daemon/handlers.ts +17 -0
- package/src/daemon/history-repair.ts +214 -0
- package/src/daemon/ipc-blob-store.ts +231 -0
- package/src/daemon/ipc-contract-inventory.json +407 -0
- package/src/daemon/ipc-contract-inventory.ts +126 -0
- package/src/daemon/ipc-contract.ts +2102 -0
- package/src/daemon/ipc-protocol.ts +70 -0
- package/src/daemon/ipc-validate.ts +171 -0
- package/src/daemon/lifecycle.ts +503 -0
- package/src/daemon/main.ts +15 -0
- package/src/daemon/media-visibility-policy.ts +57 -0
- package/src/daemon/ride-shotgun-handler.ts +244 -0
- package/src/daemon/server.ts +1085 -0
- package/src/daemon/session-attachments.ts +173 -0
- package/src/daemon/session-conflict-gate.ts +219 -0
- package/src/daemon/session-dynamic-profile.ts +63 -0
- package/src/daemon/session-error.ts +269 -0
- package/src/daemon/session-evictor.ts +196 -0
- package/src/daemon/session-history.ts +437 -0
- package/src/daemon/session-memory.ts +212 -0
- package/src/daemon/session-process.ts +264 -0
- package/src/daemon/session-queue-manager.ts +81 -0
- package/src/daemon/session-runtime-assembly.ts +395 -0
- package/src/daemon/session-skill-tools.ts +237 -0
- package/src/daemon/session-slash.ts +302 -0
- package/src/daemon/session-surfaces.ts +624 -0
- package/src/daemon/session-tool-setup.ts +286 -0
- package/src/daemon/session-usage.ts +74 -0
- package/src/daemon/session-workspace.ts +19 -0
- package/src/daemon/session.ts +1651 -0
- package/src/daemon/trace-emitter.ts +82 -0
- package/src/daemon/watch-handler.ts +274 -0
- package/src/doordash/client.ts +905 -0
- package/src/doordash/queries.ts +1312 -0
- package/src/doordash/query-extractor.ts +93 -0
- package/src/doordash/session.ts +82 -0
- package/src/email/provider.ts +117 -0
- package/src/email/providers/agentmail.ts +317 -0
- package/src/email/providers/index.ts +58 -0
- package/src/email/service.ts +303 -0
- package/src/email/types.ts +126 -0
- package/src/events/bus.ts +157 -0
- package/src/events/domain-events.ts +83 -0
- package/src/events/index.ts +18 -0
- package/src/events/tool-audit-listener.ts +80 -0
- package/src/events/tool-domain-event-publisher.ts +111 -0
- package/src/events/tool-metrics-listener.ts +159 -0
- package/src/events/tool-notification-listener.ts +17 -0
- package/src/events/tool-profiling-listener.ts +158 -0
- package/src/events/tool-trace-listener.ts +75 -0
- package/src/export/formatter.ts +96 -0
- package/src/followups/followup-store.ts +166 -0
- package/src/followups/index.ts +10 -0
- package/src/followups/types.ts +23 -0
- package/src/gallery/default-gallery.ts +795 -0
- package/src/gallery/gallery-manifest.ts +24 -0
- package/src/home-base/app-link-store.ts +82 -0
- package/src/home-base/bootstrap.ts +66 -0
- package/src/home-base/prebuilt/index.html +662 -0
- package/src/home-base/prebuilt/seed-metadata.json +21 -0
- package/src/home-base/prebuilt/seed.ts +101 -0
- package/src/home-base/prebuilt-home-base-updater.ts +30 -0
- package/src/hooks/cli.ts +163 -0
- package/src/hooks/config.ts +88 -0
- package/src/hooks/discovery.ts +110 -0
- package/src/hooks/manager.ts +128 -0
- package/src/hooks/runner.ts +123 -0
- package/src/hooks/templates.ts +52 -0
- package/src/hooks/types.ts +72 -0
- package/src/index.ts +1194 -0
- package/src/instrument.ts +60 -0
- package/src/logfire.ts +99 -0
- package/src/media/gemini-image-service.ts +136 -0
- package/src/memory/account-store.ts +108 -0
- package/src/memory/admin.ts +211 -0
- package/src/memory/app-store.ts +556 -0
- package/src/memory/attachments-store.ts +453 -0
- package/src/memory/channel-delivery-store.ts +368 -0
- package/src/memory/checkpoints.ts +52 -0
- package/src/memory/clarification-resolver.ts +297 -0
- package/src/memory/conflict-store.ts +342 -0
- package/src/memory/contradiction-checker.ts +329 -0
- package/src/memory/conversation-key-store.ts +127 -0
- package/src/memory/conversation-store.ts +469 -0
- package/src/memory/db.ts +1105 -0
- package/src/memory/embedding-backend.ts +229 -0
- package/src/memory/embedding-gemini.ts +52 -0
- package/src/memory/embedding-local.ts +75 -0
- package/src/memory/embedding-ollama.ts +55 -0
- package/src/memory/embedding-openai.ts +25 -0
- package/src/memory/entity-extractor.ts +471 -0
- package/src/memory/fingerprint.ts +20 -0
- package/src/memory/indexer.ts +156 -0
- package/src/memory/items-extractor.ts +460 -0
- package/src/memory/job-handlers/backfill.ts +139 -0
- package/src/memory/job-handlers/cleanup.ts +58 -0
- package/src/memory/job-handlers/conflict.ts +99 -0
- package/src/memory/job-handlers/embedding.ts +61 -0
- package/src/memory/job-handlers/extraction.ts +123 -0
- package/src/memory/job-handlers/index-maintenance.ts +54 -0
- package/src/memory/job-handlers/summarization.ts +286 -0
- package/src/memory/job-utils.ts +170 -0
- package/src/memory/jobs-store.ts +400 -0
- package/src/memory/jobs-worker.ts +274 -0
- package/src/memory/llm-request-log-store.ts +45 -0
- package/src/memory/llm-usage-store.ts +62 -0
- package/src/memory/message-content.ts +54 -0
- package/src/memory/profile-compiler.ts +160 -0
- package/src/memory/published-pages-store.ts +137 -0
- package/src/memory/qdrant-client.ts +366 -0
- package/src/memory/qdrant-manager.ts +242 -0
- package/src/memory/query-builder.ts +45 -0
- package/src/memory/retrieval-budget.ts +30 -0
- package/src/memory/retriever.ts +653 -0
- package/src/memory/runs-store.ts +211 -0
- package/src/memory/schema.ts +529 -0
- package/src/memory/search/entity.ts +298 -0
- package/src/memory/search/formatting.ts +207 -0
- package/src/memory/search/lexical.ts +227 -0
- package/src/memory/search/ranking.ts +401 -0
- package/src/memory/search/semantic.ts +121 -0
- package/src/memory/search/types.ts +137 -0
- package/src/memory/segmenter.ts +68 -0
- package/src/memory/shared-app-links-store.ts +138 -0
- package/src/memory/tool-usage-store.ts +62 -0
- package/src/messaging/activity-analyzer.ts +76 -0
- package/src/messaging/draft-store.ts +88 -0
- package/src/messaging/index.ts +3 -0
- package/src/messaging/provider-types.ts +80 -0
- package/src/messaging/provider.ts +43 -0
- package/src/messaging/providers/gmail/adapter.ts +193 -0
- package/src/messaging/providers/gmail/client.ts +204 -0
- package/src/messaging/providers/gmail/types.ts +90 -0
- package/src/messaging/providers/slack/adapter.ts +202 -0
- package/src/messaging/providers/slack/client.ts +198 -0
- package/src/messaging/providers/slack/types.ts +119 -0
- package/src/messaging/registry.ts +34 -0
- package/src/messaging/style-analyzer.ts +158 -0
- package/src/messaging/thread-summarizer.ts +310 -0
- package/src/messaging/triage-engine.ts +321 -0
- package/src/messaging/types.ts +55 -0
- package/src/permissions/checker.ts +636 -0
- package/src/permissions/defaults.ts +243 -0
- package/src/permissions/prompter.ts +102 -0
- package/src/permissions/secret-prompter.ts +114 -0
- package/src/permissions/trust-store.ts +584 -0
- package/src/permissions/types.ts +62 -0
- package/src/playbooks/index.ts +2 -0
- package/src/playbooks/playbook-compiler.ts +90 -0
- package/src/playbooks/types.ts +55 -0
- package/src/providers/anthropic/client.ts +751 -0
- package/src/providers/failover.ts +129 -0
- package/src/providers/fireworks/client.ts +20 -0
- package/src/providers/gemini/client.ts +285 -0
- package/src/providers/ollama/client.ts +30 -0
- package/src/providers/openai/client.ts +337 -0
- package/src/providers/ratelimit.ts +93 -0
- package/src/providers/registry.ts +138 -0
- package/src/providers/retry.ts +106 -0
- package/src/providers/stream-timeout.ts +38 -0
- package/src/providers/types.ts +109 -0
- package/src/runtime/assistant-event-hub.ts +120 -0
- package/src/runtime/assistant-event.ts +82 -0
- package/src/runtime/http-server.ts +478 -0
- package/src/runtime/http-types.ts +68 -0
- package/src/runtime/routes/app-routes.ts +174 -0
- package/src/runtime/routes/attachment-routes.ts +134 -0
- package/src/runtime/routes/channel-routes.ts +342 -0
- package/src/runtime/routes/conversation-routes.ts +349 -0
- package/src/runtime/routes/run-routes.ts +223 -0
- package/src/runtime/routes/secret-routes.ts +76 -0
- package/src/runtime/run-orchestrator.ts +206 -0
- package/src/schedule/schedule-store.ts +452 -0
- package/src/schedule/scheduler.ts +168 -0
- package/src/security/encrypted-store.ts +238 -0
- package/src/security/keychain.ts +252 -0
- package/src/security/oauth2.ts +241 -0
- package/src/security/redaction.ts +89 -0
- package/src/security/secret-allowlist.ts +118 -0
- package/src/security/secret-ingress.ts +57 -0
- package/src/security/secret-scanner.ts +543 -0
- package/src/security/secure-keys.ts +180 -0
- package/src/security/token-manager.ts +141 -0
- package/src/services/published-app-updater.ts +69 -0
- package/src/services/vercel-deploy.ts +73 -0
- package/src/skills/active-skill-tools.ts +81 -0
- package/src/skills/clawhub.ts +414 -0
- package/src/skills/include-graph.ts +146 -0
- package/src/skills/managed-store.ts +233 -0
- package/src/skills/path-classifier.ts +128 -0
- package/src/skills/slash-commands.ts +174 -0
- package/src/skills/tool-manifest.ts +165 -0
- package/src/skills/version-hash.ts +110 -0
- package/src/slack/slack-webhook.ts +61 -0
- package/src/subagent/index.ts +19 -0
- package/src/subagent/manager.ts +477 -0
- package/src/subagent/types.ts +69 -0
- package/src/swarm/backend-claude-code.ts +90 -0
- package/src/swarm/index.ts +44 -0
- package/src/swarm/limits.ts +37 -0
- package/src/swarm/orchestrator.ts +279 -0
- package/src/swarm/plan-validator.ts +151 -0
- package/src/swarm/router-planner.ts +100 -0
- package/src/swarm/router-prompts.ts +36 -0
- package/src/swarm/synthesizer.ts +62 -0
- package/src/swarm/types.ts +62 -0
- package/src/swarm/worker-backend.ts +121 -0
- package/src/swarm/worker-prompts.ts +78 -0
- package/src/swarm/worker-runner.ts +164 -0
- package/src/tasks/SPEC.md +133 -0
- package/src/tasks/candidate-store.ts +86 -0
- package/src/tasks/ephemeral-permissions.ts +41 -0
- package/src/tasks/task-compiler.ts +198 -0
- package/src/tasks/task-runner.ts +85 -0
- package/src/tasks/task-scheduler.ts +20 -0
- package/src/tasks/task-store.ts +127 -0
- package/src/tools/apps/definitions.ts +59 -0
- package/src/tools/apps/executors.ts +313 -0
- package/src/tools/apps/open-proxy.ts +43 -0
- package/src/tools/apps/registry.ts +16 -0
- package/src/tools/assets/materialize.ts +218 -0
- package/src/tools/assets/search.ts +396 -0
- package/src/tools/browser/__tests__/auth-cache.test.ts +219 -0
- package/src/tools/browser/__tests__/auth-detector.test.ts +362 -0
- package/src/tools/browser/__tests__/jit-auth.test.ts +189 -0
- package/src/tools/browser/auth-cache.ts +149 -0
- package/src/tools/browser/auth-detector.ts +347 -0
- package/src/tools/browser/browser-execution.ts +979 -0
- package/src/tools/browser/browser-handoff.ts +79 -0
- package/src/tools/browser/browser-manager.ts +715 -0
- package/src/tools/browser/browser-screencast.ts +217 -0
- package/src/tools/browser/headless-browser.ts +450 -0
- package/src/tools/browser/jit-auth.ts +51 -0
- package/src/tools/browser/network-recorder.ts +348 -0
- package/src/tools/browser/network-recording-types.ts +49 -0
- package/src/tools/browser/recording-store.ts +49 -0
- package/src/tools/browser/runtime-check.ts +43 -0
- package/src/tools/claude-code/claude-code.ts +232 -0
- package/src/tools/computer-use/definitions.ts +443 -0
- package/src/tools/computer-use/registry.ts +22 -0
- package/src/tools/computer-use/request-computer-control.ts +53 -0
- package/src/tools/computer-use/skill-proxy-bridge.ts +28 -0
- package/src/tools/contacts/contact-merge.ts +87 -0
- package/src/tools/contacts/contact-search.ts +102 -0
- package/src/tools/contacts/contact-upsert.ts +137 -0
- package/src/tools/contacts/index.ts +4 -0
- package/src/tools/credentials/account-registry.ts +127 -0
- package/src/tools/credentials/broker-types.ts +107 -0
- package/src/tools/credentials/broker.ts +372 -0
- package/src/tools/credentials/domain-policy.ts +51 -0
- package/src/tools/credentials/host-pattern-match.ts +60 -0
- package/src/tools/credentials/metadata-store.ts +335 -0
- package/src/tools/credentials/policy-types.ts +52 -0
- package/src/tools/credentials/policy-validate.ts +80 -0
- package/src/tools/credentials/resolve.ts +122 -0
- package/src/tools/credentials/selection.ts +159 -0
- package/src/tools/credentials/tool-policy.ts +25 -0
- package/src/tools/credentials/vault.ts +641 -0
- package/src/tools/document/document-tool.ts +165 -0
- package/src/tools/document/editor-template.ts +237 -0
- package/src/tools/document/index.ts +5 -0
- package/src/tools/executor.ts +825 -0
- package/src/tools/filesystem/edit.ts +127 -0
- package/src/tools/filesystem/fuzzy-match.ts +202 -0
- package/src/tools/filesystem/read.ts +71 -0
- package/src/tools/filesystem/view-image.ts +199 -0
- package/src/tools/filesystem/write.ts +79 -0
- package/src/tools/followups/followup_create.ts +118 -0
- package/src/tools/followups/followup_list.ts +100 -0
- package/src/tools/followups/followup_resolve.ts +91 -0
- package/src/tools/followups/index.ts +3 -0
- package/src/tools/host-filesystem/edit.ts +125 -0
- package/src/tools/host-filesystem/read.ts +80 -0
- package/src/tools/host-filesystem/write.ts +76 -0
- package/src/tools/host-terminal/cli-discover.ts +179 -0
- package/src/tools/host-terminal/host-shell.ts +181 -0
- package/src/tools/memory/definitions.ts +69 -0
- package/src/tools/memory/handlers.ts +245 -0
- package/src/tools/memory/register.ts +66 -0
- package/src/tools/network/domain-normalize.ts +85 -0
- package/src/tools/network/script-proxy/certs.ts +237 -0
- package/src/tools/network/script-proxy/connect-tunnel.ts +82 -0
- package/src/tools/network/script-proxy/http-forwarder.ts +151 -0
- package/src/tools/network/script-proxy/index.ts +28 -0
- package/src/tools/network/script-proxy/logging.ts +196 -0
- package/src/tools/network/script-proxy/mitm-handler.ts +269 -0
- package/src/tools/network/script-proxy/policy.ts +152 -0
- package/src/tools/network/script-proxy/router.ts +60 -0
- package/src/tools/network/script-proxy/server.ts +136 -0
- package/src/tools/network/script-proxy/session-manager.ts +534 -0
- package/src/tools/network/script-proxy/types.ts +125 -0
- package/src/tools/network/url-safety.ts +227 -0
- package/src/tools/network/web-fetch.ts +701 -0
- package/src/tools/network/web-search.ts +319 -0
- package/src/tools/playbooks/index.ts +5 -0
- package/src/tools/playbooks/playbook-create.ts +140 -0
- package/src/tools/playbooks/playbook-delete.ts +76 -0
- package/src/tools/playbooks/playbook-list.ts +101 -0
- package/src/tools/playbooks/playbook-update.ts +159 -0
- package/src/tools/registry.ts +297 -0
- package/src/tools/reminder/reminder-store.ts +148 -0
- package/src/tools/reminder/reminder.ts +153 -0
- package/src/tools/schedule/create.ts +86 -0
- package/src/tools/schedule/delete.ts +54 -0
- package/src/tools/schedule/list.ts +88 -0
- package/src/tools/schedule/update.ts +97 -0
- package/src/tools/shared/filesystem/edit-engine.ts +56 -0
- package/src/tools/shared/filesystem/errors.ts +85 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +215 -0
- package/src/tools/shared/filesystem/format-diff.ts +35 -0
- package/src/tools/shared/filesystem/path-policy.ts +125 -0
- package/src/tools/shared/filesystem/size-guard.ts +41 -0
- package/src/tools/shared/filesystem/types.ts +80 -0
- package/src/tools/shared/shell-output.ts +52 -0
- package/src/tools/skills/delete-managed.ts +60 -0
- package/src/tools/skills/load.ts +139 -0
- package/src/tools/skills/sandbox-runner.ts +279 -0
- package/src/tools/skills/scaffold-managed.ts +150 -0
- package/src/tools/skills/script-contract.ts +6 -0
- package/src/tools/skills/skill-script-runner.ts +86 -0
- package/src/tools/skills/skill-tool-factory.ts +64 -0
- package/src/tools/skills/vellum-catalog.ts +217 -0
- package/src/tools/subagent/abort.ts +62 -0
- package/src/tools/subagent/index.ts +5 -0
- package/src/tools/subagent/message.ts +72 -0
- package/src/tools/subagent/read.ts +98 -0
- package/src/tools/subagent/spawn.ts +85 -0
- package/src/tools/subagent/status.ts +74 -0
- package/src/tools/swarm/delegate.ts +182 -0
- package/src/tools/system/request-permission.ts +98 -0
- package/src/tools/tasks/index.ts +25 -0
- package/src/tools/tasks/task-delete.ts +69 -0
- package/src/tools/tasks/task-list.ts +65 -0
- package/src/tools/tasks/task-run.ts +125 -0
- package/src/tools/tasks/task-save.ts +79 -0
- package/src/tools/tasks/work-item-enqueue.ts +176 -0
- package/src/tools/tasks/work-item-list.ts +86 -0
- package/src/tools/terminal/backends/docker.ts +372 -0
- package/src/tools/terminal/backends/native.ts +188 -0
- package/src/tools/terminal/backends/types.ts +26 -0
- package/src/tools/terminal/evaluate-typescript.ts +275 -0
- package/src/tools/terminal/parser.ts +393 -0
- package/src/tools/terminal/safe-env.ts +37 -0
- package/src/tools/terminal/sandbox-diagnostics.ts +149 -0
- package/src/tools/terminal/sandbox.ts +44 -0
- package/src/tools/terminal/shell.ts +257 -0
- package/src/tools/tool-manifest.ts +250 -0
- package/src/tools/types.ts +177 -0
- package/src/tools/ui-surface/definitions.ts +232 -0
- package/src/tools/ui-surface/registry.ts +14 -0
- package/src/tools/watch/screen-watch.ts +128 -0
- package/src/tools/watch/watch-state.ts +119 -0
- package/src/tools/watcher/create.ts +110 -0
- package/src/tools/watcher/delete.ts +53 -0
- package/src/tools/watcher/digest.ts +84 -0
- package/src/tools/watcher/list.ts +90 -0
- package/src/tools/watcher/update.ts +102 -0
- package/src/tools/weather/service.ts +551 -0
- package/src/usage/actors.ts +24 -0
- package/src/usage/types.ts +38 -0
- package/src/util/clipboard.ts +33 -0
- package/src/util/content-id.ts +16 -0
- package/src/util/diff.ts +181 -0
- package/src/util/errors.ts +129 -0
- package/src/util/logger.ts +243 -0
- package/src/util/platform.ts +607 -0
- package/src/util/pricing.ts +150 -0
- package/src/util/spinner.ts +51 -0
- package/src/util/time.ts +16 -0
- package/src/util/xml.ts +4 -0
- package/src/version.ts +3 -0
- package/src/watcher/constants.ts +11 -0
- package/src/watcher/engine.ts +199 -0
- package/src/watcher/provider-registry.ts +15 -0
- package/src/watcher/provider-types.ts +48 -0
- package/src/watcher/providers/gmail.ts +198 -0
- package/src/watcher/providers/google-calendar.ts +228 -0
- package/src/watcher/providers/slack.ts +128 -0
- package/src/watcher/watcher-store.ts +418 -0
- package/src/work-items/work-item-store.ts +91 -0
- package/src/workspace/git-service.ts +620 -0
- package/src/workspace/heartbeat-service.ts +288 -0
- package/src/workspace/top-level-renderer.ts +19 -0
- package/src/workspace/top-level-scanner.ts +41 -0
- package/src/workspace/turn-commit.ts +122 -0
- package/tsconfig.json +21 -0
- package/LICENSE +0 -674
- package/dist/cli.js +0 -569
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime message-injection helpers extracted from Session.
|
|
3
|
+
*
|
|
4
|
+
* These functions modify the user-message tail of the conversation
|
|
5
|
+
* before it is sent to the provider. They are pure (no side effects).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Message } from '../providers/types.js';
|
|
9
|
+
import { listAppFiles, getAppsDir } from '../memory/app-store.js';
|
|
10
|
+
import { statSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Describes the capabilities of the channel through which the user is
|
|
15
|
+
* interacting. Used to gate UI-specific references and permission asks.
|
|
16
|
+
*/
|
|
17
|
+
export interface ChannelCapabilities {
|
|
18
|
+
/** The raw channel identifier (e.g. "dashboard", "telegram", "http-api"). */
|
|
19
|
+
channel: string;
|
|
20
|
+
/** Whether this channel can render the dashboard UI (apps, dynamic pages). */
|
|
21
|
+
dashboardCapable: boolean;
|
|
22
|
+
/** Whether the channel supports dynamic UI surfaces (ui_show / ui_update). */
|
|
23
|
+
supportsDynamicUi: boolean;
|
|
24
|
+
/** Whether the channel supports voice/microphone input. */
|
|
25
|
+
supportsVoiceInput: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Derive channel capabilities from a raw source channel identifier. */
|
|
29
|
+
export function resolveChannelCapabilities(sourceChannel?: string | null): ChannelCapabilities {
|
|
30
|
+
const channel = sourceChannel ?? 'dashboard';
|
|
31
|
+
const isDashboard = channel === 'dashboard';
|
|
32
|
+
return {
|
|
33
|
+
channel,
|
|
34
|
+
dashboardCapable: isDashboard,
|
|
35
|
+
supportsDynamicUi: isDashboard,
|
|
36
|
+
supportsVoiceInput: isDashboard,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Context about the active workspace surface, passed to applyRuntimeInjections. */
|
|
41
|
+
export interface ActiveSurfaceContext {
|
|
42
|
+
surfaceId: string;
|
|
43
|
+
html: string;
|
|
44
|
+
/** When set, the surface is backed by a persisted app. */
|
|
45
|
+
appId?: string;
|
|
46
|
+
appName?: string;
|
|
47
|
+
appSchemaJson?: string;
|
|
48
|
+
/** Additional pages keyed by filename (e.g. "settings.html" → HTML content). */
|
|
49
|
+
appPages?: Record<string, string>;
|
|
50
|
+
/** The page currently displayed in the WebView (e.g. "settings.html"). */
|
|
51
|
+
currentPage?: string;
|
|
52
|
+
/** Pre-fetched list of files in the app directory. */
|
|
53
|
+
appFiles?: string[];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Append a memory-conflict clarification instruction to the last user message.
|
|
58
|
+
*/
|
|
59
|
+
export function injectClarificationRequestIntoUserMessage(message: Message, question: string): Message {
|
|
60
|
+
const instruction = [
|
|
61
|
+
'[Memory clarification request]',
|
|
62
|
+
`Ask this once in your response: ${question}`,
|
|
63
|
+
'After asking, continue helping with the current request.',
|
|
64
|
+
].join('\n');
|
|
65
|
+
return {
|
|
66
|
+
...message,
|
|
67
|
+
content: [
|
|
68
|
+
...message.content,
|
|
69
|
+
{ type: 'text', text: `\n\n${instruction}` },
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const MAX_CONTEXT_LENGTH = 100_000;
|
|
75
|
+
|
|
76
|
+
function truncateHtml(html: string, budget: number): string {
|
|
77
|
+
if (html.length <= budget) return html;
|
|
78
|
+
return html.slice(0, budget) + `\n<!-- truncated: original is ${html.length} characters -->`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Prepend workspace context so the model can refine UI surfaces.
|
|
83
|
+
* Adapts the injected rules based on whether the surface is app-backed.
|
|
84
|
+
*/
|
|
85
|
+
export function injectActiveSurfaceContext(message: Message, ctx: ActiveSurfaceContext): Message {
|
|
86
|
+
const lines: string[] = ['<active_workspace>'];
|
|
87
|
+
|
|
88
|
+
if (ctx.appId) {
|
|
89
|
+
// ── App-backed surface ──
|
|
90
|
+
lines.push(
|
|
91
|
+
`The user is viewing app "${ctx.appName ?? 'Untitled'}" (app_id: "${ctx.appId}") in workspace mode.`,
|
|
92
|
+
'',
|
|
93
|
+
'PREREQUISITE: If `app_*` tools (e.g. `app_file_edit`, `app_file_write`) are not yet available, call `skill_load` with `id: "app-builder"` first to load them.',
|
|
94
|
+
'',
|
|
95
|
+
'RULES FOR WORKSPACE MODIFICATION:',
|
|
96
|
+
`1. Use \`app_file_edit\` with app_id "${ctx.appId}" for surgical changes.`,
|
|
97
|
+
' Provide old_string (exact match) and new_string (replacement).',
|
|
98
|
+
' Include a short `status` message describing what you\'re doing (e.g. "adding dark mode styles").',
|
|
99
|
+
'2. Use `app_file_write` to create new files or fully rewrite files. Include `status`.',
|
|
100
|
+
'3. Use `app_file_read` to read any file with line numbers before editing.',
|
|
101
|
+
'4. Use `app_file_list` to see all files in the app.',
|
|
102
|
+
'5. The surface refreshes automatically after file edits — do NOT call app_update, ui_show, or ui_update.',
|
|
103
|
+
'6. NEVER respond with only text — the user expects a visual update.',
|
|
104
|
+
'7. Make ONLY the changes the user requested. Preserve existing content/styling.',
|
|
105
|
+
'8. Keep your text response to 1 brief sentence confirming what you changed.',
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
if (ctx.html.includes('data-vellum-home-base="v1"')) {
|
|
109
|
+
lines.push(
|
|
110
|
+
'9. This is the prebuilt Home Base scaffold. Preserve layout anchors:',
|
|
111
|
+
' `home-base-root`, `home-base-onboarding-lane`, and `home-base-starter-lane`.',
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// File tree with sizes (capped at 50 files to bound prompt size)
|
|
116
|
+
const files = ctx.appFiles ?? listAppFiles(ctx.appId);
|
|
117
|
+
const MAX_FILE_TREE_ENTRIES = 50;
|
|
118
|
+
const displayFiles = files.slice(0, MAX_FILE_TREE_ENTRIES);
|
|
119
|
+
lines.push('', 'App files:');
|
|
120
|
+
for (const filePath of displayFiles) {
|
|
121
|
+
let sizeLabel: string;
|
|
122
|
+
try {
|
|
123
|
+
const bytes = statSync(join(getAppsDir(), ctx.appId, filePath)).size;
|
|
124
|
+
sizeLabel = bytes < 1000 ? `${bytes} B` : `${(bytes / 1024).toFixed(1)} KB`;
|
|
125
|
+
} catch {
|
|
126
|
+
sizeLabel = '? KB';
|
|
127
|
+
}
|
|
128
|
+
lines.push(` ${filePath} (${sizeLabel})`);
|
|
129
|
+
}
|
|
130
|
+
if (files.length > MAX_FILE_TREE_ENTRIES) {
|
|
131
|
+
lines.push(` ... and ${files.length - MAX_FILE_TREE_ENTRIES} more files`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Schema metadata
|
|
135
|
+
const schema = ctx.appSchemaJson;
|
|
136
|
+
const MAX_SCHEMA_LENGTH = 10_000;
|
|
137
|
+
if (schema && schema !== '"{}"' && schema !== '{}') {
|
|
138
|
+
const truncatedSchema = schema.length > MAX_SCHEMA_LENGTH
|
|
139
|
+
? schema.slice(0, MAX_SCHEMA_LENGTH) + '… (truncated)'
|
|
140
|
+
: schema;
|
|
141
|
+
lines.push('', `Data schema: ${truncatedSchema}`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Determine which file content to show based on the currently viewed page
|
|
145
|
+
const viewingPage = ctx.currentPage && ctx.currentPage !== 'index.html' ? ctx.currentPage : null;
|
|
146
|
+
let primaryLabel = 'index.html';
|
|
147
|
+
let primaryContent = ctx.html;
|
|
148
|
+
if (viewingPage && ctx.appPages?.[viewingPage]) {
|
|
149
|
+
primaryLabel = viewingPage;
|
|
150
|
+
primaryContent = ctx.appPages[viewingPage];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Line-numbered current file content
|
|
154
|
+
const schemaSize = schema ? Math.min(schema.length, MAX_SCHEMA_LENGTH) : 0;
|
|
155
|
+
// Reduce budget by 15% to account for line-number prefix overhead (~7 chars/line)
|
|
156
|
+
let mainBudget = Math.floor((MAX_CONTEXT_LENGTH - schemaSize) * 0.85);
|
|
157
|
+
const additionalPageBlocks: string[] = [];
|
|
158
|
+
|
|
159
|
+
// Build additional page content (all pages except the primary one)
|
|
160
|
+
const otherPages: Record<string, string> = {};
|
|
161
|
+
if (viewingPage && primaryLabel !== 'index.html') {
|
|
162
|
+
otherPages['index.html'] = ctx.html;
|
|
163
|
+
}
|
|
164
|
+
if (ctx.appPages) {
|
|
165
|
+
for (const [filename, content] of Object.entries(ctx.appPages)) {
|
|
166
|
+
if (filename !== primaryLabel) {
|
|
167
|
+
otherPages[filename] = content;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (Object.keys(otherPages).length > 0) {
|
|
173
|
+
let additionalSize = 0;
|
|
174
|
+
for (const [filename, content] of Object.entries(otherPages)) {
|
|
175
|
+
additionalSize += filename.length + content.length + 30;
|
|
176
|
+
additionalPageBlocks.push(`--- ${filename} ---`, content);
|
|
177
|
+
}
|
|
178
|
+
if (additionalSize + primaryContent.length > MAX_CONTEXT_LENGTH - schemaSize) {
|
|
179
|
+
additionalPageBlocks.length = 0;
|
|
180
|
+
} else {
|
|
181
|
+
mainBudget = Math.floor((MAX_CONTEXT_LENGTH - schemaSize - additionalSize) * 0.85);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Format file content with line numbers (cat -n style)
|
|
186
|
+
const truncatedContent = truncateHtml(primaryContent, mainBudget);
|
|
187
|
+
const numberedLines = truncatedContent.split('\n').map((line, i) => {
|
|
188
|
+
const num = String(i + 1);
|
|
189
|
+
return `${num.padStart(6)}\t${line}`;
|
|
190
|
+
}).join('\n');
|
|
191
|
+
lines.push('', `--- ${primaryLabel} ---`, numberedLines);
|
|
192
|
+
|
|
193
|
+
if (additionalPageBlocks.length > 0) {
|
|
194
|
+
lines.push('', 'Additional page content:', ...additionalPageBlocks);
|
|
195
|
+
}
|
|
196
|
+
} else {
|
|
197
|
+
// ── Ephemeral surface (created via ui_show, no persisted app) ──
|
|
198
|
+
lines.push(
|
|
199
|
+
`The user is viewing a dynamic page (surface_id: "${ctx.surfaceId}") in workspace mode.`,
|
|
200
|
+
'',
|
|
201
|
+
'RULES FOR WORKSPACE MODIFICATION:',
|
|
202
|
+
`1. You MUST call \`ui_update\` with surface_id "${ctx.surfaceId}" and data.html containing`,
|
|
203
|
+
' the complete updated HTML.',
|
|
204
|
+
' NEVER respond with only text — the user expects a visual update every time they',
|
|
205
|
+
' send a message here. Even if the page appears to already show what they want,',
|
|
206
|
+
' call ui_update anyway (the user sees a broken experience when no update arrives).',
|
|
207
|
+
'2. You MAY call other tools first to gather data before calling ui_update.',
|
|
208
|
+
'3. Do NOT call ui_show — modify the existing page.',
|
|
209
|
+
'4. Make ONLY the changes the user requested. Preserve all existing content,',
|
|
210
|
+
' styling, and functionality unless explicitly asked to change them.',
|
|
211
|
+
'5. Keep your text response to 1 brief sentence confirming what you changed.',
|
|
212
|
+
'',
|
|
213
|
+
'Current HTML:',
|
|
214
|
+
truncateHtml(ctx.html, MAX_CONTEXT_LENGTH),
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
lines.push('</active_workspace>');
|
|
219
|
+
|
|
220
|
+
const block = lines.join('\n');
|
|
221
|
+
return {
|
|
222
|
+
...message,
|
|
223
|
+
content: [
|
|
224
|
+
{ type: 'text', text: block },
|
|
225
|
+
...message.content,
|
|
226
|
+
],
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Prepend channel capability context to the last user message so the
|
|
232
|
+
* model knows what the current channel can and cannot do.
|
|
233
|
+
*/
|
|
234
|
+
export function injectChannelCapabilityContext(message: Message, caps: ChannelCapabilities): Message {
|
|
235
|
+
const lines: string[] = ['<channel_capabilities>'];
|
|
236
|
+
lines.push(`channel: ${caps.channel}`);
|
|
237
|
+
lines.push(`dashboard_capable: ${caps.dashboardCapable}`);
|
|
238
|
+
lines.push(`supports_dynamic_ui: ${caps.supportsDynamicUi}`);
|
|
239
|
+
lines.push(`supports_voice_input: ${caps.supportsVoiceInput}`);
|
|
240
|
+
|
|
241
|
+
if (!caps.dashboardCapable) {
|
|
242
|
+
lines.push('');
|
|
243
|
+
lines.push('CHANNEL CONSTRAINTS:');
|
|
244
|
+
lines.push('- Do NOT reference the dashboard UI, settings panels, or visual preference pickers.');
|
|
245
|
+
lines.push('- Do NOT use ui_show, ui_update, or app_create — this channel cannot render them.');
|
|
246
|
+
lines.push('- Present information as well-formatted text instead of dynamic UI.');
|
|
247
|
+
lines.push('- Defer dashboard-specific actions (e.g. accent color selection) by telling the user');
|
|
248
|
+
lines.push(' they can complete those steps later from the desktop app.');
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (!caps.supportsVoiceInput) {
|
|
252
|
+
lines.push('- Do NOT ask the user to use voice or microphone input.');
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
lines.push('</channel_capabilities>');
|
|
256
|
+
|
|
257
|
+
const block = lines.join('\n');
|
|
258
|
+
return {
|
|
259
|
+
...message,
|
|
260
|
+
content: [
|
|
261
|
+
{ type: 'text', text: block },
|
|
262
|
+
...message.content,
|
|
263
|
+
],
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Strip `<channel_capabilities>` blocks injected by
|
|
269
|
+
* `injectChannelCapabilityContext`.
|
|
270
|
+
*/
|
|
271
|
+
export function stripChannelCapabilityContext(messages: Message[]): Message[] {
|
|
272
|
+
return messages.map((message) => {
|
|
273
|
+
if (message.role !== 'user') return message;
|
|
274
|
+
const nextContent = message.content.filter((block) => {
|
|
275
|
+
if (block.type !== 'text') return true;
|
|
276
|
+
return !block.text.startsWith('<channel_capabilities>');
|
|
277
|
+
});
|
|
278
|
+
if (nextContent.length === message.content.length) return message;
|
|
279
|
+
if (nextContent.length === 0) return null;
|
|
280
|
+
return { ...message, content: nextContent };
|
|
281
|
+
}).filter((message): message is NonNullable<typeof message> => message !== null);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Prepend workspace top-level directory context to a user message.
|
|
286
|
+
*/
|
|
287
|
+
export function injectWorkspaceTopLevelContext(message: Message, contextText: string): Message {
|
|
288
|
+
return {
|
|
289
|
+
...message,
|
|
290
|
+
content: [
|
|
291
|
+
{ type: 'text', text: contextText },
|
|
292
|
+
...message.content,
|
|
293
|
+
],
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Strip `<workspace_top_level>` blocks injected by
|
|
299
|
+
* `injectWorkspaceTopLevelContext`. Called after the agent run to prevent
|
|
300
|
+
* workspace context from persisting in session history.
|
|
301
|
+
*/
|
|
302
|
+
export function stripWorkspaceTopLevelContext(messages: Message[]): Message[] {
|
|
303
|
+
return messages.map((message) => {
|
|
304
|
+
if (message.role !== 'user') return message;
|
|
305
|
+
const nextContent = message.content.filter((block) => {
|
|
306
|
+
if (block.type !== 'text') return true;
|
|
307
|
+
return !block.text.startsWith('<workspace_top_level>');
|
|
308
|
+
});
|
|
309
|
+
if (nextContent.length === message.content.length) return message;
|
|
310
|
+
if (nextContent.length === 0) return null;
|
|
311
|
+
return { ...message, content: nextContent };
|
|
312
|
+
}).filter((message): message is NonNullable<typeof message> => message !== null);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Strip `<active_workspace>` (and legacy `<active_dynamic_page>`) blocks
|
|
317
|
+
* injected by `injectActiveSurfaceContext`. Called after the agent run to
|
|
318
|
+
* prevent the (potentially 100 KB) surface HTML from persisting in session
|
|
319
|
+
* history.
|
|
320
|
+
*/
|
|
321
|
+
export function stripActiveSurfaceContext(messages: Message[]): Message[] {
|
|
322
|
+
return messages.map((message) => {
|
|
323
|
+
if (message.role !== 'user') return message;
|
|
324
|
+
const nextContent = message.content.filter((block) => {
|
|
325
|
+
if (block.type !== 'text') return true;
|
|
326
|
+
return !block.text.startsWith('<active_workspace>') && !block.text.startsWith('<active_dynamic_page>');
|
|
327
|
+
});
|
|
328
|
+
if (nextContent.length === message.content.length) return message;
|
|
329
|
+
if (nextContent.length === 0) return null;
|
|
330
|
+
return { ...message, content: nextContent };
|
|
331
|
+
}).filter((message): message is NonNullable<typeof message> => message !== null);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Apply a chain of user-message injections to `runMessages`.
|
|
336
|
+
*
|
|
337
|
+
* Each injection is optional — pass `null`/`undefined` to skip it.
|
|
338
|
+
* Returns the final message array ready for the provider.
|
|
339
|
+
*/
|
|
340
|
+
export function applyRuntimeInjections(
|
|
341
|
+
runMessages: Message[],
|
|
342
|
+
options: {
|
|
343
|
+
softConflictInstruction?: string | null;
|
|
344
|
+
activeSurface?: ActiveSurfaceContext | null;
|
|
345
|
+
workspaceTopLevelContext?: string | null;
|
|
346
|
+
channelCapabilities?: ChannelCapabilities | null;
|
|
347
|
+
},
|
|
348
|
+
): Message[] {
|
|
349
|
+
let result = runMessages;
|
|
350
|
+
|
|
351
|
+
if (options.softConflictInstruction) {
|
|
352
|
+
const userTail = result[result.length - 1];
|
|
353
|
+
if (userTail && userTail.role === 'user') {
|
|
354
|
+
result = [
|
|
355
|
+
...result.slice(0, -1),
|
|
356
|
+
injectClarificationRequestIntoUserMessage(userTail, options.softConflictInstruction),
|
|
357
|
+
];
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (options.activeSurface) {
|
|
362
|
+
const userTail = result[result.length - 1];
|
|
363
|
+
if (userTail && userTail.role === 'user') {
|
|
364
|
+
result = [
|
|
365
|
+
...result.slice(0, -1),
|
|
366
|
+
injectActiveSurfaceContext(userTail, options.activeSurface),
|
|
367
|
+
];
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
if (options.channelCapabilities) {
|
|
372
|
+
const userTail = result[result.length - 1];
|
|
373
|
+
if (userTail && userTail.role === 'user') {
|
|
374
|
+
result = [
|
|
375
|
+
...result.slice(0, -1),
|
|
376
|
+
injectChannelCapabilityContext(userTail, options.channelCapabilities),
|
|
377
|
+
];
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Workspace top-level context is injected last so it appears first
|
|
382
|
+
// (prepended) in the user message content, keeping cache breakpoints
|
|
383
|
+
// anchored to the trailing blocks.
|
|
384
|
+
if (options.workspaceTopLevelContext) {
|
|
385
|
+
const userTail = result[result.length - 1];
|
|
386
|
+
if (userTail && userTail.role === 'user') {
|
|
387
|
+
result = [
|
|
388
|
+
...result.slice(0, -1),
|
|
389
|
+
injectWorkspaceTopLevelContext(userTail, options.workspaceTopLevelContext),
|
|
390
|
+
];
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
return result;
|
|
395
|
+
}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-time projection of active skill tools.
|
|
3
|
+
*
|
|
4
|
+
* On each agent turn the conversation history (and any pre-activated IDs from
|
|
5
|
+
* config or slash commands) determine which skills are "active". This module
|
|
6
|
+
* computes the union, loads tool manifests, registers new skill tools, tears
|
|
7
|
+
* down tools for skills that are no longer active, and returns the projected
|
|
8
|
+
* tool definitions so the agent loop can include them in the next request.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { Message, ToolDefinition } from '../providers/types.js';
|
|
12
|
+
import type { SkillSummary, SkillToolManifest } from '../config/skills.js';
|
|
13
|
+
import { loadSkillCatalog } from '../config/skills.js';
|
|
14
|
+
import { deriveActiveSkills } from '../skills/active-skill-tools.js';
|
|
15
|
+
|
|
16
|
+
import { parseToolManifestFile } from '../skills/tool-manifest.js';
|
|
17
|
+
import { computeSkillVersionHash } from '../skills/version-hash.js';
|
|
18
|
+
import { createSkillToolsFromManifest } from '../tools/skills/skill-tool-factory.js';
|
|
19
|
+
import {
|
|
20
|
+
getTool,
|
|
21
|
+
registerSkillTools,
|
|
22
|
+
unregisterSkillTools,
|
|
23
|
+
} from '../tools/registry.js';
|
|
24
|
+
import { getLogger } from '../util/logger.js';
|
|
25
|
+
import { join } from 'node:path';
|
|
26
|
+
import { existsSync } from 'node:fs';
|
|
27
|
+
|
|
28
|
+
const log = getLogger('session-skill-tools');
|
|
29
|
+
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Public types
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
export interface SkillToolProjection {
|
|
35
|
+
/** Tool definitions to append to the agent's tool list for this turn. */
|
|
36
|
+
toolDefinitions: ToolDefinition[];
|
|
37
|
+
/** Tool names that belong to currently active skills. */
|
|
38
|
+
allowedToolNames: Set<string>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ProjectSkillToolsOptions {
|
|
42
|
+
/** Skill IDs that should be treated as active regardless of history markers. */
|
|
43
|
+
preactivatedSkillIds?: string[];
|
|
44
|
+
/**
|
|
45
|
+
* Session-scoped tracking map of previously active skill IDs to their
|
|
46
|
+
* version hashes. Each session should own its own map to prevent
|
|
47
|
+
* cross-session state bleed when the daemon serves multiple concurrent
|
|
48
|
+
* sessions. When a skill's hash changes between turns, its tools are
|
|
49
|
+
* unregistered and re-registered with the updated definitions.
|
|
50
|
+
*/
|
|
51
|
+
previouslyActiveSkillIds?: Map<string, string>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Internal helpers
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Load and parse a skill's TOOLS.json manifest, returning null on any failure.
|
|
60
|
+
*/
|
|
61
|
+
function loadManifestForSkill(skill: SkillSummary): SkillToolManifest | null {
|
|
62
|
+
const manifestPath = join(skill.directoryPath, 'TOOLS.json');
|
|
63
|
+
if (!existsSync(manifestPath)) {
|
|
64
|
+
log.debug({ skillId: skill.id, manifestPath }, 'No TOOLS.json found for skill');
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
return parseToolManifestFile(manifestPath);
|
|
70
|
+
} catch (err) {
|
|
71
|
+
log.warn({ err, skillId: skill.id, manifestPath }, 'Failed to parse TOOLS.json for skill');
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Main export
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Compute the set of active skill tools for the current session turn.
|
|
82
|
+
*
|
|
83
|
+
* 1. Derives active skill IDs from conversation history markers.
|
|
84
|
+
* 2. Merges with any preactivated IDs (union).
|
|
85
|
+
* 3. For each newly-active skill, loads its TOOLS.json and registers tools.
|
|
86
|
+
* 4. For each previously-active skill that is no longer active, unregisters.
|
|
87
|
+
* 5. Returns projected tool definitions and the set of allowed tool names.
|
|
88
|
+
*/
|
|
89
|
+
export function projectSkillTools(
|
|
90
|
+
history: Message[],
|
|
91
|
+
options?: ProjectSkillToolsOptions,
|
|
92
|
+
): SkillToolProjection {
|
|
93
|
+
const contextEntries = deriveActiveSkills(history);
|
|
94
|
+
const preactivated = options?.preactivatedSkillIds ?? [];
|
|
95
|
+
const prevActive = options?.previouslyActiveSkillIds ?? new Map<string, string>();
|
|
96
|
+
|
|
97
|
+
// Index marker versions by skill ID so we can use them during registration.
|
|
98
|
+
// When a marker carries a version, it records the hash that was active at
|
|
99
|
+
// load time — useful for detecting drift without re-hashing the directory.
|
|
100
|
+
const markerVersionById = new Map<string, string>();
|
|
101
|
+
for (const entry of contextEntries) {
|
|
102
|
+
if (entry.version) {
|
|
103
|
+
markerVersionById.set(entry.id, entry.version);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Union of context-derived and preactivated IDs
|
|
108
|
+
const contextIds = contextEntries.map((e) => e.id);
|
|
109
|
+
const activeIds = new Set<string>([...contextIds, ...preactivated]);
|
|
110
|
+
|
|
111
|
+
// Determine which skills were removed since last projection
|
|
112
|
+
const removedIds = new Set<string>();
|
|
113
|
+
for (const id of prevActive.keys()) {
|
|
114
|
+
if (!activeIds.has(id)) {
|
|
115
|
+
removedIds.add(id);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Unregister tools for skills that are no longer active
|
|
120
|
+
for (const id of removedIds) {
|
|
121
|
+
log.info({ skillId: id }, 'Unregistering tools for deactivated skill');
|
|
122
|
+
unregisterSkillTools(id);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Early exit if nothing is active
|
|
126
|
+
if (activeIds.size === 0) {
|
|
127
|
+
prevActive.clear();
|
|
128
|
+
return { toolDefinitions: [], allowedToolNames: new Set() };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Load the catalog once and index by ID for efficient lookup
|
|
132
|
+
const catalog = loadSkillCatalog();
|
|
133
|
+
const catalogById = new Map<string, SkillSummary>();
|
|
134
|
+
for (const skill of catalog) {
|
|
135
|
+
catalogById.set(skill.id, skill);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const allToolDefinitions: ToolDefinition[] = [];
|
|
139
|
+
const allToolNames = new Set<string>();
|
|
140
|
+
const successfulEntries = new Map<string, string>();
|
|
141
|
+
|
|
142
|
+
for (const skillId of activeIds) {
|
|
143
|
+
const skill = catalogById.get(skillId);
|
|
144
|
+
if (!skill) {
|
|
145
|
+
log.warn({ skillId }, 'Active skill ID not found in catalog');
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const manifest = loadManifestForSkill(skill);
|
|
150
|
+
if (!manifest) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Compute the current version hash for this skill directory
|
|
155
|
+
let currentHash: string;
|
|
156
|
+
try {
|
|
157
|
+
currentHash = computeSkillVersionHash(skill.directoryPath);
|
|
158
|
+
} catch (err) {
|
|
159
|
+
log.warn({ err, skillId }, 'Failed to compute skill version hash, treating as changed');
|
|
160
|
+
currentHash = `unknown-${Date.now()}`;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Create runtime Tool objects
|
|
164
|
+
const tools = createSkillToolsFromManifest(
|
|
165
|
+
manifest.tools,
|
|
166
|
+
skillId,
|
|
167
|
+
skill.directoryPath,
|
|
168
|
+
currentHash,
|
|
169
|
+
skill.bundled,
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
if (tools.length > 0) {
|
|
173
|
+
const prevHash = prevActive.get(skillId);
|
|
174
|
+
if (prevHash === undefined) {
|
|
175
|
+
// Newly active skill — register for the first time
|
|
176
|
+
registerSkillTools(tools);
|
|
177
|
+
} else if (prevHash !== currentHash) {
|
|
178
|
+
// Hash changed — unregister stale tools, then re-register with new definitions
|
|
179
|
+
log.info({ skillId, prevHash, currentHash }, 'Skill version changed, re-registering tools');
|
|
180
|
+
unregisterSkillTools(skillId);
|
|
181
|
+
registerSkillTools(tools);
|
|
182
|
+
} else {
|
|
183
|
+
// Hash unchanged — check if the bundled status drifted (e.g. a
|
|
184
|
+
// managed skill override was added/removed with identical content).
|
|
185
|
+
// Re-register so the ownerSkillBundled flag stays accurate.
|
|
186
|
+
const existing = getTool(tools[0].name);
|
|
187
|
+
if (existing && existing.ownerSkillBundled !== (skill.bundled ?? undefined)) {
|
|
188
|
+
log.info({ skillId, bundled: skill.bundled }, 'Skill bundled status changed, re-registering tools');
|
|
189
|
+
unregisterSkillTools(skillId);
|
|
190
|
+
registerSkillTools(tools);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
successfulEntries.set(skillId, currentHash);
|
|
195
|
+
for (const tool of tools) {
|
|
196
|
+
allToolDefinitions.push(tool.getDefinition());
|
|
197
|
+
allToolNames.add(tool.name);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Unregister skills that were previously active but failed processing this
|
|
203
|
+
// turn (catalog miss, manifest failure, empty tools). Without this, the
|
|
204
|
+
// skill would be re-registered when it recovers next turn, inflating the
|
|
205
|
+
// refcount since the prior registration was never decremented.
|
|
206
|
+
for (const id of prevActive.keys()) {
|
|
207
|
+
if (activeIds.has(id) && !successfulEntries.has(id)) {
|
|
208
|
+
log.info({ skillId: id }, 'Unregistering tools for transiently-failed skill');
|
|
209
|
+
unregisterSkillTools(id);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Update the session-scoped tracking map in-place — only include skills
|
|
214
|
+
// that were successfully processed so failed skills can be retried next turn.
|
|
215
|
+
prevActive.clear();
|
|
216
|
+
for (const [id, hash] of successfulEntries) {
|
|
217
|
+
prevActive.set(id, hash);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
toolDefinitions: allToolDefinitions,
|
|
222
|
+
allowedToolNames: allToolNames,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Reset the projection state and unregister all skill tools tracked in the
|
|
228
|
+
* given map. Used for session teardown and tests.
|
|
229
|
+
*/
|
|
230
|
+
export function resetSkillToolProjection(trackedIds?: Map<string, string>): void {
|
|
231
|
+
if (trackedIds) {
|
|
232
|
+
for (const id of trackedIds.keys()) {
|
|
233
|
+
unregisterSkillTools(id);
|
|
234
|
+
}
|
|
235
|
+
trackedIds.clear();
|
|
236
|
+
}
|
|
237
|
+
}
|