@vellumai/assistant 0.4.26 → 0.4.29
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/.env.example +2 -2
- package/AGENTS.md +5 -0
- package/ARCHITECTURE.md +169 -69
- package/Dockerfile +1 -1
- package/README.md +111 -112
- package/bun.lock +0 -3
- package/docs/architecture/integrations.md +0 -1
- package/docs/architecture/memory.md +100 -63
- package/docs/error-handling.md +71 -0
- package/docs/runbook-trusted-contacts.md +10 -9
- package/docs/trusted-contact-access.md +48 -46
- package/package.json +3 -3
- package/scripts/compare-benchmarks.sh +12 -5
- package/scripts/ipc/check-swift-decoder-drift.ts +3 -0
- package/scripts/test.sh +89 -5
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +46 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/account-registry.test.ts +1 -1
- package/src/__tests__/actor-token-service.test.ts +36 -23
- package/src/__tests__/agent-loop-thinking.test.ts +29 -13
- package/src/__tests__/agent-loop.test.ts +2 -1
- package/src/__tests__/app-builder-tool-scripts.test.ts +1 -1
- package/src/__tests__/approval-routes-http.test.ts +2 -2
- package/src/__tests__/asset-materialize-tool.test.ts +7 -7
- package/src/__tests__/asset-search-tool.test.ts +7 -7
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +217 -0
- package/src/__tests__/call-controller.test.ts +99 -69
- package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +113 -70
- package/src/__tests__/channel-guardian.test.ts +173 -282
- package/src/__tests__/channel-readiness-service.test.ts +6 -2
- package/src/__tests__/channel-reply-delivery.test.ts +2 -2
- package/src/__tests__/channel-retry-sweep.test.ts +14 -14
- package/src/__tests__/checker.test.ts +12 -31
- package/src/__tests__/claude-code-tool-profiles.test.ts +1 -1
- package/src/__tests__/commit-message-enrichment-service.test.ts +67 -59
- package/src/__tests__/compaction.benchmark.test.ts +6 -2
- package/src/__tests__/computer-use-tools.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +66 -7
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -29
- package/src/__tests__/contacts-tools.test.ts +63 -2
- package/src/__tests__/context-overflow-approval.test.ts +141 -0
- package/src/__tests__/context-overflow-policy.test.ts +171 -0
- package/src/__tests__/context-overflow-reducer.test.ts +533 -0
- package/src/__tests__/context-window-manager.test.ts +97 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +38 -46
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +214 -10
- package/src/__tests__/conversation-routes.test.ts +4 -7
- package/src/__tests__/credential-broker-browser-fill.test.ts +13 -2
- package/src/__tests__/credential-security-e2e.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +1 -1
- package/src/__tests__/credential-vault-unit.test.ts +1 -1
- package/src/__tests__/credential-vault.test.ts +11 -8
- package/src/__tests__/daemon-lifecycle.test.ts +2 -2
- package/src/__tests__/daemon-server-session-init.test.ts +6 -6
- package/src/__tests__/delete-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +4 -0
- package/src/__tests__/encrypted-store.test.ts +10 -7
- package/src/__tests__/ephemeral-permissions.test.ts +3 -3
- package/src/__tests__/file-edit-tool.test.ts +1 -1
- package/src/__tests__/file-read-tool.test.ts +1 -1
- package/src/__tests__/file-write-tool.test.ts +1 -1
- package/src/__tests__/fixtures/credential-security-fixtures.ts +87 -64
- package/src/__tests__/fixtures/media-reuse-fixtures.ts +37 -31
- package/src/__tests__/fixtures/mock-signup-server.ts +171 -115
- package/src/__tests__/fixtures/proxy-fixtures.ts +39 -39
- package/src/__tests__/followup-tools.test.ts +1 -1
- package/src/__tests__/gateway-only-guard.test.ts +3 -0
- package/src/__tests__/guardian-actions-endpoint.test.ts +543 -1
- package/src/__tests__/guardian-control-plane-policy.test.ts +15 -15
- package/src/__tests__/guardian-dispatch.test.ts +79 -1
- package/src/__tests__/guardian-grant-minting.test.ts +14 -14
- package/src/__tests__/guardian-outbound-http.test.ts +1 -2
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -41
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -5
- package/src/__tests__/guardian-routing-state.test.ts +36 -52
- package/src/__tests__/guardian-verification-intent-routing.test.ts +4 -6
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
- package/src/__tests__/handle-user-message-secret-resume.test.ts +39 -1
- package/src/__tests__/handlers-cu-observation-blob.test.ts +21 -10
- package/src/__tests__/handlers-telegram-config.test.ts +14 -14
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +23 -2
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-navigate.test.ts +1 -1
- package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
- package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +45 -2
- package/src/__tests__/host-file-edit-tool.test.ts +1 -1
- package/src/__tests__/host-file-read-tool.test.ts +1 -1
- package/src/__tests__/host-file-write-tool.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/inbound-invite-redemption.test.ts +16 -18
- package/src/__tests__/ingress-reconcile.test.ts +2 -2
- package/src/__tests__/ingress-routes-http.test.ts +2 -1
- package/src/__tests__/integrations-cli.test.ts +256 -0
- package/src/__tests__/intent-routing.test.ts +4 -5
- package/src/__tests__/invite-redemption-service.test.ts +4 -3
- package/src/__tests__/ipc-snapshot.test.ts +28 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -1
- package/src/__tests__/mcp-cli.test.ts +136 -57
- package/src/__tests__/mcp-client-auth.test.ts +95 -0
- package/src/__tests__/media-generate-image.test.ts +2 -2
- package/src/__tests__/media-reuse-story.e2e.test.ts +8 -8
- package/src/__tests__/memory-regressions.test.ts +6 -6
- package/src/__tests__/messaging-send-tool.test.ts +1 -1
- package/src/__tests__/migration-cross-version-compatibility.test.ts +1855 -0
- package/src/__tests__/migration-export-http.test.ts +540 -0
- package/src/__tests__/migration-import-commit-http.test.ts +823 -0
- package/src/__tests__/migration-import-preflight-http.test.ts +755 -0
- package/src/__tests__/migration-parity-persistence.test.ts +1854 -0
- package/src/__tests__/migration-transport.test.ts +904 -0
- package/src/__tests__/migration-validate-http.test.ts +698 -0
- package/src/__tests__/migration-wizard.test.ts +1289 -0
- package/src/__tests__/non-member-access-request.test.ts +17 -17
- package/src/__tests__/notification-decision-strategy.test.ts +110 -2
- package/src/__tests__/notification-deep-link.test.ts +18 -0
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/oauth2-gateway-transport.test.ts +1 -1
- package/src/__tests__/playbook-execution.test.ts +1 -1
- package/src/__tests__/playbook-tools.test.ts +1 -1
- package/src/__tests__/provider-streaming.benchmark.test.ts +3 -1
- package/src/__tests__/proxy-approval-callback.test.ts +1 -1
- package/src/__tests__/qdrant-manager.test.ts +40 -11
- package/src/__tests__/rebind-secrets-screen.test.ts +839 -0
- package/src/__tests__/recording-handler.test.ts +2 -2
- package/src/__tests__/recording-intent-handler.test.ts +3 -3
- package/src/__tests__/recording-state-machine.test.ts +2 -2
- package/src/__tests__/relay-server.test.ts +506 -227
- package/src/__tests__/reminder-store.test.ts +8 -0
- package/src/__tests__/reminder.test.ts +8 -0
- package/src/__tests__/{resolve-guardian-trust-class.test.ts → resolve-trust-class.test.ts} +11 -17
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/schedule-tools.test.ts +1 -1
- package/src/__tests__/script-proxy-certs.test.ts +1 -1
- package/src/__tests__/script-proxy-connect-tunnel.test.ts +2 -3
- package/src/__tests__/script-proxy-decision-trace.test.ts +2 -2
- package/src/__tests__/script-proxy-http-forwarder.test.ts +1 -1
- package/src/__tests__/script-proxy-injection-runtime.test.ts +5 -5
- package/src/__tests__/script-proxy-mitm-handler.test.ts +4 -4
- package/src/__tests__/script-proxy-policy-runtime.test.ts +2 -2
- package/src/__tests__/script-proxy-policy.test.ts +2 -2
- package/src/__tests__/script-proxy-session-manager.test.ts +4 -7
- package/src/__tests__/script-proxy-session-runtime.test.ts +1 -6
- package/src/__tests__/secret-onetime-send.test.ts +4 -4
- package/src/__tests__/secret-scanner-executor.test.ts +2 -2
- package/src/__tests__/send-endpoint-busy.test.ts +11 -9
- package/src/__tests__/send-notification-tool.test.ts +2 -2
- package/src/__tests__/session-abort-tool-results.test.ts +17 -2
- package/src/__tests__/session-agent-loop.test.ts +456 -35
- package/src/__tests__/session-confirmation-signals.test.ts +3 -2
- package/src/__tests__/session-conflict-gate.test.ts +20 -3
- package/src/__tests__/session-init.benchmark.test.ts +2 -2
- package/src/__tests__/session-load-history-repair.test.ts +7 -7
- package/src/__tests__/session-pre-run-repair.test.ts +17 -2
- package/src/__tests__/session-profile-injection.test.ts +20 -3
- package/src/__tests__/session-provider-retry-repair.test.ts +86 -6
- package/src/__tests__/session-queue.test.ts +33 -18
- package/src/__tests__/session-runtime-assembly.test.ts +147 -1
- package/src/__tests__/session-runtime-workspace.test.ts +40 -0
- package/src/__tests__/session-slash-known.test.ts +21 -3
- package/src/__tests__/session-slash-queue.test.ts +17 -2
- package/src/__tests__/session-slash-unknown.test.ts +17 -2
- package/src/__tests__/session-surfaces-deselection.test.ts +208 -0
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -2
- package/src/__tests__/session-workspace-injection.test.ts +17 -2
- package/src/__tests__/session-workspace-tool-tracking.test.ts +17 -2
- package/src/__tests__/shell-credential-ref.test.ts +1 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -1
- package/src/__tests__/skill-load-tool.test.ts +1 -1
- package/src/__tests__/skill-script-runner-host.test.ts +1 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -1
- package/src/__tests__/skill-script-runner.test.ts +1 -1
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/slack-skill.test.ts +3 -2
- package/src/__tests__/subagent-tools.test.ts +3 -3
- package/src/__tests__/swarm-recursion.test.ts +1 -1
- package/src/__tests__/swarm-session-integration.test.ts +1 -1
- package/src/__tests__/swarm-tool.test.ts +1 -1
- package/src/__tests__/task-management-tools.test.ts +1 -1
- package/src/__tests__/task-tools.test.ts +1 -1
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-support/browser-skill-harness.ts +39 -27
- package/src/__tests__/test-support/computer-use-skill-harness.ts +14 -14
- package/src/__tests__/tool-approval-handler.test.ts +15 -15
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +23 -182
- package/src/__tests__/tool-grant-request-escalation.test.ts +11 -11
- package/src/__tests__/tool-permission-simulate-handler.test.ts +4 -4
- package/src/__tests__/transfer-progress-screen.test.ts +1180 -0
- package/src/__tests__/trust-context-guards.test.ts +25 -29
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +23 -21
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +37 -40
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +29 -25
- package/src/__tests__/trusted-contact-multichannel.test.ts +25 -24
- package/src/__tests__/trusted-contact-verification.test.ts +63 -77
- package/src/__tests__/turn-commit.test.ts +18 -18
- package/src/__tests__/twilio-provider.test.ts +7 -7
- package/src/__tests__/validation-results-screen.test.ts +1107 -0
- package/src/__tests__/view-image-tool.test.ts +1 -1
- package/src/__tests__/voice-invite-redemption.test.ts +3 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +12 -12
- package/src/__tests__/voice-session-bridge.test.ts +24 -24
- package/src/agent/attachments.ts +3 -1
- package/src/agent/loop.ts +13 -13
- package/src/agent/message-types.ts +13 -7
- package/src/amazon/cart.ts +59 -32
- package/src/amazon/checkout.ts +25 -14
- package/src/amazon/client.ts +68 -48
- package/src/amazon/product-details.ts +3 -3
- package/src/amazon/request-extractor.ts +46 -31
- package/src/amazon/search.ts +6 -4
- package/src/amazon/session.ts +33 -24
- package/src/approvals/AGENTS.md +26 -0
- package/src/approvals/approval-primitive.ts +87 -64
- package/src/approvals/guardian-decision-primitive.ts +172 -81
- package/src/approvals/guardian-request-resolvers.ts +262 -155
- package/src/autonomy/autonomy-resolver.ts +7 -5
- package/src/autonomy/autonomy-store.ts +34 -19
- package/src/autonomy/disposition-mapper.ts +5 -5
- package/src/autonomy/index.ts +6 -6
- package/src/autonomy/types.ts +7 -3
- package/src/browser-extension-relay/client.ts +50 -19
- package/src/browser-extension-relay/protocol.ts +11 -11
- package/src/browser-extension-relay/server.ts +45 -20
- package/src/bundler/app-bundler.ts +75 -50
- package/src/bundler/bundle-scanner.ts +145 -41
- package/src/bundler/bundle-signer.ts +16 -14
- package/src/bundler/signature-verifier.ts +36 -33
- package/src/calls/call-constants.ts +10 -3
- package/src/calls/call-controller.ts +473 -214
- package/src/calls/call-conversation-messages.ts +25 -15
- package/src/calls/call-domain.ts +401 -148
- package/src/calls/call-pointer-message-composer.ts +26 -21
- package/src/calls/call-pointer-messages.ts +52 -28
- package/src/calls/call-recovery.ts +53 -37
- package/src/calls/call-state-machine.ts +37 -7
- package/src/calls/call-state.ts +35 -13
- package/src/calls/call-store.ts +165 -77
- package/src/calls/elevenlabs-client.ts +39 -20
- package/src/calls/guardian-action-sweep.ts +42 -24
- package/src/calls/guardian-dispatch.ts +79 -56
- package/src/calls/guardian-question-copy.ts +28 -23
- package/src/calls/relay-server.ts +1121 -532
- package/src/calls/speaker-identification.ts +21 -15
- package/src/calls/twilio-config.ts +34 -17
- package/src/calls/twilio-provider.ts +108 -55
- package/src/calls/twilio-rest.ts +212 -100
- package/src/calls/twilio-routes.ts +165 -92
- package/src/calls/types.ts +55 -7
- package/src/calls/voice-quality.ts +6 -4
- package/src/calls/voice-session-bridge.ts +181 -133
- package/src/channels/config.ts +17 -13
- package/src/channels/types.ts +38 -10
- package/src/cli/amazon.ts +333 -227
- package/src/cli/config-commands.ts +236 -146
- package/src/cli/core-commands.ts +403 -329
- package/src/cli/email-guardrails.ts +38 -19
- package/src/cli/email.ts +207 -153
- package/src/cli/influencer.ts +58 -56
- package/src/cli/integrations.ts +362 -0
- package/src/cli/ipc-client.ts +24 -19
- package/src/cli/map.ts +176 -129
- package/src/cli/mcp.ts +260 -152
- package/src/cli/sequence.ts +165 -107
- package/src/cli/twitter.ts +302 -218
- package/src/cli.ts +418 -279
- package/src/commands/cc-command-registry.ts +52 -27
- package/src/config/agent-schema.ts +217 -134
- package/src/config/assistant-feature-flags.ts +23 -18
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +19 -0
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-query.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +6 -3
- package/src/config/bundled-skills/browser/tools/browser-click.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-close.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-type.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +13 -6
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +5 -2
- package/src/config/bundled-skills/claude-code/TOOLS.json +4 -0
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +5 -2
- package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +6 -3
- package/src/config/bundled-skills/configure-settings/SKILL.md +28 -14
- package/src/config/bundled-skills/contacts/SKILL.md +446 -15
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +99 -20
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +74 -17
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +89 -26
- package/src/config/bundled-skills/document/tools/document-create.ts +5 -2
- package/src/config/bundled-skills/document/tools/document-update.ts +5 -2
- package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -7
- package/src/config/bundled-skills/email-setup/SKILL.md +9 -9
- package/src/config/bundled-skills/followups/tools/followup-create.ts +5 -2
- package/src/config/bundled-skills/followups/tools/followup-list.ts +5 -2
- package/src/config/bundled-skills/followups/tools/followup-resolve.ts +5 -2
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +44 -32
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +11 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +13 -7
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +11 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +13 -7
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +28 -12
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +6 -4
- package/src/config/bundled-skills/google-calendar/types.ts +3 -3
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +46 -24
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +36 -19
- package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +60 -35
- package/src/config/bundled-skills/mcp-setup/SKILL.md +75 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +55 -15
- package/src/config/bundled-skills/media-processing/TOOLS.json +20 -2
- package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +12 -10
- package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +34 -19
- package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +82 -66
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +148 -0
- package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +8 -3
- package/src/config/bundled-skills/media-processing/services/gemini-map.ts +117 -53
- package/src/config/bundled-skills/media-processing/services/gemini-video.ts +273 -0
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +185 -97
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +32 -27
- package/src/config/bundled-skills/media-processing/services/reduce.ts +101 -24
- package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +121 -55
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +58 -24
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +177 -91
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +98 -70
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +59 -19
- package/src/config/bundled-skills/media-processing/tools/media-status.ts +26 -10
- package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +29 -14
- package/src/config/bundled-skills/messaging/SKILL.md +7 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +7 -7
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +31 -13
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +16 -10
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +18 -9
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +23 -16
- package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +28 -12
- package/src/config/bundled-skills/messaging/tools/gmail-filters.ts +41 -21
- package/src/config/bundled-skills/messaging/tools/gmail-follow-up.ts +44 -23
- package/src/config/bundled-skills/messaging/tools/gmail-forward.ts +73 -33
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +15 -9
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +22 -14
- package/src/config/bundled-skills/messaging/tools/gmail-outreach-scan.ts +99 -50
- package/src/config/bundled-skills/messaging/tools/gmail-send-draft.ts +14 -8
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +63 -44
- package/src/config/bundled-skills/messaging/tools/gmail-sender-digest.ts +90 -46
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +43 -22
- package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +15 -9
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +51 -22
- package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +62 -26
- package/src/config/bundled-skills/messaging/tools/gmail-vacation.ts +34 -19
- package/src/config/bundled-skills/messaging/tools/google-contacts.ts +32 -16
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +91 -47
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +21 -9
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +9 -3
- package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +30 -17
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +14 -6
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +16 -5
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +63 -36
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +30 -12
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +48 -29
- package/src/config/bundled-skills/messaging/tools/scan-result-store.ts +20 -6
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/sequence-analytics.ts +59 -22
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +13 -7
- package/src/config/bundled-skills/messaging/tools/sequence-create.ts +27 -12
- package/src/config/bundled-skills/messaging/tools/sequence-delete.ts +14 -6
- package/src/config/bundled-skills/messaging/tools/sequence-enroll.ts +30 -11
- package/src/config/bundled-skills/messaging/tools/sequence-enrollment-list.ts +16 -8
- package/src/config/bundled-skills/messaging/tools/sequence-get.ts +31 -13
- package/src/config/bundled-skills/messaging/tools/sequence-import.ts +38 -22
- package/src/config/bundled-skills/messaging/tools/sequence-list.ts +16 -7
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +29 -10
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +16 -8
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +35 -16
- package/src/config/bundled-skills/messaging/tools/shared.ts +26 -12
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +69 -34
- package/src/config/bundled-skills/notifications/tools/shared.ts +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +46 -48
- package/src/config/bundled-skills/phone-calls/tools/call-end.ts +1 -1
- package/src/config/bundled-skills/phone-calls/tools/call-start.ts +1 -1
- package/src/config/bundled-skills/phone-calls/tools/call-status.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +91 -51
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +30 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +66 -27
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +89 -42
- package/src/config/bundled-skills/public-ingress/SKILL.md +26 -19
- package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +5 -2
- package/src/config/bundled-skills/reminder/tools/reminder-create.ts +5 -2
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-create.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-list.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-update.ts +5 -2
- package/src/config/bundled-skills/screen-recording/SKILL.md +11 -3
- package/src/config/bundled-skills/self-upgrade/SKILL.md +9 -8
- package/src/config/bundled-skills/slack/TOOLS.json +33 -15
- package/src/config/bundled-skills/slack/tools/shared.ts +7 -5
- package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-configure-channels.ts +46 -16
- package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +28 -0
- package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +12 -6
- package/src/config/bundled-skills/sms-setup/SKILL.md +5 -8
- package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-message.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-read.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-status.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-run.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-save.ts +5 -2
- package/src/config/bundled-skills/telegram-setup/SKILL.md +7 -8
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +232 -127
- package/src/config/bundled-skills/twilio-setup/SKILL.md +7 -12
- package/src/config/bundled-skills/twitter/SKILL.md +19 -2
- package/src/config/bundled-skills/voice-setup/SKILL.md +5 -5
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +5 -2
- package/src/config/bundled-skills/weather/tools/get-weather.ts +5 -2
- package/src/config/calls-schema.ts +108 -63
- package/src/config/computer-use-prompt.ts +7 -7
- package/src/config/core-schema.ts +239 -155
- package/src/config/defaults.ts +2 -2
- package/src/config/elevenlabs-schema.ts +15 -15
- package/src/config/env-registry.ts +33 -33
- package/src/config/feature-flag-registry.json +31 -7
- package/src/config/loader.ts +118 -58
- package/src/config/mcp-schema.ts +29 -15
- package/src/config/memory-schema.ts +434 -229
- package/src/config/notifications-schema.ts +4 -4
- package/src/config/sandbox-schema.ts +2 -2
- package/src/config/schema.ts +12 -2
- package/src/config/skill-state.ts +27 -15
- package/src/config/skills-schema.ts +72 -23
- package/src/config/skills.ts +303 -143
- package/src/config/system-prompt.ts +25 -6
- package/src/config/types.ts +1 -1
- package/src/config/update-bulletin-format.ts +3 -3
- package/src/config/update-bulletin-state.ts +15 -6
- package/src/config/update-bulletin-template-path.ts +8 -4
- package/src/config/update-bulletin.ts +33 -14
- package/src/config/user-reference.ts +8 -8
- package/src/contacts/contact-events.ts +21 -0
- package/src/contacts/contact-store.ts +622 -100
- package/src/contacts/contacts-write.ts +287 -0
- package/src/contacts/index.ts +13 -4
- package/src/contacts/startup-migration.ts +21 -0
- package/src/contacts/types.ts +47 -2
- package/src/context/token-estimator.ts +54 -31
- package/src/context/tool-result-truncation.ts +41 -7
- package/src/context/window-manager.ts +225 -120
- package/src/daemon/approval-generators.ts +83 -55
- package/src/daemon/approved-devices-store.ts +33 -20
- package/src/daemon/assistant-attachments.ts +134 -98
- package/src/daemon/auth-manager.ts +17 -15
- package/src/daemon/classifier.ts +117 -46
- package/src/daemon/computer-use-session.ts +316 -187
- package/src/daemon/config-watcher.ts +91 -44
- package/src/daemon/connection-policy.ts +18 -10
- package/src/daemon/context-overflow-approval.ts +48 -0
- package/src/daemon/context-overflow-policy.ts +50 -0
- package/src/daemon/context-overflow-reducer.ts +300 -0
- package/src/daemon/daemon-control.ts +79 -51
- package/src/daemon/date-context.ts +119 -69
- package/src/daemon/dictation-profile-store.ts +94 -48
- package/src/daemon/dictation-text-processing.ts +33 -12
- package/src/daemon/doordash-steps.ts +92 -49
- package/src/daemon/guardian-action-generators.ts +62 -46
- package/src/daemon/guardian-verification-intent.ts +31 -18
- package/src/daemon/handlers/apps.ts +257 -111
- package/src/daemon/handlers/avatar.ts +20 -15
- package/src/daemon/handlers/computer-use.ts +82 -39
- package/src/daemon/handlers/config-channels.ts +146 -69
- package/src/daemon/handlers/config-heartbeat.ts +114 -59
- package/src/daemon/handlers/config-inbox.ts +277 -106
- package/src/daemon/handlers/config-ingress.ts +127 -55
- package/src/daemon/handlers/config-integrations.ts +145 -88
- package/src/daemon/handlers/config-model.ts +58 -22
- package/src/daemon/handlers/config-platform.ts +40 -16
- package/src/daemon/handlers/config-scheduling.ts +109 -48
- package/src/daemon/handlers/config-slack-channel.ts +67 -35
- package/src/daemon/handlers/config-slack.ts +21 -20
- package/src/daemon/handlers/config-telegram.ts +100 -70
- package/src/daemon/handlers/config-tools.ts +103 -55
- package/src/daemon/handlers/config-trust.ts +50 -20
- package/src/daemon/handlers/config.ts +72 -24
- package/src/daemon/handlers/contacts.ts +163 -0
- package/src/daemon/handlers/diagnostics.ts +90 -48
- package/src/daemon/handlers/documents.ts +74 -46
- package/src/daemon/handlers/guardian-actions.ts +118 -71
- package/src/daemon/handlers/home-base.ts +19 -16
- package/src/daemon/handlers/identity.ts +65 -45
- package/src/daemon/handlers/index.ts +78 -54
- package/src/daemon/handlers/misc.ts +664 -234
- package/src/daemon/handlers/navigate-settings.ts +14 -11
- package/src/daemon/handlers/oauth-connect.ts +48 -35
- package/src/daemon/handlers/open-bundle-handler.ts +31 -24
- package/src/daemon/handlers/pairing.ts +51 -25
- package/src/daemon/handlers/publish.ts +55 -33
- package/src/daemon/handlers/recording.ts +378 -162
- package/src/daemon/handlers/sessions.ts +923 -423
- package/src/daemon/handlers/shared.ts +202 -117
- package/src/daemon/handlers/signing.ts +25 -6
- package/src/daemon/handlers/subagents.ts +117 -56
- package/src/daemon/handlers/twitter-auth.ts +70 -49
- package/src/daemon/handlers/work-items.ts +264 -112
- package/src/daemon/handlers/workspace-files.ts +27 -20
- package/src/daemon/handlers.ts +2 -2
- package/src/daemon/history-repair.ts +16 -15
- package/src/daemon/identity-helpers.ts +4 -4
- package/src/daemon/install-cli-launchers.ts +33 -22
- package/src/daemon/ipc-blob-store.ts +38 -24
- package/src/daemon/ipc-contract/apps.ts +61 -49
- package/src/daemon/ipc-contract/computer-use.ts +47 -37
- package/src/daemon/ipc-contract/contacts.ts +69 -0
- package/src/daemon/ipc-contract/diagnostics.ts +14 -14
- package/src/daemon/ipc-contract/documents.ts +8 -8
- package/src/daemon/ipc-contract/guardian-actions.ts +4 -4
- package/src/daemon/ipc-contract/inbox.ts +16 -16
- package/src/daemon/ipc-contract/integrations.ts +57 -44
- package/src/daemon/ipc-contract/memory.ts +3 -5
- package/src/daemon/ipc-contract/messages.ts +95 -69
- package/src/daemon/ipc-contract/notifications.ts +10 -6
- package/src/daemon/ipc-contract/pairing.ts +8 -8
- package/src/daemon/ipc-contract/schedules.ts +20 -20
- package/src/daemon/ipc-contract/sessions.ts +88 -57
- package/src/daemon/ipc-contract/settings.ts +12 -7
- package/src/daemon/ipc-contract/shared.ts +9 -7
- package/src/daemon/ipc-contract/skills.ts +46 -26
- package/src/daemon/ipc-contract/subagents.ts +9 -9
- package/src/daemon/ipc-contract/trust.ts +11 -11
- package/src/daemon/ipc-contract/work-items.ts +33 -28
- package/src/daemon/ipc-contract/workspace.ts +28 -21
- package/src/daemon/ipc-contract-inventory.json +8 -0
- package/src/daemon/ipc-contract-inventory.ts +29 -26
- package/src/daemon/ipc-contract.ts +111 -44
- package/src/daemon/ipc-handler.ts +27 -19
- package/src/daemon/ipc-protocol.ts +22 -12
- package/src/daemon/ipc-validate.ts +91 -46
- package/src/daemon/lifecycle.ts +25 -1
- package/src/daemon/main.ts +10 -8
- package/src/daemon/media-visibility-policy.ts +3 -1
- package/src/daemon/pairing-store.ts +72 -40
- package/src/daemon/providers-setup.ts +35 -25
- package/src/daemon/recording-executor.ts +37 -30
- package/src/daemon/recording-intent-fallback.ts +58 -28
- package/src/daemon/recording-intent.ts +71 -61
- package/src/daemon/ride-shotgun-handler.ts +201 -121
- package/src/daemon/seed-files.ts +28 -17
- package/src/daemon/server.ts +23 -14
- package/src/daemon/session-agent-loop-handlers.ts +261 -135
- package/src/daemon/session-agent-loop.ts +795 -253
- package/src/daemon/session-attachments.ts +104 -39
- package/src/daemon/session-conflict-gate.ts +72 -28
- package/src/daemon/session-dynamic-profile.ts +36 -22
- package/src/daemon/session-error.ts +50 -45
- package/src/daemon/session-evictor.ts +17 -10
- package/src/daemon/session-history.ts +201 -89
- package/src/daemon/session-lifecycle.ts +79 -42
- package/src/daemon/session-media-retry.ts +89 -41
- package/src/daemon/session-memory.ts +77 -55
- package/src/daemon/session-messaging.ts +261 -111
- package/src/daemon/session-notifiers.ts +57 -45
- package/src/daemon/session-process.ts +370 -154
- package/src/daemon/session-queue-manager.ts +30 -13
- package/src/daemon/session-runtime-assembly.ts +61 -15
- package/src/daemon/session-skill-tools.ts +84 -36
- package/src/daemon/session-slash.ts +178 -113
- package/src/daemon/session-surfaces.ts +498 -211
- package/src/daemon/session-tool-setup.ts +22 -17
- package/src/daemon/session-usage.ts +26 -13
- package/src/daemon/session-workspace.ts +7 -4
- package/src/daemon/session.ts +18 -19
- package/src/daemon/shutdown-handlers.ts +36 -33
- package/src/daemon/tls-certs.ts +90 -57
- package/src/daemon/tool-side-effects.ts +97 -65
- package/src/daemon/trace-emitter.ts +8 -7
- package/src/daemon/video-thumbnail.ts +55 -25
- package/src/daemon/watch-handler.ts +164 -86
- package/src/email/provider.ts +1 -1
- package/src/email/providers/agentmail.ts +87 -45
- package/src/email/providers/index.ts +19 -14
- package/src/email/service.ts +52 -24
- package/src/email/types.ts +2 -2
- package/src/errors.ts +1 -1
- package/src/events/bus.ts +30 -10
- package/src/events/domain-events.ts +19 -13
- package/src/events/index.ts +6 -6
- package/src/events/tool-audit-listener.ts +34 -20
- package/src/events/tool-domain-event-publisher.ts +22 -20
- package/src/events/tool-metrics-listener.ts +26 -21
- package/src/events/tool-notification-listener.ts +5 -5
- package/src/events/tool-profiling-listener.ts +33 -23
- package/src/events/tool-trace-listener.ts +70 -46
- package/src/export/formatter.ts +38 -32
- package/src/followups/followup-store.ts +43 -36
- package/src/followups/index.ts +2 -2
- package/src/followups/types.ts +1 -1
- package/src/gallery/default-gallery.ts +37 -34
- package/src/gallery/gallery-manifest.ts +9 -9
- package/src/heartbeat/heartbeat-service.ts +59 -37
- package/src/home-base/app-link-store.ts +14 -12
- package/src/home-base/bootstrap.ts +14 -8
- package/src/home-base/prebuilt/seed.ts +35 -26
- package/src/home-base/prebuilt-home-base-updater.ts +14 -8
- package/src/hooks/cli.ts +56 -43
- package/src/hooks/config.ts +27 -14
- package/src/hooks/discovery.ts +53 -33
- package/src/hooks/manager.ts +50 -26
- package/src/hooks/runner.ts +35 -29
- package/src/hooks/templates.ts +38 -15
- package/src/hooks/types.ts +13 -13
- package/src/inbound/platform-callback-registration.ts +21 -15
- package/src/inbound/public-ingress-urls.ts +9 -6
- package/src/index.ts +20 -19
- package/src/influencer/client.ts +269 -108
- package/src/instrument.ts +3 -1
- package/src/logfire.ts +64 -39
- package/src/mcp/client.ts +107 -55
- package/src/mcp/manager.ts +45 -18
- package/src/mcp/mcp-oauth-provider.ts +114 -62
- package/src/media/gemini-image-service.ts +28 -21
- package/src/memory/account-store.ts +16 -9
- package/src/memory/admin.ts +87 -57
- package/src/memory/app-git-service.ts +77 -47
- package/src/memory/app-store.ts +151 -77
- package/src/memory/attachments-store.ts +123 -53
- package/src/memory/canonical-guardian-store.ts +190 -48
- package/src/memory/channel-delivery-store.ts +5 -5
- package/src/memory/channel-guardian-store.ts +31 -16
- package/src/memory/checkpoints.ts +14 -7
- package/src/memory/clarification-resolver.ts +219 -104
- package/src/memory/conflict-intent.ts +74 -23
- package/src/memory/conflict-policy.ts +20 -7
- package/src/memory/conflict-store.ts +144 -94
- package/src/memory/contradiction-checker.ts +257 -132
- package/src/memory/conversation-attention-store.ts +72 -32
- package/src/memory/conversation-bootstrap.ts +28 -0
- package/src/memory/conversation-crud.ts +12 -5
- package/src/memory/conversation-display-order-migration.ts +7 -7
- package/src/memory/conversation-key-store.ts +18 -13
- package/src/memory/conversation-queries.ts +130 -52
- package/src/memory/conversation-store.ts +43 -26
- package/src/memory/conversation-title-service.ts +89 -66
- package/src/memory/db-init.ts +90 -2
- package/src/memory/db.ts +10 -3
- package/src/memory/delivery-channels.ts +12 -6
- package/src/memory/delivery-crud.ts +26 -12
- package/src/memory/delivery-status.ts +19 -16
- package/src/memory/embedding-backend.ts +205 -77
- package/src/memory/embedding-gemini.ts +23 -10
- package/src/memory/embedding-local.ts +89 -44
- package/src/memory/embedding-ollama.ts +25 -13
- package/src/memory/embedding-openai.ts +20 -11
- package/src/memory/embedding-runtime-manager.ts +163 -90
- package/src/memory/entity-extractor.ts +185 -123
- package/src/memory/external-conversation-store.ts +30 -12
- package/src/memory/fingerprint.ts +2 -2
- package/src/memory/fts-reconciler.ts +57 -28
- package/src/memory/guardian-action-store.ts +162 -100
- package/src/memory/guardian-approvals.ts +63 -129
- package/src/memory/guardian-rate-limits.ts +20 -9
- package/src/memory/guardian-verification.ts +82 -35
- package/src/memory/indexer.ts +96 -55
- package/src/memory/ingress-invite-store.ts +28 -169
- package/src/memory/items-extractor.ts +313 -157
- package/src/memory/job-handlers/backfill.ts +116 -63
- package/src/memory/job-handlers/cleanup.ts +64 -41
- package/src/memory/job-handlers/conflict.ts +90 -49
- package/src/memory/job-handlers/embedding.ts +32 -17
- package/src/memory/job-handlers/extraction.ts +58 -33
- package/src/memory/job-handlers/index-maintenance.ts +31 -17
- package/src/memory/job-handlers/media-processing.ts +65 -24
- package/src/memory/job-handlers/summarization.ts +186 -128
- package/src/memory/job-utils.ts +100 -57
- package/src/memory/jobs-store.ts +235 -142
- package/src/memory/jobs-worker.ts +167 -83
- package/src/memory/llm-request-log-store.ts +13 -11
- package/src/memory/llm-usage-store.ts +35 -26
- package/src/memory/media-store.ts +151 -44
- package/src/memory/message-content.ts +28 -18
- package/src/memory/migrations/001-job-deferrals.ts +11 -5
- package/src/memory/migrations/002-tool-invocations-fk.ts +14 -6
- package/src/memory/migrations/003-memory-fts-backfill.ts +11 -5
- package/src/memory/migrations/004-entity-relation-dedup.ts +17 -11
- package/src/memory/migrations/005-fingerprint-scope-unique.ts +36 -21
- package/src/memory/migrations/006-scope-salted-fingerprints.ts +35 -20
- package/src/memory/migrations/007-assistant-id-to-self.ts +40 -27
- package/src/memory/migrations/008-remove-assistant-id-columns.ts +58 -36
- package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +36 -22
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +21 -11
- package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +30 -15
- package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +4 -2
- package/src/memory/migrations/013-guardian-action-tables.ts +29 -11
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +35 -21
- package/src/memory/migrations/015-drop-active-search-index.ts +17 -11
- package/src/memory/migrations/016-memory-segments-indexes.ts +7 -3
- package/src/memory/migrations/017-memory-items-indexes.ts +4 -2
- package/src/memory/migrations/018-remaining-table-indexes.ts +13 -5
- package/src/memory/migrations/019-notification-tables-schema-migration.ts +34 -20
- package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +87 -53
- package/src/memory/migrations/021-conversation-status-indexes.ts +7 -3
- package/src/memory/migrations/022-add-origin-interface.ts +4 -2
- package/src/memory/migrations/023-memory-item-sources-indexes.ts +4 -2
- package/src/memory/migrations/024-embedding-vector-blob.ts +34 -18
- package/src/memory/migrations/025-messages-fts-backfill.ts +11 -5
- package/src/memory/migrations/026-guardian-verification-sessions.ts +80 -14
- package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +42 -26
- package/src/memory/migrations/027-notification-delivery-pairing-columns.ts +22 -8
- package/src/memory/migrations/027a-guardian-bootstrap-token.ts +11 -3
- package/src/memory/migrations/028-call-session-mode.ts +13 -3
- package/src/memory/migrations/028-notification-delivery-client-ack.ts +22 -8
- package/src/memory/migrations/029-channel-inbound-delivered-segments.ts +7 -3
- package/src/memory/migrations/030-guardian-action-followup.ts +46 -8
- package/src/memory/migrations/030-guardian-verification-purpose.ts +4 -2
- package/src/memory/migrations/031-conversations-thread-type-index.ts +4 -2
- package/src/memory/migrations/032-guardian-delivery-conversation-index.ts +4 -2
- package/src/memory/migrations/032-notification-delivery-thread-decision.ts +22 -8
- package/src/memory/migrations/033-scoped-approval-grants.ts +1 -1
- package/src/memory/migrations/034-guardian-action-tool-metadata.ts +15 -3
- package/src/memory/migrations/035-guardian-action-supersession.ts +15 -3
- package/src/memory/migrations/036-normalize-phone-identities.ts +101 -87
- package/src/memory/migrations/037-voice-invite-columns.ts +22 -4
- package/src/memory/migrations/038-actor-token-records.ts +5 -9
- package/src/memory/migrations/039-actor-refresh-token-records.ts +7 -13
- package/src/memory/migrations/100-core-tables.ts +1 -1
- package/src/memory/migrations/101-watchers-and-logs.ts +1 -1
- package/src/memory/migrations/103-complex-migrations.ts +9 -9
- package/src/memory/migrations/104-core-indexes.ts +188 -64
- package/src/memory/migrations/105-contacts-and-triage.ts +28 -10
- package/src/memory/migrations/106-call-sessions.ts +58 -16
- package/src/memory/migrations/107-followups.ts +16 -6
- package/src/memory/migrations/108-tasks-and-work-items.ts +43 -11
- package/src/memory/migrations/109-external-conversation-bindings.ts +11 -5
- package/src/memory/migrations/110-channel-guardian.ts +48 -10
- package/src/memory/migrations/111-media-assets.ts +52 -18
- package/src/memory/migrations/112-assistant-inbox.ts +32 -12
- package/src/memory/migrations/113-late-migrations.ts +12 -12
- package/src/memory/migrations/114-notifications.ts +28 -12
- package/src/memory/migrations/115-sequences.ts +10 -4
- package/src/memory/migrations/116-messages-fts.ts +1 -1
- package/src/memory/migrations/117-conversation-attention.ts +16 -6
- package/src/memory/migrations/118-reminder-routing-intent.ts +7 -3
- package/src/memory/migrations/119-schema-indexes-and-columns.ts +35 -15
- package/src/memory/migrations/120-fk-cascade-rebuilds.ts +36 -17
- package/src/memory/migrations/121-canonical-guardian-requests.ts +25 -9
- package/src/memory/migrations/122-canonical-guardian-requester-chat-id.ts +11 -3
- package/src/memory/migrations/123-canonical-guardian-deliveries-destination-index.ts +4 -2
- package/src/memory/migrations/124-voice-invite-display-metadata.ts +15 -3
- package/src/memory/migrations/125-guardian-principal-id-columns.ts +22 -4
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +174 -126
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +58 -42
- package/src/memory/migrations/128-contacts-role-principal.ts +26 -0
- package/src/memory/migrations/129-contact-channels-access-fields.ts +105 -0
- package/src/memory/migrations/130-contact-channels-type-ext-chat-id-index.ts +15 -0
- package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +134 -0
- package/src/memory/migrations/132-contacts-assistant-id.ts +21 -0
- package/src/memory/migrations/index.ts +82 -73
- package/src/memory/migrations/registry.ts +53 -37
- package/src/memory/migrations/validate-migration-state.ts +73 -46
- package/src/memory/profile-compiler.ts +58 -24
- package/src/memory/published-pages-store.ts +12 -16
- package/src/memory/qdrant-circuit-breaker.ts +28 -20
- package/src/memory/qdrant-client.ts +99 -63
- package/src/memory/qdrant-manager.ts +89 -57
- package/src/memory/query-builder.ts +9 -7
- package/src/memory/raw-query.ts +63 -14
- package/src/memory/recall-cache.ts +15 -8
- package/src/memory/retrieval-budget.ts +0 -1
- package/src/memory/retriever.ts +385 -192
- package/src/memory/schema-migration.ts +1 -1
- package/src/memory/schema.ts +44 -56
- package/src/memory/scoped-approval-grants.ts +99 -45
- package/src/memory/search/entity.ts +102 -40
- package/src/memory/search/formatting.ts +70 -52
- package/src/memory/search/lexical.ts +82 -43
- package/src/memory/search/ranking.ts +103 -39
- package/src/memory/search/semantic.ts +59 -35
- package/src/memory/search/types.ts +8 -8
- package/src/memory/segmenter.ts +20 -12
- package/src/memory/shared-app-links-store.ts +21 -16
- package/src/memory/task-memory-cleanup.ts +18 -8
- package/src/memory/tool-usage-store.ts +27 -19
- package/src/memory/validation.ts +4 -2
- package/src/messaging/activity-analyzer.ts +7 -7
- package/src/messaging/draft-store.ts +13 -10
- package/src/messaging/email-classifier.ts +73 -37
- package/src/messaging/index.ts +3 -3
- package/src/messaging/outreach-classifier.ts +76 -38
- package/src/messaging/provider-types.ts +2 -4
- package/src/messaging/provider.ts +37 -8
- package/src/messaging/providers/gmail/adapter.ts +183 -66
- package/src/messaging/providers/gmail/client.ts +3 -1
- package/src/messaging/providers/gmail/mime-builder.ts +21 -19
- package/src/messaging/providers/gmail/people-client.ts +22 -9
- package/src/messaging/providers/gmail/types.ts +6 -6
- package/src/messaging/providers/slack/adapter.ts +93 -43
- package/src/messaging/providers/slack/client.ts +100 -41
- package/src/messaging/providers/slack/types.ts +6 -0
- package/src/messaging/providers/sms/adapter.ts +76 -40
- package/src/messaging/providers/sms/client.ts +4 -4
- package/src/messaging/providers/telegram-bot/adapter.ts +52 -30
- package/src/messaging/providers/telegram-bot/client.ts +7 -7
- package/src/messaging/providers/whatsapp/adapter.ts +58 -31
- package/src/messaging/providers/whatsapp/client.ts +4 -4
- package/src/messaging/registry.ts +9 -5
- package/src/messaging/style-analyzer.ts +69 -39
- package/src/messaging/thread-summarizer.ts +101 -53
- package/src/messaging/triage-engine.ts +111 -82
- package/src/messaging/types.ts +10 -10
- package/src/migrations/config-merge.ts +18 -10
- package/src/migrations/data-layout.ts +35 -22
- package/src/migrations/data-merge.ts +17 -7
- package/src/migrations/hooks-merge.ts +43 -16
- package/src/migrations/index.ts +6 -6
- package/src/migrations/log.ts +9 -5
- package/src/migrations/skills-merge.ts +17 -7
- package/src/migrations/workspace-layout.ts +39 -25
- package/src/notifications/AGENTS.md +5 -0
- package/src/notifications/adapters/macos.ts +21 -14
- package/src/notifications/adapters/sms.ts +28 -15
- package/src/notifications/adapters/telegram.ts +24 -15
- package/src/notifications/broadcaster.ts +108 -52
- package/src/notifications/conversation-pairing.ts +64 -29
- package/src/notifications/copy-composer.ts +165 -95
- package/src/notifications/decision-engine.ts +353 -147
- package/src/notifications/decisions-store.ts +26 -10
- package/src/notifications/deliveries-store.ts +23 -13
- package/src/notifications/destination-resolver.ts +42 -24
- package/src/notifications/deterministic-checks.ts +78 -27
- package/src/notifications/emit-signal.ts +83 -45
- package/src/notifications/events-store.ts +13 -7
- package/src/notifications/guardian-question-mode.ts +125 -75
- package/src/notifications/preference-extractor.ts +85 -53
- package/src/notifications/preference-summary.ts +31 -18
- package/src/notifications/preferences-store.ts +29 -18
- package/src/notifications/runtime-dispatch.ts +22 -12
- package/src/notifications/signal.ts +4 -4
- package/src/notifications/thread-candidates.ts +59 -23
- package/src/notifications/thread-seed-composer.ts +45 -27
- package/src/notifications/types.ts +19 -10
- package/src/oauth/connect-orchestrator.ts +105 -54
- package/src/oauth/connect-types.ts +3 -3
- package/src/oauth/provider-profiles.ts +80 -59
- package/src/oauth/scope-policy.ts +5 -2
- package/src/oauth/token-persistence.ts +58 -24
- package/src/outbound-proxy/certs.ts +284 -0
- package/src/outbound-proxy/config.ts +94 -0
- package/src/outbound-proxy/connect-tunnel.ts +84 -0
- package/src/outbound-proxy/health.ts +62 -0
- package/src/outbound-proxy/host-pattern-match.ts +67 -0
- package/src/outbound-proxy/http-forwarder.ts +162 -0
- package/src/outbound-proxy/index.ts +80 -0
- package/src/outbound-proxy/logging.ts +193 -0
- package/src/outbound-proxy/mitm-handler.ts +292 -0
- package/src/outbound-proxy/policy.ts +172 -0
- package/src/outbound-proxy/router.ts +64 -0
- package/src/outbound-proxy/server.ts +145 -0
- package/src/outbound-proxy/types.ts +150 -0
- package/src/permissions/checker.ts +481 -189
- package/src/permissions/defaults.ts +135 -108
- package/src/permissions/prompter.ts +53 -27
- package/src/permissions/secret-prompter.ts +21 -15
- package/src/permissions/shell-identity.ts +47 -16
- package/src/permissions/trust-store.ts +185 -73
- package/src/permissions/types.ts +22 -12
- package/src/permissions/workspace-policy.ts +47 -38
- package/src/playbooks/index.ts +10 -2
- package/src/playbooks/playbook-compiler.ts +30 -24
- package/src/playbooks/types.ts +11 -8
- package/src/providers/anthropic/client.ts +325 -168
- package/src/providers/failover.ts +57 -22
- package/src/providers/fireworks/client.ts +9 -5
- package/src/providers/gemini/client.ts +61 -39
- package/src/providers/model-intents.ts +40 -33
- package/src/providers/ollama/client.ts +7 -7
- package/src/providers/openai/client.ts +106 -68
- package/src/providers/openrouter/client.ts +9 -5
- package/src/providers/provider-send-message.ts +59 -27
- package/src/providers/ratelimit.ts +25 -8
- package/src/providers/registry.ts +86 -38
- package/src/providers/retry.ts +84 -36
- package/src/providers/stream-timeout.ts +5 -3
- package/src/providers/types.ts +7 -6
- package/src/runtime/AGENTS.md +42 -0
- package/src/runtime/access-request-helper.ts +118 -68
- package/src/runtime/actor-refresh-token-store.ts +21 -16
- package/src/runtime/actor-token-store.ts +25 -18
- package/src/runtime/actor-trust-resolver.ts +183 -80
- package/src/runtime/approval-conversation-turn.ts +39 -26
- package/src/runtime/approval-message-composer.ts +116 -84
- package/src/runtime/assistant-event-hub.ts +25 -6
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/assistant-scope.ts +1 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +36 -14
- package/src/runtime/auth/context.ts +8 -7
- package/src/runtime/auth/credential-service.ts +60 -38
- package/src/runtime/auth/external-assistant-id.ts +16 -8
- package/src/runtime/auth/index.ts +23 -16
- package/src/runtime/auth/route-policy.ts +170 -104
- package/src/runtime/auth/scopes.ts +22 -29
- package/src/runtime/auth/subject.ts +19 -13
- package/src/runtime/auth/token-service.ts +3 -3
- package/src/runtime/auth/types.ts +23 -23
- package/src/runtime/channel-approval-parser.ts +37 -14
- package/src/runtime/channel-approval-types.ts +12 -4
- package/src/runtime/channel-approvals.ts +41 -23
- package/src/runtime/channel-guardian-service.ts +144 -103
- package/src/runtime/channel-invite-transport.ts +4 -2
- package/src/runtime/channel-invite-transports/telegram.ts +16 -10
- package/src/runtime/channel-invite-transports/voice.ts +7 -7
- package/src/runtime/channel-readiness-service.ts +139 -90
- package/src/runtime/channel-readiness-types.ts +4 -2
- package/src/runtime/channel-reply-delivery.ts +21 -11
- package/src/runtime/channel-retry-sweep.ts +111 -62
- package/src/runtime/confirmation-request-guardian-bridge.ts +73 -54
- package/src/runtime/gateway-client.ts +86 -53
- package/src/runtime/guardian-action-conversation-turn.ts +34 -18
- package/src/runtime/guardian-action-followup-executor.ts +115 -45
- package/src/runtime/guardian-action-grant-minter.ts +40 -24
- package/src/runtime/guardian-action-message-composer.ts +105 -84
- package/src/runtime/guardian-decision-types.ts +28 -13
- package/src/runtime/guardian-outbound-actions.ts +9 -0
- package/src/runtime/guardian-reply-router.ts +274 -145
- package/src/runtime/guardian-vellum-migration.ts +38 -24
- package/src/runtime/guardian-verification-templates.ts +8 -11
- package/src/runtime/http-router.ts +175 -0
- package/src/runtime/http-server.ts +931 -669
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/ingress-service.ts +182 -89
- package/src/runtime/invite-redemption-service.ts +211 -134
- package/src/runtime/invite-redemption-templates.ts +18 -11
- package/src/runtime/local-actor-identity.ts +73 -55
- package/src/runtime/middleware/auth.ts +25 -14
- package/src/runtime/middleware/error-handler.ts +15 -11
- package/src/runtime/middleware/rate-limiter.ts +23 -17
- package/src/runtime/middleware/request-logger.ts +4 -4
- package/src/runtime/middleware/twilio-validation.ts +29 -20
- package/src/runtime/migrations/migration-transport.ts +575 -0
- package/src/runtime/migrations/migration-wizard.ts +715 -0
- package/src/runtime/migrations/rebind-secrets-screen.ts +351 -0
- package/src/runtime/migrations/transfer-progress-screen.ts +321 -0
- package/src/runtime/migrations/validation-results-screen.ts +467 -0
- package/src/runtime/migrations/vbundle-builder.ts +295 -0
- package/src/runtime/migrations/vbundle-import-analyzer.ts +212 -0
- package/src/runtime/migrations/vbundle-importer.ts +339 -0
- package/src/runtime/migrations/vbundle-validator.ts +356 -0
- package/src/runtime/pending-interactions.ts +16 -7
- package/src/runtime/routes/access-request-decision.ts +73 -52
- package/src/runtime/routes/app-routes.ts +56 -38
- package/src/runtime/routes/approval-routes.ts +165 -74
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +930 -0
- package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +82 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +151 -0
- package/src/runtime/routes/attachment-routes.ts +59 -48
- package/src/runtime/routes/brain-graph-routes.ts +85 -69
- package/src/runtime/routes/call-routes.ts +79 -38
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +10 -10
- package/src/runtime/routes/channel-delivery-routes.ts +19 -14
- package/src/runtime/routes/channel-guardian-routes.ts +3 -3
- package/src/runtime/routes/channel-inbound-routes.ts +2 -2
- package/src/runtime/routes/channel-readiness-routes.ts +12 -6
- package/src/runtime/routes/channel-route-shared.ts +33 -25
- package/src/runtime/routes/channel-routes.ts +4 -6
- package/src/runtime/routes/contact-routes.ts +205 -16
- package/src/runtime/routes/conversation-attention-routes.ts +57 -28
- package/src/runtime/routes/conversation-routes.ts +321 -174
- package/src/runtime/routes/debug-routes.ts +14 -10
- package/src/runtime/routes/events-routes.ts +90 -57
- package/src/runtime/routes/global-search-routes.ts +266 -0
- package/src/runtime/routes/guardian-action-routes.ts +147 -56
- package/src/runtime/routes/guardian-approval-interception.ts +255 -880
- package/src/runtime/routes/guardian-approval-prompt.ts +40 -24
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +135 -0
- package/src/runtime/routes/guardian-bootstrap-routes.ts +55 -36
- package/src/runtime/routes/guardian-expiry-sweep.ts +63 -37
- package/src/runtime/routes/guardian-refresh-routes.ts +40 -19
- package/src/runtime/routes/identity-routes.ts +71 -42
- package/src/runtime/routes/inbound-conversation.ts +17 -11
- package/src/runtime/routes/inbound-message-handler.ts +278 -1460
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +658 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +492 -0
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +214 -0
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +116 -0
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +167 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +185 -0
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +132 -0
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +340 -0
- package/src/runtime/routes/ingress-routes.ts +34 -23
- package/src/runtime/routes/integration-routes.ts +60 -21
- package/src/runtime/routes/migration-routes.ts +434 -0
- package/src/runtime/routes/pairing-routes.ts +157 -79
- package/src/runtime/routes/secret-routes.ts +6 -2
- package/src/runtime/routes/twilio-routes.ts +443 -249
- package/src/runtime/tool-grant-request-helper.ts +36 -27
- package/src/runtime/{guardian-context-resolver.ts → trust-context-resolver.ts} +29 -41
- package/src/schedule/integration-status.ts +44 -9
- package/src/schedule/recurrence-engine.ts +47 -24
- package/src/schedule/recurrence-types.ts +12 -7
- package/src/schedule/schedule-store.ts +166 -83
- package/src/schedule/scheduler.ts +26 -22
- package/src/security/encrypted-store.ts +68 -38
- package/src/security/keychain.ts +183 -120
- package/src/security/oauth-callback-registry.ts +3 -3
- package/src/security/oauth2.ts +226 -138
- package/src/security/redaction.ts +24 -24
- package/src/security/secret-allowlist.ts +46 -21
- package/src/security/secret-ingress.ts +15 -7
- package/src/security/secret-scanner.ts +193 -104
- package/src/security/secure-keys.ts +9 -3
- package/src/security/token-manager.ts +99 -40
- package/src/security/tool-approval-digest.ts +3 -3
- package/src/sequence/analytics.ts +52 -27
- package/src/sequence/engine.ts +135 -72
- package/src/sequence/guardrails.ts +32 -20
- package/src/sequence/importer.ts +75 -37
- package/src/sequence/reply-matcher.ts +36 -18
- package/src/sequence/store.ts +137 -75
- package/src/sequence/types.ts +30 -16
- package/src/services/published-app-updater.ts +26 -16
- package/src/services/vercel-deploy.ts +19 -15
- package/src/skills/active-skill-tools.ts +3 -3
- package/src/skills/clawhub.ts +178 -90
- package/src/skills/include-graph.ts +24 -17
- package/src/skills/managed-store.ts +89 -42
- package/src/skills/path-classifier.ts +10 -10
- package/src/skills/remote-skill-policy.ts +31 -22
- package/src/skills/slash-commands.ts +36 -30
- package/src/skills/tool-manifest.ts +60 -31
- package/src/skills/version-hash.ts +25 -15
- package/src/slack/slack-webhook.ts +19 -15
- package/src/subagent/index.ts +4 -8
- package/src/subagent/manager.ts +119 -69
- package/src/subagent/types.ts +9 -12
- package/src/swarm/backend-claude-code.ts +124 -45
- package/src/swarm/checkpoint.ts +36 -16
- package/src/swarm/graph-utils.ts +1 -3
- package/src/swarm/index.ts +38 -19
- package/src/swarm/limits.ts +13 -4
- package/src/swarm/orchestrator.ts +108 -57
- package/src/swarm/plan-validator.ts +23 -17
- package/src/swarm/router-planner.ts +51 -22
- package/src/swarm/router-prompts.ts +4 -1
- package/src/swarm/synthesizer.ts +26 -18
- package/src/swarm/types.ts +14 -4
- package/src/swarm/worker-backend.ts +36 -26
- package/src/swarm/worker-prompts.ts +13 -9
- package/src/swarm/worker-runner.ts +40 -34
- package/src/tasks/candidate-store.ts +14 -6
- package/src/tasks/ephemeral-permissions.ts +9 -5
- package/src/tasks/task-compiler.ts +41 -38
- package/src/tasks/task-runner.ts +54 -26
- package/src/tasks/task-scheduler.ts +1 -1
- package/src/tasks/task-store.ts +20 -7
- package/src/tasks/tool-sanitizer.ts +3 -3
- package/src/tools/apps/definitions.ts +23 -15
- package/src/tools/apps/executors.ts +118 -37
- package/src/tools/apps/open-proxy.ts +5 -5
- package/src/tools/apps/registry.ts +2 -2
- package/src/tools/assets/materialize.ts +59 -41
- package/src/tools/assets/search.ts +86 -48
- package/src/tools/browser/api-map.ts +52 -36
- package/src/tools/browser/auth-cache.ts +21 -18
- package/src/tools/browser/auth-detector.ts +43 -28
- package/src/tools/browser/auto-navigate.ts +149 -68
- package/src/tools/browser/browser-execution.ts +9 -3
- package/src/tools/browser/headless-browser.ts +287 -150
- package/src/tools/browser/jit-auth.ts +37 -21
- package/src/tools/browser/network-recorder.ts +138 -56
- package/src/tools/browser/recording-store.ts +22 -15
- package/src/tools/browser/runtime-check.ts +8 -5
- package/src/tools/browser/x-auto-navigate.ts +88 -47
- package/src/tools/calls/call-end.ts +9 -6
- package/src/tools/calls/call-start.ts +30 -20
- package/src/tools/calls/call-status.ts +8 -5
- package/src/tools/claude-code/claude-code.ts +301 -165
- package/src/tools/computer-use/definitions.ts +159 -130
- package/src/tools/computer-use/registry.ts +2 -2
- package/src/tools/computer-use/request-computer-control.ts +21 -13
- package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
- package/src/tools/credentials/account-registry.ts +52 -35
- package/src/tools/credentials/broker-types.ts +1 -1
- package/src/tools/credentials/broker.ts +97 -55
- package/src/tools/credentials/domain-policy.ts +5 -2
- package/src/tools/credentials/host-pattern-match.ts +15 -8
- package/src/tools/credentials/metadata-store.ts +93 -43
- package/src/tools/credentials/policy-types.ts +5 -2
- package/src/tools/credentials/policy-validate.ts +21 -14
- package/src/tools/credentials/post-connect-hooks.ts +18 -7
- package/src/tools/credentials/resolve.ts +11 -10
- package/src/tools/credentials/selection.ts +30 -25
- package/src/tools/credentials/tool-policy.ts +5 -2
- package/src/tools/credentials/vault.ts +452 -183
- package/src/tools/document/document-tool.ts +23 -17
- package/src/tools/document/editor-template.ts +12 -7
- package/src/tools/execution-target.ts +13 -10
- package/src/tools/execution-timeout.ts +6 -5
- package/src/tools/executor.ts +141 -74
- package/src/tools/filesystem/edit.ts +82 -45
- package/src/tools/filesystem/fuzzy-match.ts +70 -32
- package/src/tools/filesystem/read.ts +46 -28
- package/src/tools/filesystem/view-image.ts +86 -42
- package/src/tools/filesystem/write.ts +53 -32
- package/src/tools/followups/followup_create.ts +43 -17
- package/src/tools/followups/followup_list.ts +28 -13
- package/src/tools/followups/followup_resolve.ts +9 -6
- package/src/tools/guardian-control-plane-policy.ts +15 -14
- package/src/tools/host-filesystem/edit.ts +77 -42
- package/src/tools/host-filesystem/read.ts +52 -33
- package/src/tools/host-filesystem/write.ts +50 -29
- package/src/tools/host-terminal/host-shell.ts +97 -61
- package/src/tools/mcp/mcp-tool-factory.ts +21 -14
- package/src/tools/memory/definitions.ts +60 -28
- package/src/tools/memory/handlers.ts +149 -77
- package/src/tools/memory/register.ts +39 -16
- package/src/tools/network/__tests__/web-search.test.ts +236 -177
- package/src/tools/network/domain-normalize.ts +13 -9
- package/src/tools/network/script-proxy/__tests__/logging.test.ts +193 -123
- package/src/tools/network/script-proxy/__tests__/policy.test.ts +225 -127
- package/src/tools/network/script-proxy/index.ts +1 -17
- package/src/tools/network/script-proxy/session-manager.ts +151 -84
- package/src/tools/network/url-safety.ts +56 -34
- package/src/tools/network/web-fetch.ts +273 -155
- package/src/tools/network/web-search.ts +166 -81
- package/src/tools/permission-checker.ts +6 -25
- package/src/tools/policy-context.ts +8 -5
- package/src/tools/registry.ts +73 -46
- package/src/tools/reminder/reminder-store.ts +65 -44
- package/src/tools/reminder/reminder.ts +76 -35
- package/src/tools/schedule/create.ts +44 -21
- package/src/tools/schedule/delete.ts +8 -5
- package/src/tools/schedule/list.ts +39 -19
- package/src/tools/schedule/update.ts +49 -26
- package/src/tools/secret-detection-handler.ts +130 -49
- package/src/tools/sensitive-output-placeholders.ts +15 -8
- package/src/tools/shared/filesystem/edit-engine.ts +45 -14
- package/src/tools/shared/filesystem/errors.ts +18 -18
- package/src/tools/shared/filesystem/file-ops-service.ts +59 -32
- package/src/tools/shared/filesystem/format-diff.ts +21 -11
- package/src/tools/shared/filesystem/path-policy.ts +17 -13
- package/src/tools/shared/filesystem/size-guard.ts +8 -4
- package/src/tools/shared/filesystem/types.ts +2 -2
- package/src/tools/shared/shell-output.ts +4 -3
- package/src/tools/side-effects.ts +36 -28
- package/src/tools/skills/delete-managed.ts +30 -17
- package/src/tools/skills/load.ts +88 -46
- package/src/tools/skills/sandbox-runner.ts +62 -46
- package/src/tools/skills/scaffold-managed.ts +98 -48
- package/src/tools/skills/script-contract.ts +5 -2
- package/src/tools/skills/skill-script-runner.ts +29 -13
- package/src/tools/skills/skill-tool-factory.ts +20 -10
- package/src/tools/subagent/abort.ts +10 -4
- package/src/tools/subagent/message.ts +14 -8
- package/src/tools/subagent/read.ts +20 -11
- package/src/tools/subagent/spawn.ts +14 -6
- package/src/tools/subagent/status.ts +7 -4
- package/src/tools/swarm/delegate.ts +75 -49
- package/src/tools/system/avatar-generator.ts +46 -33
- package/src/tools/system/navigate-settings.ts +29 -19
- package/src/tools/system/open-system-settings.ts +30 -20
- package/src/tools/system/request-permission.ts +59 -44
- package/src/tools/system/version.ts +27 -16
- package/src/tools/system/voice-config.ts +116 -53
- package/src/tools/tasks/index.ts +8 -8
- package/src/tools/tasks/task-delete.ts +61 -22
- package/src/tools/tasks/task-list.ts +23 -11
- package/src/tools/tasks/task-run.ts +41 -16
- package/src/tools/tasks/task-save.ts +27 -10
- package/src/tools/tasks/work-item-enqueue.ts +114 -48
- package/src/tools/tasks/work-item-list.ts +20 -10
- package/src/tools/tasks/work-item-remove.ts +49 -15
- package/src/tools/tasks/work-item-run.ts +34 -13
- package/src/tools/tasks/work-item-update.ts +84 -31
- package/src/tools/terminal/backends/native.ts +64 -35
- package/src/tools/terminal/backends/types.ts +6 -2
- package/src/tools/terminal/parser.ts +200 -125
- package/src/tools/terminal/safe-env.ts +27 -21
- package/src/tools/terminal/sandbox-diagnostics.ts +31 -13
- package/src/tools/terminal/sandbox.ts +10 -6
- package/src/tools/terminal/shell.ts +124 -68
- package/src/tools/tool-approval-handler.ts +193 -138
- package/src/tools/types.ts +43 -23
- package/src/tools/ui-surface/definitions.ts +124 -89
- package/src/tools/ui-surface/registry.ts +2 -2
- package/src/tools/watch/screen-watch.ts +50 -32
- package/src/tools/watch/watch-state.ts +41 -15
- package/src/tools/watcher/create.ts +37 -15
- package/src/tools/watcher/delete.ts +9 -6
- package/src/tools/watcher/digest.ts +10 -6
- package/src/tools/watcher/list.ts +37 -14
- package/src/tools/watcher/update.ts +33 -18
- package/src/tools/weather/service.ts +331 -174
- package/src/twitter/client.ts +261 -138
- package/src/twitter/oauth-client.ts +17 -13
- package/src/twitter/router.ts +51 -23
- package/src/twitter/session.ts +27 -18
- package/src/types/qrcode.d.ts +6 -3
- package/src/usage/actors.ts +16 -16
- package/src/usage/types.ts +3 -3
- package/src/util/bundled-asset.ts +10 -6
- package/src/util/canonicalize-identity.ts +11 -4
- package/src/util/clipboard.ts +7 -7
- package/src/util/content-id.ts +3 -3
- package/src/util/debounce.ts +3 -2
- package/src/util/diff.ts +55 -33
- package/src/util/errors.ts +26 -26
- package/src/util/fs.ts +8 -2
- package/src/util/log-redact.ts +12 -12
- package/src/util/logger.ts +112 -51
- package/src/util/network-info.ts +13 -5
- package/src/util/object.ts +4 -2
- package/src/util/phone.ts +4 -4
- package/src/util/platform.ts +80 -58
- package/src/util/pricing.ts +49 -31
- package/src/util/retry.ts +18 -7
- package/src/util/row-mapper.ts +7 -4
- package/src/util/silently.ts +7 -4
- package/src/util/spawn.ts +48 -0
- package/src/util/spinner.ts +9 -7
- package/src/util/time.ts +16 -3
- package/src/util/truncate.ts +1 -1
- package/src/util/voice-code.ts +6 -4
- package/src/util/xml.ts +5 -1
- package/src/version.ts +12 -8
- package/src/watcher/engine.ts +71 -44
- package/src/watcher/provider-registry.ts +1 -1
- package/src/watcher/providers/github.ts +40 -23
- package/src/watcher/providers/gmail.ts +59 -38
- package/src/watcher/providers/google-calendar.ts +62 -48
- package/src/watcher/providers/linear.ts +219 -150
- package/src/watcher/providers/slack.ts +93 -27
- package/src/watcher/watcher-store.ts +75 -55
- package/src/work-items/work-item-runner.ts +62 -29
- package/src/work-items/work-item-store.ts +137 -47
- package/src/workspace/commit-message-enrichment-service.ts +65 -25
- package/src/workspace/commit-message-provider.ts +14 -12
- package/src/workspace/git-service.ts +355 -239
- package/src/workspace/heartbeat-service.ts +74 -37
- package/src/workspace/provider-commit-message-generator.ts +95 -70
- package/src/workspace/top-level-renderer.ts +10 -8
- package/src/workspace/top-level-scanner.ts +9 -3
- package/src/workspace/turn-commit.ts +63 -36
- package/src/__tests__/ingress-member-store.test.ts +0 -294
- package/src/__tests__/script-proxy-router.test.ts +0 -215
- package/src/config/bundled-skills/trusted-contacts/SKILL.md +0 -372
- package/src/memory/guardian-bindings.ts +0 -158
- package/src/memory/ingress-member-store.ts +0 -352
- package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -77
- package/src/tools/network/script-proxy/certs.ts +0 -7
- package/src/tools/network/script-proxy/connect-tunnel.ts +0 -1
- package/src/tools/network/script-proxy/http-forwarder.ts +0 -2
- package/src/tools/network/script-proxy/logging.ts +0 -12
- package/src/tools/network/script-proxy/mitm-handler.ts +0 -2
- package/src/tools/network/script-proxy/policy.ts +0 -4
- package/src/tools/network/script-proxy/router.ts +0 -2
- package/src/tools/network/script-proxy/server.ts +0 -5
- package/src/tools/network/script-proxy/types.ts +0 -19
|
@@ -1,19 +1,36 @@
|
|
|
1
|
-
import { createHash } from
|
|
2
|
-
import { homedir } from
|
|
3
|
-
import { dirname, resolve } from
|
|
4
|
-
|
|
5
|
-
import { getConfig } from
|
|
6
|
-
import { resolveSkillSelector } from
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
|
|
5
|
+
import { getConfig } from "../config/loader.js";
|
|
6
|
+
import { resolveSkillSelector } from "../config/skills.js";
|
|
7
|
+
import {
|
|
8
|
+
isSkillSourcePath,
|
|
9
|
+
normalizeFilePath,
|
|
10
|
+
} from "../skills/path-classifier.js";
|
|
11
|
+
import { computeSkillVersionHash } from "../skills/version-hash.js";
|
|
12
|
+
import type { ManifestOverride } from "../tools/execution-target.js";
|
|
13
|
+
import {
|
|
14
|
+
looksLikeHostPortShorthand,
|
|
15
|
+
looksLikePathOnlyInput,
|
|
16
|
+
} from "../tools/network/url-safety.js";
|
|
17
|
+
import { getTool } from "../tools/registry.js";
|
|
18
|
+
import { getLogger } from "../util/logger.js";
|
|
19
|
+
import {
|
|
20
|
+
buildShellAllowlistOptions,
|
|
21
|
+
buildShellCommandCandidates,
|
|
22
|
+
cachedParse,
|
|
23
|
+
type ParsedCommand,
|
|
24
|
+
} from "./shell-identity.js";
|
|
25
|
+
import { findHighestPriorityRule, onRulesChanged } from "./trust-store.js";
|
|
26
|
+
import {
|
|
27
|
+
type AllowlistOption,
|
|
28
|
+
type PermissionCheckResult,
|
|
29
|
+
type PolicyContext,
|
|
30
|
+
RiskLevel,
|
|
31
|
+
type ScopeOption,
|
|
32
|
+
} from "./types.js";
|
|
33
|
+
import { isWorkspaceScopedInvocation } from "./workspace-policy.js";
|
|
17
34
|
|
|
18
35
|
// ── Risk classification cache ────────────────────────────────────────────────
|
|
19
36
|
// classifyRisk() is called on every permission check and can invoke WASM
|
|
@@ -25,15 +42,20 @@ import { isWorkspaceScopedInvocation } from './workspace-policy.js';
|
|
|
25
42
|
const RISK_CACHE_MAX = 256;
|
|
26
43
|
const riskCache = new Map<string, RiskLevel>();
|
|
27
44
|
|
|
28
|
-
function riskCacheKey(
|
|
45
|
+
function riskCacheKey(
|
|
46
|
+
toolName: string,
|
|
47
|
+
input: Record<string, unknown>,
|
|
48
|
+
workingDir?: string,
|
|
49
|
+
manifestOverride?: ManifestOverride,
|
|
50
|
+
): string {
|
|
29
51
|
const inputJson = JSON.stringify(input);
|
|
30
|
-
const hash = createHash(
|
|
52
|
+
const hash = createHash("sha256")
|
|
31
53
|
.update(inputJson)
|
|
32
|
-
.update(
|
|
33
|
-
.update(workingDir ??
|
|
34
|
-
.update(
|
|
35
|
-
.update(manifestOverride ? JSON.stringify(manifestOverride) :
|
|
36
|
-
.digest(
|
|
54
|
+
.update("\0")
|
|
55
|
+
.update(workingDir ?? "")
|
|
56
|
+
.update("\0")
|
|
57
|
+
.update(manifestOverride ? JSON.stringify(manifestOverride) : "")
|
|
58
|
+
.digest("hex");
|
|
37
59
|
return `${toolName}\0${hash}`;
|
|
38
60
|
}
|
|
39
61
|
|
|
@@ -56,61 +78,156 @@ export function _resetLegacyDeprecationWarning(): void {
|
|
|
56
78
|
|
|
57
79
|
// Low-risk shell programs that are read-only / informational
|
|
58
80
|
const LOW_RISK_PROGRAMS = new Set([
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
81
|
+
"ls",
|
|
82
|
+
"cat",
|
|
83
|
+
"head",
|
|
84
|
+
"tail",
|
|
85
|
+
"less",
|
|
86
|
+
"more",
|
|
87
|
+
"wc",
|
|
88
|
+
"file",
|
|
89
|
+
"stat",
|
|
90
|
+
"grep",
|
|
91
|
+
"rg",
|
|
92
|
+
"ag",
|
|
93
|
+
"ack",
|
|
94
|
+
"find",
|
|
95
|
+
"fd",
|
|
96
|
+
"which",
|
|
97
|
+
"where",
|
|
98
|
+
"whereis",
|
|
99
|
+
"type",
|
|
100
|
+
"echo",
|
|
101
|
+
"printf",
|
|
102
|
+
"date",
|
|
103
|
+
"cal",
|
|
104
|
+
"uptime",
|
|
105
|
+
"whoami",
|
|
106
|
+
"hostname",
|
|
107
|
+
"uname",
|
|
108
|
+
"pwd",
|
|
109
|
+
"realpath",
|
|
110
|
+
"dirname",
|
|
111
|
+
"basename",
|
|
112
|
+
"git",
|
|
113
|
+
"node",
|
|
114
|
+
"bun",
|
|
115
|
+
"deno",
|
|
116
|
+
"npm",
|
|
117
|
+
"npx",
|
|
118
|
+
"yarn",
|
|
119
|
+
"pnpm",
|
|
120
|
+
"python",
|
|
121
|
+
"python3",
|
|
122
|
+
"pip",
|
|
123
|
+
"pip3",
|
|
124
|
+
"man",
|
|
125
|
+
"help",
|
|
126
|
+
"info",
|
|
127
|
+
"env",
|
|
128
|
+
"printenv",
|
|
129
|
+
"set",
|
|
130
|
+
"diff",
|
|
131
|
+
"sort",
|
|
132
|
+
"uniq",
|
|
133
|
+
"cut",
|
|
134
|
+
"tr",
|
|
135
|
+
"tee",
|
|
136
|
+
"xargs",
|
|
137
|
+
"jq",
|
|
138
|
+
"yq",
|
|
139
|
+
"http",
|
|
140
|
+
"dig",
|
|
141
|
+
"nslookup",
|
|
142
|
+
"ping",
|
|
143
|
+
"tree",
|
|
144
|
+
"du",
|
|
145
|
+
"df",
|
|
71
146
|
]);
|
|
72
147
|
|
|
73
148
|
// High-risk shell programs / patterns
|
|
74
149
|
const HIGH_RISK_PROGRAMS = new Set([
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
150
|
+
"sudo",
|
|
151
|
+
"su",
|
|
152
|
+
"doas",
|
|
153
|
+
"dd",
|
|
154
|
+
"mkfs",
|
|
155
|
+
"fdisk",
|
|
156
|
+
"parted",
|
|
157
|
+
"mount",
|
|
158
|
+
"umount",
|
|
159
|
+
"systemctl",
|
|
160
|
+
"service",
|
|
161
|
+
"launchctl",
|
|
162
|
+
"useradd",
|
|
163
|
+
"userdel",
|
|
164
|
+
"usermod",
|
|
165
|
+
"groupadd",
|
|
166
|
+
"groupdel",
|
|
167
|
+
"iptables",
|
|
168
|
+
"ufw",
|
|
169
|
+
"firewall-cmd",
|
|
170
|
+
"reboot",
|
|
171
|
+
"shutdown",
|
|
172
|
+
"halt",
|
|
173
|
+
"poweroff",
|
|
174
|
+
"kill",
|
|
175
|
+
"killall",
|
|
176
|
+
"pkill",
|
|
82
177
|
]);
|
|
83
178
|
|
|
84
179
|
// Git subcommands that are low-risk (read-only)
|
|
85
180
|
const LOW_RISK_GIT_SUBCOMMANDS = new Set([
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
181
|
+
"status",
|
|
182
|
+
"log",
|
|
183
|
+
"diff",
|
|
184
|
+
"show",
|
|
185
|
+
"branch",
|
|
186
|
+
"tag",
|
|
187
|
+
"remote",
|
|
188
|
+
"stash",
|
|
189
|
+
"blame",
|
|
190
|
+
"shortlog",
|
|
191
|
+
"describe",
|
|
192
|
+
"rev-parse",
|
|
193
|
+
"ls-files",
|
|
194
|
+
"ls-tree",
|
|
195
|
+
"cat-file",
|
|
196
|
+
"reflog",
|
|
89
197
|
]);
|
|
90
198
|
|
|
91
199
|
// Commands that wrap another program — the real program appears as the first
|
|
92
200
|
// non-flag argument. When one of these is the segment program we look through
|
|
93
201
|
// its args to find the effective program (e.g. `env curl …` → curl).
|
|
94
202
|
const WRAPPER_PROGRAMS = new Set([
|
|
95
|
-
|
|
96
|
-
|
|
203
|
+
"env",
|
|
204
|
+
"nice",
|
|
205
|
+
"nohup",
|
|
206
|
+
"time",
|
|
207
|
+
"command",
|
|
208
|
+
"exec",
|
|
209
|
+
"strace",
|
|
210
|
+
"ltrace",
|
|
211
|
+
"ionice",
|
|
212
|
+
"taskset",
|
|
213
|
+
"timeout",
|
|
97
214
|
]);
|
|
98
215
|
|
|
99
216
|
// `env` flags that consume the next positional argument as their value.
|
|
100
217
|
// Without this, `env -u curl echo` would incorrectly identify `curl` (the
|
|
101
218
|
// value of -u) as the wrapped program instead of `echo`.
|
|
102
|
-
const ENV_VALUE_FLAGS = new Set([
|
|
219
|
+
const ENV_VALUE_FLAGS = new Set(["-u", "--unset", "-C", "--chdir"]);
|
|
103
220
|
|
|
104
221
|
// Bare filenames that `rm` is allowed to delete at Medium risk (instead of
|
|
105
222
|
// High) so workspace-scoped allow rules can approve them without the
|
|
106
223
|
// dangerous `allowHighRisk` flag. Only matches when the args contain no
|
|
107
224
|
// flags and exactly one of these filenames.
|
|
108
|
-
const RM_SAFE_BARE_FILES = new Set([
|
|
225
|
+
const RM_SAFE_BARE_FILES = new Set(["BOOTSTRAP.md", "UPDATES.md"]);
|
|
109
226
|
|
|
110
227
|
function isRmOfKnownSafeFile(args: string[]): boolean {
|
|
111
228
|
if (args.length !== 1) return false;
|
|
112
229
|
const target = args[0];
|
|
113
|
-
if (target.startsWith(
|
|
230
|
+
if (target.startsWith("-") || target.includes("/")) return false;
|
|
114
231
|
return RM_SAFE_BARE_FILES.has(target);
|
|
115
232
|
}
|
|
116
233
|
|
|
@@ -122,26 +239,32 @@ function isRmOfKnownSafeFile(args: string[]): boolean {
|
|
|
122
239
|
* Handles `env` specially: skips `VAR=value` pairs and value-taking flags
|
|
123
240
|
* like `-u NAME` and `-C DIR`.
|
|
124
241
|
*/
|
|
125
|
-
function getWrappedProgram(seg: {
|
|
126
|
-
|
|
242
|
+
function getWrappedProgram(seg: {
|
|
243
|
+
program: string;
|
|
244
|
+
args: string[];
|
|
245
|
+
}): string | undefined {
|
|
246
|
+
const isEnv = seg.program === "env";
|
|
127
247
|
for (let i = 0; i < seg.args.length; i++) {
|
|
128
248
|
const arg = seg.args[i];
|
|
129
|
-
if (arg.startsWith(
|
|
249
|
+
if (arg.startsWith("-")) {
|
|
130
250
|
if (isEnv && ENV_VALUE_FLAGS.has(arg)) i++; // skip the value argument
|
|
131
251
|
continue;
|
|
132
252
|
}
|
|
133
|
-
if (isEnv && arg.includes(
|
|
253
|
+
if (isEnv && arg.includes("=")) continue; // skip env VAR=value pairs
|
|
134
254
|
return arg;
|
|
135
255
|
}
|
|
136
256
|
return undefined;
|
|
137
257
|
}
|
|
138
258
|
|
|
139
|
-
function getStringField(
|
|
259
|
+
function getStringField(
|
|
260
|
+
input: Record<string, unknown>,
|
|
261
|
+
...keys: string[]
|
|
262
|
+
): string {
|
|
140
263
|
for (const key of keys) {
|
|
141
264
|
const value = input[key];
|
|
142
|
-
if (typeof value ===
|
|
265
|
+
if (typeof value === "string") return value;
|
|
143
266
|
}
|
|
144
|
-
return
|
|
267
|
+
return "";
|
|
145
268
|
}
|
|
146
269
|
|
|
147
270
|
/**
|
|
@@ -149,7 +272,9 @@ function getStringField(input: Record<string, unknown>, ...keys: string[]): stri
|
|
|
149
272
|
* is always computed from disk so that untrusted input cannot spoof a
|
|
150
273
|
* pre-approved hash. If disk computation fails, only the bare id is returned.
|
|
151
274
|
*/
|
|
152
|
-
function resolveSkillIdAndHash(
|
|
275
|
+
function resolveSkillIdAndHash(
|
|
276
|
+
selector: string,
|
|
277
|
+
): { id: string; versionHash?: string } | null {
|
|
153
278
|
const resolved = resolveSkillSelector(selector);
|
|
154
279
|
if (!resolved.skill) return null;
|
|
155
280
|
|
|
@@ -162,9 +287,9 @@ function resolveSkillIdAndHash(selector: string): { id: string; versionHash?: st
|
|
|
162
287
|
}
|
|
163
288
|
|
|
164
289
|
function canonicalizeWebFetchUrl(parsed: URL): URL {
|
|
165
|
-
parsed.hash =
|
|
166
|
-
parsed.username =
|
|
167
|
-
parsed.password =
|
|
290
|
+
parsed.hash = "";
|
|
291
|
+
parsed.username = "";
|
|
292
|
+
parsed.password = "";
|
|
168
293
|
|
|
169
294
|
try {
|
|
170
295
|
// Normalize equivalent escaped paths (for example, "/%70rivate" -> "/private")
|
|
@@ -174,8 +299,8 @@ function canonicalizeWebFetchUrl(parsed: URL): URL {
|
|
|
174
299
|
// Keep URL parser canonical form when decoding fails.
|
|
175
300
|
}
|
|
176
301
|
|
|
177
|
-
if (parsed.hostname.endsWith(
|
|
178
|
-
parsed.hostname = parsed.hostname.replace(/\.+$/,
|
|
302
|
+
if (parsed.hostname.endsWith(".")) {
|
|
303
|
+
parsed.hostname = parsed.hostname.replace(/\.+$/, "");
|
|
179
304
|
}
|
|
180
305
|
|
|
181
306
|
return parsed;
|
|
@@ -195,7 +320,7 @@ export function normalizeWebFetchUrl(rawUrl: string): URL | null {
|
|
|
195
320
|
|
|
196
321
|
try {
|
|
197
322
|
const parsed = new URL(trimmed);
|
|
198
|
-
if (parsed.protocol ===
|
|
323
|
+
if (parsed.protocol === "http:" || parsed.protocol === "https:") {
|
|
199
324
|
return canonicalizeWebFetchUrl(parsed);
|
|
200
325
|
}
|
|
201
326
|
return null;
|
|
@@ -219,19 +344,27 @@ export function normalizeWebFetchUrl(rawUrl: string): URL | null {
|
|
|
219
344
|
}
|
|
220
345
|
|
|
221
346
|
function escapeMinimatchLiteral(value: string): string {
|
|
222
|
-
return value.replace(/([\\*?[\]{}()!+@|])/g,
|
|
347
|
+
return value.replace(/([\\*?[\]{}()!+@|])/g, "\\$1");
|
|
223
348
|
}
|
|
224
349
|
|
|
225
|
-
async function buildCommandCandidates(
|
|
226
|
-
|
|
227
|
-
|
|
350
|
+
async function buildCommandCandidates(
|
|
351
|
+
toolName: string,
|
|
352
|
+
input: Record<string, unknown>,
|
|
353
|
+
workingDir: string,
|
|
354
|
+
preParsed?: ParsedCommand,
|
|
355
|
+
): Promise<string[]> {
|
|
356
|
+
if (toolName === "bash" || toolName === "host_bash") {
|
|
357
|
+
return buildShellCommandCandidates(
|
|
358
|
+
getStringField(input, "command"),
|
|
359
|
+
preParsed,
|
|
360
|
+
);
|
|
228
361
|
}
|
|
229
362
|
|
|
230
|
-
if (toolName ===
|
|
231
|
-
const rawSelector = getStringField(input,
|
|
363
|
+
if (toolName === "skill_load") {
|
|
364
|
+
const rawSelector = getStringField(input, "skill").trim();
|
|
232
365
|
const targets: string[] = [];
|
|
233
366
|
if (!rawSelector) {
|
|
234
|
-
targets.push(
|
|
367
|
+
targets.push("");
|
|
235
368
|
} else {
|
|
236
369
|
const resolved = resolveSkillIdAndHash(rawSelector);
|
|
237
370
|
if (resolved) {
|
|
@@ -247,13 +380,20 @@ async function buildCommandCandidates(toolName: string, input: Record<string, un
|
|
|
247
380
|
return [...new Set(targets)].map((target) => `${toolName}:${target}`);
|
|
248
381
|
}
|
|
249
382
|
|
|
250
|
-
if (
|
|
251
|
-
|
|
383
|
+
if (
|
|
384
|
+
toolName === "scaffold_managed_skill" ||
|
|
385
|
+
toolName === "delete_managed_skill"
|
|
386
|
+
) {
|
|
387
|
+
const skillId = getStringField(input, "skill_id").trim();
|
|
252
388
|
return [`${toolName}:${skillId}`];
|
|
253
389
|
}
|
|
254
390
|
|
|
255
|
-
if (
|
|
256
|
-
|
|
391
|
+
if (
|
|
392
|
+
toolName === "web_fetch" ||
|
|
393
|
+
toolName === "browser_navigate" ||
|
|
394
|
+
toolName === "network_request"
|
|
395
|
+
) {
|
|
396
|
+
const rawUrl = getStringField(input, "url").trim();
|
|
257
397
|
const candidates: string[] = [];
|
|
258
398
|
|
|
259
399
|
if (rawUrl) {
|
|
@@ -273,10 +413,17 @@ async function buildCommandCandidates(toolName: string, input: Record<string, un
|
|
|
273
413
|
return [...new Set(candidates)];
|
|
274
414
|
}
|
|
275
415
|
|
|
276
|
-
const fileTarget = getStringField(input,
|
|
277
|
-
if (
|
|
416
|
+
const fileTarget = getStringField(input, "path", "file_path");
|
|
417
|
+
if (
|
|
418
|
+
toolName === "host_file_read" ||
|
|
419
|
+
toolName === "host_file_write" ||
|
|
420
|
+
toolName === "host_file_edit"
|
|
421
|
+
) {
|
|
278
422
|
const resolved = fileTarget ? resolve(fileTarget) : fileTarget;
|
|
279
|
-
const normalized =
|
|
423
|
+
const normalized =
|
|
424
|
+
resolved && process.platform === "win32"
|
|
425
|
+
? resolved.replaceAll("\\", "/")
|
|
426
|
+
: resolved;
|
|
280
427
|
const candidates = [`${toolName}:${normalized}`];
|
|
281
428
|
if (normalized !== fileTarget) {
|
|
282
429
|
candidates.push(`${toolName}:${fileTarget}`);
|
|
@@ -293,7 +440,10 @@ async function buildCommandCandidates(toolName: string, input: Record<string, un
|
|
|
293
440
|
}
|
|
294
441
|
|
|
295
442
|
const rawResolved = fileTarget ? resolve(workingDir, fileTarget) : fileTarget;
|
|
296
|
-
const resolved =
|
|
443
|
+
const resolved =
|
|
444
|
+
rawResolved && process.platform === "win32"
|
|
445
|
+
? rawResolved.replaceAll("\\", "/")
|
|
446
|
+
: rawResolved;
|
|
297
447
|
const candidates = [`${toolName}:${resolved}`];
|
|
298
448
|
// Also include the raw path if it differs, so user-created rules with
|
|
299
449
|
// raw paths still match.
|
|
@@ -312,12 +462,21 @@ async function buildCommandCandidates(toolName: string, input: Record<string, un
|
|
|
312
462
|
return [...new Set(candidates)];
|
|
313
463
|
}
|
|
314
464
|
|
|
315
|
-
export async function classifyRisk(
|
|
465
|
+
export async function classifyRisk(
|
|
466
|
+
toolName: string,
|
|
467
|
+
input: Record<string, unknown>,
|
|
468
|
+
workingDir?: string,
|
|
469
|
+
preParsed?: ParsedCommand,
|
|
470
|
+
manifestOverride?: ManifestOverride,
|
|
471
|
+
signal?: AbortSignal,
|
|
472
|
+
): Promise<RiskLevel> {
|
|
316
473
|
signal?.throwIfAborted();
|
|
317
474
|
|
|
318
475
|
// Check cache first (skip when preParsed is provided since caller already
|
|
319
476
|
// parsed and we'd just be duplicating the key computation cost).
|
|
320
|
-
const cacheKey = preParsed
|
|
477
|
+
const cacheKey = preParsed
|
|
478
|
+
? null
|
|
479
|
+
: riskCacheKey(toolName, input, workingDir, manifestOverride);
|
|
321
480
|
if (cacheKey) {
|
|
322
481
|
const cached = riskCache.get(cacheKey);
|
|
323
482
|
if (cached !== undefined) {
|
|
@@ -328,7 +487,13 @@ export async function classifyRisk(toolName: string, input: Record<string, unkno
|
|
|
328
487
|
}
|
|
329
488
|
}
|
|
330
489
|
|
|
331
|
-
const result = await classifyRiskUncached(
|
|
490
|
+
const result = await classifyRiskUncached(
|
|
491
|
+
toolName,
|
|
492
|
+
input,
|
|
493
|
+
workingDir,
|
|
494
|
+
preParsed,
|
|
495
|
+
manifestOverride,
|
|
496
|
+
);
|
|
332
497
|
|
|
333
498
|
if (cacheKey) {
|
|
334
499
|
if (riskCache.size >= RISK_CACHE_MAX) {
|
|
@@ -341,47 +506,66 @@ export async function classifyRisk(toolName: string, input: Record<string, unkno
|
|
|
341
506
|
return result;
|
|
342
507
|
}
|
|
343
508
|
|
|
344
|
-
async function classifyRiskUncached(
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
509
|
+
async function classifyRiskUncached(
|
|
510
|
+
toolName: string,
|
|
511
|
+
input: Record<string, unknown>,
|
|
512
|
+
workingDir?: string,
|
|
513
|
+
preParsed?: ParsedCommand,
|
|
514
|
+
manifestOverride?: ManifestOverride,
|
|
515
|
+
): Promise<RiskLevel> {
|
|
516
|
+
if (toolName === "file_read") return RiskLevel.Low;
|
|
517
|
+
if (toolName === "file_write" || toolName === "file_edit") {
|
|
518
|
+
const filePath = getStringField(input, "path", "file_path");
|
|
519
|
+
if (
|
|
520
|
+
filePath &&
|
|
521
|
+
isSkillSourcePath(
|
|
522
|
+
resolve(workingDir ?? process.cwd(), filePath),
|
|
523
|
+
getConfig().skills.load.extraDirs,
|
|
524
|
+
)
|
|
525
|
+
) {
|
|
349
526
|
return RiskLevel.High;
|
|
350
527
|
}
|
|
351
528
|
return RiskLevel.Medium;
|
|
352
529
|
}
|
|
353
|
-
if (toolName ===
|
|
354
|
-
if (toolName ===
|
|
530
|
+
if (toolName === "web_search") return RiskLevel.Low;
|
|
531
|
+
if (toolName === "web_fetch") {
|
|
355
532
|
// Private-network fetches are High risk so that blanket allow rules
|
|
356
533
|
// (including the starter bundle) cannot silently bypass the prompt.
|
|
357
|
-
return input.allow_private_network === true
|
|
534
|
+
return input.allow_private_network === true
|
|
535
|
+
? RiskLevel.High
|
|
536
|
+
: RiskLevel.Low;
|
|
358
537
|
}
|
|
359
|
-
if (toolName ===
|
|
360
|
-
return input.allow_private_network === true
|
|
538
|
+
if (toolName === "browser_navigate") {
|
|
539
|
+
return input.allow_private_network === true
|
|
540
|
+
? RiskLevel.High
|
|
541
|
+
: RiskLevel.Low;
|
|
361
542
|
}
|
|
362
543
|
// All other browser tools are low risk — the browser is sandboxed and user-visible.
|
|
363
|
-
if (toolName.startsWith(
|
|
544
|
+
if (toolName.startsWith("browser_")) return RiskLevel.Low;
|
|
364
545
|
// Proxy-authenticated network requests are Medium risk — they carry injected
|
|
365
546
|
// credentials and the user should approve the target host/origin.
|
|
366
|
-
if (toolName ===
|
|
367
|
-
if (toolName ===
|
|
547
|
+
if (toolName === "network_request") return RiskLevel.Medium;
|
|
548
|
+
if (toolName === "skill_load") return RiskLevel.Low;
|
|
368
549
|
|
|
369
550
|
// Escalate host file mutations targeting skill source paths to High risk.
|
|
370
551
|
// The host variants fall through to the tool registry (Medium) by default,
|
|
371
552
|
// but writing to skill source code is a privilege-escalation vector.
|
|
372
|
-
if (toolName ===
|
|
373
|
-
const filePath = getStringField(input,
|
|
374
|
-
if (
|
|
553
|
+
if (toolName === "host_file_write" || toolName === "host_file_edit") {
|
|
554
|
+
const filePath = getStringField(input, "path", "file_path");
|
|
555
|
+
if (
|
|
556
|
+
filePath &&
|
|
557
|
+
isSkillSourcePath(resolve(filePath), getConfig().skills.load.extraDirs)
|
|
558
|
+
) {
|
|
375
559
|
return RiskLevel.High;
|
|
376
560
|
}
|
|
377
561
|
// Fall through to the tool registry default (Medium) below.
|
|
378
562
|
}
|
|
379
563
|
|
|
380
|
-
if (toolName ===
|
|
381
|
-
const command = (input.command as string) ??
|
|
564
|
+
if (toolName === "bash" || toolName === "host_bash") {
|
|
565
|
+
const command = (input.command as string) ?? "";
|
|
382
566
|
if (!command.trim()) return RiskLevel.Low;
|
|
383
567
|
|
|
384
|
-
const parsed = preParsed ?? await cachedParse(command);
|
|
568
|
+
const parsed = preParsed ?? (await cachedParse(command));
|
|
385
569
|
|
|
386
570
|
// Dangerous patterns → High
|
|
387
571
|
if (parsed.dangerousPatterns.length > 0) return RiskLevel.High;
|
|
@@ -397,26 +581,31 @@ async function classifyRiskUncached(toolName: string, input: Record<string, unkn
|
|
|
397
581
|
|
|
398
582
|
if (HIGH_RISK_PROGRAMS.has(prog)) return RiskLevel.High;
|
|
399
583
|
|
|
400
|
-
if (prog ===
|
|
584
|
+
if (prog === "rm") {
|
|
401
585
|
// Only downgrade rm of known safe workspace files for sandboxed bash.
|
|
402
586
|
// host_bash has a global allow rule that would auto-approve Medium-risk
|
|
403
587
|
// commands, so rm on the host must always require explicit approval.
|
|
404
|
-
if (toolName ===
|
|
588
|
+
if (toolName === "bash" && isRmOfKnownSafeFile(seg.args)) {
|
|
405
589
|
maxRisk = RiskLevel.Medium;
|
|
406
590
|
continue;
|
|
407
591
|
}
|
|
408
592
|
return RiskLevel.High;
|
|
409
593
|
}
|
|
410
594
|
|
|
411
|
-
if (
|
|
412
|
-
|
|
595
|
+
if (
|
|
596
|
+
prog === "chmod" ||
|
|
597
|
+
prog === "chown" ||
|
|
598
|
+
prog === "chgrp" ||
|
|
599
|
+
prog === "sed" ||
|
|
600
|
+
prog === "awk"
|
|
601
|
+
) {
|
|
413
602
|
maxRisk = RiskLevel.Medium;
|
|
414
603
|
continue;
|
|
415
604
|
}
|
|
416
605
|
|
|
417
606
|
// curl/wget can download and execute arbitrary code from the internet.
|
|
418
607
|
// Also catch wrapped invocations like `env curl …` or `nice wget …`.
|
|
419
|
-
if (prog ===
|
|
608
|
+
if (prog === "curl" || prog === "wget") {
|
|
420
609
|
maxRisk = RiskLevel.Medium;
|
|
421
610
|
continue;
|
|
422
611
|
}
|
|
@@ -424,19 +613,23 @@ async function classifyRiskUncached(toolName: string, input: Record<string, unkn
|
|
|
424
613
|
if (WRAPPER_PROGRAMS.has(prog)) {
|
|
425
614
|
// `command -v` and `command -V` are read-only lookups (print where
|
|
426
615
|
// a command lives) — don't escalate to high risk for those.
|
|
427
|
-
if (
|
|
616
|
+
if (
|
|
617
|
+
prog === "command" &&
|
|
618
|
+
seg.args.length > 0 &&
|
|
619
|
+
(seg.args[0] === "-v" || seg.args[0] === "-V")
|
|
620
|
+
) {
|
|
428
621
|
continue;
|
|
429
622
|
}
|
|
430
623
|
const wrapped = getWrappedProgram(seg);
|
|
431
|
-
if (wrapped ===
|
|
624
|
+
if (wrapped === "rm") return RiskLevel.High;
|
|
432
625
|
if (wrapped && HIGH_RISK_PROGRAMS.has(wrapped)) return RiskLevel.High;
|
|
433
|
-
if (wrapped ===
|
|
626
|
+
if (wrapped === "curl" || wrapped === "wget") {
|
|
434
627
|
maxRisk = RiskLevel.Medium;
|
|
435
628
|
continue;
|
|
436
629
|
}
|
|
437
630
|
}
|
|
438
631
|
|
|
439
|
-
if (prog ===
|
|
632
|
+
if (prog === "git") {
|
|
440
633
|
const subcommand = seg.args[0];
|
|
441
634
|
if (subcommand && LOW_RISK_GIT_SUBCOMMANDS.has(subcommand)) {
|
|
442
635
|
// Stay at current risk
|
|
@@ -470,7 +663,11 @@ async function classifyRiskUncached(toolName: string, input: Record<string, unkn
|
|
|
470
663
|
// Use manifest metadata for unregistered skill tools so the Permission
|
|
471
664
|
// Simulator shows accurate risk levels instead of defaulting to Medium.
|
|
472
665
|
if (manifestOverride) {
|
|
473
|
-
const riskMap: Record<string, RiskLevel> = {
|
|
666
|
+
const riskMap: Record<string, RiskLevel> = {
|
|
667
|
+
low: RiskLevel.Low,
|
|
668
|
+
medium: RiskLevel.Medium,
|
|
669
|
+
high: RiskLevel.High,
|
|
670
|
+
};
|
|
474
671
|
return riskMap[manifestOverride.risk] ?? RiskLevel.Medium;
|
|
475
672
|
}
|
|
476
673
|
|
|
@@ -490,49 +687,73 @@ export async function check(
|
|
|
490
687
|
|
|
491
688
|
// For shell tools, parse once and share the result to avoid duplicate tree-sitter work.
|
|
492
689
|
let shellParsed: ParsedCommand | undefined;
|
|
493
|
-
if (toolName ===
|
|
494
|
-
const command = ((input.command as string) ??
|
|
690
|
+
if (toolName === "bash" || toolName === "host_bash") {
|
|
691
|
+
const command = ((input.command as string) ?? "").trim();
|
|
495
692
|
if (command) {
|
|
496
693
|
shellParsed = await cachedParse(command);
|
|
497
694
|
}
|
|
498
695
|
}
|
|
499
696
|
|
|
500
|
-
const risk = await classifyRisk(
|
|
697
|
+
const risk = await classifyRisk(
|
|
698
|
+
toolName,
|
|
699
|
+
input,
|
|
700
|
+
workingDir,
|
|
701
|
+
shellParsed,
|
|
702
|
+
manifestOverride,
|
|
703
|
+
signal,
|
|
704
|
+
);
|
|
501
705
|
|
|
502
706
|
// Build command string candidates for rule matching
|
|
503
|
-
const commandCandidates = await buildCommandCandidates(
|
|
707
|
+
const commandCandidates = await buildCommandCandidates(
|
|
708
|
+
toolName,
|
|
709
|
+
input,
|
|
710
|
+
workingDir,
|
|
711
|
+
shellParsed,
|
|
712
|
+
);
|
|
504
713
|
|
|
505
714
|
// Find the highest-priority matching rule across all candidates
|
|
506
|
-
const matchedRule = findHighestPriorityRule(
|
|
715
|
+
const matchedRule = findHighestPriorityRule(
|
|
716
|
+
toolName,
|
|
717
|
+
commandCandidates,
|
|
718
|
+
workingDir,
|
|
719
|
+
policyContext,
|
|
720
|
+
);
|
|
507
721
|
|
|
508
722
|
// Deny rules apply at ALL risk levels — including proxied network mode.
|
|
509
723
|
// Evaluate them first so hard blocks are never downgraded to a prompt.
|
|
510
|
-
if (matchedRule && matchedRule.decision ===
|
|
511
|
-
return {
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
// proxy with injected credentials. This runs after deny rules but
|
|
517
|
-
// before allow/ask rules so that trust rules cannot auto-approve
|
|
518
|
-
// proxied commands.
|
|
519
|
-
if (toolName === 'bash' && input.network_mode === 'proxied') {
|
|
520
|
-
return { decision: 'prompt', reason: 'Proxied network mode requires explicit approval for each invocation.' };
|
|
724
|
+
if (matchedRule && matchedRule.decision === "deny") {
|
|
725
|
+
return {
|
|
726
|
+
decision: "deny",
|
|
727
|
+
reason: `Blocked by deny rule: ${matchedRule.pattern}`,
|
|
728
|
+
matchedRule,
|
|
729
|
+
};
|
|
521
730
|
}
|
|
522
731
|
|
|
523
732
|
if (matchedRule) {
|
|
524
|
-
if (matchedRule.decision ===
|
|
733
|
+
if (matchedRule.decision === "ask") {
|
|
525
734
|
// Ask rules always prompt — never auto-allow or auto-deny
|
|
526
|
-
return {
|
|
735
|
+
return {
|
|
736
|
+
decision: "prompt",
|
|
737
|
+
reason: `Matched ask rule: ${matchedRule.pattern}`,
|
|
738
|
+
matchedRule,
|
|
739
|
+
};
|
|
527
740
|
}
|
|
528
741
|
|
|
529
742
|
// Allow rule: auto-allow for non-High risk
|
|
530
743
|
if (risk !== RiskLevel.High) {
|
|
531
|
-
return {
|
|
744
|
+
return {
|
|
745
|
+
decision: "allow",
|
|
746
|
+
reason: `Matched trust rule: ${matchedRule.pattern}`,
|
|
747
|
+
matchedRule,
|
|
748
|
+
};
|
|
532
749
|
}
|
|
533
750
|
// High risk with allow rule that explicitly permits high-risk → auto-allow
|
|
534
751
|
if (matchedRule.allowHighRisk === true) {
|
|
535
|
-
return {
|
|
752
|
+
return {
|
|
753
|
+
decision: "allow",
|
|
754
|
+
reason: `Matched high-risk trust rule: ${matchedRule.pattern}`,
|
|
755
|
+
matchedRule,
|
|
756
|
+
};
|
|
536
757
|
}
|
|
537
758
|
// High risk with allow rule (without allowHighRisk) → fall through to prompt
|
|
538
759
|
}
|
|
@@ -546,11 +767,17 @@ export async function check(
|
|
|
546
767
|
// but isn't registered — treat it as a third-party skill tool.
|
|
547
768
|
if (!matchedRule) {
|
|
548
769
|
const tool = getTool(toolName);
|
|
549
|
-
if (tool?.origin ===
|
|
550
|
-
return {
|
|
770
|
+
if (tool?.origin === "skill" && !tool.ownerSkillBundled) {
|
|
771
|
+
return {
|
|
772
|
+
decision: "prompt",
|
|
773
|
+
reason: "Skill tool: requires approval by default",
|
|
774
|
+
};
|
|
551
775
|
}
|
|
552
776
|
if (!tool && manifestOverride) {
|
|
553
|
-
return {
|
|
777
|
+
return {
|
|
778
|
+
decision: "prompt",
|
|
779
|
+
reason: "Skill tool: requires approval by default",
|
|
780
|
+
};
|
|
554
781
|
}
|
|
555
782
|
}
|
|
556
783
|
|
|
@@ -561,24 +788,32 @@ export async function check(
|
|
|
561
788
|
// skill load via an exact-version or wildcard trust rule.
|
|
562
789
|
const permissionsMode = getConfig().permissions.mode;
|
|
563
790
|
|
|
564
|
-
if (permissionsMode ===
|
|
791
|
+
if (permissionsMode === "legacy" && !_legacyDeprecationWarned) {
|
|
565
792
|
_legacyDeprecationWarned = true;
|
|
566
|
-
getLogger(
|
|
793
|
+
getLogger("checker").warn(
|
|
794
|
+
'Permissions mode "legacy" is deprecated and will be removed in a future release. Switch to "workspace" (default) or "strict".',
|
|
795
|
+
);
|
|
567
796
|
}
|
|
568
797
|
|
|
569
|
-
if (permissionsMode ===
|
|
570
|
-
return {
|
|
798
|
+
if (permissionsMode === "strict" && !matchedRule) {
|
|
799
|
+
return {
|
|
800
|
+
decision: "prompt",
|
|
801
|
+
reason: `Strict mode: no matching rule, requires approval`,
|
|
802
|
+
};
|
|
571
803
|
}
|
|
572
804
|
|
|
573
805
|
// Workspace mode: auto-allow workspace-scoped operations that don't have
|
|
574
806
|
// an explicit rule. Non-workspace operations fall through to risk-based policy.
|
|
575
|
-
if (permissionsMode ===
|
|
807
|
+
if (permissionsMode === "workspace" && !matchedRule) {
|
|
576
808
|
// When sandbox is disabled, bash runs on the host — don't auto-allow
|
|
577
809
|
const sandboxEnabled = getConfig().sandbox.enabled;
|
|
578
|
-
if (toolName ===
|
|
810
|
+
if (toolName === "bash" && !sandboxEnabled) {
|
|
579
811
|
// Fall through to risk-based policy below
|
|
580
812
|
} else if (isWorkspaceScopedInvocation(toolName, input, workingDir)) {
|
|
581
|
-
return {
|
|
813
|
+
return {
|
|
814
|
+
decision: "allow",
|
|
815
|
+
reason: "Workspace mode: workspace-scoped operation auto-allowed",
|
|
816
|
+
};
|
|
582
817
|
}
|
|
583
818
|
}
|
|
584
819
|
|
|
@@ -590,41 +825,47 @@ export async function check(
|
|
|
590
825
|
// still prompts for bundled skill tools without explicit rules.
|
|
591
826
|
if (!matchedRule && risk === RiskLevel.Low) {
|
|
592
827
|
const tool = getTool(toolName);
|
|
593
|
-
if (tool?.origin ===
|
|
594
|
-
return {
|
|
828
|
+
if (tool?.origin === "skill" && tool.ownerSkillBundled) {
|
|
829
|
+
return {
|
|
830
|
+
decision: "allow",
|
|
831
|
+
reason: "Bundled skill tool: low risk, auto-allowed",
|
|
832
|
+
};
|
|
595
833
|
}
|
|
596
834
|
}
|
|
597
835
|
|
|
598
836
|
if (risk === RiskLevel.High) {
|
|
599
|
-
return {
|
|
837
|
+
return {
|
|
838
|
+
decision: "prompt",
|
|
839
|
+
reason: `High risk: always requires approval`,
|
|
840
|
+
};
|
|
600
841
|
}
|
|
601
842
|
|
|
602
843
|
if (risk === RiskLevel.Low) {
|
|
603
|
-
return { decision:
|
|
844
|
+
return { decision: "allow", reason: "Low risk: auto-allowed" };
|
|
604
845
|
}
|
|
605
846
|
|
|
606
|
-
return { decision:
|
|
847
|
+
return { decision: "prompt", reason: `${risk} risk: requires approval` };
|
|
607
848
|
}
|
|
608
849
|
|
|
609
850
|
const TOOL_DISPLAY_NAMES: Record<string, string> = {
|
|
610
|
-
file_read:
|
|
611
|
-
file_write:
|
|
612
|
-
file_edit:
|
|
613
|
-
host_file_read:
|
|
614
|
-
host_file_write:
|
|
615
|
-
host_file_edit:
|
|
616
|
-
web_fetch:
|
|
617
|
-
browser_navigate:
|
|
618
|
-
network_request:
|
|
851
|
+
file_read: "file reads",
|
|
852
|
+
file_write: "file writes",
|
|
853
|
+
file_edit: "file edits",
|
|
854
|
+
host_file_read: "host file reads",
|
|
855
|
+
host_file_write: "host file writes",
|
|
856
|
+
host_file_edit: "host file edits",
|
|
857
|
+
web_fetch: "URL fetches",
|
|
858
|
+
browser_navigate: "browser navigations",
|
|
859
|
+
network_request: "network requests",
|
|
619
860
|
};
|
|
620
861
|
|
|
621
862
|
function friendlyBasename(filePath: string): string {
|
|
622
|
-
const parts = filePath.split(
|
|
863
|
+
const parts = filePath.split("/");
|
|
623
864
|
return parts[parts.length - 1] || filePath;
|
|
624
865
|
}
|
|
625
866
|
|
|
626
867
|
function friendlyHostname(url: URL): string {
|
|
627
|
-
return url.hostname.replace(/^www\./,
|
|
868
|
+
return url.hostname.replace(/^www\./, "");
|
|
628
869
|
}
|
|
629
870
|
|
|
630
871
|
// ── Per-tool allowlist option strategies ─────────────────────────────────────
|
|
@@ -632,29 +873,46 @@ function friendlyHostname(url: URL): string {
|
|
|
632
873
|
// options. Adding support for a new tool type means adding a function here
|
|
633
874
|
// and registering it in ALLOWLIST_STRATEGIES below.
|
|
634
875
|
|
|
635
|
-
type AllowlistStrategy = (
|
|
876
|
+
type AllowlistStrategy = (
|
|
877
|
+
toolName: string,
|
|
878
|
+
input: Record<string, unknown>,
|
|
879
|
+
) => Promise<AllowlistOption[]> | AllowlistOption[];
|
|
636
880
|
|
|
637
|
-
function shellAllowlistStrategy(
|
|
638
|
-
|
|
881
|
+
function shellAllowlistStrategy(
|
|
882
|
+
_toolName: string,
|
|
883
|
+
input: Record<string, unknown>,
|
|
884
|
+
): Promise<AllowlistOption[]> {
|
|
885
|
+
const command = ((input.command as string) ?? "").trim();
|
|
639
886
|
return buildShellAllowlistOptions(command);
|
|
640
887
|
}
|
|
641
888
|
|
|
642
|
-
function fileAllowlistStrategy(
|
|
643
|
-
|
|
889
|
+
function fileAllowlistStrategy(
|
|
890
|
+
toolName: string,
|
|
891
|
+
input: Record<string, unknown>,
|
|
892
|
+
): AllowlistOption[] {
|
|
893
|
+
const filePath = (input.path as string) ?? (input.file_path as string) ?? "";
|
|
644
894
|
const toolLabel = TOOL_DISPLAY_NAMES[toolName] ?? toolName;
|
|
645
895
|
const options: AllowlistOption[] = [];
|
|
646
896
|
|
|
647
897
|
// Patterns must match the "tool:path" format used by check()
|
|
648
|
-
options.push({
|
|
898
|
+
options.push({
|
|
899
|
+
label: filePath,
|
|
900
|
+
description: `This file only`,
|
|
901
|
+
pattern: `${toolName}:${filePath}`,
|
|
902
|
+
});
|
|
649
903
|
|
|
650
904
|
// Ancestor directory wildcards — walk up from immediate parent, stop at home dir or /
|
|
651
905
|
const home = homedir();
|
|
652
906
|
let dir = dirname(filePath);
|
|
653
907
|
const maxLevels = 3;
|
|
654
908
|
let levels = 0;
|
|
655
|
-
while (dir && dir !==
|
|
909
|
+
while (dir && dir !== "/" && dir !== "." && levels < maxLevels) {
|
|
656
910
|
const dirName = friendlyBasename(dir);
|
|
657
|
-
options.push({
|
|
911
|
+
options.push({
|
|
912
|
+
label: `${dir}/**`,
|
|
913
|
+
description: `Anything in ${dirName}/`,
|
|
914
|
+
pattern: `${toolName}:${dir}/**`,
|
|
915
|
+
});
|
|
658
916
|
if (dir === home) break;
|
|
659
917
|
const parent = dirname(dir);
|
|
660
918
|
if (parent === dir) break;
|
|
@@ -662,18 +920,29 @@ function fileAllowlistStrategy(toolName: string, input: Record<string, unknown>)
|
|
|
662
920
|
levels++;
|
|
663
921
|
}
|
|
664
922
|
|
|
665
|
-
options.push({
|
|
923
|
+
options.push({
|
|
924
|
+
label: `${toolName}:*`,
|
|
925
|
+
description: `All ${toolLabel}`,
|
|
926
|
+
pattern: `${toolName}:*`,
|
|
927
|
+
});
|
|
666
928
|
return options;
|
|
667
929
|
}
|
|
668
930
|
|
|
669
|
-
function urlAllowlistStrategy(
|
|
670
|
-
|
|
931
|
+
function urlAllowlistStrategy(
|
|
932
|
+
toolName: string,
|
|
933
|
+
input: Record<string, unknown>,
|
|
934
|
+
): AllowlistOption[] {
|
|
935
|
+
const rawUrl = getStringField(input, "url").trim();
|
|
671
936
|
const normalized = normalizeWebFetchUrl(rawUrl);
|
|
672
937
|
const exact = normalized?.href ?? rawUrl;
|
|
673
938
|
|
|
674
939
|
const options: AllowlistOption[] = [];
|
|
675
940
|
if (exact) {
|
|
676
|
-
options.push({
|
|
941
|
+
options.push({
|
|
942
|
+
label: exact,
|
|
943
|
+
description: "This exact URL",
|
|
944
|
+
pattern: `${toolName}:${escapeMinimatchLiteral(exact)}`,
|
|
945
|
+
});
|
|
677
946
|
}
|
|
678
947
|
if (normalized) {
|
|
679
948
|
const host = friendlyHostname(normalized);
|
|
@@ -687,7 +956,11 @@ function urlAllowlistStrategy(toolName: string, input: Record<string, unknown>):
|
|
|
687
956
|
// Use standalone "**" globstar — minimatch only treats ** as globstar when
|
|
688
957
|
// it is its own path segment, so "${toolName}:*" would fail to match URL
|
|
689
958
|
// candidates containing "/". The tool field is already filtered separately.
|
|
690
|
-
options.push({
|
|
959
|
+
options.push({
|
|
960
|
+
label: `${toolName}:*`,
|
|
961
|
+
description: `All ${toolLabel}`,
|
|
962
|
+
pattern: `**`,
|
|
963
|
+
});
|
|
691
964
|
|
|
692
965
|
const seen = new Set<string>();
|
|
693
966
|
return options.filter((o) => {
|
|
@@ -697,9 +970,13 @@ function urlAllowlistStrategy(toolName: string, input: Record<string, unknown>):
|
|
|
697
970
|
});
|
|
698
971
|
}
|
|
699
972
|
|
|
700
|
-
function managedSkillAllowlistStrategy(
|
|
701
|
-
|
|
702
|
-
|
|
973
|
+
function managedSkillAllowlistStrategy(
|
|
974
|
+
toolName: string,
|
|
975
|
+
input: Record<string, unknown>,
|
|
976
|
+
): AllowlistOption[] {
|
|
977
|
+
const skillId = getStringField(input, "skill_id").trim();
|
|
978
|
+
const toolLabel =
|
|
979
|
+
toolName === "scaffold_managed_skill" ? "scaffold" : "delete";
|
|
703
980
|
const options: AllowlistOption[] = [];
|
|
704
981
|
if (skillId) {
|
|
705
982
|
options.push({
|
|
@@ -716,8 +993,11 @@ function managedSkillAllowlistStrategy(toolName: string, input: Record<string, u
|
|
|
716
993
|
return options;
|
|
717
994
|
}
|
|
718
995
|
|
|
719
|
-
function skillLoadAllowlistStrategy(
|
|
720
|
-
|
|
996
|
+
function skillLoadAllowlistStrategy(
|
|
997
|
+
_toolName: string,
|
|
998
|
+
input: Record<string, unknown>,
|
|
999
|
+
): AllowlistOption[] {
|
|
1000
|
+
const rawSelector = getStringField(input, "skill").trim();
|
|
721
1001
|
|
|
722
1002
|
if (rawSelector) {
|
|
723
1003
|
const resolved = resolveSkillIdAndHash(rawSelector);
|
|
@@ -725,7 +1005,7 @@ function skillLoadAllowlistStrategy(_toolName: string, input: Record<string, unk
|
|
|
725
1005
|
return [
|
|
726
1006
|
{
|
|
727
1007
|
label: `${resolved.id}@${resolved.versionHash}`,
|
|
728
|
-
description:
|
|
1008
|
+
description: "This exact version",
|
|
729
1009
|
pattern: `skill_load:${resolved.id}@${resolved.versionHash}`,
|
|
730
1010
|
},
|
|
731
1011
|
];
|
|
@@ -734,7 +1014,7 @@ function skillLoadAllowlistStrategy(_toolName: string, input: Record<string, unk
|
|
|
734
1014
|
return [
|
|
735
1015
|
{
|
|
736
1016
|
label: id,
|
|
737
|
-
description:
|
|
1017
|
+
description: "This skill",
|
|
738
1018
|
pattern: `skill_load:${id}`,
|
|
739
1019
|
},
|
|
740
1020
|
];
|
|
@@ -742,9 +1022,9 @@ function skillLoadAllowlistStrategy(_toolName: string, input: Record<string, unk
|
|
|
742
1022
|
|
|
743
1023
|
return [
|
|
744
1024
|
{
|
|
745
|
-
label:
|
|
746
|
-
description:
|
|
747
|
-
pattern:
|
|
1025
|
+
label: "skill_load:*",
|
|
1026
|
+
description: "All skill loads",
|
|
1027
|
+
pattern: "skill_load:*",
|
|
748
1028
|
},
|
|
749
1029
|
];
|
|
750
1030
|
}
|
|
@@ -766,25 +1046,37 @@ const ALLOWLIST_STRATEGIES: Record<string, AllowlistStrategy> = {
|
|
|
766
1046
|
skill_load: skillLoadAllowlistStrategy,
|
|
767
1047
|
};
|
|
768
1048
|
|
|
769
|
-
export async function generateAllowlistOptions(
|
|
1049
|
+
export async function generateAllowlistOptions(
|
|
1050
|
+
toolName: string,
|
|
1051
|
+
input: Record<string, unknown>,
|
|
1052
|
+
signal?: AbortSignal,
|
|
1053
|
+
): Promise<AllowlistOption[]> {
|
|
770
1054
|
signal?.throwIfAborted();
|
|
771
1055
|
|
|
772
1056
|
if (Object.hasOwn(ALLOWLIST_STRATEGIES, toolName)) {
|
|
773
1057
|
return ALLOWLIST_STRATEGIES[toolName](toolName, input);
|
|
774
1058
|
}
|
|
775
1059
|
|
|
776
|
-
return [{ label:
|
|
1060
|
+
return [{ label: "*", description: "Everything", pattern: "*" }];
|
|
777
1061
|
}
|
|
778
1062
|
|
|
779
1063
|
// Directory-based scope only applies to filesystem and shell tools.
|
|
780
1064
|
// All other tools auto-use "everywhere" (the client handles this).
|
|
781
1065
|
export const SCOPE_AWARE_TOOLS = new Set([
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
1066
|
+
"bash",
|
|
1067
|
+
"host_bash",
|
|
1068
|
+
"file_read",
|
|
1069
|
+
"file_write",
|
|
1070
|
+
"file_edit",
|
|
1071
|
+
"host_file_read",
|
|
1072
|
+
"host_file_write",
|
|
1073
|
+
"host_file_edit",
|
|
785
1074
|
]);
|
|
786
1075
|
|
|
787
|
-
export function generateScopeOptions(
|
|
1076
|
+
export function generateScopeOptions(
|
|
1077
|
+
workingDir: string,
|
|
1078
|
+
toolName?: string,
|
|
1079
|
+
): ScopeOption[] {
|
|
788
1080
|
if (toolName && !SCOPE_AWARE_TOOLS.has(toolName)) {
|
|
789
1081
|
return [];
|
|
790
1082
|
}
|
|
@@ -794,7 +1086,7 @@ export function generateScopeOptions(workingDir: string, toolName?: string): Sco
|
|
|
794
1086
|
|
|
795
1087
|
// Project directory
|
|
796
1088
|
const displayDir = workingDir.startsWith(home)
|
|
797
|
-
?
|
|
1089
|
+
? "~" + workingDir.slice(home.length)
|
|
798
1090
|
: workingDir;
|
|
799
1091
|
options.push({ label: displayDir, scope: workingDir });
|
|
800
1092
|
|
|
@@ -802,13 +1094,13 @@ export function generateScopeOptions(workingDir: string, toolName?: string): Sco
|
|
|
802
1094
|
const parentDir = dirname(workingDir);
|
|
803
1095
|
if (parentDir !== workingDir) {
|
|
804
1096
|
const displayParent = parentDir.startsWith(home)
|
|
805
|
-
?
|
|
1097
|
+
? "~" + parentDir.slice(home.length)
|
|
806
1098
|
: parentDir;
|
|
807
1099
|
options.push({ label: `${displayParent}/*`, scope: parentDir });
|
|
808
1100
|
}
|
|
809
1101
|
|
|
810
1102
|
// Everywhere
|
|
811
|
-
options.push({ label:
|
|
1103
|
+
options.push({ label: "everywhere", scope: "everywhere" });
|
|
812
1104
|
|
|
813
1105
|
return options;
|
|
814
1106
|
}
|