@vellumai/assistant 0.6.4 → 0.6.6
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/AGENTS.md +9 -1
- package/ARCHITECTURE.md +43 -49
- package/Dockerfile +17 -3
- package/README.md +3 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +283 -0
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +33 -59
- package/docs/architecture/memory.md +25 -30
- package/docs/architecture/security.md +19 -18
- package/docs/browser-use-architecture-phase2.md +63 -20
- package/docs/error-handling.md +111 -0
- package/docs/plugins.md +761 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/examples/plugins/echo/README.md +132 -0
- package/examples/plugins/echo/package.json +17 -0
- package/examples/plugins/echo/register.ts +187 -0
- 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/node_modules/@vellumai/egress-proxy/src/types.ts +19 -0
- package/openapi.yaml +334 -78
- 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__/app-compiler.test.ts +57 -0
- package/src/__tests__/approval-cascade.test.ts +36 -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__/auto-analysis-end-to-end.test.ts +1 -0
- package/src/__tests__/avatar-generator.test.ts +4 -2
- 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__/bundled-asset.test.ts +6 -6
- 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 +96 -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 +870 -655
- package/src/__tests__/circuit-breaker-pipeline.test.ts +406 -0
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/compaction-events.test.ts +501 -0
- package/src/__tests__/compaction-pipeline.test.ts +210 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +181 -0
- package/src/__tests__/compaction-timeout-recovery.test.ts +262 -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-model-image-provider.test.ts +110 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +440 -114
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -4
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-tools.test.ts +26 -0
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-overflow-policy.test.ts +7 -7
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +883 -4
- package/src/__tests__/conversation-abort-tool-results.test.ts +32 -15
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +86 -46
- package/src/__tests__/conversation-agent-loop.test.ts +435 -216
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +36 -10
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +7 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +34 -12
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pairing.test.ts +174 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +32 -15
- package/src/__tests__/conversation-process-callsite.test.ts +309 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +44 -21
- package/src/__tests__/conversation-queue.test.ts +68 -38
- package/src/__tests__/conversation-routes-disk-view.test.ts +36 -7
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2877 -152
- package/src/__tests__/conversation-runtime-workspace.test.ts +35 -50
- package/src/__tests__/conversation-seed-composer.test.ts +2 -2
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +39 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +53 -16
- package/src/__tests__/conversation-speed-override.test.ts +36 -12
- 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 +118 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +41 -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 +4 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +33 -9
- package/src/__tests__/conversation-workspace-injection.test.ts +46 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +46 -15
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-health-service.test.ts +78 -9
- package/src/__tests__/credential-security-invariants.test.ts +5 -2
- 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__/db-schedule-syntax-migration.test.ts +1 -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__/empty-response-pipeline.test.ts +305 -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 +29 -10
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/first-greeting.test.ts +247 -5
- 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__/headless-browser-mode.test.ts +57 -0
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/history-repair-pipeline.test.ts +399 -0
- package/src/__tests__/host-browser-e2e-cloud.test.ts +307 -0
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +3 -3
- package/src/__tests__/host-proxy-interface.test.ts +36 -2
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/image-credentials.test.ts +137 -0
- package/src/__tests__/image-service-dispatcher.test.ts +186 -0
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/injector-chain.test.ts +526 -0
- package/src/__tests__/intent-routing.test.ts +1 -66
- package/src/__tests__/llm-call-pipeline.test.ts +285 -0
- 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__/media-generate-image.test.ts +119 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +401 -0
- package/src/__tests__/memory-upsert-concurrency.test.ts +1 -0
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +621 -0
- package/src/__tests__/model-intents.test.ts +11 -83
- package/src/__tests__/notification-broadcaster.test.ts +3 -3
- 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__/notification-decision-strategy.test.ts +0 -11
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +108 -0
- package/src/__tests__/oauth-apps-routes.test.ts +1 -1
- package/src/__tests__/oauth-cli.test.ts +14 -12
- package/src/__tests__/oauth-connect-orchestrator.test.ts +4 -13
- package/src/__tests__/oauth-provider-serializer.test.ts +6 -4
- package/src/__tests__/oauth-provider-visibility.test.ts +3 -5
- package/src/__tests__/oauth-providers-routes.test.ts +3 -2
- package/src/__tests__/oauth-store.test.ts +46 -78
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/onboarding-template-contract.test.ts +16 -64
- package/src/__tests__/openai-image-service.test.ts +368 -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__/overflow-reduce-pipeline.test.ts +676 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -25
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persist-onboarding-artifacts.test.ts +266 -0
- package/src/__tests__/persistence-pipeline.test.ts +377 -0
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pipeline-runner.test.ts +565 -0
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/platform.test.ts +5 -2
- package/src/__tests__/plugin-bootstrap.test.ts +483 -0
- package/src/__tests__/plugin-registry.test.ts +273 -0
- package/src/__tests__/plugin-route-contribution.test.ts +288 -0
- package/src/__tests__/plugin-skill-contribution.test.ts +367 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +286 -0
- package/src/__tests__/plugin-types.test.ts +320 -0
- package/src/__tests__/pricing.test.ts +93 -14
- 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 +69 -9
- package/src/__tests__/reaction-persistence.test.ts +561 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +0 -2
- 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__/schedule-routes.test.ts +131 -1
- package/src/__tests__/scheduler-recurrence.test.ts +14 -70
- package/src/__tests__/scheduler-reuse-conversation.test.ts +10 -50
- package/src/__tests__/secret-detection-handler.test.ts +0 -10
- 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-identity.test.ts +0 -134
- 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 +259 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-memory-cleanup.test.ts +1 -0
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/task-scheduler.test.ts +3 -15
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-preload.ts +11 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/title-generate-pipeline.test.ts +224 -0
- package/src/__tests__/token-estimate-pipeline.test.ts +431 -0
- package/src/__tests__/tool-error-pipeline.test.ts +244 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +431 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -8
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor-shell-integration.test.ts +7 -10
- package/src/__tests__/tool-executor.test.ts +201 -94
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +356 -0
- package/src/__tests__/tool-result-truncation.test.ts +0 -110
- 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__/user-plugin-loader.test.ts +191 -0
- 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-046-seed-conversation-starters-callsite.test.ts +185 -0
- package/src/__tests__/workspace-migration-049-release-notes-default-sonnet.test.ts +100 -0
- package/src/__tests__/workspace-migration-050-seed-main-agent-opus-callsite.test.ts +171 -0
- package/src/__tests__/workspace-migration-051-seed-conversation-summarization-callsite.test.ts +252 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +99 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +22 -16
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +545 -115
- package/src/approvals/__tests__/guardian-feed-event.test.ts +304 -0
- package/src/approvals/guardian-request-resolvers.ts +80 -0
- 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/backup/__tests__/backup-worker.test.ts +2 -13
- package/src/backup/backup-worker.ts +3 -15
- 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/bundler/app-compiler.ts +84 -1
- package/src/calls/call-state.ts +2 -2
- 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/channels/__tests__/types.test.ts +3 -3
- package/src/channels/types.ts +6 -4
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/__tests__/notifications.test.ts +87 -211
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/backup.test.ts +1 -1
- 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 +886 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +463 -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 +606 -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/backup.ts +2 -2
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/clients.ts +138 -0
- package/src/cli/commands/completions.ts +2 -12
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +69 -8
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +299 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/notifications.ts +68 -103
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -1
- package/src/cli/commands/oauth/connect.ts +2 -2
- package/src/cli/commands/oauth/providers.ts +176 -8
- package/src/cli/commands/oauth/status.ts +46 -36
- 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/skills.ts +3 -4
- 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 +39 -24
- package/src/cli.ts +0 -37
- package/src/config/__tests__/backup-schema.test.ts +7 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +10 -10
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +66 -87
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +28 -51
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +22 -40
- package/src/config/bundled-skills/image-studio/SKILL.md +2 -1
- package/src/config/bundled-skills/image-studio/TOOLS.json +2 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +23 -39
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +5 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +207 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +20 -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 +69 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/schedule/SKILL.md +8 -3
- package/src/config/bundled-skills/schedule/TOOLS.json +15 -7
- package/src/config/bundled-skills/schedule/references/SCRIPT_MODE_PATTERNS.md +59 -0
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -190
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +42 -10
- 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 +49 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/backup.ts +1 -1
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/conversations.ts +16 -0
- 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 +317 -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 +64 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skill-state.ts +6 -2
- package/src/config/skills.ts +96 -7
- package/src/context/__tests__/compact-prompt.test.ts +63 -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 +26 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/tool-result-truncation.ts +3 -63
- package/src/context/window-manager.ts +417 -39
- 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/credential-health/credential-health-service.ts +19 -6
- package/src/daemon/__tests__/conversation-feed-event.test.ts +317 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +4 -12
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +14 -15
- 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 -3
- package/src/daemon/context-overflow-policy.ts +4 -13
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +162 -34
- package/src/daemon/conversation-agent-loop.ts +1282 -599
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-history.ts +10 -19
- package/src/daemon/conversation-lifecycle.ts +59 -17
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-notifiers.ts +2 -110
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +1063 -211
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +51 -9
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +197 -64
- package/src/daemon/external-plugins-bootstrap.ts +478 -0
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/first-greeting.ts +191 -14
- 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 +65 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +7 -3
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +109 -82
- package/src/daemon/message-types/computer-use.ts +2 -34
- package/src/daemon/message-types/conversations.ts +63 -0
- package/src/daemon/message-types/messages.ts +21 -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 +122 -12
- package/src/daemon/shutdown-handlers.ts +2 -12
- package/src/daemon/tool-side-effects.ts +14 -65
- 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/__tests__/heartbeat-feed-event.test.ts +160 -0
- package/src/heartbeat/heartbeat-service.ts +99 -28
- package/src/home/__tests__/feed-population-integration.test.ts +312 -0
- 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 +11 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +97 -4
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rewrite-command-preview.ts +66 -0
- 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 +34 -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 +6 -3
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +63 -0
- package/src/ipc/routes/browser.ts +97 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/get-contact.ts +16 -0
- package/src/ipc/routes/index.ts +31 -1
- package/src/ipc/routes/list-clients.ts +31 -0
- package/src/ipc/routes/merge-contacts.ts +17 -0
- package/src/ipc/routes/notification.ts +133 -0
- package/src/ipc/routes/rename-conversation.ts +59 -0
- package/src/ipc/routes/search-contacts.ts +19 -0
- 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/upsert-contact.ts +25 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +76 -0
- package/src/media/app-icon-generator.ts +23 -46
- package/src/media/avatar-router.ts +26 -41
- package/src/media/gemini-image-service.ts +8 -41
- package/src/media/image-credentials.ts +73 -0
- package/src/media/image-service.ts +85 -0
- package/src/media/openai-image-service.ts +131 -0
- package/src/media/types.ts +46 -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 +133 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-queries.ts +57 -4
- package/src/memory/conversation-title-service.ts +32 -4
- package/src/memory/db-init.ts +10 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/embedding-gemini.test.ts +41 -2
- package/src/memory/embedding-gemini.ts +6 -1
- package/src/memory/graph/bootstrap.test.ts +282 -0
- package/src/memory/graph/bootstrap.ts +8 -5
- 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 +183 -53
- package/src/memory/graph/graph-search.test.ts +93 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/inspect.ts +2 -2
- 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 +237 -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/041-approval-prompt-ts-tracker.ts +26 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/149-oauth-tables.ts +1 -0
- 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/223-schedule-script-column.ts +11 -0
- package/src/memory/migrations/224-oauth-providers-managed-service-is-paid.ts +24 -0
- package/src/memory/migrations/225-oauth-providers-available-scopes.ts +13 -0
- package/src/memory/migrations/index.ts +5 -0
- package/src/memory/pkb/pkb-index.test.ts +369 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +252 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +499 -0
- package/src/memory/pkb/pkb-search.ts +159 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.test.ts +60 -0
- package/src/memory/qdrant-client.ts +147 -1
- package/src/memory/schema/infrastructure.ts +1 -0
- package/src/memory/schema/oauth.ts +4 -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 +1421 -0
- package/src/messaging/providers/slack/render-transcript.ts +501 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/conversation-pairing.ts +78 -19
- package/src/notifications/copy-composer.ts +0 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/emit-signal.ts +1 -1
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/notifications/signal.ts +1 -2
- package/src/oauth/AGENTS.md +1 -1
- package/src/oauth/__tests__/identity-verifier.test.ts +2 -1
- package/src/oauth/connect-orchestrator.ts +8 -34
- package/src/oauth/connect-types.ts +6 -10
- package/src/oauth/manual-token-connection.ts +23 -0
- package/src/oauth/oauth-store.ts +31 -14
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/provider-serializer.ts +6 -1
- package/src/oauth/seed-providers.ts +56 -106
- package/src/outbound-proxy/http-forwarder.ts +9 -0
- package/src/permissions/approval-policy.test.ts +1223 -0
- package/src/permissions/approval-policy.ts +309 -0
- package/src/permissions/arg-parser.test.ts +161 -0
- package/src/permissions/arg-parser.ts +141 -0
- package/src/permissions/bash-risk-classifier.test.ts +1620 -0
- package/src/permissions/bash-risk-classifier.ts +950 -0
- package/src/permissions/checker.ts +348 -711
- package/src/permissions/command-registry.test.ts +774 -0
- package/src/permissions/command-registry.ts +1005 -0
- package/src/permissions/defaults.ts +28 -79
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/gateway-threshold-reader.ts +196 -0
- package/src/permissions/prompter.ts +4 -0
- package/src/permissions/risk-types.ts +262 -0
- package/src/permissions/schedule-risk-classifier.test.ts +129 -0
- package/src/permissions/schedule-risk-classifier.ts +85 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/shell-identity.ts +2 -42
- 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 +25 -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 +9 -19
- package/src/platform/client.ts +19 -1
- package/src/plugins/defaults/circuit-breaker.ts +146 -0
- package/src/plugins/defaults/compaction.ts +145 -0
- package/src/plugins/defaults/empty-response.ts +126 -0
- package/src/plugins/defaults/history-repair.ts +85 -0
- package/src/plugins/defaults/index.ts +116 -0
- package/src/plugins/defaults/injectors.ts +491 -0
- package/src/plugins/defaults/llm-call.ts +82 -0
- package/src/plugins/defaults/memory-retrieval.ts +226 -0
- package/src/plugins/defaults/overflow-reduce.ts +181 -0
- package/src/plugins/defaults/persistence.ts +129 -0
- package/src/plugins/defaults/title-generate.ts +95 -0
- package/src/plugins/defaults/token-estimate.ts +104 -0
- package/src/plugins/defaults/tool-error.ts +126 -0
- package/src/plugins/defaults/tool-execute.ts +89 -0
- package/src/plugins/defaults/tool-result-truncate.ts +88 -0
- package/src/plugins/pipeline.ts +316 -0
- package/src/plugins/plugin-skill-contributions.ts +292 -0
- package/src/plugins/registry.ts +241 -0
- package/src/plugins/types.ts +1134 -0
- package/src/plugins/user-loader.ts +177 -0
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/BOOTSTRAP.md +27 -77
- 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 +524 -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 +80 -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/deepgram-realtime.test.ts +61 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +57 -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 +646 -0
- package/src/providers/speech-to-text/xai-realtime.ts +821 -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 +27 -18
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +3 -3
- package/src/runtime/__tests__/client-registry.test.ts +293 -0
- 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/client-registry.ts +261 -0
- 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 +129 -9
- package/src/runtime/http-types.ts +23 -3
- 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-builder.ts +1 -22
- 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 +78 -0
- package/src/runtime/routes/approval-routes.ts +29 -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/browser-extension-pair-routes.ts +27 -8
- 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 +351 -138
- 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 +987 -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/memory-item-routes.test.ts +1 -0
- package/src/runtime/routes/migration-routes.ts +720 -127
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +284 -0
- package/src/runtime/routes/playground/__tests__/guard.test.ts +80 -0
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +294 -0
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +271 -0
- package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +202 -0
- package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +309 -0
- package/src/runtime/routes/playground/__tests__/state.test.ts +224 -0
- package/src/runtime/routes/playground/conversation-not-found.ts +29 -0
- package/src/runtime/routes/playground/deps.ts +56 -0
- package/src/runtime/routes/playground/force-compact.ts +73 -0
- package/src/runtime/routes/playground/guard.ts +37 -0
- package/src/runtime/routes/playground/index.ts +28 -0
- package/src/runtime/routes/playground/inject-failures.ts +159 -0
- package/src/runtime/routes/playground/reset-circuit.ts +115 -0
- package/src/runtime/routes/playground/seed-conversation.ts +139 -0
- package/src/runtime/routes/playground/seeded-conversations.ts +78 -0
- package/src/runtime/routes/playground/state.ts +78 -0
- package/src/runtime/routes/schedule-routes.ts +89 -8
- 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 +97 -15
- package/src/schedule/run-script.ts +68 -0
- package/src/schedule/schedule-store.ts +7 -1
- package/src/schedule/scheduler.ts +56 -8
- 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 +35 -9
- 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 +234 -2
- package/src/tools/browser/browser-execution.ts +150 -54
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +230 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +146 -3
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +54 -3
- package/src/tools/browser/cdp-client/factory.ts +15 -4
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +129 -73
- 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/script-proxy/session-manager.ts +37 -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 +116 -46
- package/src/tools/policy-context.ts +29 -8
- package/src/tools/registry.ts +195 -6
- package/src/tools/schedule/create.ts +23 -8
- package/src/tools/schedule/update.ts +3 -1
- package/src/tools/secret-detection-handler.ts +0 -51
- 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/system/avatar-generator.ts +6 -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 +40 -5
- 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 +9 -4
- package/src/util/pricing.ts +41 -8
- 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/006-services-config.ts +2 -4
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +2 -3
- 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 +56 -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/046-seed-conversation-starters-callsite.ts +108 -0
- package/src/workspace/migrations/047-remove-watch-callsites.ts +54 -0
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +81 -0
- package/src/workspace/migrations/049-release-notes-default-sonnet.ts +80 -0
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +86 -0
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +128 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +28 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/tsconfig.json +1 -1
- package/hook-templates/debug-prompt-logger/hook.json +0 -7
- package/hook-templates/debug-prompt-logger/run.sh +0 -66
- package/src/__tests__/context-overflow-approval.test.ts +0 -156
- 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__/hooks-blocking.test.ts +0 -178
- package/src/__tests__/hooks-cli.test.ts +0 -182
- package/src/__tests__/hooks-config.test.ts +0 -108
- package/src/__tests__/hooks-discovery.test.ts +0 -211
- package/src/__tests__/hooks-integration.test.ts +0 -196
- package/src/__tests__/hooks-manager.test.ts +0 -226
- package/src/__tests__/hooks-runner.test.ts +0 -175
- package/src/__tests__/hooks-settings.test.ts +0 -160
- package/src/__tests__/hooks-templates.test.ts +0 -169
- package/src/__tests__/hooks-ts-runner.test.ts +0 -170
- package/src/__tests__/hooks-watch.test.ts +0 -112
- package/src/__tests__/notification-schedule-dedup.test.ts +0 -213
- package/src/__tests__/oauth-scope-policy.test.ts +0 -180
- 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__/send-notification-tool.test.ts +0 -83
- 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/cli/commands/shotgun.ts +0 -266
- 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/conversations/SKILL.md +0 -20
- package/src/config/bundled-skills/conversations/TOOLS.json +0 -23
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +0 -66
- 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/heartbeat/SKILL.md +0 -43
- package/src/config/bundled-skills/notifications/SKILL.md +0 -40
- package/src/config/bundled-skills/notifications/TOOLS.json +0 -80
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +0 -152
- package/src/config/bundled-skills/notifications/tools/shared.ts +0 -13
- 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/screen-watch/SKILL.md +0 -27
- package/src/config/bundled-skills/screen-watch/TOOLS.json +0 -35
- package/src/config/bundled-skills/screen-watch/tools/start-screen-watch.ts +0 -12
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -84
- 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/daemon/context-overflow-approval.ts +0 -52
- package/src/daemon/watch-handler.ts +0 -399
- package/src/hooks/cli.ts +0 -253
- package/src/hooks/config.ts +0 -100
- package/src/hooks/discovery.ts +0 -135
- package/src/hooks/manager.ts +0 -179
- package/src/hooks/runner.ts +0 -117
- package/src/hooks/templates.ts +0 -77
- package/src/hooks/types.ts +0 -75
- package/src/oauth/scope-policy.ts +0 -89
- 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/runtime/gateway-internal-client.ts +0 -94
- package/src/runtime/routes/watch-routes.ts +0 -156
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/signals/shotgun.ts +0 -203
- package/src/tools/watch/screen-watch.ts +0 -144
- package/src/tools/watch/watch-state.ts +0 -142
- 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
|
@@ -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
|
},
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Unlike tool-executor.test.ts, this file does NOT mock ../permissions/checker.js,
|
|
5
5
|
* so generateAllowlistOptions and generateScopeOptions run through the actual
|
|
6
|
-
* implementation (
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* implementation. With permission-controls-v3 OFF (the default), bash tools use
|
|
7
|
+
* the legacy shellAllowlistStrategy (buildShellAllowlistOptions → action: key
|
|
8
|
+
* patterns). With the flag ON, they use classifier-produced scope ladder options.
|
|
9
9
|
*/
|
|
10
10
|
import { beforeAll, describe, expect, mock, test } from "bun:test";
|
|
11
11
|
|
|
@@ -111,13 +111,6 @@ mock.module("../tools/terminal/sandbox.js", () => ({
|
|
|
111
111
|
wrapCommand: () => ({ command: "", sandboxed: false }),
|
|
112
112
|
}));
|
|
113
113
|
|
|
114
|
-
// ── Hooks manager ──
|
|
115
|
-
mock.module("../hooks/manager.js", () => ({
|
|
116
|
-
getHookManager: () => ({
|
|
117
|
-
trigger: async () => ({ blocked: false }),
|
|
118
|
-
}),
|
|
119
|
-
}));
|
|
120
|
-
|
|
121
114
|
// ── Ephemeral permissions ──
|
|
122
115
|
mock.module("../tasks/ephemeral-permissions.js", () => ({
|
|
123
116
|
getTaskRunRules: () => [],
|
|
@@ -193,6 +186,10 @@ beforeAll(async () => {
|
|
|
193
186
|
});
|
|
194
187
|
|
|
195
188
|
describe("ToolExecutor → real shell allowlist integration", () => {
|
|
189
|
+
// These tests run with permission-controls-v3 OFF (default), so
|
|
190
|
+
// generateAllowlistOptions falls through to shellAllowlistStrategy
|
|
191
|
+
// which uses action: key patterns from buildShellAllowlistOptions.
|
|
192
|
+
|
|
196
193
|
test("simple command produces parser-derived action keys", async () => {
|
|
197
194
|
const { prompter, getAllowlist, getScopes } = makeCapturingPrompter();
|
|
198
195
|
const executor = new ToolExecutor(prompter);
|
|
@@ -86,6 +86,16 @@ let checkFnOverride:
|
|
|
86
86
|
/** Override for generateScopeOptions — when set, returns this value instead of the default. */
|
|
87
87
|
let scopeOptionsOverride: ScopeOption[] | undefined;
|
|
88
88
|
|
|
89
|
+
/** Override for getCachedAssessment — when set, returns this value. */
|
|
90
|
+
let cachedAssessmentOverride:
|
|
91
|
+
| {
|
|
92
|
+
riskLevel: string;
|
|
93
|
+
reason: string;
|
|
94
|
+
scopeOptions: Array<{ pattern: string; label: string }>;
|
|
95
|
+
matchType: string;
|
|
96
|
+
}
|
|
97
|
+
| undefined;
|
|
98
|
+
|
|
89
99
|
/** Spy on addRule to capture calls without replacing the real implementation. */
|
|
90
100
|
let addRuleSpy: ReturnType<typeof spyOn> | undefined;
|
|
91
101
|
|
|
@@ -109,7 +119,7 @@ mock.module("../util/logger.js", () => ({
|
|
|
109
119
|
}));
|
|
110
120
|
|
|
111
121
|
mock.module("../permissions/checker.js", () => ({
|
|
112
|
-
classifyRisk: async () => "low",
|
|
122
|
+
classifyRisk: async () => ({ level: "low" }),
|
|
113
123
|
check: async (
|
|
114
124
|
toolName: string,
|
|
115
125
|
input: Record<string, unknown>,
|
|
@@ -127,6 +137,7 @@ mock.module("../permissions/checker.js", () => ({
|
|
|
127
137
|
],
|
|
128
138
|
generateScopeOptions: () =>
|
|
129
139
|
scopeOptionsOverride ?? [{ label: "/tmp", scope: "/tmp" }],
|
|
140
|
+
getCachedAssessment: () => cachedAssessmentOverride,
|
|
130
141
|
}));
|
|
131
142
|
|
|
132
143
|
// Mock every export so downstream test files that dynamically import modules
|
|
@@ -196,6 +207,7 @@ describe("ToolExecutor allowedToolNames gating", () => {
|
|
|
196
207
|
getToolOverride = undefined;
|
|
197
208
|
checkResultOverride = undefined;
|
|
198
209
|
checkFnOverride = undefined;
|
|
210
|
+
cachedAssessmentOverride = undefined;
|
|
199
211
|
if (addRuleSpy) {
|
|
200
212
|
addRuleSpy.mockRestore();
|
|
201
213
|
addRuleSpy = undefined;
|
|
@@ -272,6 +284,7 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
272
284
|
getToolOverride = undefined;
|
|
273
285
|
checkResultOverride = undefined;
|
|
274
286
|
checkFnOverride = undefined;
|
|
287
|
+
cachedAssessmentOverride = undefined;
|
|
275
288
|
if (addRuleSpy) {
|
|
276
289
|
addRuleSpy.mockRestore();
|
|
277
290
|
addRuleSpy = undefined;
|
|
@@ -309,6 +322,9 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
309
322
|
expect(result.isError).toBe(false);
|
|
310
323
|
expect(lastCheckArgs).toBeDefined();
|
|
311
324
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
325
|
+
conversationId: "conversation-1",
|
|
326
|
+
executionContext: "conversation",
|
|
327
|
+
ephemeralRules: undefined,
|
|
312
328
|
executionTarget: "sandbox",
|
|
313
329
|
});
|
|
314
330
|
});
|
|
@@ -326,7 +342,11 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
326
342
|
|
|
327
343
|
expect(result.isError).toBe(false);
|
|
328
344
|
expect(lastCheckArgs).toBeDefined();
|
|
329
|
-
expect(lastCheckArgs!.policyContext).
|
|
345
|
+
expect(lastCheckArgs!.policyContext).toEqual({
|
|
346
|
+
conversationId: "conversation-1",
|
|
347
|
+
executionContext: "conversation",
|
|
348
|
+
ephemeralRules: undefined,
|
|
349
|
+
});
|
|
330
350
|
});
|
|
331
351
|
|
|
332
352
|
test('passes undefined policyContext for tools with origin "core"', async () => {
|
|
@@ -356,7 +376,11 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
356
376
|
|
|
357
377
|
expect(result.isError).toBe(false);
|
|
358
378
|
expect(lastCheckArgs).toBeDefined();
|
|
359
|
-
expect(lastCheckArgs!.policyContext).
|
|
379
|
+
expect(lastCheckArgs!.policyContext).toEqual({
|
|
380
|
+
conversationId: "conversation-1",
|
|
381
|
+
executionContext: "conversation",
|
|
382
|
+
ephemeralRules: undefined,
|
|
383
|
+
});
|
|
360
384
|
});
|
|
361
385
|
|
|
362
386
|
test('includes executionTarget "host" from skill tool metadata', async () => {
|
|
@@ -390,6 +414,9 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
390
414
|
expect(result.isError).toBe(false);
|
|
391
415
|
expect(lastCheckArgs).toBeDefined();
|
|
392
416
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
417
|
+
conversationId: "conversation-1",
|
|
418
|
+
executionContext: "conversation",
|
|
419
|
+
ephemeralRules: undefined,
|
|
393
420
|
executionTarget: "host",
|
|
394
421
|
});
|
|
395
422
|
});
|
|
@@ -420,6 +447,9 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
420
447
|
expect(result.isError).toBe(false);
|
|
421
448
|
expect(lastCheckArgs).toBeDefined();
|
|
422
449
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
450
|
+
conversationId: "conversation-1",
|
|
451
|
+
executionContext: "conversation",
|
|
452
|
+
ephemeralRules: undefined,
|
|
423
453
|
executionTarget: undefined,
|
|
424
454
|
});
|
|
425
455
|
});
|
|
@@ -463,7 +493,7 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
463
493
|
scope: string,
|
|
464
494
|
decision = "allow",
|
|
465
495
|
priority = 100,
|
|
466
|
-
options?: {
|
|
496
|
+
options?: { executionTarget?: string },
|
|
467
497
|
) => {
|
|
468
498
|
return {
|
|
469
499
|
id: "spy-rule-id",
|
|
@@ -528,7 +558,7 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
528
558
|
expect(options.executionTarget).toBe("sandbox");
|
|
529
559
|
});
|
|
530
560
|
|
|
531
|
-
test("
|
|
561
|
+
test("always_allow captures execution target without allowHighRisk", async () => {
|
|
532
562
|
checkResultOverride = { decision: "prompt", reason: "test prompt" };
|
|
533
563
|
const spy = setupAddRuleSpy();
|
|
534
564
|
|
|
@@ -553,7 +583,7 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
553
583
|
};
|
|
554
584
|
|
|
555
585
|
const prompter = makePrompterWithDecision(
|
|
556
|
-
"
|
|
586
|
+
"always_allow",
|
|
557
587
|
"risky_tool:*",
|
|
558
588
|
"everywhere",
|
|
559
589
|
);
|
|
@@ -569,7 +599,6 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
569
599
|
expect(scope).toBe("everywhere");
|
|
570
600
|
expect(decision).toBe("allow");
|
|
571
601
|
expect(options).toBeDefined();
|
|
572
|
-
expect(options.allowHighRisk).toBe(true);
|
|
573
602
|
expect(options.executionTarget).toBe("host");
|
|
574
603
|
});
|
|
575
604
|
|
|
@@ -663,13 +692,13 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
663
692
|
expect(scope).toBe("everywhere");
|
|
664
693
|
});
|
|
665
694
|
|
|
666
|
-
test("
|
|
695
|
+
test("always_allow for core tool creates rule without execution target", async () => {
|
|
667
696
|
checkResultOverride = { decision: "prompt", reason: "test prompt" };
|
|
668
697
|
const spy = setupAddRuleSpy();
|
|
669
698
|
getToolOverride = undefined;
|
|
670
699
|
|
|
671
700
|
const prompter = makePrompterWithDecision(
|
|
672
|
-
"
|
|
701
|
+
"always_allow",
|
|
673
702
|
"sudo *",
|
|
674
703
|
"everywhere",
|
|
675
704
|
);
|
|
@@ -683,10 +712,8 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
683
712
|
expect(result.isError).toBe(false);
|
|
684
713
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
685
714
|
const [, , , , , options] = spy.mock.calls[0];
|
|
686
|
-
|
|
687
|
-
expect(options
|
|
688
|
-
// No execution target for core tools
|
|
689
|
-
expect(options.executionTarget).toBeUndefined();
|
|
715
|
+
// Core tools have no executionTarget, so ruleOptions is empty → undefined
|
|
716
|
+
expect(options).toBeUndefined();
|
|
690
717
|
});
|
|
691
718
|
|
|
692
719
|
test("skill tool with host execution target records executionTarget in rule", async () => {
|
|
@@ -740,6 +767,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
740
767
|
getToolOverride = undefined;
|
|
741
768
|
checkResultOverride = undefined;
|
|
742
769
|
checkFnOverride = undefined;
|
|
770
|
+
cachedAssessmentOverride = undefined;
|
|
743
771
|
if (addRuleSpy) {
|
|
744
772
|
addRuleSpy.mockRestore();
|
|
745
773
|
addRuleSpy = undefined;
|
|
@@ -754,7 +782,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
754
782
|
scope: string,
|
|
755
783
|
decision = "allow",
|
|
756
784
|
priority = 100,
|
|
757
|
-
options?: {
|
|
785
|
+
options?: { executionTarget?: string },
|
|
758
786
|
) => {
|
|
759
787
|
return {
|
|
760
788
|
id: "spy-rule-id",
|
|
@@ -771,7 +799,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
771
799
|
return addRuleSpy;
|
|
772
800
|
}
|
|
773
801
|
|
|
774
|
-
test("
|
|
802
|
+
test("always_allow creates rule with execution target for high-risk skill tool", async () => {
|
|
775
803
|
checkResultOverride = {
|
|
776
804
|
decision: "prompt",
|
|
777
805
|
reason: "High risk: always requires approval",
|
|
@@ -799,7 +827,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
799
827
|
};
|
|
800
828
|
|
|
801
829
|
const prompter = makePrompterWithDecision(
|
|
802
|
-
"
|
|
830
|
+
"always_allow",
|
|
803
831
|
"deploy_tool:*",
|
|
804
832
|
"everywhere",
|
|
805
833
|
);
|
|
@@ -818,12 +846,12 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
818
846
|
expect(pattern).toBe("deploy_tool:*");
|
|
819
847
|
expect(scope).toBe("everywhere");
|
|
820
848
|
expect(decision).toBe("allow");
|
|
821
|
-
// The key integration assertion:
|
|
822
|
-
expect(options.
|
|
849
|
+
// The key integration assertion: execution target is captured
|
|
850
|
+
expect(options.executionTarget).toBeDefined();
|
|
823
851
|
expect(options.executionTarget).toBe("host");
|
|
824
852
|
});
|
|
825
853
|
|
|
826
|
-
test("always_allow creates rule
|
|
854
|
+
test("always_allow creates rule with execution target for skill tool", async () => {
|
|
827
855
|
checkResultOverride = { decision: "prompt", reason: "test prompt" };
|
|
828
856
|
const spy = setupAddRuleSpy();
|
|
829
857
|
|
|
@@ -847,9 +875,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
847
875
|
};
|
|
848
876
|
};
|
|
849
877
|
|
|
850
|
-
// User chooses always_allow
|
|
851
|
-
// should NOT have allowHighRisk set, meaning future high-risk checks
|
|
852
|
-
// will still prompt.
|
|
878
|
+
// User chooses always_allow — rule is created with execution target.
|
|
853
879
|
const prompter = makePrompterWithDecision(
|
|
854
880
|
"always_allow",
|
|
855
881
|
"risky_op:*",
|
|
@@ -864,8 +890,8 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
864
890
|
expect(options).toBeDefined();
|
|
865
891
|
// executionTarget should be present
|
|
866
892
|
expect(options.executionTarget).toBe("sandbox");
|
|
867
|
-
//
|
|
868
|
-
|
|
893
|
+
// Rule should have execution target
|
|
894
|
+
// allowHighRisk is no longer persisted
|
|
869
895
|
});
|
|
870
896
|
|
|
871
897
|
test("executor forwards policyContext to check() for version-bound skill tool", async () => {
|
|
@@ -894,13 +920,16 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
894
920
|
|
|
895
921
|
expect(lastCheckArgs).toBeDefined();
|
|
896
922
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
923
|
+
conversationId: "conversation-1",
|
|
924
|
+
executionContext: "conversation",
|
|
925
|
+
ephemeralRules: undefined,
|
|
897
926
|
executionTarget: "sandbox",
|
|
898
927
|
});
|
|
899
928
|
});
|
|
900
929
|
|
|
901
930
|
// ── Skill mutation approval regression tests (PR 30) ──────────
|
|
902
931
|
|
|
903
|
-
test("
|
|
932
|
+
test("always_allow for skill source write creates rule with execution target", async () => {
|
|
904
933
|
checkResultOverride = {
|
|
905
934
|
decision: "prompt",
|
|
906
935
|
reason: "High risk: always requires approval",
|
|
@@ -928,7 +957,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
928
957
|
};
|
|
929
958
|
|
|
930
959
|
const prompter = makePrompterWithDecision(
|
|
931
|
-
"
|
|
960
|
+
"always_allow",
|
|
932
961
|
"file_write:*/skills/**",
|
|
933
962
|
"everywhere",
|
|
934
963
|
);
|
|
@@ -946,11 +975,11 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
946
975
|
expect(pattern).toBe("file_write:*/skills/**");
|
|
947
976
|
expect(scope).toBe("everywhere");
|
|
948
977
|
expect(decision).toBe("allow");
|
|
949
|
-
expect(options.
|
|
978
|
+
expect(options.executionTarget).toBeDefined();
|
|
950
979
|
expect(options.executionTarget).toBe("sandbox");
|
|
951
980
|
});
|
|
952
981
|
|
|
953
|
-
test("always_allow
|
|
982
|
+
test("always_allow for skill source write creates rule with execution target (baseline)", async () => {
|
|
954
983
|
checkResultOverride = {
|
|
955
984
|
decision: "prompt",
|
|
956
985
|
reason: "High risk: always requires approval",
|
|
@@ -977,7 +1006,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
977
1006
|
};
|
|
978
1007
|
};
|
|
979
1008
|
|
|
980
|
-
// User chooses always_allow
|
|
1009
|
+
// User chooses always_allow
|
|
981
1010
|
const prompter = makePrompterWithDecision(
|
|
982
1011
|
"always_allow",
|
|
983
1012
|
"file_write:*/skills/**",
|
|
@@ -995,8 +1024,8 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
995
1024
|
const [, , , , , options] = spy.mock.calls[0];
|
|
996
1025
|
expect(options).toBeDefined();
|
|
997
1026
|
expect(options.executionTarget).toBe("sandbox");
|
|
998
|
-
//
|
|
999
|
-
|
|
1027
|
+
// Execution target is captured from the tool context
|
|
1028
|
+
// allowHighRisk is no longer persisted
|
|
1000
1029
|
});
|
|
1001
1030
|
|
|
1002
1031
|
test("skill version is captured in rule for future version-bound matching", async () => {
|
|
@@ -1027,7 +1056,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1027
1056
|
};
|
|
1028
1057
|
|
|
1029
1058
|
const prompter = makePrompterWithDecision(
|
|
1030
|
-
"
|
|
1059
|
+
"always_allow",
|
|
1031
1060
|
"file_edit:*/skills/**",
|
|
1032
1061
|
"everywhere",
|
|
1033
1062
|
);
|
|
@@ -1042,7 +1071,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1042
1071
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
1043
1072
|
const [tool, , , , , options] = spy.mock.calls[0];
|
|
1044
1073
|
expect(tool).toBe("file_edit");
|
|
1045
|
-
expect(options.
|
|
1074
|
+
expect(options.executionTarget).toBeDefined();
|
|
1046
1075
|
expect(options.executionTarget).toBe("sandbox");
|
|
1047
1076
|
});
|
|
1048
1077
|
|
|
@@ -1076,11 +1105,14 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1076
1105
|
|
|
1077
1106
|
expect(lastCheckArgs).toBeDefined();
|
|
1078
1107
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
1108
|
+
conversationId: "conversation-1",
|
|
1109
|
+
executionContext: "conversation",
|
|
1110
|
+
ephemeralRules: undefined,
|
|
1079
1111
|
executionTarget: "sandbox",
|
|
1080
1112
|
});
|
|
1081
1113
|
});
|
|
1082
1114
|
|
|
1083
|
-
test("executor creates rule on
|
|
1115
|
+
test("executor creates rule on always_allow with full context", async () => {
|
|
1084
1116
|
checkResultOverride = {
|
|
1085
1117
|
decision: "prompt",
|
|
1086
1118
|
reason: "High risk: always requires approval",
|
|
@@ -1108,7 +1140,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1108
1140
|
};
|
|
1109
1141
|
|
|
1110
1142
|
const prompter = makePrompterWithDecision(
|
|
1111
|
-
"
|
|
1143
|
+
"always_allow",
|
|
1112
1144
|
"admin_action:*",
|
|
1113
1145
|
"everywhere",
|
|
1114
1146
|
);
|
|
@@ -1128,7 +1160,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1128
1160
|
expect(pattern).toBe("admin_action:*");
|
|
1129
1161
|
expect(scope).toBe("everywhere");
|
|
1130
1162
|
expect(decision).toBe("allow");
|
|
1131
|
-
expect(options.
|
|
1163
|
+
expect(options.executionTarget).toBeDefined();
|
|
1132
1164
|
expect(options.executionTarget).toBe("host");
|
|
1133
1165
|
});
|
|
1134
1166
|
});
|
|
@@ -1147,14 +1179,6 @@ describe("isSideEffectTool", () => {
|
|
|
1147
1179
|
"bash",
|
|
1148
1180
|
"host_bash",
|
|
1149
1181
|
"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
1182
|
"document_create",
|
|
1159
1183
|
"document_update",
|
|
1160
1184
|
"schedule_create",
|
|
@@ -1175,6 +1199,14 @@ describe("isSideEffectTool", () => {
|
|
|
1175
1199
|
"memory_recall",
|
|
1176
1200
|
"memory_manage",
|
|
1177
1201
|
"web_search",
|
|
1202
|
+
"browser_navigate",
|
|
1203
|
+
"browser_click",
|
|
1204
|
+
"browser_type",
|
|
1205
|
+
"browser_press_key",
|
|
1206
|
+
"browser_close",
|
|
1207
|
+
"browser_attach",
|
|
1208
|
+
"browser_detach",
|
|
1209
|
+
"browser_fill_credential",
|
|
1178
1210
|
"browser_snapshot",
|
|
1179
1211
|
"browser_screenshot",
|
|
1180
1212
|
"browser_wait_for",
|
|
@@ -1232,7 +1264,7 @@ describe("isSideEffectTool", () => {
|
|
|
1232
1264
|
// would cause this test to fail instead of being masked by a blanket
|
|
1233
1265
|
// mock-allow.
|
|
1234
1266
|
describe("ToolExecutor baseline: allow rule auto-allows file_edit guardian persona", () => {
|
|
1235
|
-
const guardianPersonaPath = "/Users/
|
|
1267
|
+
const guardianPersonaPath = "/Users/alice/.vellum/workspace/users/alice.md";
|
|
1236
1268
|
let ruleSpy: ReturnType<typeof spyOn> | undefined;
|
|
1237
1269
|
|
|
1238
1270
|
beforeEach(() => {
|
|
@@ -1241,6 +1273,7 @@ describe("ToolExecutor baseline: allow rule auto-allows file_edit guardian perso
|
|
|
1241
1273
|
getToolOverride = undefined;
|
|
1242
1274
|
checkResultOverride = undefined;
|
|
1243
1275
|
checkFnOverride = undefined;
|
|
1276
|
+
cachedAssessmentOverride = undefined;
|
|
1244
1277
|
if (addRuleSpy) {
|
|
1245
1278
|
addRuleSpy.mockRestore();
|
|
1246
1279
|
addRuleSpy = undefined;
|
|
@@ -1358,6 +1391,7 @@ describe("ToolExecutor forcePromptSideEffects enforcement", () => {
|
|
|
1358
1391
|
getToolOverride = undefined;
|
|
1359
1392
|
checkResultOverride = undefined;
|
|
1360
1393
|
checkFnOverride = undefined;
|
|
1394
|
+
cachedAssessmentOverride = undefined;
|
|
1361
1395
|
promptCalled = false;
|
|
1362
1396
|
if (addRuleSpy) {
|
|
1363
1397
|
addRuleSpy.mockRestore();
|
|
@@ -1554,7 +1588,7 @@ describe("ToolExecutor forcePromptSideEffects enforcement", () => {
|
|
|
1554
1588
|
const result = await executor.execute(
|
|
1555
1589
|
"file_edit",
|
|
1556
1590
|
{
|
|
1557
|
-
path: "/Users/
|
|
1591
|
+
path: "/Users/alice/.vellum/workspace/users/alice.md",
|
|
1558
1592
|
old_string: "old pref",
|
|
1559
1593
|
new_string: "new pref",
|
|
1560
1594
|
},
|
|
@@ -1573,7 +1607,7 @@ describe("ToolExecutor forcePromptSideEffects enforcement", () => {
|
|
|
1573
1607
|
const result = await executor.execute(
|
|
1574
1608
|
"host_file_edit",
|
|
1575
1609
|
{
|
|
1576
|
-
path: "/Users/
|
|
1610
|
+
path: "/Users/alice/.vellum/workspace/users/alice.md",
|
|
1577
1611
|
old_string: "x",
|
|
1578
1612
|
new_string: "y",
|
|
1579
1613
|
},
|
|
@@ -1584,51 +1618,6 @@ describe("ToolExecutor forcePromptSideEffects enforcement", () => {
|
|
|
1584
1618
|
expect(promptCalled).toBe(true);
|
|
1585
1619
|
});
|
|
1586
1620
|
|
|
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
1621
|
// ── Always-mutating document tools (PR fix5) ──────────
|
|
1633
1622
|
|
|
1634
1623
|
test("document_create forces prompt in private conversation", async () => {
|
|
@@ -1832,7 +1821,7 @@ describe("ToolExecutor persistentDecisionsAllowed contract", () => {
|
|
|
1832
1821
|
scope: string,
|
|
1833
1822
|
decision = "allow",
|
|
1834
1823
|
priority = 100,
|
|
1835
|
-
options?: {
|
|
1824
|
+
options?: { executionTarget?: string },
|
|
1836
1825
|
) => {
|
|
1837
1826
|
return {
|
|
1838
1827
|
id: "spy-rule-id",
|
|
@@ -2158,6 +2147,7 @@ describe("ToolExecutor persistent-allow lifecycle", () => {
|
|
|
2158
2147
|
getToolOverride = undefined;
|
|
2159
2148
|
checkResultOverride = undefined;
|
|
2160
2149
|
checkFnOverride = undefined;
|
|
2150
|
+
cachedAssessmentOverride = undefined;
|
|
2161
2151
|
if (addRuleSpy) {
|
|
2162
2152
|
addRuleSpy.mockRestore();
|
|
2163
2153
|
addRuleSpy = undefined;
|
|
@@ -2172,7 +2162,7 @@ describe("ToolExecutor persistent-allow lifecycle", () => {
|
|
|
2172
2162
|
scope: string,
|
|
2173
2163
|
decision = "allow",
|
|
2174
2164
|
priority = 100,
|
|
2175
|
-
options?: {
|
|
2165
|
+
options?: { executionTarget?: string },
|
|
2176
2166
|
) => {
|
|
2177
2167
|
return {
|
|
2178
2168
|
id: "spy-rule-id",
|
|
@@ -2336,3 +2326,120 @@ describe("integration regressions — prompt payload (PR 11)", () => {
|
|
|
2336
2326
|
expect(capturedScopes![0]).toHaveProperty("scope");
|
|
2337
2327
|
});
|
|
2338
2328
|
});
|
|
2329
|
+
|
|
2330
|
+
// ---------------------------------------------------------------------------
|
|
2331
|
+
// Risk metadata on ToolExecutionResult (PR 5 — scope-ladder-v1)
|
|
2332
|
+
// ---------------------------------------------------------------------------
|
|
2333
|
+
|
|
2334
|
+
describe("ToolExecutionResult includes risk metadata from classifier assessment", () => {
|
|
2335
|
+
beforeEach(() => {
|
|
2336
|
+
fakeToolResult = { content: "ok", isError: false };
|
|
2337
|
+
lastCheckArgs = undefined;
|
|
2338
|
+
getToolOverride = undefined;
|
|
2339
|
+
checkResultOverride = undefined;
|
|
2340
|
+
checkFnOverride = undefined;
|
|
2341
|
+
cachedAssessmentOverride = undefined;
|
|
2342
|
+
if (addRuleSpy) {
|
|
2343
|
+
addRuleSpy.mockRestore();
|
|
2344
|
+
addRuleSpy = undefined;
|
|
2345
|
+
}
|
|
2346
|
+
});
|
|
2347
|
+
|
|
2348
|
+
test("auto-approved tool result includes risk metadata when classifier assessment exists", async () => {
|
|
2349
|
+
cachedAssessmentOverride = {
|
|
2350
|
+
riskLevel: "medium",
|
|
2351
|
+
reason: "Writes to a file outside the workspace",
|
|
2352
|
+
scopeOptions: [
|
|
2353
|
+
{ pattern: "file_write:/tmp/test.txt", label: "This file only" },
|
|
2354
|
+
{ pattern: "file_write:/tmp/**", label: "Anything in tmp/" },
|
|
2355
|
+
],
|
|
2356
|
+
matchType: "registry",
|
|
2357
|
+
};
|
|
2358
|
+
|
|
2359
|
+
const executor = new ToolExecutor(makePrompter());
|
|
2360
|
+
const result = await executor.execute(
|
|
2361
|
+
"file_read",
|
|
2362
|
+
{ path: "README.md" },
|
|
2363
|
+
makeContext(),
|
|
2364
|
+
);
|
|
2365
|
+
|
|
2366
|
+
expect(result.isError).toBe(false);
|
|
2367
|
+
expect(result.riskLevel).toBe("medium");
|
|
2368
|
+
expect(result.riskReason).toBe("Writes to a file outside the workspace");
|
|
2369
|
+
expect(result.riskScopeOptions).toEqual([
|
|
2370
|
+
{ pattern: "file_write:/tmp/test.txt", label: "This file only" },
|
|
2371
|
+
{ pattern: "file_write:/tmp/**", label: "Anything in tmp/" },
|
|
2372
|
+
]);
|
|
2373
|
+
});
|
|
2374
|
+
|
|
2375
|
+
test("tool result omits risk metadata when no classifier assessment exists (e.g. MCP tools)", async () => {
|
|
2376
|
+
// cachedAssessmentOverride is undefined (no classifier ran)
|
|
2377
|
+
const executor = new ToolExecutor(makePrompter());
|
|
2378
|
+
const result = await executor.execute(
|
|
2379
|
+
"file_read",
|
|
2380
|
+
{ path: "README.md" },
|
|
2381
|
+
makeContext(),
|
|
2382
|
+
);
|
|
2383
|
+
|
|
2384
|
+
expect(result.isError).toBe(false);
|
|
2385
|
+
expect(result.riskLevel).toBeUndefined();
|
|
2386
|
+
expect(result.riskReason).toBeUndefined();
|
|
2387
|
+
expect(result.riskScopeOptions).toBeUndefined();
|
|
2388
|
+
});
|
|
2389
|
+
|
|
2390
|
+
test("denied tool result includes risk metadata", async () => {
|
|
2391
|
+
checkResultOverride = {
|
|
2392
|
+
decision: "deny",
|
|
2393
|
+
reason: "Blocked by deny rule",
|
|
2394
|
+
};
|
|
2395
|
+
cachedAssessmentOverride = {
|
|
2396
|
+
riskLevel: "high",
|
|
2397
|
+
reason: "Recursive force delete",
|
|
2398
|
+
scopeOptions: [{ pattern: "bash:rm -rf*", label: "rm -rf commands" }],
|
|
2399
|
+
matchType: "registry",
|
|
2400
|
+
};
|
|
2401
|
+
|
|
2402
|
+
const executor = new ToolExecutor(makePrompter());
|
|
2403
|
+
const result = await executor.execute(
|
|
2404
|
+
"bash",
|
|
2405
|
+
{ command: "rm -rf /" },
|
|
2406
|
+
makeContext(),
|
|
2407
|
+
);
|
|
2408
|
+
|
|
2409
|
+
expect(result.isError).toBe(true);
|
|
2410
|
+
expect(result.riskLevel).toBe("high");
|
|
2411
|
+
expect(result.riskReason).toBe("Recursive force delete");
|
|
2412
|
+
expect(result.riskScopeOptions).toEqual([
|
|
2413
|
+
{ pattern: "bash:rm -rf*", label: "rm -rf commands" },
|
|
2414
|
+
]);
|
|
2415
|
+
});
|
|
2416
|
+
|
|
2417
|
+
test("prompted-then-approved tool result includes risk metadata", async () => {
|
|
2418
|
+
checkResultOverride = {
|
|
2419
|
+
decision: "prompt",
|
|
2420
|
+
reason: "Medium risk: requires approval",
|
|
2421
|
+
};
|
|
2422
|
+
cachedAssessmentOverride = {
|
|
2423
|
+
riskLevel: "medium",
|
|
2424
|
+
reason: "Package manager installation",
|
|
2425
|
+
scopeOptions: [
|
|
2426
|
+
{ pattern: "bash:npm install*", label: "npm install commands" },
|
|
2427
|
+
{ pattern: "bash:npm*", label: "All npm commands" },
|
|
2428
|
+
],
|
|
2429
|
+
matchType: "registry",
|
|
2430
|
+
};
|
|
2431
|
+
|
|
2432
|
+
const executor = new ToolExecutor(makePrompter());
|
|
2433
|
+
const result = await executor.execute(
|
|
2434
|
+
"bash",
|
|
2435
|
+
{ command: "npm install lodash" },
|
|
2436
|
+
makeContext(),
|
|
2437
|
+
);
|
|
2438
|
+
|
|
2439
|
+
expect(result.isError).toBe(false);
|
|
2440
|
+
expect(result.content).toBe("ok");
|
|
2441
|
+
expect(result.riskLevel).toBe("medium");
|
|
2442
|
+
expect(result.riskReason).toBe("Package manager installation");
|
|
2443
|
+
expect(result.riskScopeOptions).toHaveLength(2);
|
|
2444
|
+
});
|
|
2445
|
+
});
|