@vellumai/assistant 0.6.4 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +5 -0
- package/AGENTS.md +9 -1
- package/ARCHITECTURE.md +43 -49
- package/Dockerfile +17 -3
- package/README.md +3 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +283 -0
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +33 -59
- package/docs/architecture/memory.md +25 -30
- package/docs/architecture/security.md +19 -18
- package/docs/browser-use-architecture-phase2.md +63 -20
- package/docs/error-handling.md +111 -0
- package/docs/plugins.md +761 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/examples/plugins/echo/README.md +132 -0
- package/examples/plugins/echo/package.json +17 -0
- package/examples/plugins/echo/register.ts +187 -0
- package/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/node_modules/@vellumai/egress-proxy/src/types.ts +19 -0
- package/openapi.yaml +334 -78
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- package/src/__tests__/app-compiler.test.ts +57 -0
- package/src/__tests__/approval-cascade.test.ts +36 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +1 -0
- package/src/__tests__/avatar-generator.test.ts +4 -2
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +96 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +870 -655
- package/src/__tests__/circuit-breaker-pipeline.test.ts +406 -0
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/compaction-events.test.ts +501 -0
- package/src/__tests__/compaction-pipeline.test.ts +210 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +181 -0
- package/src/__tests__/compaction-timeout-recovery.test.ts +262 -0
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +11 -28
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-model-image-provider.test.ts +110 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +440 -114
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -4
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-tools.test.ts +26 -0
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-overflow-policy.test.ts +7 -7
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +883 -4
- package/src/__tests__/conversation-abort-tool-results.test.ts +32 -15
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +86 -46
- package/src/__tests__/conversation-agent-loop.test.ts +435 -216
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +36 -10
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +7 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +34 -12
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pairing.test.ts +174 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +32 -15
- package/src/__tests__/conversation-process-callsite.test.ts +309 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +44 -21
- package/src/__tests__/conversation-queue.test.ts +68 -38
- package/src/__tests__/conversation-routes-disk-view.test.ts +36 -7
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2877 -152
- package/src/__tests__/conversation-runtime-workspace.test.ts +35 -50
- package/src/__tests__/conversation-seed-composer.test.ts +2 -2
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +39 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +53 -16
- package/src/__tests__/conversation-speed-override.test.ts +36 -12
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +118 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +41 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +4 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +33 -9
- package/src/__tests__/conversation-workspace-injection.test.ts +46 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +46 -15
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-health-service.test.ts +78 -9
- package/src/__tests__/credential-security-invariants.test.ts +5 -2
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +1 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/empty-response-pipeline.test.ts +305 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +29 -10
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/first-greeting.test.ts +247 -5
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-mode.test.ts +57 -0
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/history-repair-pipeline.test.ts +399 -0
- package/src/__tests__/host-browser-e2e-cloud.test.ts +307 -0
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +3 -3
- package/src/__tests__/host-proxy-interface.test.ts +36 -2
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/image-credentials.test.ts +137 -0
- package/src/__tests__/image-service-dispatcher.test.ts +186 -0
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/injector-chain.test.ts +526 -0
- package/src/__tests__/intent-routing.test.ts +1 -66
- package/src/__tests__/llm-call-pipeline.test.ts +285 -0
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/media-generate-image.test.ts +119 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +401 -0
- package/src/__tests__/memory-upsert-concurrency.test.ts +1 -0
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +621 -0
- package/src/__tests__/model-intents.test.ts +11 -83
- package/src/__tests__/notification-broadcaster.test.ts +3 -3
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/notification-decision-strategy.test.ts +0 -11
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +108 -0
- package/src/__tests__/oauth-apps-routes.test.ts +1 -1
- package/src/__tests__/oauth-cli.test.ts +14 -12
- package/src/__tests__/oauth-connect-orchestrator.test.ts +4 -13
- package/src/__tests__/oauth-provider-serializer.test.ts +6 -4
- package/src/__tests__/oauth-provider-visibility.test.ts +3 -5
- package/src/__tests__/oauth-providers-routes.test.ts +3 -2
- package/src/__tests__/oauth-store.test.ts +46 -78
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/onboarding-template-contract.test.ts +16 -64
- package/src/__tests__/openai-image-service.test.ts +368 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +676 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -25
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persist-onboarding-artifacts.test.ts +266 -0
- package/src/__tests__/persistence-pipeline.test.ts +377 -0
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pipeline-runner.test.ts +565 -0
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/platform.test.ts +5 -2
- package/src/__tests__/plugin-bootstrap.test.ts +483 -0
- package/src/__tests__/plugin-registry.test.ts +273 -0
- package/src/__tests__/plugin-route-contribution.test.ts +288 -0
- package/src/__tests__/plugin-skill-contribution.test.ts +367 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +286 -0
- package/src/__tests__/plugin-types.test.ts +320 -0
- package/src/__tests__/pricing.test.ts +93 -14
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +69 -9
- package/src/__tests__/reaction-persistence.test.ts +561 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +0 -2
- package/src/__tests__/relay-server.test.ts +1 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/schedule-routes.test.ts +131 -1
- package/src/__tests__/scheduler-recurrence.test.ts +14 -70
- package/src/__tests__/scheduler-reuse-conversation.test.ts +10 -50
- package/src/__tests__/secret-detection-handler.test.ts +0 -10
- package/src/__tests__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-identity.test.ts +0 -134
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +259 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-memory-cleanup.test.ts +1 -0
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/task-scheduler.test.ts +3 -15
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-preload.ts +11 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/title-generate-pipeline.test.ts +224 -0
- package/src/__tests__/token-estimate-pipeline.test.ts +431 -0
- package/src/__tests__/tool-error-pipeline.test.ts +244 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +431 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -8
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor-shell-integration.test.ts +7 -10
- package/src/__tests__/tool-executor.test.ts +201 -94
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +356 -0
- package/src/__tests__/tool-result-truncation.test.ts +0 -110
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/user-plugin-loader.test.ts +191 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-046-seed-conversation-starters-callsite.test.ts +185 -0
- package/src/__tests__/workspace-migration-049-release-notes-default-sonnet.test.ts +100 -0
- package/src/__tests__/workspace-migration-050-seed-main-agent-opus-callsite.test.ts +171 -0
- package/src/__tests__/workspace-migration-051-seed-conversation-summarization-callsite.test.ts +252 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +99 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +22 -16
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +545 -115
- package/src/approvals/__tests__/guardian-feed-event.test.ts +304 -0
- package/src/approvals/guardian-request-resolvers.ts +80 -0
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/backup/__tests__/backup-worker.test.ts +2 -13
- package/src/backup/backup-worker.ts +3 -15
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/bundler/app-compiler.ts +84 -1
- package/src/calls/call-state.ts +2 -2
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/channels/__tests__/types.test.ts +3 -3
- package/src/channels/types.ts +6 -4
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/__tests__/notifications.test.ts +87 -211
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/backup.test.ts +1 -1
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +886 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +463 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +606 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/backup.ts +2 -2
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/clients.ts +138 -0
- package/src/cli/commands/completions.ts +2 -12
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +69 -8
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +299 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/notifications.ts +68 -103
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -1
- package/src/cli/commands/oauth/connect.ts +2 -2
- package/src/cli/commands/oauth/providers.ts +176 -8
- package/src/cli/commands/oauth/status.ts +46 -36
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
- package/src/cli/commands/skills.ts +3 -4
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +39 -24
- package/src/cli.ts +0 -37
- package/src/config/__tests__/backup-schema.test.ts +7 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +10 -10
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +66 -87
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +28 -51
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +22 -40
- package/src/config/bundled-skills/image-studio/SKILL.md +2 -1
- package/src/config/bundled-skills/image-studio/TOOLS.json +2 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +23 -39
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +5 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +207 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +20 -1
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +69 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/schedule/SKILL.md +8 -3
- package/src/config/bundled-skills/schedule/TOOLS.json +15 -7
- package/src/config/bundled-skills/schedule/references/SCRIPT_MODE_PATTERNS.md +59 -0
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -190
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +42 -10
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +49 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/backup.ts +1 -1
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/conversations.ts +16 -0
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +317 -0
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +64 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skill-state.ts +6 -2
- package/src/config/skills.ts +96 -7
- package/src/context/__tests__/compact-prompt.test.ts +63 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/prompts/compact.md +26 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/tool-result-truncation.ts +3 -63
- package/src/context/window-manager.ts +417 -39
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- package/src/credential-health/credential-health-service.ts +19 -6
- package/src/daemon/__tests__/conversation-feed-event.test.ts +317 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +4 -12
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +14 -15
- package/src/daemon/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +0 -3
- package/src/daemon/context-overflow-policy.ts +4 -13
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +162 -34
- package/src/daemon/conversation-agent-loop.ts +1282 -599
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-history.ts +10 -19
- package/src/daemon/conversation-lifecycle.ts +59 -17
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-notifiers.ts +2 -110
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +1063 -211
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +51 -9
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +197 -64
- package/src/daemon/external-plugins-bootstrap.ts +478 -0
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/first-greeting.ts +191 -14
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +65 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +7 -3
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +109 -82
- package/src/daemon/message-types/computer-use.ts +2 -34
- package/src/daemon/message-types/conversations.ts +63 -0
- package/src/daemon/message-types/messages.ts +21 -1
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +122 -12
- package/src/daemon/shutdown-handlers.ts +2 -12
- package/src/daemon/tool-side-effects.ts +14 -65
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +160 -0
- package/src/heartbeat/heartbeat-service.ts +99 -28
- package/src/home/__tests__/feed-population-integration.test.ts +312 -0
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +11 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +97 -4
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rewrite-command-preview.ts +66 -0
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/socket-path.test.ts +34 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +6 -3
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +63 -0
- package/src/ipc/routes/browser.ts +97 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/get-contact.ts +16 -0
- package/src/ipc/routes/index.ts +31 -1
- package/src/ipc/routes/list-clients.ts +31 -0
- package/src/ipc/routes/merge-contacts.ts +17 -0
- package/src/ipc/routes/notification.ts +133 -0
- package/src/ipc/routes/rename-conversation.ts +59 -0
- package/src/ipc/routes/search-contacts.ts +19 -0
- package/src/ipc/routes/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/upsert-contact.ts +25 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +76 -0
- package/src/media/app-icon-generator.ts +23 -46
- package/src/media/avatar-router.ts +26 -41
- package/src/media/gemini-image-service.ts +8 -41
- package/src/media/image-credentials.ts +73 -0
- package/src/media/image-service.ts +85 -0
- package/src/media/openai-image-service.ts +131 -0
- package/src/media/types.ts +46 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +133 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-queries.ts +57 -4
- package/src/memory/conversation-title-service.ts +32 -4
- package/src/memory/db-init.ts +10 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/embedding-gemini.test.ts +41 -2
- package/src/memory/embedding-gemini.ts +6 -1
- package/src/memory/graph/bootstrap.test.ts +282 -0
- package/src/memory/graph/bootstrap.ts +8 -5
- package/src/memory/graph/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +183 -53
- package/src/memory/graph/graph-search.test.ts +93 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/inspect.ts +2 -2
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +237 -48
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/041-approval-prompt-ts-tracker.ts +26 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/149-oauth-tables.ts +1 -0
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/223-schedule-script-column.ts +11 -0
- package/src/memory/migrations/224-oauth-providers-managed-service-is-paid.ts +24 -0
- package/src/memory/migrations/225-oauth-providers-available-scopes.ts +13 -0
- package/src/memory/migrations/index.ts +5 -0
- package/src/memory/pkb/pkb-index.test.ts +369 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +252 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +499 -0
- package/src/memory/pkb/pkb-search.ts +159 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.test.ts +60 -0
- package/src/memory/qdrant-client.ts +147 -1
- package/src/memory/schema/infrastructure.ts +1 -0
- package/src/memory/schema/oauth.ts +4 -1
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1421 -0
- package/src/messaging/providers/slack/render-transcript.ts +501 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/conversation-pairing.ts +78 -19
- package/src/notifications/copy-composer.ts +0 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/emit-signal.ts +1 -1
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/notifications/signal.ts +1 -2
- package/src/oauth/AGENTS.md +1 -1
- package/src/oauth/__tests__/identity-verifier.test.ts +2 -1
- package/src/oauth/connect-orchestrator.ts +8 -34
- package/src/oauth/connect-types.ts +6 -10
- package/src/oauth/manual-token-connection.ts +23 -0
- package/src/oauth/oauth-store.ts +31 -14
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/provider-serializer.ts +6 -1
- package/src/oauth/seed-providers.ts +56 -106
- package/src/outbound-proxy/http-forwarder.ts +9 -0
- package/src/permissions/approval-policy.test.ts +1223 -0
- package/src/permissions/approval-policy.ts +309 -0
- package/src/permissions/arg-parser.test.ts +161 -0
- package/src/permissions/arg-parser.ts +141 -0
- package/src/permissions/bash-risk-classifier.test.ts +1620 -0
- package/src/permissions/bash-risk-classifier.ts +950 -0
- package/src/permissions/checker.ts +348 -711
- package/src/permissions/command-registry.test.ts +774 -0
- package/src/permissions/command-registry.ts +1005 -0
- package/src/permissions/defaults.ts +28 -79
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/gateway-threshold-reader.ts +196 -0
- package/src/permissions/prompter.ts +4 -0
- package/src/permissions/risk-types.ts +262 -0
- package/src/permissions/schedule-risk-classifier.test.ts +129 -0
- package/src/permissions/schedule-risk-classifier.ts +85 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/shell-identity.ts +2 -42
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +161 -62
- package/src/permissions/types.ts +25 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +9 -19
- package/src/platform/client.ts +19 -1
- package/src/plugins/defaults/circuit-breaker.ts +146 -0
- package/src/plugins/defaults/compaction.ts +145 -0
- package/src/plugins/defaults/empty-response.ts +126 -0
- package/src/plugins/defaults/history-repair.ts +85 -0
- package/src/plugins/defaults/index.ts +116 -0
- package/src/plugins/defaults/injectors.ts +491 -0
- package/src/plugins/defaults/llm-call.ts +82 -0
- package/src/plugins/defaults/memory-retrieval.ts +226 -0
- package/src/plugins/defaults/overflow-reduce.ts +181 -0
- package/src/plugins/defaults/persistence.ts +129 -0
- package/src/plugins/defaults/title-generate.ts +95 -0
- package/src/plugins/defaults/token-estimate.ts +104 -0
- package/src/plugins/defaults/tool-error.ts +126 -0
- package/src/plugins/defaults/tool-execute.ts +89 -0
- package/src/plugins/defaults/tool-result-truncate.ts +88 -0
- package/src/plugins/pipeline.ts +316 -0
- package/src/plugins/plugin-skill-contributions.ts +292 -0
- package/src/plugins/registry.ts +241 -0
- package/src/plugins/types.ts +1134 -0
- package/src/plugins/user-loader.ts +177 -0
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/BOOTSTRAP.md +27 -77
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +524 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +80 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +61 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +57 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +646 -0
- package/src/providers/speech-to-text/xai-realtime.ts +821 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +93 -3
- package/src/runtime/AGENTS.md +27 -18
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +3 -3
- package/src/runtime/__tests__/client-registry.test.ts +293 -0
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/client-registry.ts +261 -0
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +129 -9
- package/src/runtime/http-types.ts +23 -3
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/vbundle-builder.ts +1 -22
- package/src/runtime/migrations/vbundle-importer.ts +154 -9
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +78 -0
- package/src/runtime/routes/approval-routes.ts +29 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/browser-extension-pair-routes.ts +27 -8
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +351 -138
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- package/src/runtime/routes/inbound-message-handler.ts +987 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/memory-item-routes.test.ts +1 -0
- package/src/runtime/routes/migration-routes.ts +720 -127
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +284 -0
- package/src/runtime/routes/playground/__tests__/guard.test.ts +80 -0
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +294 -0
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +271 -0
- package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +202 -0
- package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +309 -0
- package/src/runtime/routes/playground/__tests__/state.test.ts +224 -0
- package/src/runtime/routes/playground/conversation-not-found.ts +29 -0
- package/src/runtime/routes/playground/deps.ts +56 -0
- package/src/runtime/routes/playground/force-compact.ts +73 -0
- package/src/runtime/routes/playground/guard.ts +37 -0
- package/src/runtime/routes/playground/index.ts +28 -0
- package/src/runtime/routes/playground/inject-failures.ts +159 -0
- package/src/runtime/routes/playground/reset-circuit.ts +115 -0
- package/src/runtime/routes/playground/seed-conversation.ts +139 -0
- package/src/runtime/routes/playground/seeded-conversations.ts +78 -0
- package/src/runtime/routes/playground/state.ts +78 -0
- package/src/runtime/routes/schedule-routes.ts +89 -8
- package/src/runtime/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +97 -15
- package/src/schedule/run-script.ts +68 -0
- package/src/schedule/schedule-store.ts +7 -1
- package/src/schedule/scheduler.ts +56 -8
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +35 -9
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +234 -2
- package/src/tools/browser/browser-execution.ts +150 -54
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +230 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +146 -3
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +54 -3
- package/src/tools/browser/cdp-client/factory.ts +15 -4
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +129 -73
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/script-proxy/session-manager.ts +37 -1
- package/src/tools/network/web-fetch.ts +20 -10
- package/src/tools/network/web-search.ts +19 -4
- package/src/tools/permission-checker.ts +116 -46
- package/src/tools/policy-context.ts +29 -8
- package/src/tools/registry.ts +195 -6
- package/src/tools/schedule/create.ts +23 -8
- package/src/tools/schedule/update.ts +3 -1
- package/src/tools/secret-detection-handler.ts +0 -51
- package/src/tools/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/system/avatar-generator.ts +6 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +40 -5
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +9 -4
- package/src/util/pricing.ts +41 -8
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/006-services-config.ts +2 -4
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +2 -3
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +56 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +108 -0
- package/src/workspace/migrations/047-remove-watch-callsites.ts +54 -0
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +81 -0
- package/src/workspace/migrations/049-release-notes-default-sonnet.ts +80 -0
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +86 -0
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +128 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +28 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/tsconfig.json +1 -1
- package/hook-templates/debug-prompt-logger/hook.json +0 -7
- package/hook-templates/debug-prompt-logger/run.sh +0 -66
- package/src/__tests__/context-overflow-approval.test.ts +0 -156
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- package/src/__tests__/hooks-blocking.test.ts +0 -178
- package/src/__tests__/hooks-cli.test.ts +0 -182
- package/src/__tests__/hooks-config.test.ts +0 -108
- package/src/__tests__/hooks-discovery.test.ts +0 -211
- package/src/__tests__/hooks-integration.test.ts +0 -196
- package/src/__tests__/hooks-manager.test.ts +0 -226
- package/src/__tests__/hooks-runner.test.ts +0 -175
- package/src/__tests__/hooks-settings.test.ts +0 -160
- package/src/__tests__/hooks-templates.test.ts +0 -169
- package/src/__tests__/hooks-ts-runner.test.ts +0 -170
- package/src/__tests__/hooks-watch.test.ts +0 -112
- package/src/__tests__/notification-schedule-dedup.test.ts +0 -213
- package/src/__tests__/oauth-scope-policy.test.ts +0 -180
- package/src/__tests__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
- package/src/__tests__/send-notification-tool.test.ts +0 -83
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/cli/commands/shotgun.ts +0 -266
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/conversations/SKILL.md +0 -20
- package/src/config/bundled-skills/conversations/TOOLS.json +0 -23
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +0 -66
- package/src/config/bundled-skills/gmail/SKILL.md +0 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/heartbeat/SKILL.md +0 -43
- package/src/config/bundled-skills/notifications/SKILL.md +0 -40
- package/src/config/bundled-skills/notifications/TOOLS.json +0 -80
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +0 -152
- package/src/config/bundled-skills/notifications/tools/shared.ts +0 -13
- package/src/config/bundled-skills/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/screen-watch/SKILL.md +0 -27
- package/src/config/bundled-skills/screen-watch/TOOLS.json +0 -35
- package/src/config/bundled-skills/screen-watch/tools/start-screen-watch.ts +0 -12
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -84
- package/src/config/bundled-skills/slack/SKILL.md +0 -108
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/daemon/context-overflow-approval.ts +0 -52
- package/src/daemon/watch-handler.ts +0 -399
- package/src/hooks/cli.ts +0 -253
- package/src/hooks/config.ts +0 -100
- package/src/hooks/discovery.ts +0 -135
- package/src/hooks/manager.ts +0 -179
- package/src/hooks/runner.ts +0 -117
- package/src/hooks/templates.ts +0 -77
- package/src/hooks/types.ts +0 -75
- package/src/oauth/scope-policy.ts +0 -89
- package/src/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -139
- package/src/runtime/gateway-internal-client.ts +0 -94
- package/src/runtime/routes/watch-routes.ts +0 -156
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/signals/shotgun.ts +0 -203
- package/src/tools/watch/screen-watch.ts +0 -144
- package/src/tools/watch/watch-state.ts +0 -142
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -4,6 +4,7 @@ import { getLogger } from "../../util/logger.js";
|
|
|
4
4
|
import { truncate } from "../../util/truncate.js";
|
|
5
5
|
import { safeStringSlice } from "../../util/unicode.js";
|
|
6
6
|
import { credentialBroker } from "../credentials/broker.js";
|
|
7
|
+
import { BROWSER_FILL_CAPABILITY } from "../credentials/tool-policy.js";
|
|
7
8
|
import {
|
|
8
9
|
isPrivateOrLocalHost,
|
|
9
10
|
parseUrl,
|
|
@@ -86,19 +87,22 @@ type StatusCheckMode = BrowserStatusMode;
|
|
|
86
87
|
|
|
87
88
|
const MODE_TRADEOFFS: Record<StatusCheckMode, string[]> = {
|
|
88
89
|
[BROWSER_STATUS_MODE.EXTENSION]: [
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"
|
|
90
|
+
"This is the preferred approach for all things browser-use.",
|
|
91
|
+
"On macOS, the host browser proxy is provisioned automatically via the desktop client's SSE bridge — no extension install required.",
|
|
92
|
+
"When the Chrome extension is also installed, it takes priority for direct WebSocket routing to the user's Chrome session.",
|
|
93
|
+
"More secure than relying on Chrome's native remote debugging functionality.",
|
|
92
94
|
],
|
|
93
95
|
[BROWSER_STATUS_MODE.CDP_INSPECT]: [
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
"
|
|
96
|
+
"This is the second-best approach for all things browser-use, after the native Vellum Assistant Chrome Extension.",
|
|
97
|
+
"It requires Chrome version 146 or greater",
|
|
98
|
+
"It requires toggling on remote debugging in Chrome Settings",
|
|
99
|
+
"It's prone to phishing attacks from other local processes that may try to do their own remote debugging.",
|
|
97
100
|
],
|
|
98
101
|
[BROWSER_STATUS_MODE.LOCAL]: [
|
|
99
|
-
"
|
|
100
|
-
"
|
|
102
|
+
"The least-preferred approach for all things browser-use.",
|
|
103
|
+
"Considered a last-resort fallback if the user has not installed the Chrome Extension or enabled remote debugging in Chrome, and has indicated that they do not want to.",
|
|
101
104
|
"Does not use the user's existing browser profile, so sessions/cookies may differ.",
|
|
105
|
+
"Requires that Playwright and Chromium are installed on the host machine,",
|
|
102
106
|
],
|
|
103
107
|
};
|
|
104
108
|
|
|
@@ -186,15 +190,16 @@ export function parseBrowserMode(
|
|
|
186
190
|
const REMEDIATION_HINTS: Record<string, string[]> = {
|
|
187
191
|
// Extension backend
|
|
188
192
|
"extension:transport_error": [
|
|
189
|
-
"Ensure the Vellum browser extension is installed and enabled.",
|
|
190
|
-
"
|
|
191
|
-
"
|
|
193
|
+
"Ensure the Vellum browser extension is installed and enabled, or that the macOS desktop client is running for host browser proxy mode.",
|
|
194
|
+
"For extension mode: check that the extension WebSocket connection is active (extension popup → status).",
|
|
195
|
+
"For macOS host browser proxy: verify the desktop client is running and has an active SSE connection to the assistant.",
|
|
196
|
+
"Try reconnecting the extension or restarting the desktop client.",
|
|
192
197
|
],
|
|
193
198
|
// cdp-inspect backend — discovery-level failures
|
|
194
199
|
"cdp-inspect:unreachable": [
|
|
195
|
-
"Ensure Chrome
|
|
200
|
+
"Ensure that Chrome is on version 146 or higher by going to chrome://settings/help.",
|
|
201
|
+
'Ensure that you have toggled on "Allow remote debugging for this browser instance" by going to chrome://inspect/#remote-debugging',
|
|
196
202
|
"Verify no firewall or antivirus is blocking localhost:9222.",
|
|
197
|
-
"Try: /Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --remote-debugging-port=9222",
|
|
198
203
|
],
|
|
199
204
|
"cdp-inspect:non_chrome": [
|
|
200
205
|
"The process listening on the configured port is not Chrome/Chromium.",
|
|
@@ -322,6 +327,14 @@ function collectRemediationHints(
|
|
|
322
327
|
return hints;
|
|
323
328
|
}
|
|
324
329
|
|
|
330
|
+
/**
|
|
331
|
+
* Detect the common extension CDP failure where the active tab is a
|
|
332
|
+
* restricted Chrome internal page (e.g. `chrome://newtab`).
|
|
333
|
+
*/
|
|
334
|
+
function isRestrictedChromePageProbeError(error: CdpError): boolean {
|
|
335
|
+
return error.message.toLowerCase().includes("chrome://");
|
|
336
|
+
}
|
|
337
|
+
|
|
325
338
|
/**
|
|
326
339
|
* Parse browser_mode from input and acquire a CdpClient. Returns
|
|
327
340
|
* either a `{ cdp, browserMode }` pair on success or a pre-formatted
|
|
@@ -530,7 +543,7 @@ export function resolveElement(
|
|
|
530
543
|
}
|
|
531
544
|
return {
|
|
532
545
|
resolved: null,
|
|
533
|
-
error: `Error: element_id "${elementId}" not found. Run
|
|
546
|
+
error: `Error: element_id "${elementId}" not found. Run a snapshot first to get current element IDs.`,
|
|
534
547
|
};
|
|
535
548
|
}
|
|
536
549
|
|
|
@@ -740,8 +753,8 @@ export async function executeBrowserNavigate(
|
|
|
740
753
|
).blockedAddress)
|
|
741
754
|
) {
|
|
742
755
|
// Navigate the page away from the private target to prevent
|
|
743
|
-
// follow-up
|
|
744
|
-
//
|
|
756
|
+
// follow-up operations (e.g. snapshot) from reading the
|
|
757
|
+
// already-loaded private content.
|
|
745
758
|
try {
|
|
746
759
|
await navigateAndWait(
|
|
747
760
|
cdp,
|
|
@@ -847,7 +860,7 @@ export async function executeBrowserNavigate(
|
|
|
847
860
|
|
|
848
861
|
if (navigationTimedOut) {
|
|
849
862
|
lines.push(
|
|
850
|
-
`Note: Page is still loading (document.readyState timed out). The page should still be interactive -
|
|
863
|
+
`Note: Page is still loading (document.readyState timed out). The page should still be interactive - take a snapshot to check.`,
|
|
851
864
|
);
|
|
852
865
|
}
|
|
853
866
|
|
|
@@ -917,14 +930,12 @@ export async function executeBrowserNavigate(
|
|
|
917
930
|
lines.push("");
|
|
918
931
|
lines.push(formatAuthChallenge(postCaptchaAuth));
|
|
919
932
|
lines.push("");
|
|
933
|
+
lines.push("Handle this by interacting with the login form:");
|
|
920
934
|
lines.push(
|
|
921
|
-
"
|
|
922
|
-
);
|
|
923
|
-
lines.push(
|
|
924
|
-
"1. Use browser_snapshot to find the sign-in form elements",
|
|
935
|
+
"1. Take a snapshot to find the sign-in form elements",
|
|
925
936
|
);
|
|
926
937
|
lines.push(
|
|
927
|
-
"2. Use
|
|
938
|
+
"2. Use credential fill to enter email/password from credential_store",
|
|
928
939
|
);
|
|
929
940
|
lines.push(
|
|
930
941
|
"3. For email verification codes, use ui_show with a form to ask the user for the code mid-turn",
|
|
@@ -944,18 +955,14 @@ export async function executeBrowserNavigate(
|
|
|
944
955
|
}
|
|
945
956
|
} else {
|
|
946
957
|
// Login / 2FA / OAuth - the agent should handle these itself
|
|
947
|
-
// using browser
|
|
958
|
+
// using browser operations + credential_store. Don't hand off.
|
|
948
959
|
lines.push("");
|
|
949
960
|
lines.push(formatAuthChallenge(challenge));
|
|
950
961
|
lines.push("");
|
|
962
|
+
lines.push("Handle this by interacting with the login form:");
|
|
963
|
+
lines.push("1. Take a snapshot to find the sign-in form elements");
|
|
951
964
|
lines.push(
|
|
952
|
-
"
|
|
953
|
-
);
|
|
954
|
-
lines.push(
|
|
955
|
-
"1. Use browser_snapshot to find the sign-in form elements",
|
|
956
|
-
);
|
|
957
|
-
lines.push(
|
|
958
|
-
"2. Use browser_fill_credential to fill email/password from credential_store",
|
|
965
|
+
"2. Use credential fill to enter email/password from credential_store",
|
|
959
966
|
);
|
|
960
967
|
lines.push(
|
|
961
968
|
"3. For email verification codes, use ui_show with a form to ask the user for the code mid-turn",
|
|
@@ -1006,7 +1013,7 @@ export async function executeBrowserNavigate(
|
|
|
1006
1013
|
}
|
|
1007
1014
|
}
|
|
1008
1015
|
|
|
1009
|
-
// ──
|
|
1016
|
+
// ── snapshot ─────────────────────────────────────────────────────────
|
|
1010
1017
|
|
|
1011
1018
|
export async function executeBrowserSnapshot(
|
|
1012
1019
|
_input: Record<string, unknown>,
|
|
@@ -1938,7 +1945,7 @@ export async function executeBrowserExtract(
|
|
|
1938
1945
|
}
|
|
1939
1946
|
}
|
|
1940
1947
|
|
|
1941
|
-
// ──
|
|
1948
|
+
// ── browser credential fill ──────────────────────────────────────────
|
|
1942
1949
|
|
|
1943
1950
|
export async function executeBrowserFillCredential(
|
|
1944
1951
|
input: Record<string, unknown>,
|
|
@@ -1996,7 +2003,7 @@ export async function executeBrowserFillCredential(
|
|
|
1996
2003
|
const result = await credentialBroker.browserFill({
|
|
1997
2004
|
service,
|
|
1998
2005
|
field,
|
|
1999
|
-
toolName:
|
|
2006
|
+
toolName: BROWSER_FILL_CAPABILITY,
|
|
2000
2007
|
domain: pageDomain,
|
|
2001
2008
|
fill: async (value) => {
|
|
2002
2009
|
// Clear-then-focus-then-insert via the shared helper. We
|
|
@@ -2087,24 +2094,59 @@ function modeTradeoffs(mode: StatusCheckMode): string[] {
|
|
|
2087
2094
|
|
|
2088
2095
|
function extensionSetupActions(): string[] {
|
|
2089
2096
|
return [
|
|
2090
|
-
"Install
|
|
2091
|
-
"Open the extension
|
|
2092
|
-
"Keep the extension connected to the assistant relay.",
|
|
2097
|
+
"Install the Vellum Assistant Chrome extension from the Chrome Web Store: https://chromewebstore.google.com/detail/vellum-assistant-browser/hphbdmpffeigpcdjkckleobjmhhokpne",
|
|
2098
|
+
"Open the extension and pair with your assistant.",
|
|
2093
2099
|
];
|
|
2094
2100
|
}
|
|
2095
2101
|
|
|
2102
|
+
function macOSHostBrowserSetupActions(): string[] {
|
|
2103
|
+
return [
|
|
2104
|
+
"Ensure the Vellum desktop app is running and connected to the assistant.",
|
|
2105
|
+
"Open Google Chrome on the desktop machine so the host browser proxy can attach.",
|
|
2106
|
+
"If the desktop client is not running, launch it and wait for the SSE connection to establish.",
|
|
2107
|
+
];
|
|
2108
|
+
}
|
|
2109
|
+
|
|
2110
|
+
function macOSHostBrowserReconnectActions(): string[] {
|
|
2111
|
+
return [
|
|
2112
|
+
"Verify the Vellum desktop app is still running and has an active network connection.",
|
|
2113
|
+
"If the desktop client was recently restarted, send a new message to re-establish the SSE bridge.",
|
|
2114
|
+
"Ensure Chrome is open on the desktop machine for the host browser proxy to target.",
|
|
2115
|
+
];
|
|
2116
|
+
}
|
|
2117
|
+
|
|
2118
|
+
function macOSHostBrowserProbeFailureActions(error: CdpError): string[] {
|
|
2119
|
+
const actions: string[] = [
|
|
2120
|
+
"Ensure Google Chrome is running on the desktop machine.",
|
|
2121
|
+
];
|
|
2122
|
+
const message = error.message.toLowerCase();
|
|
2123
|
+
if (message.includes("timeout") || message.includes("timed out")) {
|
|
2124
|
+
actions.push(
|
|
2125
|
+
"The desktop client may be unresponsive — try restarting the Vellum desktop app.",
|
|
2126
|
+
);
|
|
2127
|
+
}
|
|
2128
|
+
if (message.includes("transport") || message.includes("disconnected")) {
|
|
2129
|
+
actions.push(
|
|
2130
|
+
"The SSE bridge between the assistant and the desktop client appears broken. Send a new message to re-establish the connection.",
|
|
2131
|
+
);
|
|
2132
|
+
}
|
|
2133
|
+
actions.push(
|
|
2134
|
+
"Switch Chrome to a regular http(s) tab (not chrome://...) and retry.",
|
|
2135
|
+
);
|
|
2136
|
+
return dedupeStrings(actions);
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2096
2139
|
function cdpInspectSetupActions(): string[] {
|
|
2097
2140
|
return [
|
|
2098
|
-
"
|
|
2099
|
-
"
|
|
2100
|
-
|
|
2141
|
+
"Update Chrome to the latest version by going to chrome://settings/help",
|
|
2142
|
+
"Navigate directly to chrome://inspect/#remote-debugging",
|
|
2143
|
+
'Check the box next to "Allow remote debugging for this browser instance"',
|
|
2101
2144
|
];
|
|
2102
2145
|
}
|
|
2103
2146
|
|
|
2104
2147
|
function localSetupActions(): string[] {
|
|
2105
2148
|
return [
|
|
2106
|
-
"
|
|
2107
|
-
"Install Chromium for Playwright: bunx playwright install chromium.",
|
|
2149
|
+
"Ask your assistant to install playwright and chromium on your host machine.",
|
|
2108
2150
|
];
|
|
2109
2151
|
}
|
|
2110
2152
|
|
|
@@ -2243,6 +2285,7 @@ async function checkExtensionModeStatus(
|
|
|
2243
2285
|
): Promise<BrowserStatusModeResult> {
|
|
2244
2286
|
const proxyBound = Boolean(context.hostBrowserProxy);
|
|
2245
2287
|
const proxyConnected = context.hostBrowserProxy?.isAvailable() ?? false;
|
|
2288
|
+
const isMacOS = context.transportInterface === "macos";
|
|
2246
2289
|
|
|
2247
2290
|
if (!proxyBound) {
|
|
2248
2291
|
return {
|
|
@@ -2250,13 +2293,20 @@ async function checkExtensionModeStatus(
|
|
|
2250
2293
|
available: false,
|
|
2251
2294
|
verified: "preflight",
|
|
2252
2295
|
autoCandidate,
|
|
2253
|
-
summary:
|
|
2254
|
-
"Extension mode is unavailable:
|
|
2255
|
-
|
|
2296
|
+
summary: isMacOS
|
|
2297
|
+
? "Extension mode is unavailable: the macOS host browser proxy is not bound to this conversation. Ensure the desktop client is connected."
|
|
2298
|
+
: "Extension mode is unavailable: no host browser proxy is bound to this conversation.",
|
|
2299
|
+
userActions: isMacOS
|
|
2300
|
+
? macOSHostBrowserSetupActions()
|
|
2301
|
+
: extensionSetupActions(),
|
|
2256
2302
|
tradeoffs: modeTradeoffs(BROWSER_STATUS_MODE.EXTENSION),
|
|
2257
2303
|
details: {
|
|
2258
2304
|
proxyBound,
|
|
2259
2305
|
proxyConnected,
|
|
2306
|
+
transport:
|
|
2307
|
+
isMacOS && !context.hostBrowserRegistryRouted
|
|
2308
|
+
? "macos-sse"
|
|
2309
|
+
: "extension-ws",
|
|
2260
2310
|
},
|
|
2261
2311
|
};
|
|
2262
2312
|
}
|
|
@@ -2267,13 +2317,20 @@ async function checkExtensionModeStatus(
|
|
|
2267
2317
|
available: false,
|
|
2268
2318
|
verified: "preflight",
|
|
2269
2319
|
autoCandidate,
|
|
2270
|
-
summary:
|
|
2271
|
-
"Extension mode is unavailable: the
|
|
2272
|
-
|
|
2320
|
+
summary: isMacOS
|
|
2321
|
+
? "Extension mode is unavailable: the macOS host browser proxy is bound but the SSE transport is currently disconnected. Verify the desktop client is running and connected."
|
|
2322
|
+
: "Extension mode is unavailable: the extension transport is currently disconnected.",
|
|
2323
|
+
userActions: isMacOS
|
|
2324
|
+
? macOSHostBrowserReconnectActions()
|
|
2325
|
+
: extensionSetupActions(),
|
|
2273
2326
|
tradeoffs: modeTradeoffs(BROWSER_STATUS_MODE.EXTENSION),
|
|
2274
2327
|
details: {
|
|
2275
2328
|
proxyBound,
|
|
2276
2329
|
proxyConnected,
|
|
2330
|
+
transport:
|
|
2331
|
+
isMacOS && !context.hostBrowserRegistryRouted
|
|
2332
|
+
? "macos-sse"
|
|
2333
|
+
: "extension-ws",
|
|
2277
2334
|
},
|
|
2278
2335
|
};
|
|
2279
2336
|
}
|
|
@@ -2288,13 +2345,47 @@ async function checkExtensionModeStatus(
|
|
|
2288
2345
|
available: true,
|
|
2289
2346
|
verified: "active_probe",
|
|
2290
2347
|
autoCandidate,
|
|
2291
|
-
summary:
|
|
2348
|
+
summary: isMacOS
|
|
2349
|
+
? "Extension mode is ready via macOS host browser proxy and responded to an active CDP probe."
|
|
2350
|
+
: "Extension mode is ready and responded to an active CDP probe.",
|
|
2292
2351
|
userActions: [],
|
|
2293
2352
|
tradeoffs: modeTradeoffs(BROWSER_STATUS_MODE.EXTENSION),
|
|
2294
2353
|
details: {
|
|
2295
2354
|
proxyBound,
|
|
2296
2355
|
proxyConnected,
|
|
2297
2356
|
backendKind: probe.backendKind,
|
|
2357
|
+
transport:
|
|
2358
|
+
isMacOS && !context.hostBrowserRegistryRouted
|
|
2359
|
+
? "macos-sse"
|
|
2360
|
+
: "extension-ws",
|
|
2361
|
+
},
|
|
2362
|
+
};
|
|
2363
|
+
}
|
|
2364
|
+
|
|
2365
|
+
if (isRestrictedChromePageProbeError(probe.error)) {
|
|
2366
|
+
return {
|
|
2367
|
+
mode: BROWSER_STATUS_MODE.EXTENSION,
|
|
2368
|
+
available: true,
|
|
2369
|
+
verified: "active_probe",
|
|
2370
|
+
autoCandidate,
|
|
2371
|
+
summary: isMacOS
|
|
2372
|
+
? "Extension mode transport is connected via macOS host browser proxy, but the active Chrome tab is a restricted chrome:// page. Switch to a regular website tab if browser actions fail."
|
|
2373
|
+
: "Extension mode transport is connected, but the active Chrome tab is a restricted chrome:// page. Switch to a regular website tab if browser actions fail.",
|
|
2374
|
+
userActions: [
|
|
2375
|
+
"Switch Chrome to a regular http(s) tab (not chrome://...) and retry.",
|
|
2376
|
+
],
|
|
2377
|
+
tradeoffs: modeTradeoffs(BROWSER_STATUS_MODE.EXTENSION),
|
|
2378
|
+
details: {
|
|
2379
|
+
proxyBound,
|
|
2380
|
+
proxyConnected,
|
|
2381
|
+
restrictedActiveTab: true,
|
|
2382
|
+
errorCode: probe.error.code,
|
|
2383
|
+
diagnostic: probe.diagnostic,
|
|
2384
|
+
attemptDiagnostics: probe.error.attemptDiagnostics ?? [],
|
|
2385
|
+
transport:
|
|
2386
|
+
isMacOS && !context.hostBrowserRegistryRouted
|
|
2387
|
+
? "macos-sse"
|
|
2388
|
+
: "extension-ws",
|
|
2298
2389
|
},
|
|
2299
2390
|
};
|
|
2300
2391
|
}
|
|
@@ -2304,11 +2395,12 @@ async function checkExtensionModeStatus(
|
|
|
2304
2395
|
available: false,
|
|
2305
2396
|
verified: "active_probe",
|
|
2306
2397
|
autoCandidate,
|
|
2307
|
-
summary:
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2398
|
+
summary: isMacOS
|
|
2399
|
+
? `Extension mode probe failed via macOS host browser proxy: ${probe.error.message}`
|
|
2400
|
+
: `Extension mode probe failed: ${probe.error.message}`,
|
|
2401
|
+
userActions: isMacOS
|
|
2402
|
+
? macOSHostBrowserProbeFailureActions(probe.error)
|
|
2403
|
+
: probeFailureActions(BROWSER_STATUS_MODE.EXTENSION, probe.error),
|
|
2312
2404
|
tradeoffs: modeTradeoffs(BROWSER_STATUS_MODE.EXTENSION),
|
|
2313
2405
|
details: {
|
|
2314
2406
|
proxyBound,
|
|
@@ -2316,6 +2408,10 @@ async function checkExtensionModeStatus(
|
|
|
2316
2408
|
errorCode: probe.error.code,
|
|
2317
2409
|
diagnostic: probe.diagnostic,
|
|
2318
2410
|
attemptDiagnostics: probe.error.attemptDiagnostics ?? [],
|
|
2411
|
+
transport:
|
|
2412
|
+
isMacOS && !context.hostBrowserRegistryRouted
|
|
2413
|
+
? "macos-sse"
|
|
2414
|
+
: "extension-ws",
|
|
2319
2415
|
},
|
|
2320
2416
|
};
|
|
2321
2417
|
}
|
|
@@ -2547,7 +2643,7 @@ export async function executeBrowserStatus(
|
|
|
2547
2643
|
} catch (err) {
|
|
2548
2644
|
const msg = err instanceof Error ? err.message : String(err);
|
|
2549
2645
|
return {
|
|
2550
|
-
content: `Error:
|
|
2646
|
+
content: `Error: browser status check failed: ${msg}`,
|
|
2551
2647
|
isError: true,
|
|
2552
2648
|
};
|
|
2553
2649
|
}
|
|
@@ -356,4 +356,234 @@ describe("ExtensionCdpClient", () => {
|
|
|
356
356
|
expect(err.message).toBe("CDP call aborted");
|
|
357
357
|
expect(err.cdpMethod).toBe("Browser.getVersion");
|
|
358
358
|
});
|
|
359
|
+
|
|
360
|
+
// ── Structured transport error classification ────────────────────────
|
|
361
|
+
|
|
362
|
+
test("structured error with code 'transport_error' is classified as transport_error", async () => {
|
|
363
|
+
const errorBody = {
|
|
364
|
+
code: "transport_error",
|
|
365
|
+
message: "Extension WebSocket disconnected",
|
|
366
|
+
};
|
|
367
|
+
const { proxy } = fakeProxy(async () => ({
|
|
368
|
+
content: JSON.stringify(errorBody),
|
|
369
|
+
isError: true,
|
|
370
|
+
}));
|
|
371
|
+
|
|
372
|
+
const client = createExtensionCdpClient(proxy, "conv-transport-1");
|
|
373
|
+
|
|
374
|
+
let caught: unknown;
|
|
375
|
+
try {
|
|
376
|
+
await client.send("Page.navigate", { url: "https://example.com" });
|
|
377
|
+
} catch (err) {
|
|
378
|
+
caught = err;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
expect(caught).toBeInstanceOf(CdpError);
|
|
382
|
+
const err = caught as CdpError;
|
|
383
|
+
expect(err.code).toBe("transport_error");
|
|
384
|
+
expect(err.message).toBe("Extension WebSocket disconnected");
|
|
385
|
+
expect(err.cdpMethod).toBe("Page.navigate");
|
|
386
|
+
expect(err.cdpParams).toEqual({ url: "https://example.com" });
|
|
387
|
+
expect(err.underlying).toEqual(errorBody);
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
test("structured error with code 'unreachable' is classified as transport_error", async () => {
|
|
391
|
+
const errorBody = {
|
|
392
|
+
code: "unreachable",
|
|
393
|
+
message: "Host browser not reachable",
|
|
394
|
+
};
|
|
395
|
+
const { proxy } = fakeProxy(async () => ({
|
|
396
|
+
content: JSON.stringify(errorBody),
|
|
397
|
+
isError: true,
|
|
398
|
+
}));
|
|
399
|
+
|
|
400
|
+
const client = createExtensionCdpClient(proxy, "conv-transport-2");
|
|
401
|
+
|
|
402
|
+
let caught: unknown;
|
|
403
|
+
try {
|
|
404
|
+
await client.send("Runtime.evaluate", { expression: "1+1" });
|
|
405
|
+
} catch (err) {
|
|
406
|
+
caught = err;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
expect(caught).toBeInstanceOf(CdpError);
|
|
410
|
+
const err = caught as CdpError;
|
|
411
|
+
expect(err.code).toBe("transport_error");
|
|
412
|
+
expect(err.message).toBe("Host browser not reachable");
|
|
413
|
+
expect(err.underlying).toEqual(errorBody);
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
test("structured error with code 'timeout' is classified as transport_error", async () => {
|
|
417
|
+
const errorBody = {
|
|
418
|
+
code: "timeout",
|
|
419
|
+
message: "CDP call timed out",
|
|
420
|
+
};
|
|
421
|
+
const { proxy } = fakeProxy(async () => ({
|
|
422
|
+
content: JSON.stringify(errorBody),
|
|
423
|
+
isError: true,
|
|
424
|
+
}));
|
|
425
|
+
|
|
426
|
+
const client = createExtensionCdpClient(proxy, "conv-transport-3");
|
|
427
|
+
|
|
428
|
+
let caught: unknown;
|
|
429
|
+
try {
|
|
430
|
+
await client.send("Page.captureScreenshot");
|
|
431
|
+
} catch (err) {
|
|
432
|
+
caught = err;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
expect(caught).toBeInstanceOf(CdpError);
|
|
436
|
+
const err = caught as CdpError;
|
|
437
|
+
expect(err.code).toBe("transport_error");
|
|
438
|
+
expect(err.message).toBe("CDP call timed out");
|
|
439
|
+
expect(err.underlying).toEqual(errorBody);
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
test("structured error with code 'non_loopback' is classified as transport_error", async () => {
|
|
443
|
+
const errorBody = {
|
|
444
|
+
code: "non_loopback",
|
|
445
|
+
message: "Only loopback addresses are allowed",
|
|
446
|
+
};
|
|
447
|
+
const { proxy } = fakeProxy(async () => ({
|
|
448
|
+
content: JSON.stringify(errorBody),
|
|
449
|
+
isError: true,
|
|
450
|
+
}));
|
|
451
|
+
|
|
452
|
+
const client = createExtensionCdpClient(proxy, "conv-transport-4");
|
|
453
|
+
|
|
454
|
+
let caught: unknown;
|
|
455
|
+
try {
|
|
456
|
+
await client.send("Browser.getVersion");
|
|
457
|
+
} catch (err) {
|
|
458
|
+
caught = err;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
expect(caught).toBeInstanceOf(CdpError);
|
|
462
|
+
const err = caught as CdpError;
|
|
463
|
+
expect(err.code).toBe("transport_error");
|
|
464
|
+
expect(err.message).toBe("Only loopback addresses are allowed");
|
|
465
|
+
expect(err.underlying).toEqual(errorBody);
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
// ── Command-level CDP errors remain cdp_error ────────────────────────
|
|
469
|
+
|
|
470
|
+
test("structured error with numeric code (CDP JSON-RPC) remains cdp_error", async () => {
|
|
471
|
+
const errorBody = {
|
|
472
|
+
code: -32000,
|
|
473
|
+
message: "Cannot find context with specified id",
|
|
474
|
+
};
|
|
475
|
+
const { proxy } = fakeProxy(async () => ({
|
|
476
|
+
content: JSON.stringify(errorBody),
|
|
477
|
+
isError: true,
|
|
478
|
+
}));
|
|
479
|
+
|
|
480
|
+
const client = createExtensionCdpClient(proxy, "conv-cdp-1");
|
|
481
|
+
|
|
482
|
+
let caught: unknown;
|
|
483
|
+
try {
|
|
484
|
+
await client.send("Runtime.evaluate", { expression: "boom" });
|
|
485
|
+
} catch (err) {
|
|
486
|
+
caught = err;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
expect(caught).toBeInstanceOf(CdpError);
|
|
490
|
+
const err = caught as CdpError;
|
|
491
|
+
expect(err.code).toBe("cdp_error");
|
|
492
|
+
expect(err.message).toBe("Cannot find context with specified id");
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
test("structured error with unknown string code remains cdp_error", async () => {
|
|
496
|
+
const errorBody = {
|
|
497
|
+
code: "some_unknown_code",
|
|
498
|
+
message: "Unrecognized error",
|
|
499
|
+
};
|
|
500
|
+
const { proxy } = fakeProxy(async () => ({
|
|
501
|
+
content: JSON.stringify(errorBody),
|
|
502
|
+
isError: true,
|
|
503
|
+
}));
|
|
504
|
+
|
|
505
|
+
const client = createExtensionCdpClient(proxy, "conv-cdp-2");
|
|
506
|
+
|
|
507
|
+
let caught: unknown;
|
|
508
|
+
try {
|
|
509
|
+
await client.send("Page.navigate", { url: "https://example.com" });
|
|
510
|
+
} catch (err) {
|
|
511
|
+
caught = err;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
expect(caught).toBeInstanceOf(CdpError);
|
|
515
|
+
const err = caught as CdpError;
|
|
516
|
+
expect(err.code).toBe("cdp_error");
|
|
517
|
+
expect(err.message).toBe("Unrecognized error");
|
|
518
|
+
});
|
|
519
|
+
|
|
520
|
+
test("structured error without code field remains cdp_error", async () => {
|
|
521
|
+
const errorBody = {
|
|
522
|
+
message: "Something went wrong",
|
|
523
|
+
};
|
|
524
|
+
const { proxy } = fakeProxy(async () => ({
|
|
525
|
+
content: JSON.stringify(errorBody),
|
|
526
|
+
isError: true,
|
|
527
|
+
}));
|
|
528
|
+
|
|
529
|
+
const client = createExtensionCdpClient(proxy, "conv-cdp-3");
|
|
530
|
+
|
|
531
|
+
let caught: unknown;
|
|
532
|
+
try {
|
|
533
|
+
await client.send("DOM.getDocument");
|
|
534
|
+
} catch (err) {
|
|
535
|
+
caught = err;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
expect(caught).toBeInstanceOf(CdpError);
|
|
539
|
+
const err = caught as CdpError;
|
|
540
|
+
expect(err.code).toBe("cdp_error");
|
|
541
|
+
expect(err.message).toBe("Something went wrong");
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
test("structured error with code: null remains cdp_error", async () => {
|
|
545
|
+
const errorBody = {
|
|
546
|
+
code: null,
|
|
547
|
+
message: "Null code error",
|
|
548
|
+
};
|
|
549
|
+
const { proxy } = fakeProxy(async () => ({
|
|
550
|
+
content: JSON.stringify(errorBody),
|
|
551
|
+
isError: true,
|
|
552
|
+
}));
|
|
553
|
+
|
|
554
|
+
const client = createExtensionCdpClient(proxy, "conv-cdp-4");
|
|
555
|
+
|
|
556
|
+
let caught: unknown;
|
|
557
|
+
try {
|
|
558
|
+
await client.send("Browser.getVersion");
|
|
559
|
+
} catch (err) {
|
|
560
|
+
caught = err;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
expect(caught).toBeInstanceOf(CdpError);
|
|
564
|
+
const err = caught as CdpError;
|
|
565
|
+
expect(err.code).toBe("cdp_error");
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
test("plain-text isError content still throws cdp_error (no failover)", async () => {
|
|
569
|
+
const { proxy } = fakeProxy(async () => ({
|
|
570
|
+
content: "Connection lost unexpectedly",
|
|
571
|
+
isError: true,
|
|
572
|
+
}));
|
|
573
|
+
|
|
574
|
+
const client = createExtensionCdpClient(proxy, "conv-cdp-5");
|
|
575
|
+
|
|
576
|
+
let caught: unknown;
|
|
577
|
+
try {
|
|
578
|
+
await client.send("Page.navigate", { url: "https://example.com" });
|
|
579
|
+
} catch (err) {
|
|
580
|
+
caught = err;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
expect(caught).toBeInstanceOf(CdpError);
|
|
584
|
+
const err = caught as CdpError;
|
|
585
|
+
expect(err.code).toBe("cdp_error");
|
|
586
|
+
expect(err.message).toBe("Connection lost unexpectedly");
|
|
587
|
+
expect(err.underlying).toBe("Connection lost unexpectedly");
|
|
588
|
+
});
|
|
359
589
|
});
|