@vellumai/assistant 0.6.4 → 0.6.5
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/.prettierignore +5 -0
- package/ARCHITECTURE.md +32 -36
- package/Dockerfile +12 -0
- package/README.md +3 -4
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +1 -20
- package/docs/architecture/security.md +16 -16
- package/docs/error-handling.md +111 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/openapi.yaml +123 -11
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- package/src/__tests__/approval-cascade.test.ts +31 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +27 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +428 -501
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/compaction-circuit-breaker.test.ts +336 -0
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +11 -28
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +427 -114
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +530 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +30 -16
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +61 -17
- package/src/__tests__/conversation-agent-loop.test.ts +412 -82
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +30 -9
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +6 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +36 -0
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +30 -16
- package/src/__tests__/conversation-process-callsite.test.ts +306 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -16
- package/src/__tests__/conversation-queue.test.ts +41 -26
- package/src/__tests__/conversation-routes-disk-view.test.ts +29 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2735 -55
- package/src/__tests__/conversation-runtime-workspace.test.ts +12 -12
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +34 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +30 -16
- package/src/__tests__/conversation-speed-override.test.ts +30 -11
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +2 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +3 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +31 -10
- package/src/__tests__/conversation-workspace-injection.test.ts +43 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +44 -16
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-security-invariants.test.ts +3 -0
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +26 -7
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/intent-routing.test.ts +1 -40
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +684 -0
- package/src/__tests__/model-intents.test.ts +9 -83
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/oauth-store.test.ts +10 -7
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -1
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/pricing.test.ts +50 -3
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +0 -1
- package/src/__tests__/reaction-persistence.test.ts +560 -0
- package/src/__tests__/relay-server.test.ts +1 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +160 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor.test.ts +60 -94
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +1 -13
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +209 -17
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +666 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +451 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +594 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/completions.ts +0 -3
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +14 -1
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +300 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +23 -4
- package/src/cli.ts +0 -37
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +23 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +8 -1
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +11 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -175
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +30 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +318 -0
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +53 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skills.ts +2 -2
- package/src/context/__tests__/compact-prompt.test.ts +45 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/prompts/compact.md +12 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/window-manager.ts +229 -25
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- package/src/daemon/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +0 -1
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +79 -12
- package/src/daemon/conversation-agent-loop.ts +462 -80
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-lifecycle.ts +30 -6
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-process.ts +10 -4
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +760 -29
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +10 -5
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +118 -30
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +54 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +2 -2
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +76 -14
- package/src/daemon/message-types/conversations.ts +14 -0
- package/src/daemon/message-types/messages.ts +9 -1
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +117 -9
- package/src/daemon/tool-side-effects.ts +0 -9
- package/src/daemon/watch-handler.ts +4 -4
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/heartbeat-service.ts +76 -28
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +4 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +56 -2
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/socket-path.test.ts +73 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +4 -4
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +61 -0
- package/src/ipc/routes/browser.ts +96 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/index.ts +17 -1
- package/src/ipc/routes/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +100 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +103 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-title-service.ts +7 -4
- package/src/memory/db-init.ts +2 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/graph/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +173 -51
- package/src/memory/graph/graph-search.test.ts +92 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +230 -48
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/pkb/pkb-index.test.ts +368 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +251 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +438 -0
- package/src/memory/pkb/pkb-search.ts +137 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.ts +122 -1
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1373 -0
- package/src/messaging/providers/slack/render-transcript.ts +443 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/oauth/oauth-store.ts +1 -0
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/seed-providers.ts +4 -2
- package/src/permissions/approval-policy.test.ts +948 -0
- package/src/permissions/approval-policy.ts +257 -0
- package/src/permissions/bash-risk-classifier.test.ts +1208 -0
- package/src/permissions/bash-risk-classifier.ts +707 -0
- package/src/permissions/checker.ts +217 -708
- package/src/permissions/command-registry.test.ts +535 -0
- package/src/permissions/command-registry.ts +825 -0
- package/src/permissions/defaults.ts +26 -78
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/risk-types.ts +205 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +161 -62
- package/src/permissions/types.ts +23 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +1 -16
- package/src/platform/client.ts +19 -1
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +501 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +76 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +578 -0
- package/src/providers/speech-to-text/xai-realtime.ts +796 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +93 -3
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +52 -1
- package/src/runtime/http-types.ts +23 -1
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/vbundle-importer.ts +154 -9
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +58 -0
- package/src/runtime/routes/approval-routes.ts +12 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +133 -27
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- package/src/runtime/routes/inbound-message-handler.ts +912 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/migration-routes.ts +720 -124
- package/src/runtime/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +28 -6
- package/src/schedule/scheduler.ts +8 -0
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +26 -7
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +45 -2
- package/src/tools/browser/browser-execution.ts +65 -38
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +4 -0
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/web-fetch.ts +20 -10
- package/src/tools/network/web-search.ts +19 -4
- package/src/tools/permission-checker.ts +36 -15
- package/src/tools/policy-context.ts +25 -8
- package/src/tools/registry.ts +55 -3
- package/src/tools/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +12 -3
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +2 -2
- package/src/util/pricing.ts +15 -5
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +57 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +16 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- package/src/__tests__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/gmail/SKILL.md +0 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/slack/SKILL.md +0 -108
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -139
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -202,7 +202,7 @@ describe("Tool execution pipeline benchmark", () => {
|
|
|
202
202
|
expect(p50).toBeLessThan(15);
|
|
203
203
|
expect(p95).toBeLessThan(40);
|
|
204
204
|
// Verify correctness: ls should be low risk
|
|
205
|
-
expect(results[0]).toBe(RiskLevel.Low);
|
|
205
|
+
expect(results[0].level).toBe(RiskLevel.Low);
|
|
206
206
|
});
|
|
207
207
|
|
|
208
208
|
test("classifyRisk: medium-risk tool (file_write)", async () => {
|
|
@@ -213,7 +213,7 @@ describe("Tool execution pipeline benchmark", () => {
|
|
|
213
213
|
|
|
214
214
|
const p50 = percentile(timings, 50);
|
|
215
215
|
expect(p50).toBeLessThan(5);
|
|
216
|
-
expect(results[0]).toBe(RiskLevel.Low);
|
|
216
|
+
expect(results[0].level).toBe(RiskLevel.Low);
|
|
217
217
|
});
|
|
218
218
|
|
|
219
219
|
test("check: full permission check for low-risk tool", async () => {
|
|
@@ -64,7 +64,7 @@ mock.module("../util/logger.js", () => ({
|
|
|
64
64
|
}));
|
|
65
65
|
|
|
66
66
|
mock.module("../permissions/checker.js", () => ({
|
|
67
|
-
classifyRisk: async () => checkerRisk,
|
|
67
|
+
classifyRisk: async () => ({ level: checkerRisk }),
|
|
68
68
|
check: async () => ({ decision: checkerDecision, reason: checkerReason }),
|
|
69
69
|
generateAllowlistOptions: () => [
|
|
70
70
|
{ label: "exact", description: "exact", pattern: "exact" },
|
|
@@ -639,7 +639,7 @@ describe("ToolExecutor lifecycle events", () => {
|
|
|
639
639
|
const result = await executor.execute(
|
|
640
640
|
"file_edit",
|
|
641
641
|
{
|
|
642
|
-
path: "/Users/
|
|
642
|
+
path: "/Users/alice/.vellum/workspace/users/alice.md",
|
|
643
643
|
old_string: "old",
|
|
644
644
|
new_string: "new",
|
|
645
645
|
},
|
|
@@ -109,7 +109,7 @@ mock.module("../util/logger.js", () => ({
|
|
|
109
109
|
}));
|
|
110
110
|
|
|
111
111
|
mock.module("../permissions/checker.js", () => ({
|
|
112
|
-
classifyRisk: async () => "low",
|
|
112
|
+
classifyRisk: async () => ({ level: "low" }),
|
|
113
113
|
check: async (
|
|
114
114
|
toolName: string,
|
|
115
115
|
input: Record<string, unknown>,
|
|
@@ -309,6 +309,8 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
309
309
|
expect(result.isError).toBe(false);
|
|
310
310
|
expect(lastCheckArgs).toBeDefined();
|
|
311
311
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
312
|
+
executionContext: "conversation",
|
|
313
|
+
ephemeralRules: undefined,
|
|
312
314
|
executionTarget: "sandbox",
|
|
313
315
|
});
|
|
314
316
|
});
|
|
@@ -326,7 +328,10 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
326
328
|
|
|
327
329
|
expect(result.isError).toBe(false);
|
|
328
330
|
expect(lastCheckArgs).toBeDefined();
|
|
329
|
-
expect(lastCheckArgs!.policyContext).
|
|
331
|
+
expect(lastCheckArgs!.policyContext).toEqual({
|
|
332
|
+
executionContext: "conversation",
|
|
333
|
+
ephemeralRules: undefined,
|
|
334
|
+
});
|
|
330
335
|
});
|
|
331
336
|
|
|
332
337
|
test('passes undefined policyContext for tools with origin "core"', async () => {
|
|
@@ -356,7 +361,10 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
356
361
|
|
|
357
362
|
expect(result.isError).toBe(false);
|
|
358
363
|
expect(lastCheckArgs).toBeDefined();
|
|
359
|
-
expect(lastCheckArgs!.policyContext).
|
|
364
|
+
expect(lastCheckArgs!.policyContext).toEqual({
|
|
365
|
+
executionContext: "conversation",
|
|
366
|
+
ephemeralRules: undefined,
|
|
367
|
+
});
|
|
360
368
|
});
|
|
361
369
|
|
|
362
370
|
test('includes executionTarget "host" from skill tool metadata', async () => {
|
|
@@ -390,6 +398,8 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
390
398
|
expect(result.isError).toBe(false);
|
|
391
399
|
expect(lastCheckArgs).toBeDefined();
|
|
392
400
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
401
|
+
executionContext: "conversation",
|
|
402
|
+
ephemeralRules: undefined,
|
|
393
403
|
executionTarget: "host",
|
|
394
404
|
});
|
|
395
405
|
});
|
|
@@ -420,6 +430,8 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
420
430
|
expect(result.isError).toBe(false);
|
|
421
431
|
expect(lastCheckArgs).toBeDefined();
|
|
422
432
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
433
|
+
executionContext: "conversation",
|
|
434
|
+
ephemeralRules: undefined,
|
|
423
435
|
executionTarget: undefined,
|
|
424
436
|
});
|
|
425
437
|
});
|
|
@@ -463,7 +475,7 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
463
475
|
scope: string,
|
|
464
476
|
decision = "allow",
|
|
465
477
|
priority = 100,
|
|
466
|
-
options?: {
|
|
478
|
+
options?: { executionTarget?: string },
|
|
467
479
|
) => {
|
|
468
480
|
return {
|
|
469
481
|
id: "spy-rule-id",
|
|
@@ -528,7 +540,7 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
528
540
|
expect(options.executionTarget).toBe("sandbox");
|
|
529
541
|
});
|
|
530
542
|
|
|
531
|
-
test("
|
|
543
|
+
test("always_allow captures execution target without allowHighRisk", async () => {
|
|
532
544
|
checkResultOverride = { decision: "prompt", reason: "test prompt" };
|
|
533
545
|
const spy = setupAddRuleSpy();
|
|
534
546
|
|
|
@@ -553,7 +565,7 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
553
565
|
};
|
|
554
566
|
|
|
555
567
|
const prompter = makePrompterWithDecision(
|
|
556
|
-
"
|
|
568
|
+
"always_allow",
|
|
557
569
|
"risky_tool:*",
|
|
558
570
|
"everywhere",
|
|
559
571
|
);
|
|
@@ -569,7 +581,6 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
569
581
|
expect(scope).toBe("everywhere");
|
|
570
582
|
expect(decision).toBe("allow");
|
|
571
583
|
expect(options).toBeDefined();
|
|
572
|
-
expect(options.allowHighRisk).toBe(true);
|
|
573
584
|
expect(options.executionTarget).toBe("host");
|
|
574
585
|
});
|
|
575
586
|
|
|
@@ -663,13 +674,13 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
663
674
|
expect(scope).toBe("everywhere");
|
|
664
675
|
});
|
|
665
676
|
|
|
666
|
-
test("
|
|
677
|
+
test("always_allow for core tool creates rule without execution target", async () => {
|
|
667
678
|
checkResultOverride = { decision: "prompt", reason: "test prompt" };
|
|
668
679
|
const spy = setupAddRuleSpy();
|
|
669
680
|
getToolOverride = undefined;
|
|
670
681
|
|
|
671
682
|
const prompter = makePrompterWithDecision(
|
|
672
|
-
"
|
|
683
|
+
"always_allow",
|
|
673
684
|
"sudo *",
|
|
674
685
|
"everywhere",
|
|
675
686
|
);
|
|
@@ -683,10 +694,8 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
683
694
|
expect(result.isError).toBe(false);
|
|
684
695
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
685
696
|
const [, , , , , options] = spy.mock.calls[0];
|
|
686
|
-
|
|
687
|
-
expect(options
|
|
688
|
-
// No execution target for core tools
|
|
689
|
-
expect(options.executionTarget).toBeUndefined();
|
|
697
|
+
// Core tools have no executionTarget, so ruleOptions is empty → undefined
|
|
698
|
+
expect(options).toBeUndefined();
|
|
690
699
|
});
|
|
691
700
|
|
|
692
701
|
test("skill tool with host execution target records executionTarget in rule", async () => {
|
|
@@ -754,7 +763,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
754
763
|
scope: string,
|
|
755
764
|
decision = "allow",
|
|
756
765
|
priority = 100,
|
|
757
|
-
options?: {
|
|
766
|
+
options?: { executionTarget?: string },
|
|
758
767
|
) => {
|
|
759
768
|
return {
|
|
760
769
|
id: "spy-rule-id",
|
|
@@ -771,7 +780,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
771
780
|
return addRuleSpy;
|
|
772
781
|
}
|
|
773
782
|
|
|
774
|
-
test("
|
|
783
|
+
test("always_allow creates rule with execution target for high-risk skill tool", async () => {
|
|
775
784
|
checkResultOverride = {
|
|
776
785
|
decision: "prompt",
|
|
777
786
|
reason: "High risk: always requires approval",
|
|
@@ -799,7 +808,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
799
808
|
};
|
|
800
809
|
|
|
801
810
|
const prompter = makePrompterWithDecision(
|
|
802
|
-
"
|
|
811
|
+
"always_allow",
|
|
803
812
|
"deploy_tool:*",
|
|
804
813
|
"everywhere",
|
|
805
814
|
);
|
|
@@ -818,12 +827,12 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
818
827
|
expect(pattern).toBe("deploy_tool:*");
|
|
819
828
|
expect(scope).toBe("everywhere");
|
|
820
829
|
expect(decision).toBe("allow");
|
|
821
|
-
// The key integration assertion:
|
|
822
|
-
expect(options.
|
|
830
|
+
// The key integration assertion: execution target is captured
|
|
831
|
+
expect(options.executionTarget).toBeDefined();
|
|
823
832
|
expect(options.executionTarget).toBe("host");
|
|
824
833
|
});
|
|
825
834
|
|
|
826
|
-
test("always_allow creates rule
|
|
835
|
+
test("always_allow creates rule with execution target for skill tool", async () => {
|
|
827
836
|
checkResultOverride = { decision: "prompt", reason: "test prompt" };
|
|
828
837
|
const spy = setupAddRuleSpy();
|
|
829
838
|
|
|
@@ -847,9 +856,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
847
856
|
};
|
|
848
857
|
};
|
|
849
858
|
|
|
850
|
-
// User chooses always_allow
|
|
851
|
-
// should NOT have allowHighRisk set, meaning future high-risk checks
|
|
852
|
-
// will still prompt.
|
|
859
|
+
// User chooses always_allow — rule is created with execution target.
|
|
853
860
|
const prompter = makePrompterWithDecision(
|
|
854
861
|
"always_allow",
|
|
855
862
|
"risky_op:*",
|
|
@@ -864,8 +871,8 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
864
871
|
expect(options).toBeDefined();
|
|
865
872
|
// executionTarget should be present
|
|
866
873
|
expect(options.executionTarget).toBe("sandbox");
|
|
867
|
-
//
|
|
868
|
-
|
|
874
|
+
// Rule should have execution target
|
|
875
|
+
// allowHighRisk is no longer persisted
|
|
869
876
|
});
|
|
870
877
|
|
|
871
878
|
test("executor forwards policyContext to check() for version-bound skill tool", async () => {
|
|
@@ -894,13 +901,15 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
894
901
|
|
|
895
902
|
expect(lastCheckArgs).toBeDefined();
|
|
896
903
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
904
|
+
executionContext: "conversation",
|
|
905
|
+
ephemeralRules: undefined,
|
|
897
906
|
executionTarget: "sandbox",
|
|
898
907
|
});
|
|
899
908
|
});
|
|
900
909
|
|
|
901
910
|
// ── Skill mutation approval regression tests (PR 30) ──────────
|
|
902
911
|
|
|
903
|
-
test("
|
|
912
|
+
test("always_allow for skill source write creates rule with execution target", async () => {
|
|
904
913
|
checkResultOverride = {
|
|
905
914
|
decision: "prompt",
|
|
906
915
|
reason: "High risk: always requires approval",
|
|
@@ -928,7 +937,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
928
937
|
};
|
|
929
938
|
|
|
930
939
|
const prompter = makePrompterWithDecision(
|
|
931
|
-
"
|
|
940
|
+
"always_allow",
|
|
932
941
|
"file_write:*/skills/**",
|
|
933
942
|
"everywhere",
|
|
934
943
|
);
|
|
@@ -946,11 +955,11 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
946
955
|
expect(pattern).toBe("file_write:*/skills/**");
|
|
947
956
|
expect(scope).toBe("everywhere");
|
|
948
957
|
expect(decision).toBe("allow");
|
|
949
|
-
expect(options.
|
|
958
|
+
expect(options.executionTarget).toBeDefined();
|
|
950
959
|
expect(options.executionTarget).toBe("sandbox");
|
|
951
960
|
});
|
|
952
961
|
|
|
953
|
-
test("always_allow
|
|
962
|
+
test("always_allow for skill source write creates rule with execution target (baseline)", async () => {
|
|
954
963
|
checkResultOverride = {
|
|
955
964
|
decision: "prompt",
|
|
956
965
|
reason: "High risk: always requires approval",
|
|
@@ -977,7 +986,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
977
986
|
};
|
|
978
987
|
};
|
|
979
988
|
|
|
980
|
-
// User chooses always_allow
|
|
989
|
+
// User chooses always_allow
|
|
981
990
|
const prompter = makePrompterWithDecision(
|
|
982
991
|
"always_allow",
|
|
983
992
|
"file_write:*/skills/**",
|
|
@@ -995,8 +1004,8 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
995
1004
|
const [, , , , , options] = spy.mock.calls[0];
|
|
996
1005
|
expect(options).toBeDefined();
|
|
997
1006
|
expect(options.executionTarget).toBe("sandbox");
|
|
998
|
-
//
|
|
999
|
-
|
|
1007
|
+
// Execution target is captured from the tool context
|
|
1008
|
+
// allowHighRisk is no longer persisted
|
|
1000
1009
|
});
|
|
1001
1010
|
|
|
1002
1011
|
test("skill version is captured in rule for future version-bound matching", async () => {
|
|
@@ -1027,7 +1036,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1027
1036
|
};
|
|
1028
1037
|
|
|
1029
1038
|
const prompter = makePrompterWithDecision(
|
|
1030
|
-
"
|
|
1039
|
+
"always_allow",
|
|
1031
1040
|
"file_edit:*/skills/**",
|
|
1032
1041
|
"everywhere",
|
|
1033
1042
|
);
|
|
@@ -1042,7 +1051,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1042
1051
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
1043
1052
|
const [tool, , , , , options] = spy.mock.calls[0];
|
|
1044
1053
|
expect(tool).toBe("file_edit");
|
|
1045
|
-
expect(options.
|
|
1054
|
+
expect(options.executionTarget).toBeDefined();
|
|
1046
1055
|
expect(options.executionTarget).toBe("sandbox");
|
|
1047
1056
|
});
|
|
1048
1057
|
|
|
@@ -1076,11 +1085,13 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1076
1085
|
|
|
1077
1086
|
expect(lastCheckArgs).toBeDefined();
|
|
1078
1087
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
1088
|
+
executionContext: "conversation",
|
|
1089
|
+
ephemeralRules: undefined,
|
|
1079
1090
|
executionTarget: "sandbox",
|
|
1080
1091
|
});
|
|
1081
1092
|
});
|
|
1082
1093
|
|
|
1083
|
-
test("executor creates rule on
|
|
1094
|
+
test("executor creates rule on always_allow with full context", async () => {
|
|
1084
1095
|
checkResultOverride = {
|
|
1085
1096
|
decision: "prompt",
|
|
1086
1097
|
reason: "High risk: always requires approval",
|
|
@@ -1108,7 +1119,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1108
1119
|
};
|
|
1109
1120
|
|
|
1110
1121
|
const prompter = makePrompterWithDecision(
|
|
1111
|
-
"
|
|
1122
|
+
"always_allow",
|
|
1112
1123
|
"admin_action:*",
|
|
1113
1124
|
"everywhere",
|
|
1114
1125
|
);
|
|
@@ -1128,7 +1139,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1128
1139
|
expect(pattern).toBe("admin_action:*");
|
|
1129
1140
|
expect(scope).toBe("everywhere");
|
|
1130
1141
|
expect(decision).toBe("allow");
|
|
1131
|
-
expect(options.
|
|
1142
|
+
expect(options.executionTarget).toBeDefined();
|
|
1132
1143
|
expect(options.executionTarget).toBe("host");
|
|
1133
1144
|
});
|
|
1134
1145
|
});
|
|
@@ -1147,14 +1158,6 @@ describe("isSideEffectTool", () => {
|
|
|
1147
1158
|
"bash",
|
|
1148
1159
|
"host_bash",
|
|
1149
1160
|
"web_fetch",
|
|
1150
|
-
"browser_navigate",
|
|
1151
|
-
"browser_click",
|
|
1152
|
-
"browser_type",
|
|
1153
|
-
"browser_press_key",
|
|
1154
|
-
"browser_close",
|
|
1155
|
-
"browser_attach",
|
|
1156
|
-
"browser_detach",
|
|
1157
|
-
"browser_fill_credential",
|
|
1158
1161
|
"document_create",
|
|
1159
1162
|
"document_update",
|
|
1160
1163
|
"schedule_create",
|
|
@@ -1175,6 +1178,14 @@ describe("isSideEffectTool", () => {
|
|
|
1175
1178
|
"memory_recall",
|
|
1176
1179
|
"memory_manage",
|
|
1177
1180
|
"web_search",
|
|
1181
|
+
"browser_navigate",
|
|
1182
|
+
"browser_click",
|
|
1183
|
+
"browser_type",
|
|
1184
|
+
"browser_press_key",
|
|
1185
|
+
"browser_close",
|
|
1186
|
+
"browser_attach",
|
|
1187
|
+
"browser_detach",
|
|
1188
|
+
"browser_fill_credential",
|
|
1178
1189
|
"browser_snapshot",
|
|
1179
1190
|
"browser_screenshot",
|
|
1180
1191
|
"browser_wait_for",
|
|
@@ -1232,7 +1243,7 @@ describe("isSideEffectTool", () => {
|
|
|
1232
1243
|
// would cause this test to fail instead of being masked by a blanket
|
|
1233
1244
|
// mock-allow.
|
|
1234
1245
|
describe("ToolExecutor baseline: allow rule auto-allows file_edit guardian persona", () => {
|
|
1235
|
-
const guardianPersonaPath = "/Users/
|
|
1246
|
+
const guardianPersonaPath = "/Users/alice/.vellum/workspace/users/alice.md";
|
|
1236
1247
|
let ruleSpy: ReturnType<typeof spyOn> | undefined;
|
|
1237
1248
|
|
|
1238
1249
|
beforeEach(() => {
|
|
@@ -1554,7 +1565,7 @@ describe("ToolExecutor forcePromptSideEffects enforcement", () => {
|
|
|
1554
1565
|
const result = await executor.execute(
|
|
1555
1566
|
"file_edit",
|
|
1556
1567
|
{
|
|
1557
|
-
path: "/Users/
|
|
1568
|
+
path: "/Users/alice/.vellum/workspace/users/alice.md",
|
|
1558
1569
|
old_string: "old pref",
|
|
1559
1570
|
new_string: "new pref",
|
|
1560
1571
|
},
|
|
@@ -1573,7 +1584,7 @@ describe("ToolExecutor forcePromptSideEffects enforcement", () => {
|
|
|
1573
1584
|
const result = await executor.execute(
|
|
1574
1585
|
"host_file_edit",
|
|
1575
1586
|
{
|
|
1576
|
-
path: "/Users/
|
|
1587
|
+
path: "/Users/alice/.vellum/workspace/users/alice.md",
|
|
1577
1588
|
old_string: "x",
|
|
1578
1589
|
new_string: "y",
|
|
1579
1590
|
},
|
|
@@ -1584,51 +1595,6 @@ describe("ToolExecutor forcePromptSideEffects enforcement", () => {
|
|
|
1584
1595
|
expect(promptCalled).toBe(true);
|
|
1585
1596
|
});
|
|
1586
1597
|
|
|
1587
|
-
// ── Browser action tools as side-effect tools (PR fix2) ──────────
|
|
1588
|
-
|
|
1589
|
-
test("browser_click forces prompt in private conversation", async () => {
|
|
1590
|
-
checkResultOverride = { decision: "allow", reason: "Matched trust rule" };
|
|
1591
|
-
|
|
1592
|
-
const executor = new ToolExecutor(makeTrackingPrompter());
|
|
1593
|
-
const result = await executor.execute(
|
|
1594
|
-
"browser_click",
|
|
1595
|
-
{ selector: "#submit-btn" },
|
|
1596
|
-
makeContext({ forcePromptSideEffects: true }),
|
|
1597
|
-
);
|
|
1598
|
-
|
|
1599
|
-
expect(result.isError).toBe(false);
|
|
1600
|
-
expect(promptCalled).toBe(true);
|
|
1601
|
-
});
|
|
1602
|
-
|
|
1603
|
-
test("browser_type forces prompt in private conversation", async () => {
|
|
1604
|
-
checkResultOverride = { decision: "allow", reason: "Matched trust rule" };
|
|
1605
|
-
|
|
1606
|
-
const executor = new ToolExecutor(makeTrackingPrompter());
|
|
1607
|
-
const result = await executor.execute(
|
|
1608
|
-
"browser_type",
|
|
1609
|
-
{ selector: "#search-input", text: "query" },
|
|
1610
|
-
makeContext({ forcePromptSideEffects: true }),
|
|
1611
|
-
);
|
|
1612
|
-
|
|
1613
|
-
expect(result.isError).toBe(false);
|
|
1614
|
-
expect(promptCalled).toBe(true);
|
|
1615
|
-
});
|
|
1616
|
-
|
|
1617
|
-
test("browser_snapshot does NOT force prompt in private conversation", async () => {
|
|
1618
|
-
checkResultOverride = { decision: "allow", reason: "Matched trust rule" };
|
|
1619
|
-
|
|
1620
|
-
const executor = new ToolExecutor(makeTrackingPrompter());
|
|
1621
|
-
const result = await executor.execute(
|
|
1622
|
-
"browser_snapshot",
|
|
1623
|
-
{},
|
|
1624
|
-
makeContext({ forcePromptSideEffects: true }),
|
|
1625
|
-
);
|
|
1626
|
-
|
|
1627
|
-
expect(result.isError).toBe(false);
|
|
1628
|
-
// browser_snapshot is read-only — must NOT trigger forced prompting
|
|
1629
|
-
expect(promptCalled).toBe(false);
|
|
1630
|
-
});
|
|
1631
|
-
|
|
1632
1598
|
// ── Always-mutating document tools (PR fix5) ──────────
|
|
1633
1599
|
|
|
1634
1600
|
test("document_create forces prompt in private conversation", async () => {
|
|
@@ -1832,7 +1798,7 @@ describe("ToolExecutor persistentDecisionsAllowed contract", () => {
|
|
|
1832
1798
|
scope: string,
|
|
1833
1799
|
decision = "allow",
|
|
1834
1800
|
priority = 100,
|
|
1835
|
-
options?: {
|
|
1801
|
+
options?: { executionTarget?: string },
|
|
1836
1802
|
) => {
|
|
1837
1803
|
return {
|
|
1838
1804
|
id: "spy-rule-id",
|
|
@@ -2172,7 +2138,7 @@ describe("ToolExecutor persistent-allow lifecycle", () => {
|
|
|
2172
2138
|
scope: string,
|
|
2173
2139
|
decision = "allow",
|
|
2174
2140
|
priority = 100,
|
|
2175
|
-
options?: {
|
|
2141
|
+
options?: { executionTarget?: string },
|
|
2176
2142
|
) => {
|
|
2177
2143
|
return {
|
|
2178
2144
|
id: "spy-rule-id",
|