@vellumai/assistant 0.7.0 → 0.7.2
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/ARCHITECTURE.md +38 -56
- package/Dockerfile +2 -0
- package/README.md +3 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +88 -142
- package/bun.lock +29 -26
- package/docs/architecture/security.md +38 -16
- package/docs/plugins.md +7 -9
- package/knip.json +2 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +39 -1
- package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
- package/node_modules/@vellumai/service-contracts/package.json +2 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +9 -5
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
- package/node_modules/@vellumai/slack-text/bun.lock +24 -0
- package/node_modules/@vellumai/slack-text/package.json +18 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
- package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
- package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
- package/node_modules/@vellumai/twilio-client/package.json +18 -0
- package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
- package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
- package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
- package/openapi.yaml +869 -129
- package/package.json +8 -3
- package/scripts/generate-openapi.ts +16 -111
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
- package/src/__tests__/anthropic-provider.test.ts +56 -13
- package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
- package/src/__tests__/app-bundler.test.ts +170 -1
- package/src/__tests__/app-control-flow.test.ts +374 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
- package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
- package/src/__tests__/app-conversation-ids.test.ts +151 -0
- package/src/__tests__/app-executors.test.ts +30 -43
- package/src/__tests__/approval-cascade.test.ts +0 -15
- package/src/__tests__/approval-routes-http.test.ts +29 -23
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
- package/src/__tests__/assistant-event-hub.test.ts +235 -79
- package/src/__tests__/assistant-event.test.ts +10 -5
- package/src/__tests__/assistant-events-sse-hardening.test.ts +44 -17
- package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -36
- package/src/__tests__/background-shell-host-bash.test.ts +46 -56
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
- package/src/__tests__/btw-routes.test.ts +13 -4
- package/src/__tests__/call-controller.test.ts +50 -2
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- package/src/__tests__/call-site-routing-provider.test.ts +193 -0
- package/src/__tests__/channel-approval-routes.test.ts +10 -296
- package/src/__tests__/channel-approvals.test.ts +25 -17
- package/src/__tests__/channel-guardian.test.ts +100 -146
- package/src/__tests__/channel-readiness-service.test.ts +59 -1
- package/src/__tests__/checker.test.ts +23 -38
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/config-loader-backfill.test.ts +90 -155
- package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +6 -48
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +14 -2
- package/src/__tests__/connection-policy.test.ts +1 -52
- package/src/__tests__/contacts-write.test.ts +2 -64
- package/src/__tests__/context-image-dimensions.test.ts +1 -1
- package/src/__tests__/context-search-memory-source.test.ts +120 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
- package/src/__tests__/context-search-pkb-source.test.ts +49 -0
- package/src/__tests__/context-search-workspace-source.test.ts +9 -22
- package/src/__tests__/context-window-manager.test.ts +46 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
- package/src/__tests__/conversation-agent-loop.test.ts +980 -13
- package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
- package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
- package/src/__tests__/conversation-history-web-search.test.ts +4 -3
- package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-lifecycle.test.ts +40 -4
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
- package/src/__tests__/conversation-process-callsite.test.ts +79 -2
- package/src/__tests__/conversation-queue.test.ts +3 -8
- package/src/__tests__/conversation-routes-disk-view.test.ts +7 -161
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -104
- package/src/__tests__/conversation-routes-slash-commands.test.ts +76 -66
- package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
- package/src/__tests__/conversation-slash-commands.test.ts +24 -8
- package/src/__tests__/conversation-slash-queue.test.ts +2 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-starter-routes.test.ts +79 -2
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +317 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
- package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
- package/src/__tests__/conversation-usage.test.ts +253 -3
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
- package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
- package/src/__tests__/credential-health-service.test.ts +68 -0
- package/src/__tests__/credential-security-e2e.test.ts +4 -3
- package/src/__tests__/credential-security-invariants.test.ts +1 -5
- package/src/__tests__/credential-token-resolver.test.ts +180 -0
- package/src/__tests__/credentials-cli.test.ts +5 -12
- package/src/__tests__/cu-unified-flow.test.ts +206 -27
- package/src/__tests__/daemon-assistant-events.test.ts +34 -21
- package/src/__tests__/daemon-credential-client.test.ts +102 -17
- package/src/__tests__/db-connection-isolation.test.ts +125 -0
- package/src/__tests__/db-migration-rollback.test.ts +101 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
- package/src/__tests__/document-conversations.test.ts +332 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
- package/src/__tests__/emit-event-signal.test.ts +4 -6
- package/src/__tests__/events-client-registration.test.ts +193 -49
- package/src/__tests__/filing-service.test.ts +58 -7
- package/src/__tests__/first-greeting.test.ts +156 -150
- package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-grant-minting.test.ts +7 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
- package/src/__tests__/guardian-routing-state.test.ts +1 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +30 -11
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -84
- package/src/__tests__/headless-browser-mode.test.ts +4 -9
- package/src/__tests__/headless-browser-navigate.test.ts +21 -20
- package/src/__tests__/heartbeat-service.test.ts +1007 -8
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
- package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
- package/src/__tests__/host-app-control-proxy.test.ts +602 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +270 -147
- package/src/__tests__/host-bash-routes.test.ts +294 -0
- package/src/__tests__/host-browser-proxy.test.ts +126 -198
- package/src/__tests__/host-browser-routes.test.ts +50 -54
- package/src/__tests__/host-cu-proxy.test.ts +78 -144
- package/src/__tests__/host-cu-routes-targeted.test.ts +300 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +339 -0
- package/src/__tests__/host-file-proxy.test.ts +62 -122
- package/src/__tests__/host-file-read-tool.test.ts +59 -21
- package/src/__tests__/host-file-routes-targeted.test.ts +262 -0
- package/src/__tests__/host-file-write-tool.test.ts +42 -1
- package/src/__tests__/host-proxy-base.test.ts +312 -0
- package/src/__tests__/host-shell-tool.test.ts +53 -70
- package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +583 -0
- package/src/__tests__/host-transfer-proxy.test.ts +145 -56
- package/src/__tests__/host-transfer-routes-targeted.test.ts +447 -0
- package/src/__tests__/http-user-message-parity.test.ts +1 -6
- package/src/__tests__/identity-intro-cache.test.ts +29 -0
- package/src/__tests__/identity-routes.test.ts +103 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
- package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
- package/src/__tests__/injector-chain.test.ts +10 -5
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -67
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -13
- package/src/__tests__/install-skill-routing.test.ts +1 -13
- package/src/__tests__/integration-status.test.ts +85 -5
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
- package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
- package/src/__tests__/llm-catalog-parity.test.ts +90 -0
- package/src/__tests__/llm-context-resolution.test.ts +180 -0
- package/src/__tests__/llm-resolver.test.ts +80 -12
- package/src/__tests__/llm-usage-store.test.ts +269 -4
- package/src/__tests__/log-export-routes.test.ts +89 -0
- package/src/__tests__/managed-profile-guard.test.ts +225 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -11
- package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
- package/src/__tests__/migration-export-http.test.ts +33 -26
- package/src/__tests__/migration-export-streaming.test.ts +18 -10
- package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
- package/src/__tests__/migration-import-commit-http.test.ts +172 -21
- package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
- package/src/__tests__/migration-import-from-url.test.ts +20 -6
- package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
- package/src/__tests__/migration-parity-persistence.test.ts +62 -25
- package/src/__tests__/migration-transport.test.ts +115 -23
- package/src/__tests__/migration-validate-http.test.ts +105 -80
- package/src/__tests__/migration-wizard.test.ts +133 -27
- package/src/__tests__/mock-gateway-ipc.ts +1 -0
- package/src/__tests__/non-member-access-request.test.ts +1 -1
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/oauth-cli.test.ts +0 -2
- package/src/__tests__/oauth-store.test.ts +19 -0
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +26 -21
- package/src/__tests__/prechat-onboarding-contract.test.ts +34 -8
- package/src/__tests__/pricing.test.ts +68 -4
- package/src/__tests__/process-message-background-slack.test.ts +333 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
- package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
- package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
- package/src/__tests__/provider-usage-tracking.test.ts +208 -0
- package/src/__tests__/public-ingress-urls.test.ts +97 -0
- package/src/__tests__/reaction-persistence.test.ts +9 -6
- package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
- package/src/__tests__/recording-handler.test.ts +64 -81
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
- package/src/__tests__/relay-server.test.ts +18 -13
- package/src/__tests__/require-fresh-approval.test.ts +13 -23
- package/src/__tests__/retry-backoff.test.ts +87 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +13 -18
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- package/src/__tests__/search-skills-unified.test.ts +9 -15
- package/src/__tests__/secret-ingress-cli.test.ts +2 -5
- package/src/__tests__/secret-ingress-http.test.ts +1 -4
- package/src/__tests__/secret-onetime-send.test.ts +4 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
- package/src/__tests__/secret-response-routing.test.ts +29 -15
- package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
- package/src/__tests__/secret-scanner.test.ts +2 -545
- package/src/__tests__/send-endpoint-busy.test.ts +12 -24
- package/src/__tests__/settings-routes.test.ts +1 -1
- package/src/__tests__/shell-credential-ref.test.ts +0 -8
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -57
- package/src/__tests__/skill-feature-flags.test.ts +43 -41
- package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
- package/src/__tests__/skill-load-inline-command.test.ts +0 -51
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -12
- package/src/__tests__/skill-tool-factory.test.ts +97 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
- package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
- package/src/__tests__/slack-channel-config.test.ts +9 -14
- package/src/__tests__/slack-inbound-verification.test.ts +1 -62
- package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
- package/src/__tests__/subagent-manager-notify.test.ts +70 -70
- package/src/__tests__/subagent-notify-parent.test.ts +80 -83
- package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
- package/src/__tests__/system-prompt.test.ts +115 -14
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -89
- package/src/__tests__/test-preload.ts +8 -0
- package/src/__tests__/thread-backfill.test.ts +945 -31
- package/src/__tests__/tool-approval-handler.test.ts +3 -4
- package/src/__tests__/tool-audit-listener.test.ts +48 -0
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -7
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -17
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -8
- package/src/__tests__/tool-executor.test.ts +12 -20
- package/src/__tests__/tool-metrics-listener.test.ts +0 -35
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-trace-listener.test.ts +0 -17
- package/src/__tests__/transfer-progress-screen.test.ts +63 -26
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
- package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/tts-catalog-parity.test.ts +16 -5
- package/src/__tests__/twilio-config.test.ts +3 -16
- package/src/__tests__/twilio-routes.test.ts +3 -5
- package/src/__tests__/twilio-validation.test.ts +93 -0
- package/src/__tests__/usage-attribution.test.ts +247 -0
- package/src/__tests__/usage-cli.test.ts +143 -0
- package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
- package/src/__tests__/usage-routes.test.ts +150 -0
- package/src/__tests__/validation-results-screen.test.ts +39 -16
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +47 -138
- package/src/__tests__/verification-control-plane-policy.test.ts +6 -11
- package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
- package/src/__tests__/voice-session-bridge.test.ts +5 -5
- package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
- package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
- package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
- package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
- package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- package/src/acp/index.ts +0 -15
- package/src/acp/session-manager.ts +37 -34
- package/src/agent/loop.ts +16 -1
- package/src/approvals/AGENTS.md +4 -0
- package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
- package/src/approvals/guardian-request-resolvers.ts +10 -2
- package/src/backup/__tests__/paths.test.ts +0 -22
- package/src/backup/__tests__/restore.test.ts +94 -177
- package/src/backup/paths.ts +2 -15
- package/src/backup/restore.ts +107 -231
- package/src/browser-session/events.ts +0 -9
- package/src/bundler/app-bundler.ts +51 -3
- package/src/calls/call-store.ts +1 -34
- package/src/calls/guardian-question-copy.ts +0 -108
- package/src/calls/relay-server.ts +4 -68
- package/src/calls/twilio-config.ts +2 -17
- package/src/calls/twilio-rest.ts +31 -141
- package/src/calls/twilio-routes.ts +12 -13
- package/src/calls/voice-session-bridge.ts +7 -38
- package/src/channels/types.ts +8 -42
- package/src/cli/commands/__tests__/backup.test.ts +6 -277
- package/src/cli/commands/__tests__/cache.test.ts +152 -5
- package/src/cli/commands/__tests__/gateway.test.ts +288 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +18 -28
- package/src/cli/commands/__tests__/trust.test.ts +21 -387
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -1
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/cache-fs.ts +8 -0
- package/src/cli/commands/cache.ts +153 -82
- package/src/cli/commands/clients.ts +64 -7
- package/src/cli/commands/completions.ts +3 -3
- package/src/cli/commands/contacts.ts +304 -76
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +15 -7
- package/src/cli/commands/domain.ts +66 -15
- package/src/cli/commands/gateway.ts +183 -0
- package/src/cli/commands/keys.ts +13 -7
- package/src/cli/commands/mcp.ts +116 -156
- package/src/cli/commands/memory-v2.ts +320 -53
- package/src/cli/commands/oauth/shared.ts +2 -29
- package/src/cli/commands/pending.ts +102 -0
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -2
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -2
- package/src/cli/commands/platform/__tests__/status.test.ts +13 -15
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +0 -18
- package/src/cli/commands/skills.ts +77 -35
- package/src/cli/commands/trust.ts +70 -430
- package/src/cli/commands/usage.ts +25 -16
- package/src/cli/lib/daemon-credential-client.ts +115 -19
- package/src/cli/program.ts +4 -0
- package/src/cli.ts +0 -21
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +67 -10
- package/src/config/bundled-skills/acp/SKILL.md +6 -0
- package/src/config/bundled-skills/acp/TOOLS.json +1 -22
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
- package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
- package/src/config/bundled-skills/app-control/SKILL.md +75 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
- package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
- package/src/config/bundled-skills/document/TOOLS.json +0 -8
- package/src/config/bundled-skills/followups/TOOLS.json +0 -12
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
- package/src/config/bundled-skills/messaging/TOOLS.json +14 -44
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +19 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
- package/src/config/bundled-skills/settings/SKILL.md +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +0 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
- package/src/config/bundled-skills/subagent/SKILL.md +6 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
- package/src/config/bundled-tool-registry.ts +21 -0
- package/src/config/env-registry.ts +12 -4
- package/src/config/env.ts +22 -26
- package/src/config/feature-flag-registry.json +40 -152
- package/src/config/llm-callsite-catalog.ts +12 -0
- package/src/config/llm-context-resolution.ts +80 -0
- package/src/config/llm-resolver.ts +58 -22
- package/src/config/loader.ts +76 -102
- package/src/config/sanitize-for-transfer.ts +2 -0
- package/src/config/schema.ts +2 -158
- package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +8 -4
- package/src/config/schemas/call-site-catalog.ts +271 -0
- package/src/config/schemas/calls.ts +5 -14
- package/src/config/schemas/heartbeat.ts +63 -0
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/ingress.ts +11 -7
- package/src/config/schemas/llm.ts +34 -11
- package/src/config/schemas/memory-lifecycle.ts +77 -24
- package/src/config/schemas/memory-retrieval.ts +2 -2
- package/src/config/schemas/memory-v2.ts +57 -4
- package/src/config/schemas/platform.ts +6 -0
- package/src/config/schemas/security.ts +1 -42
- package/src/config/schemas/services.ts +7 -21
- package/src/config/schemas/skills.ts +5 -11
- package/src/config/schemas/tts.ts +1 -1
- package/src/config/seed-inference-profiles.ts +117 -0
- package/src/config/skills.ts +0 -90
- package/src/config/types.ts +3 -6
- package/src/contacts/contact-store.ts +0 -47
- package/src/contacts/contacts-write.ts +1 -132
- package/src/context/window-manager.ts +43 -5
- package/src/credential-execution/feature-gates.ts +10 -10
- package/src/credential-execution/process-manager.ts +46 -51
- package/src/credential-health/credential-health-service.ts +21 -16
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +126 -5
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +4 -3
- package/src/daemon/connection-policy.ts +1 -26
- package/src/daemon/conversation-agent-loop-handlers.ts +74 -7
- package/src/daemon/conversation-agent-loop.ts +309 -64
- package/src/daemon/conversation-history.ts +8 -8
- package/src/daemon/conversation-launch.ts +20 -135
- package/src/daemon/conversation-lifecycle.ts +8 -1
- package/src/daemon/conversation-messaging.ts +1 -0
- package/src/daemon/conversation-process.ts +97 -172
- package/src/daemon/conversation-runtime-assembly.ts +219 -76
- package/src/daemon/conversation-slash.ts +47 -5
- package/src/daemon/conversation-store.ts +7 -31
- package/src/daemon/conversation-surfaces.ts +144 -29
- package/src/daemon/conversation-tool-setup.ts +18 -87
- package/src/daemon/conversation-usage.ts +36 -0
- package/src/daemon/conversation.ts +134 -231
- package/src/daemon/daemon-control.ts +3 -71
- package/src/daemon/daemon-skill-host.ts +8 -11
- package/src/daemon/dictation-profile-store.ts +2 -26
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/first-greeting.ts +44 -156
- package/src/daemon/handlers/config-channels.ts +12 -12
- package/src/daemon/handlers/config-ingress.ts +4 -165
- package/src/daemon/handlers/config-model.ts +1 -1
- package/src/daemon/handlers/config-voice.ts +0 -42
- package/src/daemon/handlers/conversations.ts +11 -190
- package/src/daemon/handlers/recording.ts +26 -158
- package/src/daemon/handlers/shared.ts +27 -72
- package/src/daemon/handlers/skills.ts +42 -93
- package/src/daemon/host-app-control-proxy.ts +293 -0
- package/src/daemon/host-bash-proxy.ts +124 -92
- package/src/daemon/host-browser-proxy.ts +111 -88
- package/src/daemon/host-cu-proxy.ts +100 -104
- package/src/daemon/host-file-proxy.ts +136 -91
- package/src/daemon/host-proxy-base.ts +294 -0
- package/src/daemon/host-proxy-preactivation.ts +82 -0
- package/src/daemon/host-transfer-proxy.ts +303 -147
- package/src/daemon/lifecycle.ts +164 -132
- package/src/daemon/message-protocol.ts +3 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +18 -8
- package/src/daemon/message-types/host-app-control.ts +150 -0
- package/src/daemon/message-types/host-bash.ts +5 -0
- package/src/daemon/message-types/host-cu.ts +3 -0
- package/src/daemon/message-types/host-file.ts +5 -0
- package/src/daemon/message-types/host-transfer.ts +4 -0
- package/src/daemon/message-types/messages.ts +10 -9
- package/src/daemon/message-types/schedules.ts +8 -3
- package/src/daemon/message-types/skills.ts +2 -2
- package/src/daemon/message-types/workspace.ts +1 -1
- package/src/daemon/process-message.ts +119 -239
- package/src/daemon/server.ts +13 -462
- package/src/daemon/shutdown-handlers.ts +2 -5
- package/src/daemon/tool-setup-types.ts +51 -0
- package/src/daemon/tool-side-effects.ts +126 -108
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +4 -9
- package/src/events/domain-events.ts +0 -8
- package/src/events/tool-audit-listener.ts +5 -2
- package/src/events/tool-domain-event-publisher.ts +0 -10
- package/src/events/tool-metrics-listener.ts +0 -17
- package/src/events/tool-trace-listener.ts +0 -14
- package/src/filing/filing-service.ts +13 -1
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +21 -9
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +216 -0
- package/src/heartbeat/heartbeat-run-store.ts +236 -0
- package/src/heartbeat/heartbeat-service.ts +303 -54
- package/src/home/__tests__/feed-writer.test.ts +0 -4
- package/src/home/__tests__/post-connect-feed.test.ts +99 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +41 -9
- package/src/home/__tests__/suggested-prompts.test.ts +89 -0
- package/src/home/feed-writer.ts +1 -2
- package/src/home/post-connect-feed.ts +68 -0
- package/src/home/relationship-state-writer.ts +33 -95
- package/src/home/suggested-prompts.ts +46 -10
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
- package/src/ipc/assistant-server.ts +17 -11
- package/src/ipc/cli-client.ts +32 -1
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
- package/src/ipc/routes/route-adapter.ts +1 -1
- package/src/ipc/routes/trust-rules.test.ts +0 -95
- package/src/ipc/skill-ipc-types.ts +41 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
- package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
- package/src/ipc/skill-routes/events.ts +12 -23
- package/src/ipc/skill-routes/identity.ts +4 -17
- package/src/ipc/skill-routes/index.ts +1 -1
- package/src/ipc/skill-server.ts +6 -39
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
- package/src/live-voice/live-voice-metrics.ts +10 -10
- package/src/live-voice/protocol.ts +4 -13
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
- package/src/mcp/manager.ts +0 -5
- package/src/mcp/mcp-auth-orchestrator.ts +213 -0
- package/src/mcp/mcp-auth-state.ts +133 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -0
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
- package/src/memory/anisotropy.test.ts +247 -0
- package/src/memory/anisotropy.ts +443 -0
- package/src/memory/app-git-service.ts +0 -32
- package/src/memory/app-store.ts +154 -0
- package/src/memory/attachments-store.ts +6 -0
- package/src/memory/auto-analysis-constants.ts +17 -0
- package/src/memory/auto-analysis-guard.ts +5 -15
- package/src/memory/canonical-guardian-store.ts +7 -7
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
- package/src/memory/context-search/agent-protocol.ts +6 -6
- package/src/memory/context-search/agent-runner.ts +32 -7
- package/src/memory/context-search/sources/memory-v2.ts +590 -0
- package/src/memory/context-search/sources/memory.ts +5 -0
- package/src/memory/context-search/sources/pkb.ts +10 -1
- package/src/memory/context-search/sources/workspace.ts +3 -2
- package/src/memory/conversation-crud.ts +30 -5
- package/src/memory/conversation-disk-view.ts +1 -5
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/conversation-starter-checkpoints.ts +63 -0
- package/src/memory/db-connection.ts +62 -0
- package/src/memory/db-init.ts +18 -0
- package/src/memory/embedding-backend.ts +12 -42
- package/src/memory/embedding-gemini.ts +0 -2
- package/src/memory/embedding-local.ts +6 -6
- package/src/memory/embedding-ollama.ts +6 -6
- package/src/memory/embedding-openai.ts +6 -6
- package/src/memory/embedding-types.ts +21 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +49 -8
- package/src/memory/graph/conversation-graph-memory.ts +35 -36
- package/src/memory/graph/graph-search.ts +8 -0
- package/src/memory/graph/injection.test.ts +2 -2
- package/src/memory/graph/injection.ts +1 -1
- package/src/memory/graph/retriever.ts +28 -0
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/guardian-action-store.ts +0 -83
- package/src/memory/guardian-approvals.ts +0 -48
- package/src/memory/indexer.ts +1 -15
- package/src/memory/job-handlers/conversation-starters.ts +36 -53
- package/src/memory/job-utils.ts +0 -6
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
- package/src/memory/jobs/embed-concept-page.ts +28 -2
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
- package/src/memory/jobs-store.ts +66 -23
- package/src/memory/jobs-worker.ts +114 -79
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +129 -43
- package/src/memory/memory-v2-activation-log-store.ts +115 -0
- package/src/memory/migrations/233-document-conversations.ts +54 -0
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
- package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
- package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
- package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
- package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
- package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
- package/src/memory/migrations/index.ts +19 -0
- package/src/memory/migrations/registry.ts +32 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +50 -20
- package/src/memory/raw-query.ts +2 -68
- package/src/memory/schema/conversations.ts +7 -0
- package/src/memory/schema/infrastructure.ts +40 -0
- package/src/memory/search/semantic.ts +12 -16
- package/src/memory/sparse-tokenize.ts +49 -0
- package/src/memory/tool-usage-store.ts +2 -0
- package/src/memory/usage-buckets.ts +40 -1
- package/src/memory/usage-grouped-buckets.ts +127 -0
- package/src/memory/v2/__tests__/activation.test.ts +361 -180
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
- package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
- package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
- package/src/memory/v2/__tests__/injection.test.ts +424 -33
- package/src/memory/v2/__tests__/migration.test.ts +64 -36
- package/src/memory/v2/__tests__/page-store.test.ts +191 -8
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
- package/src/memory/v2/__tests__/sim.test.ts +166 -6
- package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +152 -0
- package/src/memory/v2/activation.ts +215 -163
- package/src/memory/v2/backfill-jobs.ts +15 -100
- package/src/memory/v2/consolidation-job.ts +17 -17
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/edge-index.ts +191 -0
- package/src/memory/v2/injection.ts +241 -84
- package/src/memory/v2/migration.ts +57 -64
- package/src/memory/v2/now-text.ts +2 -3
- package/src/memory/v2/page-store.ts +168 -31
- package/src/memory/v2/prompts/consolidation.ts +385 -88
- package/src/memory/v2/prompts/sweep.ts +3 -3
- package/src/memory/v2/qdrant.ts +99 -1
- package/src/memory/v2/sim.ts +126 -16
- package/src/memory/v2/skill-qdrant.ts +12 -3
- package/src/memory/v2/skill-store.ts +71 -8
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +63 -0
- package/src/memory/v2/types.ts +10 -20
- package/src/memory/validation.ts +0 -11
- package/src/messaging/draft-store.ts +0 -6
- package/src/messaging/provider-types.ts +8 -0
- package/src/messaging/provider.ts +7 -0
- package/src/messaging/providers/gmail/client.ts +1 -121
- package/src/messaging/providers/gmail/types.ts +0 -49
- package/src/messaging/providers/outlook/client.ts +0 -73
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
- package/src/messaging/providers/slack/adapter.ts +123 -52
- package/src/messaging/providers/slack/backfill.test.ts +95 -6
- package/src/messaging/providers/slack/backfill.ts +89 -11
- package/src/messaging/providers/slack/client.ts +10 -124
- package/src/messaging/providers/slack/message-metadata.ts +12 -2
- package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
- package/src/messaging/providers/slack/render-transcript.ts +126 -25
- package/src/messaging/providers/slack/types.ts +1 -32
- package/src/notifications/README.md +10 -10
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/oauth/connect-orchestrator.ts +4 -0
- package/src/oauth/connection-resolver.test.ts +8 -0
- package/src/oauth/connection-resolver.ts +8 -16
- package/src/oauth/credential-token-resolver.ts +95 -0
- package/src/oauth/manual-token-connection.ts +26 -34
- package/src/oauth/oauth-store.ts +6 -4
- package/src/outbound-proxy/certs.ts +0 -7
- package/src/outbound-proxy/index.ts +1 -59
- package/src/outbound-proxy/logging.ts +1 -1
- package/src/outbound-proxy/policy.ts +6 -5
- package/src/outbound-proxy/router.ts +2 -1
- package/src/permissions/approval-policy.test.ts +6 -275
- package/src/permissions/approval-policy.ts +0 -51
- package/src/permissions/approval-provenance.test.ts +184 -0
- package/src/permissions/approval-provenance.ts +70 -0
- package/src/permissions/checker.test.ts +0 -1
- package/src/permissions/checker.ts +7 -18
- package/src/permissions/gateway-threshold-reader.ts +6 -1
- package/src/permissions/prompter.ts +43 -3
- package/src/permissions/secret-prompter.ts +25 -48
- package/src/permissions/types.ts +33 -0
- package/src/permissions/workspace-policy.ts +0 -5
- package/src/platform/sync-identity.ts +0 -8
- package/src/plugins/defaults/injectors.ts +69 -2
- package/src/plugins/defaults/overflow-reduce.ts +3 -2
- package/src/plugins/types.ts +8 -0
- package/src/prompts/bootstrap-cleanup.ts +27 -0
- package/src/prompts/system-prompt.ts +37 -88
- package/src/prompts/templates/BOOTSTRAP.md +52 -6
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/prompts/update-bulletin-job.ts +2 -0
- package/src/providers/__tests__/retry-callsite.test.ts +138 -1
- package/src/providers/anthropic/client.ts +72 -33
- package/src/providers/call-site-routing.ts +42 -3
- package/src/providers/gemini/client.ts +18 -2
- package/src/providers/managed-proxy/context.ts +0 -5
- package/src/providers/model-catalog.ts +105 -19
- package/src/providers/openai/chat-completions-provider.ts +6 -0
- package/src/providers/openai/responses-provider.ts +7 -1
- package/src/providers/provider-send-message.ts +45 -2
- package/src/providers/ratelimit.ts +7 -2
- package/src/providers/registry.ts +14 -9
- package/src/providers/retry.ts +96 -8
- package/src/providers/speech-to-text/provider-catalog.ts +7 -8
- package/src/providers/types.ts +13 -0
- package/src/providers/usage-tracking.ts +96 -0
- package/src/runtime/AGENTS.md +10 -6
- package/src/runtime/__tests__/agent-wake.test.ts +89 -0
- package/src/runtime/agent-wake.ts +39 -2
- package/src/runtime/assistant-event-hub.ts +570 -52
- package/src/runtime/assistant-event.ts +2 -6
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/context.ts +0 -9
- package/src/runtime/auth/middleware.ts +1 -97
- package/src/runtime/auth/route-policy.ts +30 -9
- package/src/runtime/auth/token-service.ts +0 -11
- package/src/runtime/btw-sidechain.ts +2 -3
- package/src/runtime/channel-approvals.ts +6 -2
- package/src/runtime/channel-invite-transport.ts +2 -48
- package/src/runtime/channel-invite-transports/email.ts +1 -1
- package/src/runtime/channel-invite-transports/slack.ts +1 -1
- package/src/runtime/channel-invite-transports/telegram.ts +1 -1
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
- package/src/runtime/channel-invite-types.ts +54 -0
- package/src/runtime/channel-readiness-service.ts +32 -13
- package/src/runtime/channel-verification-service.ts +3 -5
- package/src/runtime/http-errors.ts +0 -34
- package/src/runtime/http-router.ts +6 -3
- package/src/runtime/http-server.ts +16 -402
- package/src/runtime/http-types.ts +5 -5
- package/src/runtime/interactive-ui.ts +0 -1
- package/src/runtime/middleware/auth.ts +0 -20
- package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
- package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +296 -80
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
- package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +421 -0
- package/src/runtime/migrations/migration-transport.ts +49 -16
- package/src/runtime/migrations/migration-wizard.ts +2 -2
- package/src/runtime/migrations/origin-mode.ts +40 -0
- package/src/runtime/migrations/vbundle-builder.ts +457 -136
- package/src/runtime/migrations/vbundle-import-analyzer.ts +13 -11
- package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
- package/src/runtime/migrations/vbundle-importer.ts +251 -74
- package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +329 -38
- package/src/runtime/migrations/vbundle-streaming-validator.ts +203 -28
- package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
- package/src/runtime/migrations/vbundle-validator.ts +328 -41
- package/src/runtime/pending-interactions.ts +48 -13
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/backup-routes.test.ts +49 -168
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +333 -0
- package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
- package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
- package/src/runtime/routes/acp-routes.test.ts +0 -3
- package/src/runtime/routes/acp-routes.ts +3 -7
- package/src/runtime/routes/app-management-routes.ts +18 -9
- package/src/runtime/routes/approval-interception-types.ts +13 -0
- package/src/runtime/routes/approval-routes.ts +55 -14
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
- package/src/runtime/routes/avatar-routes.ts +3 -5
- package/src/runtime/routes/backup-routes.ts +15 -38
- package/src/runtime/routes/browser-routes.ts +1 -15
- package/src/runtime/routes/btw-routes.ts +14 -37
- package/src/runtime/routes/channel-guardian-routes.ts +1 -5
- package/src/runtime/routes/channel-readiness-routes.ts +3 -7
- package/src/runtime/routes/channel-route-shared.ts +2 -28
- package/src/runtime/routes/client-routes.ts +46 -12
- package/src/runtime/routes/consolidation-routes.ts +115 -0
- package/src/runtime/routes/contact-prompt-routes.ts +183 -0
- package/src/runtime/routes/conversation-list-routes.ts +12 -29
- package/src/runtime/routes/conversation-management-routes.ts +14 -51
- package/src/runtime/routes/conversation-query-routes.ts +156 -9
- package/src/runtime/routes/conversation-routes.ts +72 -539
- package/src/runtime/routes/conversation-starter-routes.ts +19 -40
- package/src/runtime/routes/document-pdf-renderer.ts +165 -0
- package/src/runtime/routes/documents-routes.ts +83 -18
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +68 -94
- package/src/runtime/routes/filing-routes.ts +18 -1
- package/src/runtime/routes/gateway-log-routes.ts +79 -0
- package/src/runtime/routes/guardian-action-routes.ts +4 -9
- package/src/runtime/routes/guardian-approval-interception.ts +2 -8
- package/src/runtime/routes/heartbeat-routes.ts +103 -38
- package/src/runtime/routes/host-app-control-routes.ts +134 -0
- package/src/runtime/routes/host-bash-routes.ts +37 -6
- package/src/runtime/routes/host-browser-routes.ts +96 -25
- package/src/runtime/routes/host-cu-routes.ts +48 -13
- package/src/runtime/routes/host-file-routes.ts +35 -11
- package/src/runtime/routes/host-transfer-routes.ts +73 -37
- package/src/runtime/routes/http-adapter.ts +1 -0
- package/src/runtime/routes/identity-intro-cache.ts +30 -0
- package/src/runtime/routes/identity-routes.ts +93 -49
- package/src/runtime/routes/inbound-message-handler.ts +581 -146
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -95
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
- package/src/runtime/routes/index.ts +12 -0
- package/src/runtime/routes/integrations/slack/channel.ts +0 -24
- package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
- package/src/runtime/routes/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +451 -16
- package/src/runtime/routes/migration-routes.ts +284 -31
- package/src/runtime/routes/playground/guard.ts +1 -1
- package/src/runtime/routes/playground/index.ts +0 -2
- package/src/runtime/routes/recording-routes.ts +4 -24
- package/src/runtime/routes/rename-conversation-routes.ts +2 -6
- package/src/runtime/routes/schedule-routes.ts +10 -6
- package/src/runtime/routes/secret-routes.ts +87 -18
- package/src/runtime/routes/settings-routes.ts +29 -28
- package/src/runtime/routes/skills-routes.ts +12 -31
- package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
- package/src/runtime/routes/task-routes.ts +6 -6
- package/src/runtime/routes/trust-rules-routes.ts +3 -94
- package/src/runtime/routes/types.ts +4 -4
- package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
- package/src/runtime/routes/usage-routes.ts +87 -10
- package/src/runtime/routes/user-routes.ts +17 -31
- package/src/runtime/routes/work-items-routes.ts +1 -4
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
- package/src/runtime/services/analyze-conversation.ts +7 -17
- package/src/runtime/services/conversation-serializer.ts +2 -4
- package/src/runtime/verification-outbound-actions.ts +1 -1
- package/src/runtime/verification-rate-limiter.ts +1 -1
- package/src/runtime/verification-templates.ts +4 -7
- package/src/schedule/integration-status.ts +66 -2
- package/src/schedule/recurrence-engine.ts +4 -1
- package/src/schedule/retry-backoff.ts +18 -0
- package/src/schedule/retry-policy.ts +82 -0
- package/src/schedule/schedule-recovery.ts +64 -0
- package/src/schedule/schedule-store.ts +106 -18
- package/src/schedule/scheduler-types.ts +25 -0
- package/src/schedule/scheduler.ts +63 -38
- package/src/security/oauth-callback-registry.ts +8 -0
- package/src/security/secret-scanner.ts +14 -547
- package/src/security/secure-keys.ts +31 -11
- package/src/security/token-manager.ts +7 -3
- package/src/sequence/analytics.ts +5 -5
- package/src/sequence/engine.ts +1 -1
- package/src/signals/cancel.ts +16 -25
- package/src/signals/conversation-undo.ts +2 -27
- package/src/signals/emit-event.ts +1 -2
- package/src/signals/user-message.ts +108 -22
- package/src/skills/catalog-files.ts +2 -8
- package/src/skills/catalog-install.ts +1 -0
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/include-graph.ts +5 -5
- package/src/skills/inline-command-runner.ts +1 -7
- package/src/skills/remote-skill-policy.ts +5 -5
- package/src/skills/skill-file-provider.ts +1 -1
- package/src/skills/skill-file-types.ts +13 -0
- package/src/skills/skillssh-audit-types.ts +28 -0
- package/src/skills/skillssh-registry.ts +8 -21
- package/src/subagent/manager.ts +67 -84
- package/src/tasks/task-store.ts +1 -28
- package/src/telemetry/types.ts +8 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +59 -15
- package/src/telemetry/usage-telemetry-reporter.ts +4 -5
- package/src/tools/acp/spawn.test.ts +1 -2
- package/src/tools/acp/steer.test.ts +1 -2
- package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
- package/src/tools/apps/executors.ts +56 -69
- package/src/tools/browser/__tests__/browser-status.test.ts +55 -135
- package/src/tools/browser/browser-execution.ts +31 -147
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +145 -70
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
- package/src/tools/browser/cdp-client/factory.ts +62 -91
- package/src/tools/browser/cdp-client/index.ts +1 -27
- package/src/tools/computer-use/definitions.ts +42 -20
- package/src/tools/executor.ts +46 -31
- package/src/tools/host-filesystem/edit.ts +29 -2
- package/src/tools/host-filesystem/read.ts +29 -2
- package/src/tools/host-filesystem/transfer.test.ts +45 -42
- package/src/tools/host-filesystem/transfer.ts +35 -4
- package/src/tools/host-filesystem/write.ts +29 -2
- package/src/tools/host-terminal/host-shell.ts +62 -3
- package/src/tools/network/script-proxy/index.ts +1 -10
- package/src/tools/permission-checker.ts +66 -1
- package/src/tools/schedule/create.ts +6 -0
- package/src/tools/schedule/list.ts +2 -0
- package/src/tools/schedule/update.ts +10 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
- package/src/tools/shared/filesystem/path-policy.ts +25 -1
- package/src/tools/skills/load.ts +0 -32
- package/src/tools/skills/sandbox-runner.ts +1 -6
- package/src/tools/skills/skill-tool-factory.ts +32 -0
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/terminal/shell.ts +2 -78
- package/src/tools/tool-approval-handler.ts +1 -5
- package/src/tools/types.ts +16 -39
- package/src/tts/__tests__/provider-catalog.test.ts +2 -2
- package/src/tts/provider-catalog.ts +1 -1
- package/src/usage/actors.ts +2 -1
- package/src/usage/attribution.ts +185 -0
- package/src/usage/pricing.ts +166 -0
- package/src/usage/types.ts +14 -0
- package/src/util/json.ts +13 -0
- package/src/util/logger.ts +3 -3
- package/src/util/pricing.ts +50 -3
- package/src/work-items/work-item-runner.ts +15 -42
- package/src/workspace/hatched-date.ts +86 -0
- package/src/workspace/migrations/003-seed-device-id.ts +1 -1
- package/src/workspace/migrations/006-services-config.ts +8 -5
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +6 -4
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
- package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +54 -0
- package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
- package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
- package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/workspace/provider-commit-message-generator.ts +3 -3
- package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -904
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -296
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -431
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
- package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
- package/src/__tests__/secret-detection-handler.test.ts +0 -67
- package/src/__tests__/secret-scanner-executor.test.ts +0 -450
- package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
- package/src/__tests__/terminal-sandbox.test.ts +0 -374
- package/src/__tests__/tool-notification-listener.test.ts +0 -65
- package/src/__tests__/twilio-rest.test.ts +0 -34
- package/src/backup/__tests__/backup-key.test.ts +0 -152
- package/src/backup/__tests__/backup-worker.test.ts +0 -754
- package/src/backup/__tests__/offsite-writer.test.ts +0 -641
- package/src/backup/__tests__/stream-crypt.test.ts +0 -228
- package/src/backup/backup-key.ts +0 -137
- package/src/backup/backup-worker.ts +0 -438
- package/src/backup/offsite-writer.ts +0 -222
- package/src/backup/stream-crypt.ts +0 -263
- package/src/context/__tests__/microcompact.test.ts +0 -805
- package/src/context/microcompact.ts +0 -443
- package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
- package/src/daemon/message-types/pairing.ts +0 -58
- package/src/events/tool-notification-listener.ts +0 -17
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
- package/src/memory/v2/__tests__/edges.test.ts +0 -435
- package/src/memory/v2/edges.ts +0 -217
- package/src/outbound-proxy/config.ts +0 -94
- package/src/outbound-proxy/health.ts +0 -62
- package/src/outbound-proxy/types.ts +0 -150
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
- package/src/runtime/__tests__/client-registry.test.ts +0 -271
- package/src/runtime/capability-tokens.ts +0 -190
- package/src/runtime/chrome-extension-registry.ts +0 -368
- package/src/runtime/client-registry.ts +0 -254
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
- package/src/signals/mcp-reload.ts +0 -18
- package/src/tools/secret-detection-handler.ts +0 -269
- package/src/tools/terminal/backends/native.ts +0 -327
- package/src/tools/terminal/backends/types.ts +0 -37
- package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
- package/src/tools/terminal/sandbox.ts +0 -40
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getIsContainerized } from "../config/env-registry.js";
|
|
2
|
+
import { mapApprovalProvenance } from "../permissions/approval-provenance.js";
|
|
2
3
|
import {
|
|
3
4
|
check,
|
|
4
5
|
classifyRisk,
|
|
@@ -8,6 +9,7 @@ import {
|
|
|
8
9
|
} from "../permissions/checker.js";
|
|
9
10
|
import { getAutoApproveThreshold } from "../permissions/gateway-threshold-reader.js";
|
|
10
11
|
import type { PermissionPrompter } from "../permissions/prompter.js";
|
|
12
|
+
import type { ApprovalMode, ApprovalReason, RiskThreshold } from "../permissions/types.js";
|
|
11
13
|
import { RiskLevel } from "../permissions/types.js";
|
|
12
14
|
import { getLogger } from "../util/logger.js";
|
|
13
15
|
import { buildPolicyContext } from "./policy-context.js";
|
|
@@ -23,6 +25,8 @@ export type PermissionDecision =
|
|
|
23
25
|
decision: string;
|
|
24
26
|
riskLevel: string;
|
|
25
27
|
wasPrompted?: boolean;
|
|
28
|
+
/** ID of the trust rule that matched this invocation (if any). Always set when a rule matched, even for non-classifier tools where riskMeta is absent. */
|
|
29
|
+
matchedTrustRuleId?: string;
|
|
26
30
|
/** Risk metadata from the classifier assessment cache (when available). */
|
|
27
31
|
riskMeta?: {
|
|
28
32
|
riskLevel: string;
|
|
@@ -31,12 +35,17 @@ export type PermissionDecision =
|
|
|
31
35
|
riskDirectoryScopeOptions?: Array<{ scope: string; label: string }>;
|
|
32
36
|
isContainerized?: boolean;
|
|
33
37
|
};
|
|
38
|
+
approvalMode?: ApprovalMode;
|
|
39
|
+
approvalReason?: ApprovalReason;
|
|
40
|
+
riskThreshold?: RiskThreshold;
|
|
34
41
|
}
|
|
35
42
|
| {
|
|
36
43
|
allowed: false;
|
|
37
44
|
decision: string;
|
|
38
45
|
riskLevel: string;
|
|
39
46
|
content: string;
|
|
47
|
+
/** ID of the trust rule that matched this invocation (if any). Always set when a rule matched, even for non-classifier tools where riskMeta is absent. */
|
|
48
|
+
matchedTrustRuleId?: string;
|
|
40
49
|
/** Risk metadata from the classifier assessment cache (when available). */
|
|
41
50
|
riskMeta?: {
|
|
42
51
|
riskLevel: string;
|
|
@@ -45,6 +54,9 @@ export type PermissionDecision =
|
|
|
45
54
|
riskDirectoryScopeOptions?: Array<{ scope: string; label: string }>;
|
|
46
55
|
isContainerized?: boolean;
|
|
47
56
|
};
|
|
57
|
+
approvalMode?: ApprovalMode;
|
|
58
|
+
approvalReason?: ApprovalReason;
|
|
59
|
+
riskThreshold?: RiskThreshold;
|
|
48
60
|
};
|
|
49
61
|
|
|
50
62
|
export class PermissionChecker {
|
|
@@ -120,6 +132,19 @@ export class PermissionChecker {
|
|
|
120
132
|
context.signal,
|
|
121
133
|
);
|
|
122
134
|
|
|
135
|
+
// Extract the matched rule ID for propagation. Returned as a top-level
|
|
136
|
+
// field on PermissionDecision so it reaches the executor even when
|
|
137
|
+
// riskMeta is absent (non-classifier tools like MCP don't populate it).
|
|
138
|
+
const matchedTrustRuleId = result.matchedRule?.id;
|
|
139
|
+
|
|
140
|
+
// Resolved threshold snapshot for provenance. getAutoApproveThreshold
|
|
141
|
+
// returns from cache (populated by check() above), so this is free.
|
|
142
|
+
const conversationThreshold = await getAutoApproveThreshold(
|
|
143
|
+
policyContext.conversationId,
|
|
144
|
+
policyContext.executionContext,
|
|
145
|
+
);
|
|
146
|
+
const riskThreshold = conversationThreshold as RiskThreshold;
|
|
147
|
+
|
|
123
148
|
// Some callers force prompting for side-effect tools even when a
|
|
124
149
|
// trust/allow rule would auto-allow. Deny decisions are preserved -
|
|
125
150
|
// only allow → prompt promotion happens here.
|
|
@@ -155,16 +180,21 @@ export class PermissionChecker {
|
|
|
155
180
|
requestId: context.requestId,
|
|
156
181
|
riskLevel,
|
|
157
182
|
riskReason,
|
|
183
|
+
matchedTrustRuleId,
|
|
158
184
|
decision: "deny",
|
|
159
185
|
reason: result.reason,
|
|
160
186
|
durationMs,
|
|
161
187
|
});
|
|
188
|
+
const provenance = mapApprovalProvenance("denied", { matchedTrustRuleId });
|
|
162
189
|
return {
|
|
163
190
|
allowed: false,
|
|
164
191
|
decision: "denied",
|
|
165
192
|
riskLevel,
|
|
166
193
|
content: result.reason,
|
|
194
|
+
matchedTrustRuleId,
|
|
167
195
|
riskMeta,
|
|
196
|
+
...provenance,
|
|
197
|
+
riskThreshold,
|
|
168
198
|
};
|
|
169
199
|
}
|
|
170
200
|
|
|
@@ -189,7 +219,10 @@ export class PermissionChecker {
|
|
|
189
219
|
allowed: true,
|
|
190
220
|
decision: "platform_auto_approve",
|
|
191
221
|
riskLevel,
|
|
222
|
+
matchedTrustRuleId,
|
|
192
223
|
riskMeta,
|
|
224
|
+
...mapApprovalProvenance("platform_auto_approve", {}),
|
|
225
|
+
riskThreshold,
|
|
193
226
|
};
|
|
194
227
|
}
|
|
195
228
|
|
|
@@ -245,7 +278,10 @@ export class PermissionChecker {
|
|
|
245
278
|
allowed: true,
|
|
246
279
|
decision: "guardian_auto_approve",
|
|
247
280
|
riskLevel,
|
|
281
|
+
matchedTrustRuleId,
|
|
248
282
|
riskMeta,
|
|
283
|
+
...mapApprovalProvenance("guardian_auto_approve", {}),
|
|
284
|
+
riskThreshold: bgThreshold as RiskThreshold,
|
|
249
285
|
};
|
|
250
286
|
}
|
|
251
287
|
}
|
|
@@ -268,6 +304,7 @@ export class PermissionChecker {
|
|
|
268
304
|
requestId: context.requestId,
|
|
269
305
|
riskLevel,
|
|
270
306
|
riskReason,
|
|
307
|
+
matchedTrustRuleId,
|
|
271
308
|
decision: "deny",
|
|
272
309
|
reason: "Non-interactive session: no client to approve prompt",
|
|
273
310
|
durationMs,
|
|
@@ -277,7 +314,13 @@ export class PermissionChecker {
|
|
|
277
314
|
decision: "denied",
|
|
278
315
|
riskLevel,
|
|
279
316
|
content: `Permission denied: tool "${name}" requires user approval but no interactive client is connected. The tool was not executed. To allow this tool in non-interactive sessions, add a trust rule via permission settings.`,
|
|
317
|
+
matchedTrustRuleId,
|
|
280
318
|
riskMeta,
|
|
319
|
+
// Do not pass matchedTrustRuleId here: an ask-rule match put us in
|
|
320
|
+
// the prompt path, but the *reason* for denial is no interactive
|
|
321
|
+
// client, not a deny rule. Always emit no_interactive_client.
|
|
322
|
+
...mapApprovalProvenance("denied", {}),
|
|
323
|
+
riskThreshold,
|
|
281
324
|
};
|
|
282
325
|
}
|
|
283
326
|
|
|
@@ -352,6 +395,7 @@ export class PermissionChecker {
|
|
|
352
395
|
requestId: context.requestId,
|
|
353
396
|
riskLevel,
|
|
354
397
|
riskReason,
|
|
398
|
+
matchedTrustRuleId,
|
|
355
399
|
decision: "deny",
|
|
356
400
|
reason: denialReason,
|
|
357
401
|
durationMs,
|
|
@@ -361,7 +405,14 @@ export class PermissionChecker {
|
|
|
361
405
|
decision,
|
|
362
406
|
riskLevel,
|
|
363
407
|
content: denialMessage,
|
|
408
|
+
matchedTrustRuleId,
|
|
364
409
|
riskMeta,
|
|
410
|
+
...mapApprovalProvenance(decision, {
|
|
411
|
+
wasTimeout: response.wasTimeout,
|
|
412
|
+
wasSystemCancel: response.wasSystemCancel,
|
|
413
|
+
wasAbort: response.wasAbort,
|
|
414
|
+
}),
|
|
415
|
+
riskThreshold,
|
|
365
416
|
};
|
|
366
417
|
}
|
|
367
418
|
|
|
@@ -370,12 +421,26 @@ export class PermissionChecker {
|
|
|
370
421
|
decision,
|
|
371
422
|
riskLevel,
|
|
372
423
|
wasPrompted: true,
|
|
424
|
+
matchedTrustRuleId,
|
|
373
425
|
riskMeta,
|
|
426
|
+
...mapApprovalProvenance(decision, { wasPrompted: true }),
|
|
427
|
+
riskThreshold,
|
|
374
428
|
};
|
|
375
429
|
}
|
|
376
430
|
|
|
377
431
|
// result.decision === 'allow'
|
|
378
|
-
return {
|
|
432
|
+
return {
|
|
433
|
+
allowed: true,
|
|
434
|
+
decision: "allow",
|
|
435
|
+
riskLevel,
|
|
436
|
+
matchedTrustRuleId,
|
|
437
|
+
riskMeta,
|
|
438
|
+
...mapApprovalProvenance("allow", {
|
|
439
|
+
hasSandboxAutoApprove: result.hasSandboxAutoApprove,
|
|
440
|
+
matchedTrustRuleId,
|
|
441
|
+
}),
|
|
442
|
+
riskThreshold,
|
|
443
|
+
};
|
|
379
444
|
} catch (err) {
|
|
380
445
|
if (err instanceof Error) {
|
|
381
446
|
(err as Error & { riskLevel?: string }).riskLevel = riskLevel;
|
|
@@ -44,6 +44,8 @@ export async function executeScheduleCreate(
|
|
|
44
44
|
| undefined;
|
|
45
45
|
const quiet = (input.quiet as boolean) ?? false;
|
|
46
46
|
const reuseConversation = (input.reuse_conversation as boolean) ?? false;
|
|
47
|
+
const maxRetries = input.max_retries as number | undefined;
|
|
48
|
+
const retryBackoffMs = input.retry_backoff_ms as number | undefined;
|
|
47
49
|
|
|
48
50
|
if (!name || typeof name !== "string") {
|
|
49
51
|
return {
|
|
@@ -130,6 +132,8 @@ export async function executeScheduleCreate(
|
|
|
130
132
|
routingHints,
|
|
131
133
|
quiet,
|
|
132
134
|
reuseConversation,
|
|
135
|
+
maxRetries,
|
|
136
|
+
retryBackoffMs,
|
|
133
137
|
});
|
|
134
138
|
|
|
135
139
|
const fireDate = formatLocalDate(job.nextRunAt);
|
|
@@ -208,6 +212,8 @@ export async function executeScheduleCreate(
|
|
|
208
212
|
routingHints,
|
|
209
213
|
quiet,
|
|
210
214
|
reuseConversation,
|
|
215
|
+
maxRetries,
|
|
216
|
+
retryBackoffMs,
|
|
211
217
|
});
|
|
212
218
|
|
|
213
219
|
const scheduleDescription =
|
|
@@ -77,6 +77,8 @@ export async function executeScheduleList(
|
|
|
77
77
|
` Last run: ${job.lastRunAt ? formatLocalDate(job.lastRunAt) : "never"}`,
|
|
78
78
|
` Last status: ${job.lastStatus ?? "n/a"}`,
|
|
79
79
|
` Retry count: ${job.retryCount}`,
|
|
80
|
+
` Max retries: ${job.maxRetries}`,
|
|
81
|
+
` Retry backoff: ${job.retryBackoffMs}ms`,
|
|
80
82
|
` Created: ${formatLocalDate(job.createdAt)}`,
|
|
81
83
|
);
|
|
82
84
|
|
|
@@ -108,6 +108,14 @@ export async function executeScheduleUpdate(
|
|
|
108
108
|
updates.reuseConversation = input.reuse_conversation;
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
// Retry policy
|
|
112
|
+
if (input.max_retries !== undefined) {
|
|
113
|
+
updates.maxRetries = input.max_retries;
|
|
114
|
+
}
|
|
115
|
+
if (input.retry_backoff_ms !== undefined) {
|
|
116
|
+
updates.retryBackoffMs = input.retry_backoff_ms;
|
|
117
|
+
}
|
|
118
|
+
|
|
111
119
|
// Auto-detect syntax when expression changes without explicit syntax
|
|
112
120
|
if (input.expression !== undefined || input.syntax !== undefined) {
|
|
113
121
|
const resolved = normalizeScheduleSyntax({
|
|
@@ -173,6 +181,8 @@ export async function executeScheduleUpdate(
|
|
|
173
181
|
routingHints?: Record<string, unknown>;
|
|
174
182
|
quiet?: boolean;
|
|
175
183
|
reuseConversation?: boolean;
|
|
184
|
+
maxRetries?: number;
|
|
185
|
+
retryBackoffMs?: number;
|
|
176
186
|
},
|
|
177
187
|
);
|
|
178
188
|
|
|
@@ -11,7 +11,14 @@ import {
|
|
|
11
11
|
/**
|
|
12
12
|
* Result type shared by both sandbox and host path policies.
|
|
13
13
|
*/
|
|
14
|
-
export type PathFailureReason = "not_absolute" | "out_of_bounds";
|
|
14
|
+
export type PathFailureReason = "not_absolute" | "out_of_bounds" | "denied";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Basenames that must never be read or written by the assistant, regardless
|
|
18
|
+
* of where they resolve. Defense-in-depth: even if a key file is accidentally
|
|
19
|
+
* placed inside the workspace boundary, the assistant cannot access it.
|
|
20
|
+
*/
|
|
21
|
+
const DENIED_BASENAMES = new Set([".backup.key", "backup.key"]);
|
|
15
22
|
|
|
16
23
|
export type PathResult =
|
|
17
24
|
| { ok: true; resolved: string }
|
|
@@ -106,6 +113,16 @@ export function sandboxPolicy(
|
|
|
106
113
|
};
|
|
107
114
|
}
|
|
108
115
|
|
|
116
|
+
// Check both the logical path and the symlink-resolved path so a symlink
|
|
117
|
+
// with a non-denied name pointing at a denied file is still caught.
|
|
118
|
+
if (DENIED_BASENAMES.has(basename(resolved)) || DENIED_BASENAMES.has(basename(realResolved))) {
|
|
119
|
+
return {
|
|
120
|
+
ok: false,
|
|
121
|
+
reason: "denied",
|
|
122
|
+
error: `Access to "${basename(resolved)}" is denied`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
109
126
|
return { ok: true, resolved };
|
|
110
127
|
}
|
|
111
128
|
|
|
@@ -125,5 +142,12 @@ export function hostPolicy(rawPath: string): PathResult {
|
|
|
125
142
|
error: `path must be absolute for host file access: ${rawPath}`,
|
|
126
143
|
};
|
|
127
144
|
}
|
|
145
|
+
if (DENIED_BASENAMES.has(basename(rawPath))) {
|
|
146
|
+
return {
|
|
147
|
+
ok: false,
|
|
148
|
+
reason: "denied",
|
|
149
|
+
error: `Access to "${basename(rawPath)}" is denied`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
128
152
|
return { ok: true, resolved: rawPath };
|
|
129
153
|
}
|
package/src/tools/skills/load.ts
CHANGED
|
@@ -29,9 +29,6 @@ import { getWorkspaceDirDisplay } from "../../util/platform.js";
|
|
|
29
29
|
import { registerTool } from "../registry.js";
|
|
30
30
|
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
31
31
|
|
|
32
|
-
/** Canonical feature flag key for inline skill command expansion. */
|
|
33
|
-
const INLINE_COMMANDS_FLAG_KEY = "inline-skill-commands";
|
|
34
|
-
|
|
35
32
|
/** Skill sources eligible for inline command expansion in v1. */
|
|
36
33
|
const INLINE_COMMAND_ELIGIBLE_SOURCES = new Set([
|
|
37
34
|
"bundled",
|
|
@@ -300,20 +297,6 @@ export class SkillLoadTool implements Tool {
|
|
|
300
297
|
skill.inlineCommandExpansions && skill.inlineCommandExpansions.length > 0;
|
|
301
298
|
|
|
302
299
|
if (hasInlineCommands) {
|
|
303
|
-
const inlineFlagEnabled = isAssistantFeatureFlagEnabled(
|
|
304
|
-
INLINE_COMMANDS_FLAG_KEY,
|
|
305
|
-
config,
|
|
306
|
-
);
|
|
307
|
-
|
|
308
|
-
if (!inlineFlagEnabled) {
|
|
309
|
-
// Feature flag is off: fail closed instead of leaving live tokens in
|
|
310
|
-
// the prompt that the LLM might try to interpret.
|
|
311
|
-
return {
|
|
312
|
-
content: `Error: skill "${skill.id}" contains inline command expansions but the inline-skill-commands feature flag is disabled. Enable the flag to use this skill.`,
|
|
313
|
-
isError: true,
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
|
|
317
300
|
if (skill.source === "extra") {
|
|
318
301
|
// Third-party extra roots are out of scope for inline command
|
|
319
302
|
// expansion in v1. Reject explicitly so the failure is clear.
|
|
@@ -391,21 +374,6 @@ export class SkillLoadTool implements Tool {
|
|
|
391
374
|
childLoaded.skill.inlineCommandExpansions.length > 0;
|
|
392
375
|
|
|
393
376
|
if (childHasInlineCommands) {
|
|
394
|
-
const childInlineFlagEnabled = isAssistantFeatureFlagEnabled(
|
|
395
|
-
INLINE_COMMANDS_FLAG_KEY,
|
|
396
|
-
config,
|
|
397
|
-
);
|
|
398
|
-
|
|
399
|
-
// Fail closed: if the flag is off, reject the entire skill_load
|
|
400
|
-
// just like we do for root skills. Leaving raw !`...` tokens in
|
|
401
|
-
// the prompt would violate the documented fail-closed contract.
|
|
402
|
-
if (!childInlineFlagEnabled) {
|
|
403
|
-
return {
|
|
404
|
-
content: `Error: included skill "${childId}" contains inline command expansions but the inline-skill-commands feature flag is disabled. Enable the flag to use skill "${skill.id}".`,
|
|
405
|
-
isError: true,
|
|
406
|
-
};
|
|
407
|
-
}
|
|
408
|
-
|
|
409
377
|
if (childLoaded.skill.source === "extra") {
|
|
410
378
|
return {
|
|
411
379
|
content: `Error: included skill "${childId}" contains inline command expansions but inline commands are not supported for third-party (extra) skill sources.`,
|
|
@@ -6,7 +6,6 @@ import { join, resolve } from "node:path";
|
|
|
6
6
|
import { computeSkillVersionHash } from "../../skills/version-hash.js";
|
|
7
7
|
import { safeStringSlice } from "../../util/unicode.js";
|
|
8
8
|
import { buildSanitizedEnv } from "../terminal/safe-env.js";
|
|
9
|
-
import { wrapCommand } from "../terminal/sandbox.js";
|
|
10
9
|
import type { ToolContext, ToolExecutionResult } from "../types.js";
|
|
11
10
|
|
|
12
11
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
@@ -138,12 +137,8 @@ function spawnRunner(
|
|
|
138
137
|
const stderrChunks: Buffer[] = [];
|
|
139
138
|
let timedOut = false;
|
|
140
139
|
|
|
141
|
-
// The assistant runs exclusively in Docker or platform-managed
|
|
142
|
-
// environments where the container provides isolation.
|
|
143
|
-
const sandboxConfig = { enabled: false } as const;
|
|
144
|
-
|
|
145
140
|
const bunRunCmd = "bun run __skill_runner.ts";
|
|
146
|
-
const wrapped =
|
|
141
|
+
const wrapped = { command: "bash", args: ["-c", "--", bunRunCmd] };
|
|
147
142
|
|
|
148
143
|
const env = buildSanitizedEnv();
|
|
149
144
|
env.__SKILL_INPUT_JSON = JSON.stringify(input);
|
|
@@ -15,6 +15,31 @@ const riskMap: Record<SkillToolEntry["risk"], RiskLevel> = {
|
|
|
15
15
|
high: RiskLevel.High,
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Validate that all keys in `input` are declared in the tool's input_schema
|
|
20
|
+
* properties. Returns an error result listing unknown parameters, or undefined
|
|
21
|
+
* if validation passes.
|
|
22
|
+
*/
|
|
23
|
+
function validateNoUnknownParams(
|
|
24
|
+
toolName: string,
|
|
25
|
+
input: Record<string, unknown>,
|
|
26
|
+
schema: SkillToolEntry["input_schema"],
|
|
27
|
+
): ToolExecutionResult | undefined {
|
|
28
|
+
const properties = schema?.properties;
|
|
29
|
+
if (!properties) return undefined;
|
|
30
|
+
|
|
31
|
+
const knownKeys = new Set(Object.keys(properties));
|
|
32
|
+
const unknownKeys = Object.keys(input).filter((k) => !knownKeys.has(k));
|
|
33
|
+
if (unknownKeys.length === 0) return undefined;
|
|
34
|
+
|
|
35
|
+
const listed = unknownKeys.map((k) => `"${k}"`).join(", ");
|
|
36
|
+
const supported = [...knownKeys].map((k) => `"${k}"`).join(", ");
|
|
37
|
+
return {
|
|
38
|
+
content: `Unknown parameter${unknownKeys.length > 1 ? "s" : ""} ${listed} for tool "${toolName}". Supported parameters: ${supported}. Remove unsupported parameters and retry.`,
|
|
39
|
+
isError: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
18
43
|
/**
|
|
19
44
|
* Create a runtime Tool object from a manifest entry.
|
|
20
45
|
* Maps SkillToolEntry metadata to the Tool interface and routes execution
|
|
@@ -50,6 +75,13 @@ export function createSkillTool(
|
|
|
50
75
|
input: Record<string, unknown>,
|
|
51
76
|
context: ToolContext,
|
|
52
77
|
): Promise<ToolExecutionResult> {
|
|
78
|
+
const validationError = validateNoUnknownParams(
|
|
79
|
+
entry.name,
|
|
80
|
+
input,
|
|
81
|
+
entry.input_schema,
|
|
82
|
+
);
|
|
83
|
+
if (validationError) return validationError;
|
|
84
|
+
|
|
53
85
|
return runSkillToolScript(skillDir, entry.executor, input, context, {
|
|
54
86
|
target: entry.execution_target,
|
|
55
87
|
expectedSkillVersionHash: versionHash,
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import type { ChildProcess } from "node:child_process";
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { dirname, join } from "node:path";
|
|
5
3
|
|
|
6
4
|
import { getConfig } from "../../config/loader.js";
|
|
7
5
|
import { isCesShellLockdownEnabled } from "../../credential-execution/feature-gates.js";
|
|
@@ -11,11 +9,7 @@ import { isUntrustedTrustClass } from "../../runtime/actor-trust-resolver.js";
|
|
|
11
9
|
import { wakeAgentForOpportunity } from "../../runtime/agent-wake.js";
|
|
12
10
|
import { redactSecrets } from "../../security/secret-scanner.js";
|
|
13
11
|
import { getLogger } from "../../util/logger.js";
|
|
14
|
-
import {
|
|
15
|
-
getDataDir,
|
|
16
|
-
getProtectedDir,
|
|
17
|
-
getWorkspaceDir,
|
|
18
|
-
} from "../../util/platform.js";
|
|
12
|
+
import { getDataDir } from "../../util/platform.js";
|
|
19
13
|
import {
|
|
20
14
|
generateBackgroundToolId,
|
|
21
15
|
isBackgroundToolLimitReached,
|
|
@@ -37,7 +31,6 @@ import type {
|
|
|
37
31
|
ToolExecutionResult,
|
|
38
32
|
} from "../types.js";
|
|
39
33
|
import { buildSanitizedEnv } from "./safe-env.js";
|
|
40
|
-
import { wrapCommand } from "./sandbox.js";
|
|
41
34
|
|
|
42
35
|
/** Build a credential ref resolution trace for diagnostic logging. */
|
|
43
36
|
function buildCredentialRefTrace(
|
|
@@ -48,62 +41,6 @@ function buildCredentialRefTrace(
|
|
|
48
41
|
return { rawRefs, resolvedIds, unresolvedRefs };
|
|
49
42
|
}
|
|
50
43
|
|
|
51
|
-
/**
|
|
52
|
-
* Build the list of absolute paths that should be blocked from read access
|
|
53
|
-
* inside the sandbox when CES shell lockdown is active.
|
|
54
|
-
*
|
|
55
|
-
* Blocked paths include:
|
|
56
|
-
* - Gateway security directory (credential store secrets, CES data)
|
|
57
|
-
* - ~/.vellum/workspace/data/db/ - database files that may contain credential metadata
|
|
58
|
-
* - CES bootstrap socket directory (/run/ces-bootstrap/ or CES_BOOTSTRAP_SOCKET_DIR)
|
|
59
|
-
* - CES managed-mode data root (CES_DATA_DIR, or /ces-data when CES_MANAGED_MODE is set)
|
|
60
|
-
*/
|
|
61
|
-
function buildCesProtectedPaths(): string[] {
|
|
62
|
-
const protectedDirs = process.env.GATEWAY_SECURITY_DIR
|
|
63
|
-
? [process.env.GATEWAY_SECURITY_DIR]
|
|
64
|
-
: Array.from(
|
|
65
|
-
new Set([join(homedir(), ".vellum", "protected"), getProtectedDir()]),
|
|
66
|
-
);
|
|
67
|
-
const paths = [...protectedDirs, join(getWorkspaceDir(), "data", "db")];
|
|
68
|
-
|
|
69
|
-
// CES bootstrap socket directory - block access to the Unix socket that
|
|
70
|
-
// accepts RPC commands from the assistant process.
|
|
71
|
-
const bootstrapSocketDir =
|
|
72
|
-
process.env["CES_BOOTSTRAP_SOCKET_DIR"] || "/run/ces-bootstrap";
|
|
73
|
-
paths.push(bootstrapSocketDir);
|
|
74
|
-
|
|
75
|
-
// IPC socket directories - block access to the shared emptyDir volumes
|
|
76
|
-
// used for gateway↔daemon IPC in containerized deployments.
|
|
77
|
-
const gatewayIpcSocketDir =
|
|
78
|
-
process.env["GATEWAY_IPC_SOCKET_DIR"] || "/run/gateway-ipc";
|
|
79
|
-
paths.push(gatewayIpcSocketDir);
|
|
80
|
-
|
|
81
|
-
const assistantIpcSocketDir =
|
|
82
|
-
process.env["ASSISTANT_IPC_SOCKET_DIR"] || "/run/assistant-ipc";
|
|
83
|
-
paths.push(assistantIpcSocketDir);
|
|
84
|
-
|
|
85
|
-
// If a full socket path override is set (without the dir env var), block
|
|
86
|
-
// its parent directory as well.
|
|
87
|
-
if (
|
|
88
|
-
!process.env["CES_BOOTSTRAP_SOCKET_DIR"] &&
|
|
89
|
-
process.env["CES_BOOTSTRAP_SOCKET"]
|
|
90
|
-
) {
|
|
91
|
-
paths.push(dirname(process.env["CES_BOOTSTRAP_SOCKET"]));
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// CES managed-mode private data root - in managed deployments the CES
|
|
95
|
-
// data lives outside the Vellum root, so it isn't covered by the
|
|
96
|
-
// gateway security directory entry above.
|
|
97
|
-
const cesDataDir = process.env["CES_DATA_DIR"];
|
|
98
|
-
if (cesDataDir) {
|
|
99
|
-
paths.push(cesDataDir);
|
|
100
|
-
} else if (process.env["CES_MANAGED_MODE"]) {
|
|
101
|
-
paths.push("/ces-data");
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return paths;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
44
|
const log = getLogger("shell-tool");
|
|
108
45
|
|
|
109
46
|
class ShellTool implements Tool {
|
|
@@ -292,10 +229,6 @@ class ShellTool implements Tool {
|
|
|
292
229
|
"Executing shell command",
|
|
293
230
|
);
|
|
294
231
|
|
|
295
|
-
// The assistant runs exclusively in Docker or platform-managed
|
|
296
|
-
// environments where the container provides isolation.
|
|
297
|
-
const sandboxConfig = { enabled: false } as const;
|
|
298
|
-
|
|
299
232
|
// Acquire proxy session if proxied mode is requested.
|
|
300
233
|
// `getOrStartSession` serializes per-conversation so concurrent proxied
|
|
301
234
|
// commands share a single session instead of each creating one.
|
|
@@ -337,16 +270,7 @@ class ShellTool implements Tool {
|
|
|
337
270
|
env.VELLUM_UNTRUSTED_SHELL = "1";
|
|
338
271
|
}
|
|
339
272
|
|
|
340
|
-
|
|
341
|
-
// data, the protected dir, and data sub-dirs that contain secrets.
|
|
342
|
-
const denyReadPaths: string[] | undefined = shellLockdownActive
|
|
343
|
-
? buildCesProtectedPaths()
|
|
344
|
-
: undefined;
|
|
345
|
-
|
|
346
|
-
const wrapped = wrapCommand(command, context.workingDir, sandboxConfig, {
|
|
347
|
-
networkMode,
|
|
348
|
-
denyReadPaths,
|
|
349
|
-
});
|
|
273
|
+
const wrapped = { command: "bash", args: ["-c", "--", command] };
|
|
350
274
|
|
|
351
275
|
// -----------------------------------------------------------------------
|
|
352
276
|
// Background mode: spawn and return immediately. The process output is
|
|
@@ -292,11 +292,7 @@ export class ToolApprovalHandler {
|
|
|
292
292
|
executionTarget,
|
|
293
293
|
);
|
|
294
294
|
|
|
295
|
-
if (
|
|
296
|
-
isUntrustedTrustClass(context.trustClass) &&
|
|
297
|
-
guardianApprovalRequired &&
|
|
298
|
-
context.trustClass !== "trusted_contact"
|
|
299
|
-
) {
|
|
295
|
+
if (isUntrustedTrustClass(context.trustClass) && guardianApprovalRequired) {
|
|
300
296
|
const inputDigest = computeToolApprovalDigest(name, input);
|
|
301
297
|
needsGrantConsumption = true;
|
|
302
298
|
deferredConsumeParams = {
|
package/src/tools/types.ts
CHANGED
|
@@ -10,15 +10,10 @@ import type {
|
|
|
10
10
|
ToolExecutionStartEvent,
|
|
11
11
|
ToolPermissionDeniedEvent,
|
|
12
12
|
ToolPermissionPromptEvent,
|
|
13
|
-
ToolSecretDetectedEvent,
|
|
14
13
|
} from "@vellumai/skill-host-contracts";
|
|
15
14
|
|
|
16
15
|
import type { InterfaceId } from "../channels/types.js";
|
|
17
16
|
import type { CesClient } from "../credential-execution/client.js";
|
|
18
|
-
import type { HostBashProxy } from "../daemon/host-bash-proxy.js";
|
|
19
|
-
import type { HostBrowserProxy } from "../daemon/host-browser-proxy.js";
|
|
20
|
-
import type { HostFileProxy } from "../daemon/host-file-proxy.js";
|
|
21
|
-
import type { HostTransferProxy } from "../daemon/host-transfer-proxy.js";
|
|
22
17
|
import type { SecretPromptResult } from "../permissions/secret-prompter.js";
|
|
23
18
|
import type { ContentBlock } from "../providers/types.js";
|
|
24
19
|
import type { TrustClass } from "../runtime/actor-trust-resolver.js";
|
|
@@ -59,7 +54,6 @@ export type {
|
|
|
59
54
|
ToolExecutionStartEvent,
|
|
60
55
|
ToolPermissionDeniedEvent,
|
|
61
56
|
ToolPermissionPromptEvent,
|
|
62
|
-
ToolSecretDetectedEvent,
|
|
63
57
|
} from "@vellumai/skill-host-contracts";
|
|
64
58
|
export { RiskLevel } from "@vellumai/skill-host-contracts";
|
|
65
59
|
|
|
@@ -97,6 +91,14 @@ export interface ToolExecutionResult {
|
|
|
97
91
|
riskLevel?: string;
|
|
98
92
|
/** Human-readable reason for the risk classification. */
|
|
99
93
|
riskReason?: string;
|
|
94
|
+
/** ID of the trust rule that matched this invocation (if any). */
|
|
95
|
+
matchedTrustRuleId?: string;
|
|
96
|
+
/** How the decision was reached: prompted, auto, blocked, or unknown (legacy). */
|
|
97
|
+
approvalMode?: string;
|
|
98
|
+
/** Why the decision was reached (stable enum for client display). */
|
|
99
|
+
approvalReason?: string;
|
|
100
|
+
/** Snapshot of the auto-approve threshold at the time of execution. */
|
|
101
|
+
riskThreshold?: string;
|
|
100
102
|
/** Whether the daemon is running in a containerized (Docker) environment. */
|
|
101
103
|
isContainerized?: boolean;
|
|
102
104
|
/** Scope options ladder for the rule editor (narrowest to broadest). */
|
|
@@ -134,6 +136,12 @@ export interface ToolExecutedEvent {
|
|
|
134
136
|
requestId?: string;
|
|
135
137
|
executionTarget?: ExecutionTarget;
|
|
136
138
|
riskLevel: string;
|
|
139
|
+
/** ID of the trust rule that matched this invocation (if any). */
|
|
140
|
+
matchedTrustRuleId?: string;
|
|
141
|
+
/** How the approval decision was reached. Copied from PermissionDecision for analytics consumers. */
|
|
142
|
+
approvalMode?: string;
|
|
143
|
+
/** Why the approval decision was reached (stable enum). Copied from PermissionDecision for analytics consumers. */
|
|
144
|
+
approvalReason?: string;
|
|
137
145
|
decision: string;
|
|
138
146
|
durationMs: number;
|
|
139
147
|
result: ToolExecutionResult;
|
|
@@ -144,8 +152,7 @@ export type ToolLifecycleEvent =
|
|
|
144
152
|
| ToolPermissionPromptEvent
|
|
145
153
|
| ToolPermissionDeniedEvent
|
|
146
154
|
| ToolExecutedEvent
|
|
147
|
-
| ToolExecutionErrorEvent
|
|
148
|
-
| ToolSecretDetectedEvent;
|
|
155
|
+
| ToolExecutionErrorEvent;
|
|
149
156
|
|
|
150
157
|
export type ToolLifecycleEventHandler = (
|
|
151
158
|
event: ToolLifecycleEvent,
|
|
@@ -164,7 +171,7 @@ export interface ToolContext {
|
|
|
164
171
|
onOutput?: (chunk: string) => void;
|
|
165
172
|
/** Abort signal for cooperative cancellation. Tools should check this periodically. */
|
|
166
173
|
signal?: AbortSignal;
|
|
167
|
-
/** Optional callback for tool lifecycle events (start/prompt/deny/execute/error
|
|
174
|
+
/** Optional callback for tool lifecycle events (start/prompt/deny/execute/error). */
|
|
168
175
|
onToolLifecycleEvent?: ToolLifecycleEventHandler;
|
|
169
176
|
/** Optional resolver for proxy tools - delegates execution to an external client. */
|
|
170
177
|
proxyToolResolver?: ProxyToolResolver;
|
|
@@ -239,14 +246,6 @@ export interface ToolContext {
|
|
|
239
246
|
channelPermissionChannelId?: string;
|
|
240
247
|
/** The tool_use block ID from the LLM response, used to correlate confirmation prompts with specific tool invocations. */
|
|
241
248
|
toolUseId?: string;
|
|
242
|
-
/** Optional proxy for delegating host_bash execution to a connected client (managed/cloud-hosted mode). */
|
|
243
|
-
hostBashProxy?: HostBashProxy;
|
|
244
|
-
/** Optional proxy for delegating CDP commands to a connected client (managed/cloud-hosted mode). */
|
|
245
|
-
hostBrowserProxy?: HostBrowserProxy;
|
|
246
|
-
/** Optional proxy for delegating host_file_read/write/edit execution to a connected client (managed/cloud-hosted mode). */
|
|
247
|
-
hostFileProxy?: HostFileProxy;
|
|
248
|
-
/** Optional proxy for delegating bidirectional file transfers between sandbox and host (managed/cloud-hosted mode). */
|
|
249
|
-
hostTransferProxy?: HostTransferProxy;
|
|
250
249
|
/** True when the assistant is running as a platform-managed remote instance. Used to auto-approve sandboxed bash tools. */
|
|
251
250
|
isPlatformHosted?: boolean;
|
|
252
251
|
/** CES RPC client for credential execution operations. When present, the executor can bridge CES approval flows. */
|
|
@@ -259,28 +258,6 @@ export interface ToolContext {
|
|
|
259
258
|
* to cdp-inspect or local Playwright.
|
|
260
259
|
*/
|
|
261
260
|
transportInterface?: InterfaceId;
|
|
262
|
-
/**
|
|
263
|
-
* True when the host browser proxy's sender was overridden by a
|
|
264
|
-
* registry-routed extension connection (ChromeExtensionRegistry WebSocket).
|
|
265
|
-
* The CDP factory uses this to distinguish between an SSE-backed proxy
|
|
266
|
-
* (macOS, no extension) and an extension-backed proxy: only the latter
|
|
267
|
-
* should suppress desktop-auto cdp-inspect when temporarily unavailable,
|
|
268
|
-
* because the extension transport was explicitly expected and the
|
|
269
|
-
* disconnection is transient. An SSE-backed proxy that reports
|
|
270
|
-
* unavailable (e.g. non-interactive turn) should NOT suppress
|
|
271
|
-
* cdp-inspect — the proxy was never expected to service browser requests.
|
|
272
|
-
*/
|
|
273
|
-
hostBrowserRegistryRouted?: boolean;
|
|
274
|
-
/**
|
|
275
|
-
* Connected clients that support the `host_browser` capability, populated
|
|
276
|
-
* from the ClientRegistry. Used by `browser status` to report accurate
|
|
277
|
-
* extension availability even when no proxy is bound to the current
|
|
278
|
-
* conversation (e.g. when called from the CLI without a conversation ID).
|
|
279
|
-
*/
|
|
280
|
-
connectedBrowserClients?: Array<{
|
|
281
|
-
clientId: string;
|
|
282
|
-
interfaceId: string;
|
|
283
|
-
}>;
|
|
284
261
|
/**
|
|
285
262
|
* The per-turn inference-profile override the agent loop is currently
|
|
286
263
|
* running under, propagated through tool context so subagent-spawn tools
|