@vellumai/assistant 0.6.3 → 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 +298 -39
- package/Dockerfile +14 -3
- package/README.md +3 -4
- package/bun.lock +13 -16
- package/docs/architecture/integrations.md +1 -20
- package/docs/architecture/security.md +16 -16
- package/docs/backup-troubleshooting.md +52 -0
- package/docs/browser-use-architecture-phase2.md +174 -0
- package/docs/error-handling.md +111 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +121 -0
- package/knip.json +20 -3
- package/node_modules/@vellumai/ces-contracts/bun.lock +8 -6
- package/node_modules/@vellumai/ces-contracts/package.json +5 -4
- 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 +1094 -72
- package/package.json +9 -8
- package/scripts/generate-openapi.ts +50 -12
- package/scripts/test.sh +73 -18
- package/src/__tests__/agent-image-optimize.test.ts +28 -0
- 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 +235 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +434 -12
- 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__/auto-analysis-end-to-end.test.ts +550 -0
- package/src/__tests__/auto-analysis-prompt.test.ts +50 -0
- package/src/__tests__/browser-fill-credential.test.ts +12 -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 +52 -159
- package/src/__tests__/btw-routes.test.ts +54 -1
- package/src/__tests__/call-controller.test.ts +582 -22
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +27 -4
- package/src/__tests__/catalog-files.test.ts +138 -0
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-invite-transport.test.ts +2 -2
- package/src/__tests__/channel-readiness-routes.test.ts +16 -20
- package/src/__tests__/channel-readiness-service.test.ts +12 -7
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +576 -502
- package/src/__tests__/clawhub-files.test.ts +347 -0
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/commit-message-enrichment-service.test.ts +36 -19
- 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 +83 -0
- 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 +1458 -198
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
- package/src/__tests__/config-watcher.test.ts +45 -10
- package/src/__tests__/contact-store-user-file.test.ts +511 -0
- package/src/__tests__/contacts-write.test.ts +197 -0
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +618 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +32 -16
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +62 -17
- package/src/__tests__/conversation-agent-loop.test.ts +510 -84
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +165 -9
- package/src/__tests__/conversation-error.test.ts +102 -1
- package/src/__tests__/conversation-history-web-search.test.ts +17 -4
- package/src/__tests__/conversation-init.benchmark.test.ts +42 -1
- package/src/__tests__/conversation-launcher-skill-regression.test.ts +51 -0
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-list-source.test.ts +145 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +32 -16
- package/src/__tests__/conversation-process-callsite.test.ts +306 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +32 -16
- package/src/__tests__/conversation-queue.test.ts +932 -76
- package/src/__tests__/conversation-routes-disk-view.test.ts +299 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2790 -55
- package/src/__tests__/conversation-runtime-workspace.test.ts +12 -12
- package/src/__tests__/conversation-skill-tools.test.ts +12 -143
- package/src/__tests__/conversation-slash-commands.test.ts +33 -0
- package/src/__tests__/conversation-slash-queue.test.ts +120 -34
- package/src/__tests__/conversation-slash-unknown.test.ts +32 -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 +226 -0
- 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 +45 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +46 -16
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-health-service.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +8 -3
- 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 +495 -3
- package/src/__tests__/credentials-cli.test.ts +32 -16
- package/src/__tests__/cross-provider-web-search.test.ts +230 -35
- 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__/deterministic-verification-control-plane.test.ts +10 -1
- package/src/__tests__/device-id.test.ts +112 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +167 -4
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +1 -3
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/email-html-renderer.test.ts +71 -0
- package/src/__tests__/email-invite-adapter.test.ts +36 -32
- package/src/__tests__/emit-event-signal.test.ts +71 -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 +101 -15
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/fixtures/mock-chrome-extension.ts +11 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +206 -1
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/gemini-provider.test.ts +64 -3
- package/src/__tests__/get-skill-detail-audit.test.ts +325 -0
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +44 -1
- package/src/__tests__/headless-browser-mode.test.ts +614 -0
- package/src/__tests__/headless-browser-navigate.test.ts +142 -5
- package/src/__tests__/headless-browser-read-tools.test.ts +11 -0
- package/src/__tests__/headless-browser-snapshot.test.ts +10 -0
- package/src/__tests__/heartbeat-service.test.ts +166 -32
- package/src/__tests__/home-state-routes.test.ts +162 -0
- package/src/__tests__/host-bash-proxy.test.ts +0 -5
- package/src/__tests__/host-browser-e2e-cloud.test.ts +138 -4
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +4 -4
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +103 -0
- package/src/__tests__/host-cu-proxy.test.ts +0 -5
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/identity-intro-cache.test.ts +40 -10
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
- package/src/__tests__/intent-routing.test.ts +1 -40
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +609 -0
- package/src/__tests__/llm-context-route-provider.test.ts +86 -5
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/llm-usage-store.test.ts +363 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/media-stream-output.test.ts +555 -0
- package/src/__tests__/media-stream-parser.test.ts +374 -0
- package/src/__tests__/media-stream-server-integration.test.ts +1234 -0
- package/src/__tests__/media-stream-stt-session.test.ts +588 -0
- package/src/__tests__/media-turn-detector.test.ts +440 -0
- package/src/__tests__/message-queue.test.ts +125 -0
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-export-http.test.ts +6 -6
- package/src/__tests__/migration-import-commit-http.test.ts +8 -6
- package/src/__tests__/migration-import-from-url.test.ts +684 -0
- package/src/__tests__/migration-import-preflight-http.test.ts +6 -5
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +151 -0
- package/src/__tests__/model-intents.test.ts +10 -84
- 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-apps-routes.test.ts +1 -0
- package/src/__tests__/oauth-cli.test.ts +2 -0
- package/src/__tests__/oauth-connect-orchestrator.test.ts +2 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +1 -0
- package/src/__tests__/oauth-providers-routes.test.ts +2 -0
- package/src/__tests__/oauth-store.test.ts +95 -7
- package/src/__tests__/oauth2-gateway-transport.test.ts +257 -9
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/onboarding-template-contract.test.ts +6 -13
- package/src/__tests__/openai-provider.test.ts +183 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +184 -0
- package/src/__tests__/openai-responses-provider.test.ts +1501 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/openrouter-token-estimation.test.ts +100 -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 +251 -0
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +5 -1
- package/src/__tests__/platform.test.ts +92 -1
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +47 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +267 -0
- package/src/__tests__/pricing.test.ts +224 -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__/qdrant-manager.test.ts +29 -8
- package/src/__tests__/reaction-persistence.test.ts +560 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +194 -0
- package/src/__tests__/relationship-state-contract.test.ts +175 -0
- package/src/__tests__/relay-server.test.ts +424 -6
- 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__/search-skills-unified.test.ts +118 -0
- 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 +5 -1
- package/src/__tests__/secure-keys.test.ts +107 -0
- package/src/__tests__/send-endpoint-busy.test.ts +34 -2
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +80 -0
- package/src/__tests__/settings-routes.test.ts +201 -0
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +276 -145
- package/src/__tests__/skills-files-catalog-fallback.test.ts +381 -93
- package/src/__tests__/skills.test.ts +19 -30
- package/src/__tests__/skillssh-files.test.ts +446 -0
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-block-formatting.test.ts +110 -0
- package/src/__tests__/slack-channel-config.test.ts +564 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/stt-catalog-parity.test.ts +282 -0
- package/src/__tests__/stt-stream-session.test.ts +535 -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 +126 -53
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/telephony-stt-routing.test.ts +329 -0
- package/src/__tests__/terminal-tools.test.ts +26 -7
- package/src/__tests__/test-preload.ts +18 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -49
- 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 +10 -6
- package/src/__tests__/tool-executor-shell-integration.test.ts +4 -0
- package/src/__tests__/tool-executor.test.ts +88 -113
- package/src/__tests__/tool-result-truncation.test.ts +36 -0
- package/src/__tests__/trust-store.test.ts +442 -103
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
- package/src/__tests__/tts-catalog-parity.test.ts +345 -0
- package/src/__tests__/twilio-routes-twiml.test.ts +512 -114
- package/src/__tests__/twilio-routes.test.ts +376 -0
- package/src/__tests__/unicode.test.ts +293 -0
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/usage-routes.test.ts +25 -4
- package/src/__tests__/user-reference.test.ts +46 -61
- package/src/__tests__/verification-control-plane-policy.test.ts +5 -22
- package/src/__tests__/voice-config-update.test.ts +403 -0
- package/src/__tests__/voice-quality.test.ts +434 -19
- 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-heartbeat-service.test.ts +7 -0
- package/src/__tests__/workspace-migration-033-stt-service-explicit-config.test.ts +547 -0
- package/src/__tests__/workspace-migration-034-remove-calls-voice-transcription-provider.test.ts +596 -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 +368 -0
- package/src/__tests__/workspace-migration-meets.test.ts +244 -0
- package/src/__tests__/workspace-migration-seed-device-id.test.ts +14 -20
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +1 -11
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/image-optimize.ts +24 -12
- package/src/agent/loop.ts +251 -19
- 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-key.test.ts +152 -0
- package/src/backup/__tests__/backup-worker.test.ts +767 -0
- package/src/backup/__tests__/list-snapshots.test.ts +87 -0
- package/src/backup/__tests__/local-writer.test.ts +218 -0
- package/src/backup/__tests__/offsite-writer.test.ts +641 -0
- package/src/backup/__tests__/paths.test.ts +300 -0
- package/src/backup/__tests__/restore.test.ts +498 -0
- package/src/backup/__tests__/snapshot-lock.test.ts +352 -0
- package/src/backup/__tests__/stream-crypt.test.ts +228 -0
- package/src/backup/backup-key.ts +137 -0
- package/src/backup/backup-worker.ts +459 -0
- package/src/backup/list-snapshots.ts +147 -0
- package/src/backup/local-writer.ts +133 -0
- package/src/backup/offsite-writer.ts +222 -0
- package/src/backup/paths.ts +226 -0
- package/src/backup/restore.ts +322 -0
- package/src/backup/snapshot-lock.ts +431 -0
- package/src/backup/stream-crypt.ts +263 -0
- 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/package-resolver.ts +4 -0
- package/src/calls/audio-store.ts +11 -5
- package/src/calls/call-controller.ts +226 -71
- package/src/calls/call-domain.ts +9 -0
- package/src/calls/call-speech-output.ts +190 -0
- package/src/calls/call-transport.ts +77 -0
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/media-stream-audio-transcode.ts +173 -0
- package/src/calls/media-stream-output.ts +660 -0
- package/src/calls/media-stream-parser.ts +300 -0
- package/src/calls/media-stream-protocol.ts +166 -0
- package/src/calls/media-stream-server.ts +592 -0
- package/src/calls/media-stream-stt-session.ts +460 -0
- package/src/calls/media-turn-detector.ts +230 -0
- package/src/calls/relay-server.ts +90 -75
- package/src/calls/resolve-call-tts-provider.ts +136 -0
- package/src/calls/telephony-stt-routing.ts +145 -0
- package/src/calls/tts-call-strategy.ts +161 -0
- package/src/calls/tts-text-sanitizer.ts +32 -16
- package/src/calls/twilio-routes.ts +281 -17
- package/src/calls/voice-quality.ts +78 -35
- package/src/calls/voice-session-bridge.ts +9 -1
- package/src/channels/types.ts +16 -0
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/__tests__/run-assistant-command.ts +11 -1
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/backup.test.ts +1165 -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__/domain-register.test.ts +234 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +132 -0
- package/src/cli/commands/__tests__/email-attachment.test.ts +422 -0
- package/src/cli/commands/__tests__/email-download.test.ts +16 -1
- package/src/cli/commands/__tests__/email-list.test.ts +28 -4
- package/src/cli/commands/__tests__/email-register.test.ts +4 -4
- package/src/cli/commands/__tests__/email-send.test.ts +130 -5
- package/src/cli/commands/__tests__/email-status.test.ts +5 -1
- package/src/cli/commands/__tests__/email-unregister.test.ts +34 -5
- 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/backup.ts +993 -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 +90 -0
- package/src/cli/commands/credentials.ts +0 -1
- package/src/cli/commands/domain.ts +210 -0
- package/src/cli/commands/email.ts +308 -16
- 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/oauth/__tests__/connect.test.ts +12 -0
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +1 -0
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -0
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -0
- package/src/cli/commands/oauth/mode.ts +12 -3
- package/src/cli/commands/oauth/providers.ts +15 -0
- package/src/cli/commands/oauth/shared.ts +2 -1
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +4 -10
- package/src/cli/commands/platform/__tests__/connect.test.ts +6 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -2
- package/src/cli/commands/platform/__tests__/status.test.ts +6 -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 +53 -8
- package/src/cli.ts +0 -37
- package/src/config/__tests__/backup-schema.test.ts +134 -0
- package/src/config/assistant-feature-flags.ts +61 -62
- package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +37 -1
- package/src/config/bundled-skills/contacts/SKILL.md +2 -2
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +23 -1
- package/src/config/bundled-skills/media-processing/SKILL.md +3 -9
- package/src/config/bundled-skills/media-processing/TOOLS.json +1 -6
- package/src/config/bundled-skills/media-processing/__tests__/audio-transcribe.test.ts +125 -0
- package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +181 -0
- package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +141 -0
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +32 -87
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +8 -4
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +0 -10
- 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/messaging-archive-by-sender.ts +9 -2
- 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/SKILL.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +28 -18
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +3 -3
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +26 -22
- package/src/config/bundled-skills/transcribe/SKILL.md +9 -14
- package/src/config/bundled-skills/transcribe/TOOLS.json +2 -7
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +256 -0
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +38 -188
- package/src/config/bundled-tool-registry.ts +0 -167
- package/src/config/env-registry.ts +24 -0
- package/src/config/env.ts +39 -10
- package/src/config/feature-flag-registry.json +63 -15
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +220 -22
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +65 -51
- package/src/config/schemas/__tests__/stt.test.ts +43 -0
- package/src/config/schemas/analysis.ts +32 -0
- package/src/config/schemas/backup.ts +72 -0
- package/src/config/schemas/calls.ts +1 -30
- package/src/config/schemas/elevenlabs.ts +0 -59
- package/src/config/schemas/filing.ts +49 -14
- package/src/config/schemas/heartbeat.ts +27 -10
- package/src/config/schemas/host-browser.ts +47 -1
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +318 -0
- package/src/config/schemas/memory-lifecycle.ts +14 -2
- 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 +53 -4
- package/src/config/schemas/stt.ts +60 -0
- package/src/config/schemas/tts.ts +283 -0
- package/src/config/schemas/updates.ts +14 -0
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skills.ts +6 -2
- package/src/config/types.ts +4 -0
- package/src/contacts/contact-store.ts +56 -11
- package/src/contacts/contacts-write.ts +38 -1
- 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/post-turn-tool-result-truncation.ts +3 -2
- package/src/context/prompts/compact.md +12 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/tool-result-truncation.ts +2 -1
- package/src/context/window-manager.ts +272 -35
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +23 -2
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +96 -2
- package/src/credential-health/credential-health-service.ts +366 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +324 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +497 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +17 -8
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +127 -0
- 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 +99 -6
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +85 -12
- package/src/daemon/conversation-agent-loop.ts +563 -104
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +46 -0
- package/src/daemon/conversation-history.ts +40 -6
- package/src/daemon/conversation-launch.ts +220 -0
- package/src/daemon/conversation-lifecycle.ts +85 -11
- package/src/daemon/conversation-messaging.ts +110 -7
- package/src/daemon/conversation-notifiers.ts +5 -0
- package/src/daemon/conversation-process.ts +591 -23
- package/src/daemon/conversation-queue-manager.ts +27 -0
- package/src/daemon/conversation-runtime-assembly.ts +769 -28
- package/src/daemon/conversation-slash.ts +38 -2
- package/src/daemon/conversation-surfaces.ts +483 -5
- package/src/daemon/conversation-tool-setup.ts +35 -5
- package/src/daemon/conversation-usage.ts +8 -5
- package/src/daemon/conversation.ts +193 -47
- 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/config-slack-channel.ts +269 -94
- package/src/daemon/handlers/conversations.ts +13 -3
- package/src/daemon/handlers/shared.ts +51 -1
- package/src/daemon/handlers/skills.ts +323 -79
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/host-browser-proxy.ts +2 -1
- package/src/daemon/lifecycle.ts +185 -26
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/conversations.ts +48 -1
- package/src/daemon/message-types/home.ts +40 -0
- package/src/daemon/message-types/meet.ts +143 -0
- package/src/daemon/message-types/messages.ts +23 -1
- package/src/daemon/message-types/schedules.ts +34 -2
- package/src/daemon/message-types/skills.ts +16 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- 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 +463 -10
- package/src/daemon/shutdown-handlers.ts +32 -4
- package/src/daemon/shutdown-registry.ts +40 -0
- package/src/daemon/tool-side-effects.ts +9 -9
- package/src/daemon/watch-handler.ts +4 -4
- package/src/daemon/web-search-history.ts +126 -0
- package/src/email/html-renderer.ts +76 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/heartbeat-service.ts +156 -22
- package/src/home/__tests__/assistant-feed-authoring.test.ts +156 -0
- package/src/home/__tests__/emit-feed-event.test.ts +169 -0
- package/src/home/__tests__/feed-scheduler.test.ts +222 -0
- package/src/home/__tests__/feed-types.test.ts +275 -0
- package/src/home/__tests__/feed-writer.test.ts +688 -0
- package/src/home/__tests__/phase5-exit-criteria.test.ts +212 -0
- package/src/home/__tests__/platform-gmail-digest.test.ts +222 -0
- package/src/home/__tests__/progress-formula.test.ts +213 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +740 -0
- package/src/home/__tests__/rollup-producer.test.ts +442 -0
- package/src/home/assistant-feed-authoring.ts +128 -0
- package/src/home/emit-feed-event.ts +162 -0
- package/src/home/feed-scheduler.ts +263 -0
- package/src/home/feed-types.ts +235 -0
- package/src/home/feed-writer.ts +469 -0
- package/src/home/platform-gmail-digest.ts +163 -0
- package/src/home/progress-formula.ts +86 -0
- package/src/home/relationship-state-writer.ts +824 -0
- package/src/home/relationship-state.ts +143 -0
- package/src/home/rollup-producer.ts +413 -0
- package/src/home/suggested-prompts.ts +101 -0
- package/src/hooks/runner.ts +7 -0
- package/src/inbound/platform-callback-registration.ts +12 -3
- package/src/inbound/public-ingress-urls.ts +12 -0
- package/src/instrument.ts +1 -1
- 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__/cli-ipc.test.ts +200 -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 +152 -0
- package/src/ipc/cli-server.ts +252 -0
- package/src/ipc/gateway-client.ts +180 -0
- 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 +21 -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/wake-conversation.ts +19 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +100 -0
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +356 -0
- package/src/memory/__tests__/auto-analysis-guard.test.ts +57 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +233 -0
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +196 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/app-store.ts +1 -1
- package/src/memory/attachments-store.ts +70 -0
- package/src/memory/auto-analysis-enqueue.ts +127 -0
- package/src/memory/auto-analysis-guard.ts +27 -0
- package/src/memory/cleanup-schedule-state.ts +37 -0
- package/src/memory/conversation-analyze-job.ts +74 -0
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +199 -0
- package/src/memory/conversation-disk-view.ts +7 -0
- package/src/memory/conversation-group-migration.ts +65 -1
- package/src/memory/conversation-queries.ts +6 -5
- package/src/memory/conversation-title-service.ts +7 -4
- package/src/memory/db-init.ts +8 -0
- package/src/memory/db-maintenance.ts +108 -0
- package/src/memory/db.ts +1 -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 +104 -29
- package/src/memory/graph/extraction.test.ts +295 -2
- package/src/memory/graph/extraction.ts +181 -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 +257 -66
- package/src/memory/graph/scoring.test.ts +186 -0
- package/src/memory/graph/scoring.ts +31 -1
- 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/group-crud.ts +6 -1
- package/src/memory/indexer.ts +95 -16
- package/src/memory/job-handlers/cleanup.ts +11 -8
- package/src/memory/job-handlers/conversation-starters.ts +39 -30
- 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 +106 -5
- package/src/memory/jobs-worker.ts +26 -9
- package/src/memory/llm-usage-store.ts +92 -56
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/219-oauth-providers-token-exchange-body-format.ts +15 -0
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +190 -0
- package/src/memory/migrations/221-conversations-archived-at.ts +16 -0
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/index.ts +7 -0
- package/src/memory/migrations/registry.ts +8 -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/qdrant-manager.ts +43 -16
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/oauth.ts +3 -0
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/memory/usage-buckets.ts +396 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +79 -6
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +282 -0
- package/src/messaging/providers/slack/adapter.ts +155 -38
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/client.ts +16 -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/providers/slack/types.ts +4 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/decision-engine.ts +6 -12
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/notifications/signal.ts +5 -0
- package/src/oauth/__tests__/identity-verifier.test.ts +1 -0
- package/src/oauth/byo-connection.test.ts +18 -1
- package/src/oauth/byo-connection.ts +3 -1
- package/src/oauth/connect-orchestrator.ts +2 -0
- package/src/oauth/connection-resolver.ts +6 -2
- package/src/oauth/connection.ts +2 -0
- package/src/oauth/oauth-store.ts +10 -0
- package/src/oauth/platform-connection.test.ts +145 -0
- package/src/oauth/platform-connection.ts +62 -31
- package/src/oauth/seed-providers.ts +10 -1
- 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 +218 -699
- package/src/permissions/command-registry.test.ts +535 -0
- package/src/permissions/command-registry.ts +825 -0
- package/src/permissions/defaults.ts +71 -75
- 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 +164 -65
- 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 -13
- package/src/platform/client.test.ts +10 -0
- package/src/platform/client.ts +19 -1
- package/src/platform/sync-identity.ts +129 -0
- package/src/prompts/persona-resolver.ts +127 -3
- package/src/prompts/system-prompt.ts +78 -38
- package/src/prompts/templates/BOOTSTRAP.md +5 -5
- package/src/prompts/templates/SOUL.md +5 -3
- package/src/prompts/templates/channels/slack.md +20 -0
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/prompts/user-reference.ts +20 -17
- 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__/provider-secret-catalog.test.ts +42 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +335 -70
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/fireworks/client.ts +2 -2
- package/src/providers/gemini/client.ts +74 -3
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +502 -28
- package/src/providers/model-intents.ts +8 -8
- package/src/providers/ollama/client.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +530 -0
- package/src/providers/openai/client.ts +25 -440
- package/src/providers/openai/responses-provider.ts +579 -0
- package/src/providers/openrouter/client.ts +168 -4
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-secret-catalog.ts +139 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +21 -10
- package/src/providers/retry.ts +185 -39
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +251 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +883 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +980 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +767 -0
- package/src/providers/speech-to-text/deepgram.test.ts +332 -0
- package/src/providers/speech-to-text/deepgram.ts +115 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.test.ts +743 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +625 -0
- package/src/providers/speech-to-text/google-gemini.test.ts +226 -0
- package/src/providers/speech-to-text/google-gemini.ts +101 -0
- package/src/providers/speech-to-text/openai-whisper-stream.test.ts +564 -0
- package/src/providers/speech-to-text/openai-whisper-stream.ts +381 -0
- package/src/providers/speech-to-text/openai-whisper.test.ts +1 -37
- package/src/providers/speech-to-text/openai-whisper.ts +63 -33
- package/src/providers/speech-to-text/provider-catalog.ts +323 -0
- package/src/providers/speech-to-text/resolve.ts +393 -6
- 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 +102 -3
- package/src/runtime/AGENTS.md +45 -3
- package/src/runtime/__tests__/agent-wake.test.ts +872 -0
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/__tests__/runtime-mode.test.ts +62 -0
- package/src/runtime/__tests__/slack-block-formatting.test.ts +481 -0
- package/src/runtime/agent-wake.ts +553 -0
- package/src/runtime/auth/__tests__/route-policy.test.ts +40 -0
- package/src/runtime/auth/route-policy.ts +34 -5
- package/src/runtime/auth/token-service.ts +56 -1
- package/src/runtime/btw-sidechain.ts +15 -3
- package/src/runtime/capability-tokens.ts +10 -10
- package/src/runtime/channel-invite-transport.ts +1 -1
- package/src/runtime/channel-invite-transports/email.ts +14 -6
- package/src/runtime/channel-readiness-service.ts +12 -22
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/chrome-extension-registry.ts +38 -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 +447 -11
- package/src/runtime/http-types.ts +29 -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-import-credentials.test.ts +36 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +360 -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/migration-transport.ts +1 -0
- package/src/runtime/migrations/migration-wizard.ts +1 -0
- package/src/runtime/migrations/vbundle-import-analyzer.ts +77 -1
- package/src/runtime/migrations/vbundle-importer.ts +187 -8
- 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/pending-interactions.ts +0 -11
- package/src/runtime/routes/__tests__/backup-routes.test.ts +967 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +618 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +247 -0
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +474 -0
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +148 -17
- package/src/runtime/routes/app-management-routes.ts +12 -18
- 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/attachment-routes.test.ts +9 -3
- package/src/runtime/routes/attachment-routes.ts +216 -17
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/backup-routes.ts +519 -0
- package/src/runtime/routes/browser-extension-pair-routes.ts +82 -23
- package/src/runtime/routes/btw-routes.ts +9 -10
- package/src/runtime/routes/contact-routes.test.ts +298 -0
- package/src/runtime/routes/contact-routes.ts +132 -5
- package/src/runtime/routes/conversation-analysis-routes.ts +22 -142
- package/src/runtime/routes/conversation-management-routes.ts +133 -0
- package/src/runtime/routes/conversation-routes.ts +487 -160
- 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/filing-routes.ts +93 -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 +452 -0
- package/src/runtime/routes/home-state-routes.ts +138 -0
- package/src/runtime/routes/host-browser-routes.ts +3 -14
- package/src/runtime/routes/identity-intro-cache.ts +7 -3
- package/src/runtime/routes/identity-routes.ts +3 -17
- 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/inbound-stages/transcribe-audio.test.ts +46 -39
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +15 -15
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +137 -0
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +179 -0
- package/src/runtime/routes/integrations/slack/channel.ts +36 -6
- package/src/runtime/routes/integrations/slack/share.ts +45 -7
- package/src/runtime/routes/llm-context-normalization.ts +325 -0
- package/src/runtime/routes/memory-item-routes.test.ts +3 -2
- package/src/runtime/routes/migration-routes.ts +722 -91
- package/src/runtime/routes/settings-routes.ts +26 -7
- package/src/runtime/routes/skills-routes.ts +76 -7
- package/src/runtime/routes/stt-routes.ts +233 -0
- package/src/runtime/routes/surface-action-routes.ts +41 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/tts-routes.ts +108 -24
- package/src/runtime/routes/usage-routes.ts +30 -2
- package/src/runtime/routes/user-route-dispatcher.ts +50 -5
- package/src/runtime/routes/user-routes.ts +13 -1
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +11 -3
- package/src/runtime/runtime-mode.ts +33 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +426 -0
- package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +67 -0
- package/src/runtime/services/__tests__/auto-analysis-prompt.test.ts +53 -0
- package/src/runtime/services/__tests__/manual-analysis-prompt.test.ts +41 -0
- package/src/runtime/services/analyze-conversation.ts +340 -0
- package/src/runtime/services/analyze-deps-singleton.ts +32 -0
- package/src/runtime/services/auto-analysis-prompt.ts +55 -0
- package/src/runtime/skill-route-registry.ts +71 -0
- package/src/runtime/slack-block-formatting.ts +437 -10
- package/src/schedule/scheduler.ts +58 -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 +122 -37
- package/src/security/secure-keys.ts +32 -10
- package/src/security/token-manager.ts +35 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/sequence/engine.ts +23 -0
- package/src/sequence/types.ts +1 -1
- package/src/skills/catalog-cache.ts +26 -7
- package/src/skills/catalog-files.ts +64 -2
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/category-inference.ts +122 -0
- package/src/skills/clawhub-files.ts +213 -0
- package/src/skills/clawhub.ts +84 -23
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/skills/skill-file-provider.ts +40 -0
- package/src/skills/skillssh-files.ts +395 -0
- package/src/skills/skillssh-registry.ts +4 -4
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +468 -0
- package/src/stt/__tests__/types.test.ts +89 -0
- package/src/stt/daemon-batch-transcriber.ts +228 -0
- package/src/stt/stt-stream-session.ts +506 -0
- package/src/stt/types.ts +334 -0
- package/src/stt/wav-encoder.test.ts +373 -0
- package/src/stt/wav-encoder.ts +175 -0
- package/src/subagent/manager.ts +79 -27
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-mode.test.ts +119 -0
- package/src/tools/browser/__tests__/browser-status.test.ts +166 -0
- package/src/tools/browser/browser-execution.ts +1208 -41
- package/src/tools/browser/browser-manager.ts +45 -0
- package/src/tools/browser/browser-mode-constants.ts +12 -0
- package/src/tools/browser/browser-mode.ts +92 -0
- package/src/tools/browser/browser-status-constants.ts +33 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +393 -0
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +29 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +1648 -32
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +264 -0
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +205 -17
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +254 -21
- package/src/tools/browser/cdp-client/errors.ts +15 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +39 -16
- package/src/tools/browser/cdp-client/factory.ts +797 -87
- package/src/tools/browser/cdp-client/index.ts +16 -2
- package/src/tools/browser/cdp-client/types.ts +68 -0
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +41 -7
- 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 +25 -12
- package/src/tools/network/web-search.ts +20 -2
- 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/shared/shell-output.ts +3 -1
- package/src/tools/side-effects.ts +0 -9
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +6 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +11 -2
- package/src/tools/terminal/shell.ts +16 -4
- package/src/tools/tool-manifest.ts +6 -0
- package/src/tools/types.ts +29 -3
- package/src/tools/ui-surface/definitions.ts +6 -1
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +1061 -0
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +196 -0
- package/src/tts/__tests__/provider-catalog.test.ts +183 -0
- package/src/tts/__tests__/provider-registry.test.ts +90 -0
- package/src/tts/provider-catalog.ts +219 -0
- package/src/tts/provider-registry.ts +73 -0
- package/src/tts/providers/deepgram-provider.ts +219 -0
- package/src/tts/providers/elevenlabs-provider.ts +211 -0
- package/src/tts/providers/fish-audio-provider.ts +183 -0
- package/src/tts/providers/index.ts +44 -0
- package/src/tts/providers/register-builtins.ts +130 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/synthesize-text.ts +110 -0
- package/src/tts/tts-config-resolver.ts +78 -0
- package/src/tts/types.ts +199 -0
- package/src/types/onboarding-context.ts +7 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/abort-reasons.ts +58 -0
- package/src/util/device-id.ts +32 -16
- package/src/util/errors.ts +9 -1
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +56 -12
- package/src/util/pricing.ts +78 -5
- package/src/util/spawn.ts +1 -1
- package/src/util/truncate.ts +4 -2
- package/src/util/unicode.ts +201 -0
- package/src/version.ts +19 -24
- package/src/watcher/engine.ts +24 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/watcher/watcher-store.ts +31 -0
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/003-seed-device-id.ts +9 -3
- package/src/workspace/migrations/017-seed-persona-dirs.ts +68 -4
- package/src/workspace/migrations/029-seed-pkb.ts +1 -1
- package/src/workspace/migrations/031-drop-user-md.ts +317 -0
- package/src/workspace/migrations/031-llm-log-retention-zero-to-null.ts +73 -0
- package/src/workspace/migrations/032-tts-provider-unification.ts +227 -0
- package/src/workspace/migrations/033-stt-service-explicit-config.ts +122 -0
- package/src/workspace/migrations/034-remove-calls-voice-transcription-provider.ts +215 -0
- package/src/workspace/migrations/035-seed-slack-channel-persona.ts +50 -0
- package/src/workspace/migrations/036-update-pkb-index-bar.ts +37 -0
- package/src/workspace/migrations/037-create-meets-dir.ts +61 -0
- 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 +32 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/src/workspace/top-level-renderer.ts +13 -1
- package/src/workspace/turn-commit.ts +31 -0
- package/src/__tests__/email-cli.test.ts +0 -297
- package/src/__tests__/email-service-config-fallback.test.ts +0 -102
- 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 -250
- package/src/__tests__/update-bulletin-format.test.ts +0 -122
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -277
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/browser-relay.ts +0 -466
- package/src/cli/commands/doctor.ts +0 -341
- package/src/config/bundled-skills/browser/SKILL.md +0 -63
- package/src/config/bundled-skills/browser/TOOLS.json +0 -393
- 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-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-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -32
- 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 -175
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -558
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -149
- 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 -220
- 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 -251
- 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 -107
- 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/email/guardrails.ts +0 -221
- package/src/email/provider.ts +0 -117
- package/src/email/providers/agentmail.ts +0 -361
- package/src/email/providers/index.ts +0 -65
- package/src/email/service.ts +0 -384
- package/src/email/types.ts +0 -126
- package/src/prompts/templates/UPDATES.md +0 -38
- package/src/prompts/templates/USER.md +0 -13
- package/src/prompts/update-bulletin-format.ts +0 -68
- 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 -128
- package/src/providers/speech-to-text/types.ts +0 -17
- package/src/runtime/routes/browser-cdp-routes.ts +0 -229
- 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" },
|
|
@@ -72,8 +72,12 @@ mock.module("../permissions/checker.js", () => ({
|
|
|
72
72
|
generateScopeOptions: () => [{ label: "/tmp", scope: "/tmp" }],
|
|
73
73
|
}));
|
|
74
74
|
|
|
75
|
+
// Mock every export so downstream test files that dynamically import modules
|
|
76
|
+
// with a static `from "../memory/tool-usage-store.js"` still see all symbols.
|
|
75
77
|
mock.module("../memory/tool-usage-store.js", () => ({
|
|
76
78
|
recordToolInvocation: () => {},
|
|
79
|
+
getRecentInvocations: () => [],
|
|
80
|
+
rotateToolInvocations: () => 0,
|
|
77
81
|
}));
|
|
78
82
|
|
|
79
83
|
mock.module("../tools/registry.js", () => ({
|
|
@@ -621,11 +625,11 @@ describe("ToolExecutor lifecycle events", () => {
|
|
|
621
625
|
expect(events.map((e) => e.type)).toEqual(["start", "executed"]);
|
|
622
626
|
});
|
|
623
627
|
|
|
624
|
-
test("file_edit to
|
|
625
|
-
// Security invariant: editing
|
|
626
|
-
// prompt, even when a trust rule would auto-allow.
|
|
628
|
+
test("file_edit to guardian persona emits permission_prompt under forcePromptSideEffects", async () => {
|
|
629
|
+
// Security invariant: editing the guardian persona file in a private
|
|
630
|
+
// thread must always prompt, even when a trust rule would auto-allow.
|
|
627
631
|
checkerDecision = "allow";
|
|
628
|
-
checkerReason = "Matched trust rule: file_edit:*/
|
|
632
|
+
checkerReason = "Matched trust rule: file_edit:*/users/*.md";
|
|
629
633
|
checkerRisk = "low";
|
|
630
634
|
promptDecision = "allow";
|
|
631
635
|
|
|
@@ -635,7 +639,7 @@ describe("ToolExecutor lifecycle events", () => {
|
|
|
635
639
|
const result = await executor.execute(
|
|
636
640
|
"file_edit",
|
|
637
641
|
{
|
|
638
|
-
path: "/Users/
|
|
642
|
+
path: "/Users/alice/.vellum/workspace/users/alice.md",
|
|
639
643
|
old_string: "old",
|
|
640
644
|
new_string: "new",
|
|
641
645
|
},
|
|
@@ -92,8 +92,12 @@ mock.module("../permissions/trust-store.js", () => ({
|
|
|
92
92
|
}));
|
|
93
93
|
|
|
94
94
|
// ── Tool usage store ──
|
|
95
|
+
// Mock every export so downstream test files that dynamically import modules
|
|
96
|
+
// with a static `from "../memory/tool-usage-store.js"` still see all symbols.
|
|
95
97
|
mock.module("../memory/tool-usage-store.js", () => ({
|
|
96
98
|
recordToolInvocation: () => {},
|
|
99
|
+
getRecentInvocations: () => [],
|
|
100
|
+
rotateToolInvocations: () => 0,
|
|
97
101
|
}));
|
|
98
102
|
|
|
99
103
|
// ── Path policy ──
|
|
@@ -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>,
|
|
@@ -129,8 +129,12 @@ mock.module("../permissions/checker.js", () => ({
|
|
|
129
129
|
scopeOptionsOverride ?? [{ label: "/tmp", scope: "/tmp" }],
|
|
130
130
|
}));
|
|
131
131
|
|
|
132
|
+
// Mock every export so downstream test files that dynamically import modules
|
|
133
|
+
// with a static `from "../memory/tool-usage-store.js"` still see all symbols.
|
|
132
134
|
mock.module("../memory/tool-usage-store.js", () => ({
|
|
133
135
|
recordToolInvocation: () => {},
|
|
136
|
+
getRecentInvocations: () => [],
|
|
137
|
+
rotateToolInvocations: () => 0,
|
|
134
138
|
}));
|
|
135
139
|
|
|
136
140
|
mock.module("../tools/registry.js", () => ({
|
|
@@ -305,6 +309,8 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
305
309
|
expect(result.isError).toBe(false);
|
|
306
310
|
expect(lastCheckArgs).toBeDefined();
|
|
307
311
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
312
|
+
executionContext: "conversation",
|
|
313
|
+
ephemeralRules: undefined,
|
|
308
314
|
executionTarget: "sandbox",
|
|
309
315
|
});
|
|
310
316
|
});
|
|
@@ -322,7 +328,10 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
322
328
|
|
|
323
329
|
expect(result.isError).toBe(false);
|
|
324
330
|
expect(lastCheckArgs).toBeDefined();
|
|
325
|
-
expect(lastCheckArgs!.policyContext).
|
|
331
|
+
expect(lastCheckArgs!.policyContext).toEqual({
|
|
332
|
+
executionContext: "conversation",
|
|
333
|
+
ephemeralRules: undefined,
|
|
334
|
+
});
|
|
326
335
|
});
|
|
327
336
|
|
|
328
337
|
test('passes undefined policyContext for tools with origin "core"', async () => {
|
|
@@ -352,7 +361,10 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
352
361
|
|
|
353
362
|
expect(result.isError).toBe(false);
|
|
354
363
|
expect(lastCheckArgs).toBeDefined();
|
|
355
|
-
expect(lastCheckArgs!.policyContext).
|
|
364
|
+
expect(lastCheckArgs!.policyContext).toEqual({
|
|
365
|
+
executionContext: "conversation",
|
|
366
|
+
ephemeralRules: undefined,
|
|
367
|
+
});
|
|
356
368
|
});
|
|
357
369
|
|
|
358
370
|
test('includes executionTarget "host" from skill tool metadata', async () => {
|
|
@@ -386,6 +398,8 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
386
398
|
expect(result.isError).toBe(false);
|
|
387
399
|
expect(lastCheckArgs).toBeDefined();
|
|
388
400
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
401
|
+
executionContext: "conversation",
|
|
402
|
+
ephemeralRules: undefined,
|
|
389
403
|
executionTarget: "host",
|
|
390
404
|
});
|
|
391
405
|
});
|
|
@@ -416,6 +430,8 @@ describe("ToolExecutor policy context plumbing", () => {
|
|
|
416
430
|
expect(result.isError).toBe(false);
|
|
417
431
|
expect(lastCheckArgs).toBeDefined();
|
|
418
432
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
433
|
+
executionContext: "conversation",
|
|
434
|
+
ephemeralRules: undefined,
|
|
419
435
|
executionTarget: undefined,
|
|
420
436
|
});
|
|
421
437
|
});
|
|
@@ -459,7 +475,7 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
459
475
|
scope: string,
|
|
460
476
|
decision = "allow",
|
|
461
477
|
priority = 100,
|
|
462
|
-
options?: {
|
|
478
|
+
options?: { executionTarget?: string },
|
|
463
479
|
) => {
|
|
464
480
|
return {
|
|
465
481
|
id: "spy-rule-id",
|
|
@@ -524,7 +540,7 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
524
540
|
expect(options.executionTarget).toBe("sandbox");
|
|
525
541
|
});
|
|
526
542
|
|
|
527
|
-
test("
|
|
543
|
+
test("always_allow captures execution target without allowHighRisk", async () => {
|
|
528
544
|
checkResultOverride = { decision: "prompt", reason: "test prompt" };
|
|
529
545
|
const spy = setupAddRuleSpy();
|
|
530
546
|
|
|
@@ -549,7 +565,7 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
549
565
|
};
|
|
550
566
|
|
|
551
567
|
const prompter = makePrompterWithDecision(
|
|
552
|
-
"
|
|
568
|
+
"always_allow",
|
|
553
569
|
"risky_tool:*",
|
|
554
570
|
"everywhere",
|
|
555
571
|
);
|
|
@@ -565,7 +581,6 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
565
581
|
expect(scope).toBe("everywhere");
|
|
566
582
|
expect(decision).toBe("allow");
|
|
567
583
|
expect(options).toBeDefined();
|
|
568
|
-
expect(options.allowHighRisk).toBe(true);
|
|
569
584
|
expect(options.executionTarget).toBe("host");
|
|
570
585
|
});
|
|
571
586
|
|
|
@@ -659,13 +674,13 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
659
674
|
expect(scope).toBe("everywhere");
|
|
660
675
|
});
|
|
661
676
|
|
|
662
|
-
test("
|
|
677
|
+
test("always_allow for core tool creates rule without execution target", async () => {
|
|
663
678
|
checkResultOverride = { decision: "prompt", reason: "test prompt" };
|
|
664
679
|
const spy = setupAddRuleSpy();
|
|
665
680
|
getToolOverride = undefined;
|
|
666
681
|
|
|
667
682
|
const prompter = makePrompterWithDecision(
|
|
668
|
-
"
|
|
683
|
+
"always_allow",
|
|
669
684
|
"sudo *",
|
|
670
685
|
"everywhere",
|
|
671
686
|
);
|
|
@@ -679,10 +694,8 @@ describe("ToolExecutor contextual rule creation", () => {
|
|
|
679
694
|
expect(result.isError).toBe(false);
|
|
680
695
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
681
696
|
const [, , , , , options] = spy.mock.calls[0];
|
|
682
|
-
|
|
683
|
-
expect(options
|
|
684
|
-
// No execution target for core tools
|
|
685
|
-
expect(options.executionTarget).toBeUndefined();
|
|
697
|
+
// Core tools have no executionTarget, so ruleOptions is empty → undefined
|
|
698
|
+
expect(options).toBeUndefined();
|
|
686
699
|
});
|
|
687
700
|
|
|
688
701
|
test("skill tool with host execution target records executionTarget in rule", async () => {
|
|
@@ -750,7 +763,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
750
763
|
scope: string,
|
|
751
764
|
decision = "allow",
|
|
752
765
|
priority = 100,
|
|
753
|
-
options?: {
|
|
766
|
+
options?: { executionTarget?: string },
|
|
754
767
|
) => {
|
|
755
768
|
return {
|
|
756
769
|
id: "spy-rule-id",
|
|
@@ -767,7 +780,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
767
780
|
return addRuleSpy;
|
|
768
781
|
}
|
|
769
782
|
|
|
770
|
-
test("
|
|
783
|
+
test("always_allow creates rule with execution target for high-risk skill tool", async () => {
|
|
771
784
|
checkResultOverride = {
|
|
772
785
|
decision: "prompt",
|
|
773
786
|
reason: "High risk: always requires approval",
|
|
@@ -795,7 +808,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
795
808
|
};
|
|
796
809
|
|
|
797
810
|
const prompter = makePrompterWithDecision(
|
|
798
|
-
"
|
|
811
|
+
"always_allow",
|
|
799
812
|
"deploy_tool:*",
|
|
800
813
|
"everywhere",
|
|
801
814
|
);
|
|
@@ -814,12 +827,12 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
814
827
|
expect(pattern).toBe("deploy_tool:*");
|
|
815
828
|
expect(scope).toBe("everywhere");
|
|
816
829
|
expect(decision).toBe("allow");
|
|
817
|
-
// The key integration assertion:
|
|
818
|
-
expect(options.
|
|
830
|
+
// The key integration assertion: execution target is captured
|
|
831
|
+
expect(options.executionTarget).toBeDefined();
|
|
819
832
|
expect(options.executionTarget).toBe("host");
|
|
820
833
|
});
|
|
821
834
|
|
|
822
|
-
test("always_allow creates rule
|
|
835
|
+
test("always_allow creates rule with execution target for skill tool", async () => {
|
|
823
836
|
checkResultOverride = { decision: "prompt", reason: "test prompt" };
|
|
824
837
|
const spy = setupAddRuleSpy();
|
|
825
838
|
|
|
@@ -843,9 +856,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
843
856
|
};
|
|
844
857
|
};
|
|
845
858
|
|
|
846
|
-
// User chooses always_allow
|
|
847
|
-
// should NOT have allowHighRisk set, meaning future high-risk checks
|
|
848
|
-
// will still prompt.
|
|
859
|
+
// User chooses always_allow — rule is created with execution target.
|
|
849
860
|
const prompter = makePrompterWithDecision(
|
|
850
861
|
"always_allow",
|
|
851
862
|
"risky_op:*",
|
|
@@ -860,8 +871,8 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
860
871
|
expect(options).toBeDefined();
|
|
861
872
|
// executionTarget should be present
|
|
862
873
|
expect(options.executionTarget).toBe("sandbox");
|
|
863
|
-
//
|
|
864
|
-
|
|
874
|
+
// Rule should have execution target
|
|
875
|
+
// allowHighRisk is no longer persisted
|
|
865
876
|
});
|
|
866
877
|
|
|
867
878
|
test("executor forwards policyContext to check() for version-bound skill tool", async () => {
|
|
@@ -890,13 +901,15 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
890
901
|
|
|
891
902
|
expect(lastCheckArgs).toBeDefined();
|
|
892
903
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
904
|
+
executionContext: "conversation",
|
|
905
|
+
ephemeralRules: undefined,
|
|
893
906
|
executionTarget: "sandbox",
|
|
894
907
|
});
|
|
895
908
|
});
|
|
896
909
|
|
|
897
910
|
// ── Skill mutation approval regression tests (PR 30) ──────────
|
|
898
911
|
|
|
899
|
-
test("
|
|
912
|
+
test("always_allow for skill source write creates rule with execution target", async () => {
|
|
900
913
|
checkResultOverride = {
|
|
901
914
|
decision: "prompt",
|
|
902
915
|
reason: "High risk: always requires approval",
|
|
@@ -924,7 +937,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
924
937
|
};
|
|
925
938
|
|
|
926
939
|
const prompter = makePrompterWithDecision(
|
|
927
|
-
"
|
|
940
|
+
"always_allow",
|
|
928
941
|
"file_write:*/skills/**",
|
|
929
942
|
"everywhere",
|
|
930
943
|
);
|
|
@@ -942,11 +955,11 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
942
955
|
expect(pattern).toBe("file_write:*/skills/**");
|
|
943
956
|
expect(scope).toBe("everywhere");
|
|
944
957
|
expect(decision).toBe("allow");
|
|
945
|
-
expect(options.
|
|
958
|
+
expect(options.executionTarget).toBeDefined();
|
|
946
959
|
expect(options.executionTarget).toBe("sandbox");
|
|
947
960
|
});
|
|
948
961
|
|
|
949
|
-
test("always_allow
|
|
962
|
+
test("always_allow for skill source write creates rule with execution target (baseline)", async () => {
|
|
950
963
|
checkResultOverride = {
|
|
951
964
|
decision: "prompt",
|
|
952
965
|
reason: "High risk: always requires approval",
|
|
@@ -973,7 +986,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
973
986
|
};
|
|
974
987
|
};
|
|
975
988
|
|
|
976
|
-
// User chooses always_allow
|
|
989
|
+
// User chooses always_allow
|
|
977
990
|
const prompter = makePrompterWithDecision(
|
|
978
991
|
"always_allow",
|
|
979
992
|
"file_write:*/skills/**",
|
|
@@ -991,8 +1004,8 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
991
1004
|
const [, , , , , options] = spy.mock.calls[0];
|
|
992
1005
|
expect(options).toBeDefined();
|
|
993
1006
|
expect(options.executionTarget).toBe("sandbox");
|
|
994
|
-
//
|
|
995
|
-
|
|
1007
|
+
// Execution target is captured from the tool context
|
|
1008
|
+
// allowHighRisk is no longer persisted
|
|
996
1009
|
});
|
|
997
1010
|
|
|
998
1011
|
test("skill version is captured in rule for future version-bound matching", async () => {
|
|
@@ -1023,7 +1036,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1023
1036
|
};
|
|
1024
1037
|
|
|
1025
1038
|
const prompter = makePrompterWithDecision(
|
|
1026
|
-
"
|
|
1039
|
+
"always_allow",
|
|
1027
1040
|
"file_edit:*/skills/**",
|
|
1028
1041
|
"everywhere",
|
|
1029
1042
|
);
|
|
@@ -1038,7 +1051,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1038
1051
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
1039
1052
|
const [tool, , , , , options] = spy.mock.calls[0];
|
|
1040
1053
|
expect(tool).toBe("file_edit");
|
|
1041
|
-
expect(options.
|
|
1054
|
+
expect(options.executionTarget).toBeDefined();
|
|
1042
1055
|
expect(options.executionTarget).toBe("sandbox");
|
|
1043
1056
|
});
|
|
1044
1057
|
|
|
@@ -1072,11 +1085,13 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1072
1085
|
|
|
1073
1086
|
expect(lastCheckArgs).toBeDefined();
|
|
1074
1087
|
expect(lastCheckArgs!.policyContext).toEqual({
|
|
1088
|
+
executionContext: "conversation",
|
|
1089
|
+
ephemeralRules: undefined,
|
|
1075
1090
|
executionTarget: "sandbox",
|
|
1076
1091
|
});
|
|
1077
1092
|
});
|
|
1078
1093
|
|
|
1079
|
-
test("executor creates rule on
|
|
1094
|
+
test("executor creates rule on always_allow with full context", async () => {
|
|
1080
1095
|
checkResultOverride = {
|
|
1081
1096
|
decision: "prompt",
|
|
1082
1097
|
reason: "High risk: always requires approval",
|
|
@@ -1104,7 +1119,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1104
1119
|
};
|
|
1105
1120
|
|
|
1106
1121
|
const prompter = makePrompterWithDecision(
|
|
1107
|
-
"
|
|
1122
|
+
"always_allow",
|
|
1108
1123
|
"admin_action:*",
|
|
1109
1124
|
"everywhere",
|
|
1110
1125
|
);
|
|
@@ -1124,7 +1139,7 @@ describe("ToolExecutor strict mode + high-risk integration (PR 25)", () => {
|
|
|
1124
1139
|
expect(pattern).toBe("admin_action:*");
|
|
1125
1140
|
expect(scope).toBe("everywhere");
|
|
1126
1141
|
expect(decision).toBe("allow");
|
|
1127
|
-
expect(options.
|
|
1142
|
+
expect(options.executionTarget).toBeDefined();
|
|
1128
1143
|
expect(options.executionTarget).toBe("host");
|
|
1129
1144
|
});
|
|
1130
1145
|
});
|
|
@@ -1143,12 +1158,6 @@ describe("isSideEffectTool", () => {
|
|
|
1143
1158
|
"bash",
|
|
1144
1159
|
"host_bash",
|
|
1145
1160
|
"web_fetch",
|
|
1146
|
-
"browser_navigate",
|
|
1147
|
-
"browser_click",
|
|
1148
|
-
"browser_type",
|
|
1149
|
-
"browser_press_key",
|
|
1150
|
-
"browser_close",
|
|
1151
|
-
"browser_fill_credential",
|
|
1152
1161
|
"document_create",
|
|
1153
1162
|
"document_update",
|
|
1154
1163
|
"schedule_create",
|
|
@@ -1169,6 +1178,14 @@ describe("isSideEffectTool", () => {
|
|
|
1169
1178
|
"memory_recall",
|
|
1170
1179
|
"memory_manage",
|
|
1171
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",
|
|
1172
1189
|
"browser_snapshot",
|
|
1173
1190
|
"browser_screenshot",
|
|
1174
1191
|
"browser_wait_for",
|
|
@@ -1220,12 +1237,13 @@ describe("isSideEffectTool", () => {
|
|
|
1220
1237
|
});
|
|
1221
1238
|
});
|
|
1222
1239
|
|
|
1223
|
-
// Baseline: allow rules can auto-allow file_edit for
|
|
1224
|
-
// The mock check() delegates to
|
|
1225
|
-
//
|
|
1226
|
-
// a blanket
|
|
1227
|
-
|
|
1228
|
-
|
|
1240
|
+
// Baseline: allow rules can auto-allow file_edit for the guardian persona
|
|
1241
|
+
// today (no forced prompting). The mock check() delegates to
|
|
1242
|
+
// findHighestPriorityRule (via spy) so a regression in trust-rule matching
|
|
1243
|
+
// would cause this test to fail instead of being masked by a blanket
|
|
1244
|
+
// mock-allow.
|
|
1245
|
+
describe("ToolExecutor baseline: allow rule auto-allows file_edit guardian persona", () => {
|
|
1246
|
+
const guardianPersonaPath = "/Users/alice/.vellum/workspace/users/alice.md";
|
|
1229
1247
|
let ruleSpy: ReturnType<typeof spyOn> | undefined;
|
|
1230
1248
|
|
|
1231
1249
|
beforeEach(() => {
|
|
@@ -1239,18 +1257,19 @@ describe("ToolExecutor baseline: allow rule auto-allows file_edit USER.md", () =
|
|
|
1239
1257
|
addRuleSpy = undefined;
|
|
1240
1258
|
}
|
|
1241
1259
|
|
|
1242
|
-
// Simulate a trust rule that allows file_edit on
|
|
1243
|
-
// findHighestPriorityRule. This mirrors the
|
|
1244
|
-
// the trust-store creates for
|
|
1260
|
+
// Simulate a trust rule that allows file_edit on the guardian's per-user
|
|
1261
|
+
// persona file by stubbing findHighestPriorityRule. This mirrors the
|
|
1262
|
+
// default allow rules that the trust-store creates for the guardian
|
|
1263
|
+
// persona file (see permissions/defaults.ts).
|
|
1245
1264
|
ruleSpy = spyOn(trustStore, "findHighestPriorityRule").mockImplementation(
|
|
1246
1265
|
(tool: string, commands: string[], _scope: string) => {
|
|
1247
1266
|
if (tool !== "file_edit") return null;
|
|
1248
1267
|
for (const cmd of commands) {
|
|
1249
|
-
if (cmd === `file_edit:${
|
|
1268
|
+
if (cmd === `file_edit:${guardianPersonaPath}`) {
|
|
1250
1269
|
return {
|
|
1251
|
-
id: "default:allow-file_edit-
|
|
1270
|
+
id: "default:allow-file_edit-guardian-persona",
|
|
1252
1271
|
tool: "file_edit",
|
|
1253
|
-
pattern: `file_edit:${
|
|
1272
|
+
pattern: `file_edit:${guardianPersonaPath}`,
|
|
1254
1273
|
scope: "everywhere",
|
|
1255
1274
|
decision: "allow" as const,
|
|
1256
1275
|
priority: 100,
|
|
@@ -1294,11 +1313,11 @@ describe("ToolExecutor baseline: allow rule auto-allows file_edit USER.md", () =
|
|
|
1294
1313
|
}
|
|
1295
1314
|
});
|
|
1296
1315
|
|
|
1297
|
-
test("file_edit to
|
|
1316
|
+
test("file_edit to guardian persona is auto-allowed via trust rule", async () => {
|
|
1298
1317
|
const executor = new ToolExecutor(makePrompter());
|
|
1299
1318
|
const result = await executor.execute(
|
|
1300
1319
|
"file_edit",
|
|
1301
|
-
{ path:
|
|
1320
|
+
{ path: guardianPersonaPath, content: "hello" },
|
|
1302
1321
|
makeContext(),
|
|
1303
1322
|
);
|
|
1304
1323
|
expect(result.isError).toBe(false);
|
|
@@ -1310,7 +1329,7 @@ describe("ToolExecutor baseline: allow rule auto-allows file_edit USER.md", () =
|
|
|
1310
1329
|
expect(ruleSpy).toHaveBeenCalled();
|
|
1311
1330
|
});
|
|
1312
1331
|
|
|
1313
|
-
test("file_edit to a non-
|
|
1332
|
+
test("file_edit to a non-guardian-persona path is NOT auto-allowed without a matching rule", async () => {
|
|
1314
1333
|
let promptCalled = false;
|
|
1315
1334
|
const trackingPrompter = {
|
|
1316
1335
|
prompt: async () => {
|
|
@@ -1530,22 +1549,23 @@ describe("ToolExecutor forcePromptSideEffects enforcement", () => {
|
|
|
1530
1549
|
expect(promptCount).toBe(1);
|
|
1531
1550
|
});
|
|
1532
1551
|
|
|
1533
|
-
// ──
|
|
1552
|
+
// ── Guardian persona security invariant (PR 31) ──────────
|
|
1534
1553
|
|
|
1535
|
-
test("file_edit to
|
|
1536
|
-
// This is a key security invariant:
|
|
1537
|
-
// memory. In a private conversation
|
|
1538
|
-
// must always require explicit
|
|
1554
|
+
test("file_edit to guardian persona forces prompt in private conversation even with matching trust rule", async () => {
|
|
1555
|
+
// This is a key security invariant: the guardian persona file contains
|
|
1556
|
+
// the user's persistent memory. In a private conversation
|
|
1557
|
+
// (forcePromptSideEffects=true), edits to it must always require explicit
|
|
1558
|
+
// approval, even when a trust rule matches.
|
|
1539
1559
|
checkResultOverride = {
|
|
1540
1560
|
decision: "allow",
|
|
1541
|
-
reason: "Matched trust rule: file_edit:*/
|
|
1561
|
+
reason: "Matched trust rule: file_edit:*/users/*.md",
|
|
1542
1562
|
};
|
|
1543
1563
|
|
|
1544
1564
|
const executor = new ToolExecutor(makeTrackingPrompter());
|
|
1545
1565
|
const result = await executor.execute(
|
|
1546
1566
|
"file_edit",
|
|
1547
1567
|
{
|
|
1548
|
-
path: "/Users/
|
|
1568
|
+
path: "/Users/alice/.vellum/workspace/users/alice.md",
|
|
1549
1569
|
old_string: "old pref",
|
|
1550
1570
|
new_string: "new pref",
|
|
1551
1571
|
},
|
|
@@ -1557,14 +1577,14 @@ describe("ToolExecutor forcePromptSideEffects enforcement", () => {
|
|
|
1557
1577
|
expect(promptCalled).toBe(true);
|
|
1558
1578
|
});
|
|
1559
1579
|
|
|
1560
|
-
test("host_file_edit to
|
|
1580
|
+
test("host_file_edit to guardian persona forces prompt in private conversation", async () => {
|
|
1561
1581
|
checkResultOverride = { decision: "allow", reason: "Matched trust rule" };
|
|
1562
1582
|
|
|
1563
1583
|
const executor = new ToolExecutor(makeTrackingPrompter());
|
|
1564
1584
|
const result = await executor.execute(
|
|
1565
1585
|
"host_file_edit",
|
|
1566
1586
|
{
|
|
1567
|
-
path: "/Users/
|
|
1587
|
+
path: "/Users/alice/.vellum/workspace/users/alice.md",
|
|
1568
1588
|
old_string: "x",
|
|
1569
1589
|
new_string: "y",
|
|
1570
1590
|
},
|
|
@@ -1575,51 +1595,6 @@ describe("ToolExecutor forcePromptSideEffects enforcement", () => {
|
|
|
1575
1595
|
expect(promptCalled).toBe(true);
|
|
1576
1596
|
});
|
|
1577
1597
|
|
|
1578
|
-
// ── Browser action tools as side-effect tools (PR fix2) ──────────
|
|
1579
|
-
|
|
1580
|
-
test("browser_click forces prompt in private conversation", async () => {
|
|
1581
|
-
checkResultOverride = { decision: "allow", reason: "Matched trust rule" };
|
|
1582
|
-
|
|
1583
|
-
const executor = new ToolExecutor(makeTrackingPrompter());
|
|
1584
|
-
const result = await executor.execute(
|
|
1585
|
-
"browser_click",
|
|
1586
|
-
{ selector: "#submit-btn" },
|
|
1587
|
-
makeContext({ forcePromptSideEffects: true }),
|
|
1588
|
-
);
|
|
1589
|
-
|
|
1590
|
-
expect(result.isError).toBe(false);
|
|
1591
|
-
expect(promptCalled).toBe(true);
|
|
1592
|
-
});
|
|
1593
|
-
|
|
1594
|
-
test("browser_type forces prompt in private conversation", async () => {
|
|
1595
|
-
checkResultOverride = { decision: "allow", reason: "Matched trust rule" };
|
|
1596
|
-
|
|
1597
|
-
const executor = new ToolExecutor(makeTrackingPrompter());
|
|
1598
|
-
const result = await executor.execute(
|
|
1599
|
-
"browser_type",
|
|
1600
|
-
{ selector: "#search-input", text: "query" },
|
|
1601
|
-
makeContext({ forcePromptSideEffects: true }),
|
|
1602
|
-
);
|
|
1603
|
-
|
|
1604
|
-
expect(result.isError).toBe(false);
|
|
1605
|
-
expect(promptCalled).toBe(true);
|
|
1606
|
-
});
|
|
1607
|
-
|
|
1608
|
-
test("browser_snapshot does NOT force prompt in private conversation", async () => {
|
|
1609
|
-
checkResultOverride = { decision: "allow", reason: "Matched trust rule" };
|
|
1610
|
-
|
|
1611
|
-
const executor = new ToolExecutor(makeTrackingPrompter());
|
|
1612
|
-
const result = await executor.execute(
|
|
1613
|
-
"browser_snapshot",
|
|
1614
|
-
{},
|
|
1615
|
-
makeContext({ forcePromptSideEffects: true }),
|
|
1616
|
-
);
|
|
1617
|
-
|
|
1618
|
-
expect(result.isError).toBe(false);
|
|
1619
|
-
// browser_snapshot is read-only — must NOT trigger forced prompting
|
|
1620
|
-
expect(promptCalled).toBe(false);
|
|
1621
|
-
});
|
|
1622
|
-
|
|
1623
1598
|
// ── Always-mutating document tools (PR fix5) ──────────
|
|
1624
1599
|
|
|
1625
1600
|
test("document_create forces prompt in private conversation", async () => {
|
|
@@ -1823,7 +1798,7 @@ describe("ToolExecutor persistentDecisionsAllowed contract", () => {
|
|
|
1823
1798
|
scope: string,
|
|
1824
1799
|
decision = "allow",
|
|
1825
1800
|
priority = 100,
|
|
1826
|
-
options?: {
|
|
1801
|
+
options?: { executionTarget?: string },
|
|
1827
1802
|
) => {
|
|
1828
1803
|
return {
|
|
1829
1804
|
id: "spy-rule-id",
|
|
@@ -2163,7 +2138,7 @@ describe("ToolExecutor persistent-allow lifecycle", () => {
|
|
|
2163
2138
|
scope: string,
|
|
2164
2139
|
decision = "allow",
|
|
2165
2140
|
priority = 100,
|
|
2166
|
-
options?: {
|
|
2141
|
+
options?: { executionTarget?: string },
|
|
2167
2142
|
) => {
|
|
2168
2143
|
return {
|
|
2169
2144
|
id: "spy-rule-id",
|
|
@@ -11,6 +11,20 @@ import {
|
|
|
11
11
|
} from "../context/tool-result-truncation.js";
|
|
12
12
|
import type { ContentBlock, ToolResultContent } from "../providers/types.js";
|
|
13
13
|
|
|
14
|
+
function hasOrphanedSurrogate(str: string): boolean {
|
|
15
|
+
for (let i = 0; i < str.length; i++) {
|
|
16
|
+
const code = str.charCodeAt(i);
|
|
17
|
+
if (code >= 0xd800 && code <= 0xdbff) {
|
|
18
|
+
const next = i + 1 < str.length ? str.charCodeAt(i + 1) : 0;
|
|
19
|
+
if (next < 0xdc00 || next > 0xdfff) return true;
|
|
20
|
+
i++;
|
|
21
|
+
} else if (code >= 0xdc00 && code <= 0xdfff) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
|
|
14
28
|
// ---------------------------------------------------------------------------
|
|
15
29
|
// Helpers
|
|
16
30
|
// ---------------------------------------------------------------------------
|
|
@@ -100,6 +114,28 @@ describe("truncateToolResultText", () => {
|
|
|
100
114
|
expect(result).toBe(text);
|
|
101
115
|
expect(result).not.toContain(TRUNCATION_SUFFIX);
|
|
102
116
|
});
|
|
117
|
+
|
|
118
|
+
test("does not orphan a UTF-16 surrogate pair at the cut boundary", () => {
|
|
119
|
+
// Regression for the "no low surrogate in string" Anthropic 400 error.
|
|
120
|
+
// Build a string where the cut point lands inside a surrogate pair:
|
|
121
|
+
// 4999 padding chars, then an emoji (2 code units), then enough filler
|
|
122
|
+
// to push the cut inside the pair.
|
|
123
|
+
const EMOJI = "\uD83C\uDF89";
|
|
124
|
+
// maxChars = 5_000, so cutPoint = 5_000 - TRUNCATION_SUFFIX.length.
|
|
125
|
+
// Put the emoji so its high surrogate lands exactly at cutPoint - 1.
|
|
126
|
+
const maxChars = 5_000;
|
|
127
|
+
const cutPoint = maxChars - TRUNCATION_SUFFIX.length;
|
|
128
|
+
// Fill up to cutPoint - 1 with "a"s, then place the emoji so the high
|
|
129
|
+
// surrogate is the character at cutPoint - 1 and the low is at cutPoint.
|
|
130
|
+
const prefix = "a".repeat(cutPoint - 1);
|
|
131
|
+
const text = prefix + EMOJI + "b".repeat(100);
|
|
132
|
+
// Use a long filler with no newlines so lastIndexOf("\n", cutPoint) === -1
|
|
133
|
+
// and the function falls back to cutPoint itself.
|
|
134
|
+
const result = truncateToolResultText(text, maxChars);
|
|
135
|
+
expect(hasOrphanedSurrogate(result)).toBe(false);
|
|
136
|
+
// JSON.stringify must not throw on the result.
|
|
137
|
+
expect(() => JSON.stringify(result)).not.toThrow();
|
|
138
|
+
});
|
|
103
139
|
});
|
|
104
140
|
|
|
105
141
|
// ---------------------------------------------------------------------------
|