@vellumai/assistant 0.3.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 +248 -0
- package/bun.lock +1723 -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 +70 -0
- package/scripts/capture-x-graphql.ts +545 -0
- package/scripts/ipc/check-contract-inventory.ts +104 -0
- package/scripts/ipc/check-swift-decoder-drift.ts +166 -0
- package/scripts/ipc/generate-swift.ts +492 -0
- package/scripts/test-filesystem-tools.sh +48 -0
- package/scripts/test.sh +127 -0
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +2485 -0
- package/src/__tests__/account-registry.test.ts +245 -0
- package/src/__tests__/active-skill-tools.test.ts +378 -0
- package/src/__tests__/agent-heartbeat-service.test.ts +250 -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 +292 -0
- package/src/__tests__/app-executors.test.ts +613 -0
- package/src/__tests__/app-git-history.test.ts +176 -0
- package/src/__tests__/app-git-service.test.ts +169 -0
- package/src/__tests__/app-open-proxy.test.ts +62 -0
- package/src/__tests__/asset-materialize-tool.test.ts +452 -0
- package/src/__tests__/asset-search-tool.test.ts +477 -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__/assistant-events-sse-hardening.test.ts +315 -0
- package/src/__tests__/attachments-store.test.ts +476 -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 +68 -0
- package/src/__tests__/browser-skill-endstate.test.ts +195 -0
- package/src/__tests__/bundle-scanner.test.ts +313 -0
- package/src/__tests__/call-bridge.test.ts +517 -0
- package/src/__tests__/call-constants.test.ts +40 -0
- package/src/__tests__/call-domain.test.ts +163 -0
- package/src/__tests__/call-orchestrator.test.ts +625 -0
- package/src/__tests__/call-recovery.test.ts +518 -0
- package/src/__tests__/call-routes-http.test.ts +699 -0
- package/src/__tests__/call-state-machine.test.ts +143 -0
- package/src/__tests__/call-state.test.ts +174 -0
- package/src/__tests__/call-store.test.ts +691 -0
- package/src/__tests__/channel-approval-routes.test.ts +2356 -0
- package/src/__tests__/channel-approval.test.ts +299 -0
- package/src/__tests__/channel-approvals.test.ts +521 -0
- package/src/__tests__/channel-delivery-store.test.ts +447 -0
- package/src/__tests__/channel-guardian.test.ts +1005 -0
- package/src/__tests__/checker.test.ts +3519 -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 +26 -0
- package/src/__tests__/clipboard.test.ts +80 -0
- package/src/__tests__/commit-guarantee.test.ts +335 -0
- package/src/__tests__/commit-message-enrichment-service.test.ts +550 -0
- package/src/__tests__/compaction.benchmark.test.ts +176 -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__/computer-use-tools.test.ts +250 -0
- package/src/__tests__/config-schema.test.ts +1462 -0
- package/src/__tests__/conflict-intent-tokenization.test.ts +141 -0
- package/src/__tests__/conflict-policy.test.ts +121 -0
- package/src/__tests__/conflict-store.test.ts +332 -0
- package/src/__tests__/connection-policy.test.ts +102 -0
- package/src/__tests__/contacts-tools.test.ts +331 -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 +314 -0
- package/src/__tests__/conversation-store.test.ts +612 -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 +583 -0
- package/src/__tests__/credential-selection.test.ts +354 -0
- package/src/__tests__/credential-vault-unit.test.ts +780 -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__/date-context.test.ts +373 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +129 -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 +152 -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__/elevenlabs-client.test.ts +271 -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 +362 -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__/filesystem-tools.test.ts +579 -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__/followup-tools.test.ts +303 -0
- package/src/__tests__/forbidden-legacy-symbols.test.ts +71 -0
- package/src/__tests__/fuzzy-match-property.test.ts +216 -0
- package/src/__tests__/fuzzy-match.test.ts +138 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +631 -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-add-trust-rule-metadata.test.ts +202 -0
- package/src/__tests__/handlers-cu-observation-blob.test.ts +352 -0
- package/src/__tests__/handlers-ipc-blob-probe.test.ts +191 -0
- package/src/__tests__/handlers-slack-config.test.ts +200 -0
- package/src/__tests__/handlers-task-submit-slash.test.ts +38 -0
- package/src/__tests__/handlers-telegram-config.test.ts +968 -0
- package/src/__tests__/handlers-twilio-config.test.ts +659 -0
- package/src/__tests__/handlers-twitter-config.test.ts +858 -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 +82 -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 +182 -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 +228 -0
- package/src/__tests__/host-file-read-tool.test.ts +123 -0
- package/src/__tests__/host-file-write-tool.test.ts +136 -0
- package/src/__tests__/host-shell-tool.test.ts +562 -0
- package/src/__tests__/ingress-reconcile.test.ts +581 -0
- package/src/__tests__/ingress-url-consistency.test.ts +214 -0
- package/src/__tests__/intent-routing.test.ts +259 -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-roundtrip.benchmark.test.ts +237 -0
- package/src/__tests__/ipc-snapshot.test.ts +1769 -0
- package/src/__tests__/ipc-validate.test.ts +407 -0
- package/src/__tests__/key-migration.test.ts +206 -0
- package/src/__tests__/keychain.test.ts +258 -0
- package/src/__tests__/llm-usage-store.test.ts +221 -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.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 +4435 -0
- package/src/__tests__/memory-retrieval-budget.test.ts +49 -0
- package/src/__tests__/memory-retrieval.benchmark.test.ts +430 -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__/oauth-callback-registry.test.ts +92 -0
- package/src/__tests__/oauth2-gateway-transport.test.ts +285 -0
- package/src/__tests__/onboarding-starter-tasks.test.ts +176 -0
- package/src/__tests__/onboarding-template-contract.test.ts +58 -0
- package/src/__tests__/openai-provider.test.ts +753 -0
- package/src/__tests__/parallel-tool.benchmark.test.ts +294 -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__/playbook-execution.test.ts +502 -0
- package/src/__tests__/playbook-tools.test.ts +340 -0
- package/src/__tests__/prebuilt-home-base-seed.test.ts +75 -0
- package/src/__tests__/pricing.test.ts +256 -0
- package/src/__tests__/profile-compiler.test.ts +374 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +342 -0
- package/src/__tests__/provider-registry-ollama.test.ts +16 -0
- package/src/__tests__/provider-streaming.benchmark.test.ts +773 -0
- package/src/__tests__/proxy-approval-callback.test.ts +601 -0
- package/src/__tests__/public-ingress-urls.test.ts +256 -0
- package/src/__tests__/qdrant-manager.test.ts +267 -0
- package/src/__tests__/ratelimit.test.ts +297 -0
- package/src/__tests__/recurrence-engine-rruleset.test.ts +175 -0
- package/src/__tests__/recurrence-engine.test.ts +78 -0
- package/src/__tests__/recurrence-types.test.ts +79 -0
- package/src/__tests__/registry.test.ts +494 -0
- package/src/__tests__/relay-server.test.ts +688 -0
- package/src/__tests__/reminder-store.test.ts +223 -0
- package/src/__tests__/reminder.test.ts +229 -0
- package/src/__tests__/request-file-tool.test.ts +158 -0
- package/src/__tests__/run-orchestrator-assistant-events.test.ts +227 -0
- package/src/__tests__/run-orchestrator.test.ts +425 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +189 -0
- package/src/__tests__/runtime-events-sse-parity.test.ts +343 -0
- package/src/__tests__/runtime-events-sse.test.ts +162 -0
- package/src/__tests__/runtime-runs-http.test.ts +438 -0
- package/src/__tests__/runtime-runs.test.ts +260 -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__/schedule-store.test.ts +484 -0
- package/src/__tests__/schedule-tools.test.ts +783 -0
- package/src/__tests__/scheduler-recurrence.test.ts +430 -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 +230 -0
- package/src/__tests__/secret-ingress-handler.test.ts +110 -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 +900 -0
- package/src/__tests__/secure-keys.test.ts +323 -0
- package/src/__tests__/server-history-render.test.ts +431 -0
- package/src/__tests__/session-abort-tool-results.test.ts +240 -0
- package/src/__tests__/session-conflict-gate.test.ts +1136 -0
- package/src/__tests__/session-error.test.ts +369 -0
- package/src/__tests__/session-evictor.test.ts +188 -0
- package/src/__tests__/session-init.benchmark.test.ts +465 -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-process-bridge.test.ts +242 -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 +1535 -0
- package/src/__tests__/session-runtime-assembly.test.ts +476 -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-surfaces-task-progress.test.ts +104 -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-identity.test.ts +256 -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 +353 -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-projection.benchmark.test.ts +338 -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-script-runner.test.ts +159 -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 +680 -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__/speaker-identification.test.ts +52 -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 +404 -0
- package/src/__tests__/subagent-tools.test.ts +801 -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 +439 -0
- package/src/__tests__/task-compiler.test.ts +284 -0
- package/src/__tests__/task-management-tools.test.ts +936 -0
- package/src/__tests__/task-runner.test.ts +216 -0
- package/src/__tests__/task-scheduler.test.ts +217 -0
- package/src/__tests__/task-tools.test.ts +595 -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__/terminal-tools.test.ts +840 -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 +113 -0
- package/src/__tests__/tool-domain-event-publisher.test.ts +253 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +500 -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-shell-integration.test.ts +301 -0
- package/src/__tests__/tool-executor.test.ts +1989 -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-permission-simulate-handler.test.ts +336 -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 +1605 -0
- package/src/__tests__/turn-commit.test.ts +554 -0
- package/src/__tests__/twilio-provider.test.ts +329 -0
- package/src/__tests__/twilio-routes-elevenlabs.test.ts +375 -0
- package/src/__tests__/twilio-routes-twiml.test.ts +127 -0
- package/src/__tests__/twilio-routes.test.ts +577 -0
- package/src/__tests__/twitter-auth-handler.test.ts +667 -0
- package/src/__tests__/twitter-cli-error-shaping.test.ts +208 -0
- package/src/__tests__/twitter-cli-routing.test.ts +252 -0
- package/src/__tests__/twitter-oauth-client.test.ts +209 -0
- package/src/__tests__/url-safety.test.ts +418 -0
- package/src/__tests__/view-image-tool.test.ts +217 -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 +1153 -0
- package/src/__tests__/workspace-heartbeat-service.test.ts +486 -0
- package/src/__tests__/workspace-lifecycle.test.ts +292 -0
- package/src/__tests__/workspace-policy.test.ts +213 -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/agent-heartbeat/agent-heartbeat-service.ts +155 -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 +295 -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/calls/call-bridge.ts +168 -0
- package/src/calls/call-constants.ts +48 -0
- package/src/calls/call-domain.ts +430 -0
- package/src/calls/call-orchestrator.ts +498 -0
- package/src/calls/call-recovery.ts +207 -0
- package/src/calls/call-state-machine.ts +68 -0
- package/src/calls/call-state.ts +87 -0
- package/src/calls/call-store.ts +422 -0
- package/src/calls/elevenlabs-client.ts +97 -0
- package/src/calls/elevenlabs-config.ts +31 -0
- package/src/calls/relay-server.ts +390 -0
- package/src/calls/speaker-identification.ts +213 -0
- package/src/calls/twilio-config.ts +45 -0
- package/src/calls/twilio-provider.ts +263 -0
- package/src/calls/twilio-rest.ts +156 -0
- package/src/calls/twilio-routes.ts +311 -0
- package/src/calls/types.ts +39 -0
- package/src/calls/voice-provider.ts +14 -0
- package/src/calls/voice-quality.ts +114 -0
- package/src/cli/autonomy.ts +188 -0
- package/src/cli/config-commands.ts +334 -0
- package/src/cli/contacts.ts +149 -0
- package/src/cli/core-commands.ts +784 -0
- package/src/cli/doordash.ts +1055 -0
- package/src/cli/email-guardrails.ts +200 -0
- package/src/cli/email.ts +405 -0
- package/src/cli/ipc-client.ts +82 -0
- package/src/cli/main-screen.tsx +53 -0
- package/src/cli/map.ts +270 -0
- package/src/cli/twitter.ts +754 -0
- package/src/cli.ts +918 -0
- package/src/commands/__tests__/cc-command-registry.test.ts +319 -0
- package/src/commands/cc-command-registry.ts +209 -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 +1404 -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/contacts/SKILL.md +39 -0
- package/src/config/bundled-skills/contacts/TOOLS.json +122 -0
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +57 -0
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +60 -0
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +66 -0
- package/src/config/bundled-skills/document/SKILL.md +26 -0
- package/src/config/bundled-skills/document/TOOLS.json +53 -0
- package/src/config/bundled-skills/document/tools/document-create.ts +9 -0
- package/src/config/bundled-skills/document/tools/document-update.ts +9 -0
- package/src/config/bundled-skills/doordash/SKILL.md +163 -0
- package/src/config/bundled-skills/followups/SKILL.md +32 -0
- package/src/config/bundled-skills/followups/TOOLS.json +100 -0
- package/src/config/bundled-skills/followups/icon.svg +24 -0
- package/src/config/bundled-skills/followups/tools/followup-create.ts +9 -0
- package/src/config/bundled-skills/followups/tools/followup-list.ts +9 -0
- package/src/config/bundled-skills/followups/tools/followup-resolve.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 +115 -0
- package/src/config/bundled-skills/macos-automation/SKILL.md +66 -0
- package/src/config/bundled-skills/messaging/SKILL.md +153 -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 +125 -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 +32 -0
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +22 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +31 -0
- package/src/config/bundled-skills/messaging/tools/shared.ts +76 -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/phone-calls/SKILL.md +533 -0
- package/src/config/bundled-skills/playbooks/SKILL.md +31 -0
- package/src/config/bundled-skills/playbooks/TOOLS.json +126 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +98 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +54 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +76 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +113 -0
- package/src/config/bundled-skills/public-ingress/SKILL.md +200 -0
- package/src/config/bundled-skills/reminder/SKILL.md +20 -0
- package/src/config/bundled-skills/reminder/TOOLS.json +67 -0
- package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +9 -0
- package/src/config/bundled-skills/reminder/tools/reminder-create.ts +9 -0
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +9 -0
- package/src/config/bundled-skills/schedule/SKILL.md +74 -0
- package/src/config/bundled-skills/schedule/TOOLS.json +135 -0
- package/src/config/bundled-skills/schedule/tools/schedule-create.ts +9 -0
- package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +9 -0
- package/src/config/bundled-skills/schedule/tools/schedule-list.ts +9 -0
- package/src/config/bundled-skills/schedule/tools/schedule-update.ts +9 -0
- package/src/config/bundled-skills/self-upgrade/SKILL.md +68 -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/subagent/SKILL.md +25 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +107 -0
- package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +9 -0
- package/src/config/bundled-skills/subagent/tools/subagent-message.ts +9 -0
- package/src/config/bundled-skills/subagent/tools/subagent-read.ts +9 -0
- package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +9 -0
- package/src/config/bundled-skills/subagent/tools/subagent-status.ts +9 -0
- package/src/config/bundled-skills/tasks/SKILL.md +28 -0
- package/src/config/bundled-skills/tasks/TOOLS.json +281 -0
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-list.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-run.ts +9 -0
- package/src/config/bundled-skills/tasks/tools/task-save.ts +9 -0
- package/src/config/bundled-skills/transcribe/SKILL.md +25 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +32 -0
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +370 -0
- package/src/config/bundled-skills/twitter/SKILL.md +220 -0
- package/src/config/bundled-skills/watcher/SKILL.md +27 -0
- package/src/config/bundled-skills/watcher/TOOLS.json +147 -0
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +9 -0
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +9 -0
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +9 -0
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +9 -0
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +9 -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 +263 -0
- package/src/config/loader.ts +339 -0
- package/src/config/schema.ts +1436 -0
- package/src/config/skill-state.ts +95 -0
- package/src/config/skills.ts +972 -0
- package/src/config/system-prompt.ts +675 -0
- package/src/config/templates/BOOTSTRAP.md +70 -0
- package/src/config/templates/IDENTITY.md +25 -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 +42 -0
- package/src/config/vellum-skills/chatgpt-import/SKILL.md +24 -0
- package/src/config/vellum-skills/chatgpt-import/TOOLS.json +23 -0
- package/src/config/vellum-skills/chatgpt-import/tools/chatgpt-import.ts +284 -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 +199 -0
- package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +153 -0
- package/src/config/vellum-skills/telegram-setup/SKILL.md +143 -0
- package/src/config/vellum-skills/twilio-setup/SKILL.md +213 -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 +691 -0
- package/src/daemon/classifier.ts +110 -0
- package/src/daemon/computer-use-session.ts +903 -0
- package/src/daemon/connection-policy.ts +41 -0
- package/src/daemon/date-context.ts +136 -0
- package/src/daemon/handlers/apps.ts +530 -0
- package/src/daemon/handlers/browser.ts +54 -0
- package/src/daemon/handlers/computer-use.ts +187 -0
- package/src/daemon/handlers/config.ts +1517 -0
- package/src/daemon/handlers/diagnostics.ts +338 -0
- package/src/daemon/handlers/documents.ts +173 -0
- package/src/daemon/handlers/home-base.ts +78 -0
- package/src/daemon/handlers/identity.ts +127 -0
- package/src/daemon/handlers/index.ts +129 -0
- package/src/daemon/handlers/misc.ts +331 -0
- package/src/daemon/handlers/open-bundle-handler.ts +80 -0
- package/src/daemon/handlers/publish.ts +187 -0
- package/src/daemon/handlers/sessions.ts +555 -0
- package/src/daemon/handlers/shared.ts +570 -0
- package/src/daemon/handlers/signing.ts +37 -0
- package/src/daemon/handlers/skills.ts +486 -0
- package/src/daemon/handlers/subagents.ts +210 -0
- package/src/daemon/handlers/twitter-auth.ts +198 -0
- package/src/daemon/handlers/work-items.ts +632 -0
- package/src/daemon/handlers/workspace-files.ts +75 -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 +495 -0
- package/src/daemon/ipc-contract-inventory.ts +126 -0
- package/src/daemon/ipc-contract.ts +2551 -0
- package/src/daemon/ipc-protocol.ts +75 -0
- package/src/daemon/ipc-validate.ts +188 -0
- package/src/daemon/lifecycle.ts +582 -0
- package/src/daemon/main.ts +21 -0
- package/src/daemon/media-visibility-policy.ts +57 -0
- package/src/daemon/ride-shotgun-handler.ts +309 -0
- package/src/daemon/server.ts +1215 -0
- package/src/daemon/session-agent-loop.ts +922 -0
- package/src/daemon/session-attachments.ts +196 -0
- package/src/daemon/session-conflict-gate.ts +184 -0
- package/src/daemon/session-dynamic-profile.ts +63 -0
- package/src/daemon/session-error.ts +290 -0
- package/src/daemon/session-evictor.ts +196 -0
- package/src/daemon/session-history.ts +437 -0
- package/src/daemon/session-lifecycle.ts +147 -0
- package/src/daemon/session-media-retry.ts +147 -0
- package/src/daemon/session-memory.ts +212 -0
- package/src/daemon/session-messaging.ts +145 -0
- package/src/daemon/session-notifiers.ts +193 -0
- package/src/daemon/session-process.ts +323 -0
- package/src/daemon/session-queue-manager.ts +82 -0
- package/src/daemon/session-runtime-assembly.ts +447 -0
- package/src/daemon/session-skill-tools.ts +356 -0
- package/src/daemon/session-slash.ts +305 -0
- package/src/daemon/session-surfaces.ts +702 -0
- package/src/daemon/session-tool-setup.ts +523 -0
- package/src/daemon/session-usage.ts +72 -0
- package/src/daemon/session-workspace.ts +19 -0
- package/src/daemon/session.ts +400 -0
- package/src/daemon/tls-certs.ts +189 -0
- package/src/daemon/trace-emitter.ts +82 -0
- package/src/daemon/video-thumbnail.ts +62 -0
- package/src/daemon/watch-handler.ts +274 -0
- package/src/doordash/client.ts +999 -0
- package/src/doordash/queries.ts +1311 -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 +98 -0
- package/src/followups/followup-store.ts +168 -0
- package/src/followups/index.ts +10 -0
- package/src/followups/types.ts +29 -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 +68 -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 +112 -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 +124 -0
- package/src/hooks/runner.ts +123 -0
- package/src/hooks/templates.ts +52 -0
- package/src/hooks/types.ts +72 -0
- package/src/inbound/public-ingress-urls.ts +123 -0
- package/src/index.ts +81 -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-git-service.ts +295 -0
- package/src/memory/app-store.ts +577 -0
- package/src/memory/attachments-store.ts +397 -0
- package/src/memory/channel-delivery-store.ts +353 -0
- package/src/memory/channel-guardian-store.ts +669 -0
- package/src/memory/checkpoints.ts +52 -0
- package/src/memory/clarification-resolver.ts +298 -0
- package/src/memory/conflict-intent.ts +157 -0
- package/src/memory/conflict-policy.ts +73 -0
- package/src/memory/conflict-store.ts +350 -0
- package/src/memory/contradiction-checker.ts +358 -0
- package/src/memory/conversation-key-store.ts +122 -0
- package/src/memory/conversation-store.ts +470 -0
- package/src/memory/db.ts +1991 -0
- package/src/memory/embedding-backend.ts +229 -0
- package/src/memory/embedding-gemini.ts +52 -0
- package/src/memory/embedding-local.ts +65 -0
- package/src/memory/embedding-ollama.ts +55 -0
- package/src/memory/embedding-openai.ts +25 -0
- package/src/memory/entity-extractor.ts +474 -0
- package/src/memory/external-conversation-store.ts +234 -0
- package/src/memory/fingerprint.ts +20 -0
- package/src/memory/indexer.ts +156 -0
- package/src/memory/items-extractor.ts +461 -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 +141 -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 +401 -0
- package/src/memory/jobs-worker.ts +313 -0
- package/src/memory/llm-request-log-store.ts +45 -0
- package/src/memory/llm-usage-store.ts +60 -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 +305 -0
- package/src/memory/schema.ts +677 -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 +52 -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/providers/telegram-bot/adapter.ts +162 -0
- package/src/messaging/providers/telegram-bot/client.ts +104 -0
- package/src/messaging/providers/telegram-bot/types.ts +15 -0
- package/src/messaging/registry.ts +35 -0
- package/src/messaging/style-analyzer.ts +159 -0
- package/src/messaging/thread-summarizer.ts +306 -0
- package/src/messaging/triage-engine.ts +323 -0
- package/src/messaging/types.ts +55 -0
- package/src/permissions/checker.ts +640 -0
- package/src/permissions/defaults.ts +254 -0
- package/src/permissions/prompter.ts +98 -0
- package/src/permissions/secret-prompter.ts +114 -0
- package/src/permissions/shell-identity.ts +227 -0
- package/src/permissions/trust-store.ts +607 -0
- package/src/permissions/types.ts +43 -0
- package/src/permissions/workspace-policy.ts +114 -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/openrouter/client.ts +20 -0
- package/src/providers/ratelimit.ts +93 -0
- package/src/providers/registry.ts +146 -0
- package/src/providers/retry.ts +81 -0
- package/src/providers/stream-timeout.ts +38 -0
- package/src/providers/types.ts +109 -0
- package/src/runtime/assistant-event-hub.ts +157 -0
- package/src/runtime/assistant-event.ts +82 -0
- package/src/runtime/channel-approval-parser.ts +60 -0
- package/src/runtime/channel-approval-types.ts +73 -0
- package/src/runtime/channel-approvals.ts +206 -0
- package/src/runtime/channel-guardian-service.ts +212 -0
- package/src/runtime/gateway-client.ts +58 -0
- package/src/runtime/http-server.ts +1076 -0
- package/src/runtime/http-types.ts +66 -0
- package/src/runtime/routes/app-routes.ts +174 -0
- package/src/runtime/routes/attachment-routes.ts +133 -0
- package/src/runtime/routes/call-routes.ts +190 -0
- package/src/runtime/routes/channel-routes.ts +1404 -0
- package/src/runtime/routes/conversation-routes.ts +352 -0
- package/src/runtime/routes/events-routes.ts +148 -0
- package/src/runtime/routes/run-routes.ts +257 -0
- package/src/runtime/routes/secret-routes.ts +76 -0
- package/src/runtime/run-orchestrator.ts +330 -0
- package/src/schedule/recurrence-engine.ts +162 -0
- package/src/schedule/recurrence-types.ts +67 -0
- package/src/schedule/schedule-store.ts +506 -0
- package/src/schedule/scheduler.ts +171 -0
- package/src/security/encrypted-store.ts +238 -0
- package/src/security/keychain.ts +252 -0
- package/src/security/oauth-callback-registry.ts +66 -0
- package/src/security/oauth2.ts +274 -0
- package/src/security/redaction.ts +89 -0
- package/src/security/secret-allowlist.ts +164 -0
- package/src/security/secret-ingress.ts +57 -0
- package/src/security/secret-scanner.ts +550 -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 +511 -0
- package/src/subagent/types.ts +69 -0
- package/src/swarm/backend-claude-code.ts +145 -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 +79 -0
- package/src/swarm/worker-runner.ts +164 -0
- package/src/tasks/SPEC.md +139 -0
- package/src/tasks/candidate-store.ts +86 -0
- package/src/tasks/ephemeral-permissions.ts +48 -0
- package/src/tasks/task-compiler.ts +199 -0
- package/src/tasks/task-runner.ts +90 -0
- package/src/tasks/task-scheduler.ts +21 -0
- package/src/tasks/task-store.ts +127 -0
- package/src/tasks/tool-sanitizer.ts +36 -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 +361 -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/api-map.ts +293 -0
- package/src/tools/browser/auth-cache.ts +149 -0
- package/src/tools/browser/auth-detector.ts +347 -0
- package/src/tools/browser/auto-navigate.ts +270 -0
- package/src/tools/browser/browser-execution.ts +980 -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 +349 -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/browser/x-auto-navigate.ts +207 -0
- package/src/tools/calls/call-end.ts +67 -0
- package/src/tools/calls/call-start.ts +81 -0
- package/src/tools/calls/call-status.ts +81 -0
- package/src/tools/claude-code/claude-code.ts +428 -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/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 +657 -0
- package/src/tools/document/document-tool.ts +92 -0
- package/src/tools/document/editor-template.ts +237 -0
- package/src/tools/execution-target.ts +21 -0
- package/src/tools/execution-timeout.ts +49 -0
- package/src/tools/executor.ts +815 -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 +76 -0
- package/src/tools/followups/followup_list.ts +60 -0
- package/src/tools/followups/followup_resolve.ts +56 -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 +180 -0
- package/src/tools/host-terminal/host-shell.ts +191 -0
- package/src/tools/memory/definitions.ts +69 -0
- package/src/tools/memory/handlers.ts +246 -0
- package/src/tools/memory/register.ts +66 -0
- package/src/tools/network/__tests__/web-search.test.ts +427 -0
- package/src/tools/network/domain-normalize.ts +85 -0
- package/src/tools/network/script-proxy/__tests__/logging.test.ts +248 -0
- package/src/tools/network/script-proxy/__tests__/policy.test.ts +234 -0
- package/src/tools/network/script-proxy/__tests__/router.test.ts +76 -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 +713 -0
- package/src/tools/network/web-search.ts +296 -0
- package/src/tools/policy-context.ts +29 -0
- package/src/tools/registry.ts +295 -0
- package/src/tools/reminder/reminder-store.ts +148 -0
- package/src/tools/reminder/reminder.ts +80 -0
- package/src/tools/schedule/create.ts +81 -0
- package/src/tools/schedule/delete.ts +28 -0
- package/src/tools/schedule/list.ts +69 -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 +33 -0
- package/src/tools/subagent/message.ts +39 -0
- package/src/tools/subagent/read.ts +67 -0
- package/src/tools/subagent/spawn.ts +46 -0
- package/src/tools/subagent/status.ts +45 -0
- package/src/tools/swarm/delegate.ts +183 -0
- package/src/tools/system/request-permission.ts +98 -0
- package/src/tools/system/version.ts +43 -0
- package/src/tools/tasks/index.ts +27 -0
- package/src/tools/tasks/task-delete.ts +82 -0
- package/src/tools/tasks/task-list.ts +44 -0
- package/src/tools/tasks/task-run.ts +97 -0
- package/src/tools/tasks/task-save.ts +47 -0
- package/src/tools/tasks/work-item-enqueue.ts +234 -0
- package/src/tools/tasks/work-item-list.ts +55 -0
- package/src/tools/tasks/work-item-remove.ts +60 -0
- package/src/tools/tasks/work-item-run.ts +78 -0
- package/src/tools/tasks/work-item-update.ts +114 -0
- package/src/tools/terminal/backends/docker.ts +372 -0
- package/src/tools/terminal/backends/native.ts +190 -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 +413 -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 +198 -0
- package/src/tools/types.ts +176 -0
- package/src/tools/ui-surface/definitions.ts +244 -0
- package/src/tools/ui-surface/registry.ts +14 -0
- package/src/tools/watch/screen-watch.ts +130 -0
- package/src/tools/watch/watch-state.ts +119 -0
- package/src/tools/watcher/create.ts +64 -0
- package/src/tools/watcher/delete.ts +27 -0
- package/src/tools/watcher/digest.ts +50 -0
- package/src/tools/watcher/list.ts +60 -0
- package/src/tools/watcher/update.ts +56 -0
- package/src/tools/weather/service.ts +551 -0
- package/src/twitter/client.ts +690 -0
- package/src/twitter/oauth-client.ts +102 -0
- package/src/twitter/router.ts +101 -0
- package/src/twitter/session.ts +91 -0
- package/src/usage/actors.ts +24 -0
- package/src/usage/types.ts +37 -0
- package/src/util/clipboard.ts +33 -0
- package/src/util/content-id.ts +16 -0
- package/src/util/debounce.ts +88 -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/network-info.ts +47 -0
- package/src/util/platform.ts +632 -0
- package/src/util/pricing.ts +150 -0
- package/src/util/promise-guard.ts +37 -0
- package/src/util/retry.ts +98 -0
- package/src/util/spinner.ts +51 -0
- package/src/util/time.ts +16 -0
- package/src/util/truncate.ts +6 -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 +129 -0
- package/src/watcher/watcher-store.ts +419 -0
- package/src/work-items/work-item-runner.ts +171 -0
- package/src/work-items/work-item-store.ts +325 -0
- package/src/workspace/commit-message-enrichment-service.ts +284 -0
- package/src/workspace/commit-message-provider.ts +95 -0
- package/src/workspace/git-service.ts +857 -0
- package/src/workspace/heartbeat-service.ts +345 -0
- package/src/workspace/provider-commit-message-generator.ts +285 -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 +175 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync, chmodSync } from 'node:fs';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { v4 as uuid } from 'uuid';
|
|
4
|
+
import { Minimatch } from 'minimatch';
|
|
5
|
+
import { getRootDir } from '../util/platform.js';
|
|
6
|
+
import { getLogger } from '../util/logger.js';
|
|
7
|
+
import { getDefaultRuleTemplates } from './defaults.js';
|
|
8
|
+
import type { TrustRule, PolicyContext } from './types.js';
|
|
9
|
+
|
|
10
|
+
const log = getLogger('trust-store');
|
|
11
|
+
|
|
12
|
+
const TRUST_FILE_VERSION = 3;
|
|
13
|
+
|
|
14
|
+
interface TrustFile {
|
|
15
|
+
version: number;
|
|
16
|
+
rules: TrustRule[];
|
|
17
|
+
/** Set to true when the user explicitly accepts the starter approval bundle. */
|
|
18
|
+
starterBundleAccepted?: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let cachedRules: TrustRule[] | null = null;
|
|
22
|
+
let cachedStarterBundleAccepted: boolean | null = null;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Cache of pre-compiled Minimatch objects keyed by pattern string.
|
|
26
|
+
* Rebuilt whenever cachedRules changes. Avoids re-parsing glob patterns
|
|
27
|
+
* on every tool-call permission check.
|
|
28
|
+
*/
|
|
29
|
+
const compiledPatterns = new Map<string, Minimatch>();
|
|
30
|
+
|
|
31
|
+
/** Get or compile a Minimatch object for the given pattern. Returns null if the pattern is invalid. */
|
|
32
|
+
function getCompiledPattern(pattern: string): Minimatch | null {
|
|
33
|
+
let compiled = compiledPatterns.get(pattern);
|
|
34
|
+
if (!compiled) {
|
|
35
|
+
if (typeof pattern !== 'string') {
|
|
36
|
+
log.warn({ pattern }, 'Cannot compile non-string pattern');
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
compiled = new Minimatch(pattern);
|
|
41
|
+
compiledPatterns.set(pattern, compiled);
|
|
42
|
+
} catch (err) {
|
|
43
|
+
log.warn({ pattern, err }, 'Failed to compile pattern');
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return compiled;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Rebuild the compiled pattern cache from the current rule set. */
|
|
51
|
+
function rebuildPatternCache(rules: TrustRule[]): void {
|
|
52
|
+
compiledPatterns.clear();
|
|
53
|
+
for (const rule of rules) {
|
|
54
|
+
if (typeof rule.pattern !== 'string') {
|
|
55
|
+
log.warn({ ruleId: rule.id, pattern: rule.pattern }, 'Skipping rule with non-string pattern during cache rebuild');
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (!compiledPatterns.has(rule.pattern)) {
|
|
59
|
+
try {
|
|
60
|
+
compiledPatterns.set(rule.pattern, new Minimatch(rule.pattern));
|
|
61
|
+
} catch (err) {
|
|
62
|
+
log.warn({ ruleId: rule.id, pattern: rule.pattern, err }, 'Skipping rule with invalid pattern during cache rebuild');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function getTrustPath(): string {
|
|
69
|
+
return join(getRootDir(), 'protected', 'trust.json');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Sort comparator: highest priority first. At the same priority, deny rules
|
|
74
|
+
* come before allow rules for safety (deny wins ties).
|
|
75
|
+
*/
|
|
76
|
+
function ruleOrder(a: TrustRule, b: TrustRule): number {
|
|
77
|
+
if (b.priority !== a.priority) return b.priority - a.priority;
|
|
78
|
+
if (a.decision !== b.decision) {
|
|
79
|
+
// deny > ask > allow
|
|
80
|
+
const order = { deny: 0, ask: 1, allow: 2 };
|
|
81
|
+
return (order[a.decision] ?? 2) - (order[b.decision] ?? 2);
|
|
82
|
+
}
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Ensure default rules are always present in the rule set.
|
|
88
|
+
* Mutates the provided array and returns whether any rules were added.
|
|
89
|
+
*/
|
|
90
|
+
function backfillDefaults(rules: TrustRule[]): boolean {
|
|
91
|
+
let changed = false;
|
|
92
|
+
const existingIds = new Set(rules.map((r) => r.id));
|
|
93
|
+
|
|
94
|
+
// Migrate old default:deny-*-protected rules → default:ask-*-protected
|
|
95
|
+
const oldDefaultPrefix = 'default:deny-';
|
|
96
|
+
const newDefaultPrefix = 'default:ask-';
|
|
97
|
+
for (let i = rules.length - 1; i >= 0; i--) {
|
|
98
|
+
const rule = rules[i];
|
|
99
|
+
if (rule.id.startsWith(oldDefaultPrefix) && rule.id.endsWith('-protected')) {
|
|
100
|
+
const newId = newDefaultPrefix + rule.id.slice(oldDefaultPrefix.length);
|
|
101
|
+
rules.splice(i, 1);
|
|
102
|
+
existingIds.delete(rule.id);
|
|
103
|
+
// Don't add newId to existingIds — let the backfill loop re-add it
|
|
104
|
+
changed = true;
|
|
105
|
+
log.info({ oldId: rule.id, newId }, 'Migrated default deny rule to ask');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Remove default rules that are no longer in the template set (e.g.
|
|
110
|
+
// computer_use_done/computer_use_respond were removed from the ask-rule list
|
|
111
|
+
// because they are terminal signal tools that don't need approval).
|
|
112
|
+
const templateIds = new Set(getDefaultRuleTemplates().map((t) => t.id));
|
|
113
|
+
for (let i = rules.length - 1; i >= 0; i--) {
|
|
114
|
+
const rule = rules[i];
|
|
115
|
+
if (rule.id.startsWith('default:') && !templateIds.has(rule.id)) {
|
|
116
|
+
rules.splice(i, 1);
|
|
117
|
+
existingIds.delete(rule.id);
|
|
118
|
+
changed = true;
|
|
119
|
+
log.info({ ruleId: rule.id }, 'Removed stale default trust rule');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Migrate existing default rules whose priority, pattern, decision, or
|
|
124
|
+
// allowHighRisk has changed in the template (e.g. host_bash pattern changed
|
|
125
|
+
// from '*' to '**', host tool priorities changed from 1000 to 50).
|
|
126
|
+
for (const template of getDefaultRuleTemplates()) {
|
|
127
|
+
if (existingIds.has(template.id)) {
|
|
128
|
+
const rule = rules.find((r) => r.id === template.id);
|
|
129
|
+
if (rule && (
|
|
130
|
+
rule.priority !== template.priority
|
|
131
|
+
|| rule.pattern !== template.pattern
|
|
132
|
+
|| rule.decision !== template.decision
|
|
133
|
+
|| rule.allowHighRisk !== template.allowHighRisk
|
|
134
|
+
)) {
|
|
135
|
+
log.info(
|
|
136
|
+
{ ruleId: rule.id, oldPriority: rule.priority, newPriority: template.priority, oldPattern: rule.pattern, newPattern: template.pattern },
|
|
137
|
+
'Migrated default rule to updated template values',
|
|
138
|
+
);
|
|
139
|
+
rule.priority = template.priority;
|
|
140
|
+
rule.pattern = template.pattern;
|
|
141
|
+
rule.decision = template.decision;
|
|
142
|
+
if (template.allowHighRisk != null) {
|
|
143
|
+
rule.allowHighRisk = template.allowHighRisk;
|
|
144
|
+
} else {
|
|
145
|
+
delete rule.allowHighRisk;
|
|
146
|
+
}
|
|
147
|
+
changed = true;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
for (const template of getDefaultRuleTemplates()) {
|
|
153
|
+
if (!existingIds.has(template.id)) {
|
|
154
|
+
const rule: TrustRule = {
|
|
155
|
+
id: template.id,
|
|
156
|
+
tool: template.tool,
|
|
157
|
+
pattern: template.pattern,
|
|
158
|
+
scope: template.scope,
|
|
159
|
+
decision: template.decision,
|
|
160
|
+
priority: template.priority,
|
|
161
|
+
createdAt: Date.now(),
|
|
162
|
+
};
|
|
163
|
+
if (template.allowHighRisk != null) {
|
|
164
|
+
rule.allowHighRisk = template.allowHighRisk;
|
|
165
|
+
}
|
|
166
|
+
rules.push(rule);
|
|
167
|
+
changed = true;
|
|
168
|
+
log.info({ ruleId: template.id }, 'Backfilled default trust rule');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return changed;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Update persisted starter-bundle rules whose pattern matches a known legacy
|
|
176
|
+
* format (e.g. the old "tool:**" prefix was changed to standalone "**").
|
|
177
|
+
* Returns true when at least one rule was updated.
|
|
178
|
+
*
|
|
179
|
+
* Only rules with a recognised legacy pattern are migrated. If a user has
|
|
180
|
+
* intentionally customised a starter rule's pattern (e.g. narrowed it), it is
|
|
181
|
+
* left untouched.
|
|
182
|
+
*/
|
|
183
|
+
function migrateStarterRulePatterns(rules: TrustRule[]): boolean {
|
|
184
|
+
const templatesByID = new Map(getStarterBundleRules().map((t) => [t.id, t]));
|
|
185
|
+
let changed = false;
|
|
186
|
+
for (const rule of rules) {
|
|
187
|
+
const template = templatesByID.get(rule.id);
|
|
188
|
+
if (!template || rule.pattern === template.pattern) continue;
|
|
189
|
+
// Only migrate patterns that match a known legacy format.
|
|
190
|
+
// The "tool:**" prefix (e.g. "file_read:**") was the original pattern
|
|
191
|
+
// before it was changed to standalone "**".
|
|
192
|
+
if (!isLegacyStarterPattern(rule.pattern, rule.tool)) continue;
|
|
193
|
+
log.info(
|
|
194
|
+
{ ruleId: rule.id, oldPattern: rule.pattern, newPattern: template.pattern },
|
|
195
|
+
'Migrated starter rule pattern to current template',
|
|
196
|
+
);
|
|
197
|
+
rule.pattern = template.pattern;
|
|
198
|
+
changed = true;
|
|
199
|
+
}
|
|
200
|
+
return changed;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** Recognises legacy starter-rule patterns that should be auto-migrated. */
|
|
204
|
+
function isLegacyStarterPattern(pattern: string, tool: string): boolean {
|
|
205
|
+
// Legacy format used "tool:**" prefixes, e.g. "file_read:**", "glob:**".
|
|
206
|
+
// Only match the exact legacy pattern for this specific tool to avoid
|
|
207
|
+
// silently resetting user-customised patterns.
|
|
208
|
+
return pattern === `${tool}:**`;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function loadFromDisk(): TrustRule[] {
|
|
212
|
+
const path = getTrustPath();
|
|
213
|
+
let rules: TrustRule[] = [];
|
|
214
|
+
let needsSave = false;
|
|
215
|
+
|
|
216
|
+
if (existsSync(path)) {
|
|
217
|
+
try {
|
|
218
|
+
const raw = readFileSync(path, 'utf-8');
|
|
219
|
+
const data = JSON.parse(raw) as TrustFile;
|
|
220
|
+
|
|
221
|
+
// Guard: ensure rules is an array (protects against hand-edited files)
|
|
222
|
+
const rawRules = Array.isArray(data.rules) ? data.rules : [];
|
|
223
|
+
|
|
224
|
+
// Restore persisted starter bundle flag
|
|
225
|
+
cachedStarterBundleAccepted = data.starterBundleAccepted === true;
|
|
226
|
+
|
|
227
|
+
if (data.version === 1) {
|
|
228
|
+
// Migration: v1 → v2. All existing rules are user-created → priority 100.
|
|
229
|
+
rules = rawRules.map((r) => ({
|
|
230
|
+
...r,
|
|
231
|
+
priority: 100,
|
|
232
|
+
}));
|
|
233
|
+
needsSave = true;
|
|
234
|
+
log.info({ ruleCount: rules.length }, 'Migrated v1 trust rules to v2 (priority=100)');
|
|
235
|
+
// Fall through to v2 → v3 migration below
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (data.version === 2 || (data.version === 1 && needsSave)) {
|
|
239
|
+
// Migration: v2 → v3. Existing rules have no principal fields,
|
|
240
|
+
// which is correct — missing principal fields act as wildcards.
|
|
241
|
+
if (data.version === 2) {
|
|
242
|
+
rules = rawRules;
|
|
243
|
+
}
|
|
244
|
+
needsSave = true;
|
|
245
|
+
log.info({ ruleCount: rules.length }, 'Migrated v2 trust rules to v3 (principal fields)');
|
|
246
|
+
} else if (data.version === TRUST_FILE_VERSION) {
|
|
247
|
+
rules = rawRules;
|
|
248
|
+
|
|
249
|
+
// Strip legacy principal-scoped fields from persisted v3 rules.
|
|
250
|
+
// Before the principal concept was removed, rules could carry
|
|
251
|
+
// principalKind/principalId/principalVersion which acted as scope
|
|
252
|
+
// constraints. Now that matching ignores those fields, leaving them
|
|
253
|
+
// on loaded rules would silently widen their scope to global
|
|
254
|
+
// wildcards. Stripping them and re-saving prevents scope escalation.
|
|
255
|
+
for (const rule of rules) {
|
|
256
|
+
const r = rule as unknown as Record<string, unknown>;
|
|
257
|
+
if ('principalKind' in r || 'principalId' in r || 'principalVersion' in r) {
|
|
258
|
+
delete r.principalKind;
|
|
259
|
+
delete r.principalId;
|
|
260
|
+
delete r.principalVersion;
|
|
261
|
+
needsSave = true;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
} else if (data.version !== 1) {
|
|
265
|
+
log.warn({ version: data.version }, 'Unknown trust file version, applying defaults in-memory only');
|
|
266
|
+
// Apply default deny rules in-memory so the assistant is still
|
|
267
|
+
// protected, but do NOT persist — we must not overwrite a newer
|
|
268
|
+
// trust file format we don't understand.
|
|
269
|
+
const memRules: TrustRule[] = [];
|
|
270
|
+
backfillDefaults(memRules);
|
|
271
|
+
memRules.sort(ruleOrder);
|
|
272
|
+
return memRules;
|
|
273
|
+
}
|
|
274
|
+
} catch (err) {
|
|
275
|
+
log.error({ err }, 'Failed to load trust file');
|
|
276
|
+
// Fall through to backfill defaults even on parse errors
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Backfill default rules at their declared priority
|
|
281
|
+
if (backfillDefaults(rules)) {
|
|
282
|
+
needsSave = true;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Migrate persisted starter rules whose pattern has drifted from the
|
|
286
|
+
// current template (e.g. old "tool:**" → "**").
|
|
287
|
+
if (migrateStarterRulePatterns(rules)) {
|
|
288
|
+
needsSave = true;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
rules.sort(ruleOrder);
|
|
292
|
+
|
|
293
|
+
if (needsSave) {
|
|
294
|
+
try {
|
|
295
|
+
saveToDisk(rules);
|
|
296
|
+
} catch (err) {
|
|
297
|
+
log.warn({ err }, 'Failed to persist migrated trust rules (continuing with in-memory rules)');
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return rules;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function saveToDisk(rules: TrustRule[]): void {
|
|
305
|
+
const path = getTrustPath();
|
|
306
|
+
const dir = dirname(path);
|
|
307
|
+
if (!existsSync(dir)) {
|
|
308
|
+
mkdirSync(dir, { recursive: true });
|
|
309
|
+
}
|
|
310
|
+
const data: TrustFile = { version: TRUST_FILE_VERSION, rules };
|
|
311
|
+
if (cachedStarterBundleAccepted) {
|
|
312
|
+
data.starterBundleAccepted = true;
|
|
313
|
+
}
|
|
314
|
+
const tmpPath = path + '.tmp.' + process.pid;
|
|
315
|
+
writeFileSync(tmpPath, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
316
|
+
renameSync(tmpPath, path);
|
|
317
|
+
// Enforce owner-only permissions even if the file already existed with
|
|
318
|
+
// wider permissions. Matches the pattern used in encrypted-store.ts.
|
|
319
|
+
chmodSync(path, 0o600);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function getRules(): TrustRule[] {
|
|
323
|
+
if (cachedRules === null) {
|
|
324
|
+
cachedRules = loadFromDisk();
|
|
325
|
+
rebuildPatternCache(cachedRules);
|
|
326
|
+
}
|
|
327
|
+
return cachedRules;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
export function addRule(
|
|
331
|
+
tool: string,
|
|
332
|
+
pattern: string,
|
|
333
|
+
scope: string,
|
|
334
|
+
decision: 'allow' | 'deny' | 'ask' = 'allow',
|
|
335
|
+
priority: number = 100,
|
|
336
|
+
options?: {
|
|
337
|
+
allowHighRisk?: boolean;
|
|
338
|
+
executionTarget?: string;
|
|
339
|
+
},
|
|
340
|
+
): TrustRule {
|
|
341
|
+
// Re-read from disk to avoid lost updates if another call modified rules
|
|
342
|
+
// between our last read and now (e.g. two rapid trust rule additions).
|
|
343
|
+
cachedRules = null;
|
|
344
|
+
const rules = [...getRules()];
|
|
345
|
+
const rule: TrustRule = {
|
|
346
|
+
id: uuid(),
|
|
347
|
+
tool,
|
|
348
|
+
pattern,
|
|
349
|
+
scope,
|
|
350
|
+
decision,
|
|
351
|
+
priority,
|
|
352
|
+
createdAt: Date.now(),
|
|
353
|
+
};
|
|
354
|
+
if (options?.allowHighRisk != null) {
|
|
355
|
+
rule.allowHighRisk = options.allowHighRisk;
|
|
356
|
+
}
|
|
357
|
+
if (options?.executionTarget != null) {
|
|
358
|
+
rule.executionTarget = options.executionTarget;
|
|
359
|
+
}
|
|
360
|
+
rules.push(rule);
|
|
361
|
+
rules.sort(ruleOrder);
|
|
362
|
+
cachedRules = rules;
|
|
363
|
+
rebuildPatternCache(rules);
|
|
364
|
+
saveToDisk(rules);
|
|
365
|
+
log.info({ rule }, 'Added trust rule');
|
|
366
|
+
return rule;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
export function updateRule(
|
|
370
|
+
id: string,
|
|
371
|
+
updates: { tool?: string; pattern?: string; scope?: string; decision?: 'allow' | 'deny' | 'ask'; priority?: number },
|
|
372
|
+
): TrustRule {
|
|
373
|
+
const defaultIds = new Set(getDefaultRuleTemplates().map((t) => t.id));
|
|
374
|
+
if (defaultIds.has(id)) throw new Error(`Cannot modify default trust rule: ${id}`);
|
|
375
|
+
|
|
376
|
+
// Re-read from disk to avoid lost updates from concurrent modifications.
|
|
377
|
+
cachedRules = null;
|
|
378
|
+
const rules = [...getRules()];
|
|
379
|
+
const index = rules.findIndex((r) => r.id === id);
|
|
380
|
+
if (index === -1) throw new Error(`Trust rule not found: ${id}`);
|
|
381
|
+
const rule = { ...rules[index] };
|
|
382
|
+
if (updates.tool != null) rule.tool = updates.tool;
|
|
383
|
+
if (updates.pattern != null) rule.pattern = updates.pattern;
|
|
384
|
+
if (updates.scope != null) rule.scope = updates.scope;
|
|
385
|
+
if (updates.decision != null) rule.decision = updates.decision;
|
|
386
|
+
if (updates.priority != null) rule.priority = updates.priority;
|
|
387
|
+
rules[index] = rule;
|
|
388
|
+
rules.sort(ruleOrder);
|
|
389
|
+
cachedRules = rules;
|
|
390
|
+
rebuildPatternCache(rules);
|
|
391
|
+
saveToDisk(rules);
|
|
392
|
+
log.info({ rule }, 'Updated trust rule');
|
|
393
|
+
return rule;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
export function removeRule(id: string): boolean {
|
|
397
|
+
const defaultIds = new Set(getDefaultRuleTemplates().map((t) => t.id));
|
|
398
|
+
if (defaultIds.has(id)) throw new Error(`Cannot remove default trust rule: ${id}`);
|
|
399
|
+
|
|
400
|
+
// Re-read from disk to avoid lost updates from concurrent modifications.
|
|
401
|
+
cachedRules = null;
|
|
402
|
+
const rules = [...getRules()];
|
|
403
|
+
const index = rules.findIndex((r) => r.id === id);
|
|
404
|
+
if (index === -1) return false;
|
|
405
|
+
rules.splice(index, 1);
|
|
406
|
+
cachedRules = rules;
|
|
407
|
+
rebuildPatternCache(rules);
|
|
408
|
+
saveToDisk(rules);
|
|
409
|
+
log.info({ id }, 'Removed trust rule');
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
function matchesScope(ruleScope: string, workingDir: string): boolean {
|
|
414
|
+
if (ruleScope === 'everywhere') return true;
|
|
415
|
+
// Strip optional trailing wildcard, then enforce a directory-boundary match
|
|
416
|
+
// so that a rule for "/path/project" does NOT match "/path/project-evil".
|
|
417
|
+
const prefix = ruleScope.replace(/\*$/, '').replace(/\/+$/, '');
|
|
418
|
+
const dir = workingDir.replace(/\/+$/, '');
|
|
419
|
+
return dir === prefix || dir.startsWith(prefix + '/');
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
function findRuleByDecision(tool: string, command: string, scope: string, decision: 'allow' | 'deny' | 'ask'): TrustRule | null {
|
|
423
|
+
const rules = getRules();
|
|
424
|
+
for (const rule of rules) {
|
|
425
|
+
if (rule.tool !== tool) continue;
|
|
426
|
+
if (rule.decision !== decision) continue;
|
|
427
|
+
const compiled = getCompiledPattern(rule.pattern);
|
|
428
|
+
if (!compiled || !compiled.match(command)) continue;
|
|
429
|
+
if (!matchesScope(rule.scope, scope)) continue;
|
|
430
|
+
return rule;
|
|
431
|
+
}
|
|
432
|
+
return null;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Check whether a rule's executionTarget constraint matches the context.
|
|
437
|
+
*
|
|
438
|
+
* If the rule does not specify an executionTarget it matches any target
|
|
439
|
+
* (wildcard). If specified, it must match exactly.
|
|
440
|
+
*/
|
|
441
|
+
function matchesExecutionTarget(rule: TrustRule, ctx?: PolicyContext): boolean {
|
|
442
|
+
if (rule.executionTarget == null) return true;
|
|
443
|
+
return ctx?.executionTarget === rule.executionTarget;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Find the highest-priority rule that matches any of the command candidates.
|
|
448
|
+
* Rules are pre-sorted by priority descending, so the first match wins.
|
|
449
|
+
*
|
|
450
|
+
* When a `PolicyContext` is provided, rules that specify executionTarget
|
|
451
|
+
* constraints are filtered accordingly. Rules without those constraints
|
|
452
|
+
* act as wildcards and match any context.
|
|
453
|
+
*/
|
|
454
|
+
export function findHighestPriorityRule(tool: string, commands: string[], scope: string, ctx?: PolicyContext): TrustRule | null {
|
|
455
|
+
// Check ephemeral (task-scoped) rules first — they take precedence over
|
|
456
|
+
// file-based rules at the same priority because they are evaluated earlier.
|
|
457
|
+
// The ruleOrder sort (highest priority first, deny wins ties) still applies
|
|
458
|
+
// across the combined set because ephemeral rules use a lower default
|
|
459
|
+
// priority (50) than user rules (100), so user deny rules still win.
|
|
460
|
+
const ephemeral = ctx?.ephemeralRules ?? [];
|
|
461
|
+
const fileRules = getRules();
|
|
462
|
+
|
|
463
|
+
// Concatenate and re-sort so priority ordering is respected across both sets.
|
|
464
|
+
const allRules = ephemeral.length > 0
|
|
465
|
+
? [...ephemeral, ...fileRules].sort(ruleOrder)
|
|
466
|
+
: fileRules;
|
|
467
|
+
|
|
468
|
+
for (const rule of allRules) {
|
|
469
|
+
if (rule.tool !== tool) continue;
|
|
470
|
+
if (!matchesScope(rule.scope, scope)) continue;
|
|
471
|
+
if (!matchesExecutionTarget(rule, ctx)) continue;
|
|
472
|
+
const compiled = getCompiledPattern(rule.pattern);
|
|
473
|
+
if (!compiled) continue;
|
|
474
|
+
for (const command of commands) {
|
|
475
|
+
if (compiled.match(command)) {
|
|
476
|
+
return rule;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
return null;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
export function findMatchingRule(tool: string, command: string, scope: string): TrustRule | null {
|
|
484
|
+
return findRuleByDecision(tool, command, scope, 'allow');
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
export function findDenyRule(tool: string, command: string, scope: string): TrustRule | null {
|
|
488
|
+
return findRuleByDecision(tool, command, scope, 'deny');
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
export function getAllRules(): TrustRule[] {
|
|
492
|
+
return [...getRules()];
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
export function clearAllRules(): void {
|
|
496
|
+
// Reset the starter bundle flag so the bundle can be re-accepted after clear.
|
|
497
|
+
cachedStarterBundleAccepted = false;
|
|
498
|
+
// Re-backfill default rules so protected directory stays guarded.
|
|
499
|
+
const rules: TrustRule[] = [];
|
|
500
|
+
backfillDefaults(rules);
|
|
501
|
+
rules.sort(ruleOrder);
|
|
502
|
+
cachedRules = rules;
|
|
503
|
+
rebuildPatternCache(rules);
|
|
504
|
+
saveToDisk(rules);
|
|
505
|
+
log.info('Cleared all user trust rules (default rules preserved)');
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
export function clearCache(): void {
|
|
509
|
+
cachedRules = null;
|
|
510
|
+
cachedStarterBundleAccepted = null;
|
|
511
|
+
compiledPatterns.clear();
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// ─── Starter approval bundle ────────────────────────────────────────────────
|
|
515
|
+
//
|
|
516
|
+
// A curated set of low-risk tool rules that most users would approve
|
|
517
|
+
// individually during normal use. Accepting the bundle seeds them all at
|
|
518
|
+
// once, reducing prompt noise in strict mode while keeping the action
|
|
519
|
+
// explicitly opt-in.
|
|
520
|
+
|
|
521
|
+
export interface StarterBundleRule {
|
|
522
|
+
id: string;
|
|
523
|
+
tool: string;
|
|
524
|
+
pattern: string;
|
|
525
|
+
scope: string;
|
|
526
|
+
decision: 'allow';
|
|
527
|
+
priority: number;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Returns the starter bundle rule definitions. These cover read-only and
|
|
532
|
+
* information-gathering tools that never mutate the filesystem or execute
|
|
533
|
+
* arbitrary code.
|
|
534
|
+
*/
|
|
535
|
+
export function getStarterBundleRules(): StarterBundleRule[] {
|
|
536
|
+
return [
|
|
537
|
+
// Use standalone "**" globstar — minimatch only treats ** as globstar when
|
|
538
|
+
// it is its own path segment, so a "tool:**" prefix would collapse to
|
|
539
|
+
// single-star behavior and fail to match candidates containing "/".
|
|
540
|
+
// The tool field is already filtered by findHighestPriorityRule.
|
|
541
|
+
{ id: 'starter:allow-file_read', tool: 'file_read', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
|
|
542
|
+
{ id: 'starter:allow-glob', tool: 'glob', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
|
|
543
|
+
{ id: 'starter:allow-grep', tool: 'grep', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
|
|
544
|
+
{ id: 'starter:allow-list_directory', tool: 'list_directory', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
|
|
545
|
+
{ id: 'starter:allow-web_search', tool: 'web_search', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
|
|
546
|
+
{ id: 'starter:allow-web_fetch', tool: 'web_fetch', pattern: '**', scope: 'everywhere', decision: 'allow', priority: 90 },
|
|
547
|
+
];
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/** Whether the user has previously accepted the starter bundle. */
|
|
551
|
+
export function isStarterBundleAccepted(): boolean {
|
|
552
|
+
// Ensure rules are loaded (which also loads the flag from disk)
|
|
553
|
+
getRules();
|
|
554
|
+
return cachedStarterBundleAccepted === true;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
export interface AcceptStarterBundleResult {
|
|
558
|
+
accepted: boolean;
|
|
559
|
+
rulesAdded: number;
|
|
560
|
+
alreadyAccepted: boolean;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* Seed the trust store with the starter bundle rules.
|
|
565
|
+
*
|
|
566
|
+
* Idempotent: if the bundle was already accepted, no rules are added and
|
|
567
|
+
* `alreadyAccepted` is returned as true. Rules whose IDs already exist
|
|
568
|
+
* (e.g. from a previous partial acceptance) are skipped individually.
|
|
569
|
+
*/
|
|
570
|
+
export function acceptStarterBundle(): AcceptStarterBundleResult {
|
|
571
|
+
// Re-read from disk to avoid lost updates.
|
|
572
|
+
// loadFromDisk() also runs migrateStarterRulePatterns() to fix any
|
|
573
|
+
// stale patterns (e.g. old "tool:**" → "**") before we get here.
|
|
574
|
+
cachedRules = null;
|
|
575
|
+
cachedStarterBundleAccepted = null;
|
|
576
|
+
const rules = [...getRules()];
|
|
577
|
+
|
|
578
|
+
if (cachedStarterBundleAccepted === true) {
|
|
579
|
+
return { accepted: true, rulesAdded: 0, alreadyAccepted: true };
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
const existingIds = new Set(rules.map((r) => r.id));
|
|
583
|
+
let added = 0;
|
|
584
|
+
|
|
585
|
+
for (const template of getStarterBundleRules()) {
|
|
586
|
+
if (existingIds.has(template.id)) continue;
|
|
587
|
+
rules.push({
|
|
588
|
+
id: template.id,
|
|
589
|
+
tool: template.tool,
|
|
590
|
+
pattern: template.pattern,
|
|
591
|
+
scope: template.scope,
|
|
592
|
+
decision: template.decision,
|
|
593
|
+
priority: template.priority,
|
|
594
|
+
createdAt: Date.now(),
|
|
595
|
+
});
|
|
596
|
+
added++;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
cachedStarterBundleAccepted = true;
|
|
600
|
+
rules.sort(ruleOrder);
|
|
601
|
+
cachedRules = rules;
|
|
602
|
+
rebuildPatternCache(rules);
|
|
603
|
+
saveToDisk(rules);
|
|
604
|
+
log.info({ rulesAdded: added }, 'Starter approval bundle accepted');
|
|
605
|
+
|
|
606
|
+
return { accepted: true, rulesAdded: added, alreadyAccepted: false };
|
|
607
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export enum RiskLevel {
|
|
2
|
+
Low = 'low',
|
|
3
|
+
Medium = 'medium',
|
|
4
|
+
High = 'high',
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface TrustRule {
|
|
8
|
+
id: string;
|
|
9
|
+
tool: string;
|
|
10
|
+
pattern: string;
|
|
11
|
+
scope: string;
|
|
12
|
+
decision: 'allow' | 'deny' | 'ask';
|
|
13
|
+
priority: number;
|
|
14
|
+
createdAt: number;
|
|
15
|
+
executionTarget?: string;
|
|
16
|
+
allowHighRisk?: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type UserDecision = 'allow' | 'always_allow' | 'always_allow_high_risk' | 'deny' | 'always_deny';
|
|
20
|
+
|
|
21
|
+
export interface PermissionCheckResult {
|
|
22
|
+
decision: 'allow' | 'deny' | 'prompt';
|
|
23
|
+
reason: string;
|
|
24
|
+
matchedRule?: TrustRule;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface AllowlistOption {
|
|
28
|
+
label: string;
|
|
29
|
+
description: string;
|
|
30
|
+
pattern: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ScopeOption {
|
|
34
|
+
label: string;
|
|
35
|
+
scope: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Contextual information passed alongside a permission check for policy decisions. */
|
|
39
|
+
export interface PolicyContext {
|
|
40
|
+
executionTarget?: string;
|
|
41
|
+
/** Ephemeral rules for task-scoped permissions — checked before persistent trust.json rules. */
|
|
42
|
+
ephemeralRules?: TrustRule[];
|
|
43
|
+
}
|