@vellumai/assistant 0.6.2 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +273 -10
- package/Dockerfile +2 -3
- package/bun.lock +41 -49
- package/bunfig.toml +3 -0
- package/docs/architecture/memory.md +1 -1
- package/docs/backup-troubleshooting.md +52 -0
- package/docs/browser-use-architecture-phase2.md +174 -0
- package/docs/stt-provider-onboarding.md +120 -0
- package/knip.json +12 -2
- package/node_modules/@vellumai/ces-contracts/bun.lock +8 -6
- package/node_modules/@vellumai/ces-contracts/package.json +3 -3
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +42 -0
- package/openapi.yaml +1111 -86
- package/package.json +40 -42
- package/scripts/generate-openapi.ts +0 -2
- package/scripts/test.sh +73 -18
- package/src/__tests__/acp-session.test.ts +43 -0
- package/src/__tests__/agent-image-optimize.test.ts +28 -0
- package/src/__tests__/agent-loop.test.ts +123 -0
- package/src/__tests__/anthropic-provider.test.ts +263 -10
- package/src/__tests__/app-builder-tool-scripts.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +1 -0
- package/src/__tests__/app-source-watcher.test.ts +37 -11
- package/src/__tests__/approval-routes-http.test.ts +178 -1
- 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 +240 -94
- package/src/__tests__/browser-manager.test.ts +40 -27
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
- package/src/__tests__/browser-skill-endstate.test.ts +31 -7
- package/src/__tests__/btw-routes.test.ts +7 -0
- package/src/__tests__/call-controller.test.ts +581 -20
- package/src/__tests__/catalog-files.test.ts +1000 -0
- package/src/__tests__/channel-approvals.test.ts +53 -0
- 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__/checker.test.ts +157 -10
- package/src/__tests__/clawhub-files.test.ts +347 -0
- package/src/__tests__/commit-message-enrichment-service.test.ts +36 -19
- package/src/__tests__/config-analysis.test.ts +100 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +326 -0
- package/src/__tests__/config-schema-cmd.test.ts +2 -2
- package/src/__tests__/config-schema.test.ts +1248 -224
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
- package/src/__tests__/config-watcher.test.ts +43 -8
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +23 -0
- package/src/__tests__/contact-store-user-file.test.ts +512 -0
- package/src/__tests__/contacts-write.test.ts +197 -0
- package/src/__tests__/context-overflow-approval.test.ts +16 -1
- package/src/__tests__/context-window-manager.test.ts +88 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop.test.ts +99 -3
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -2
- package/src/__tests__/conversation-attachments.test.ts +80 -4
- package/src/__tests__/conversation-confirmation-signals.test.ts +290 -0
- package/src/__tests__/conversation-error.test.ts +70 -0
- package/src/__tests__/conversation-fork-crud.test.ts +17 -0
- package/src/__tests__/conversation-history-web-search.test.ts +12 -4
- package/src/__tests__/conversation-host-access-routes.test.ts +229 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -1
- package/src/__tests__/conversation-inject-context.test.ts +103 -0
- package/src/__tests__/conversation-launcher-skill-regression.test.ts +51 -0
- package/src/__tests__/conversation-list-source.test.ts +145 -0
- package/src/__tests__/conversation-pre-run-repair.test.ts +2 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
- package/src/__tests__/conversation-queue.test.ts +946 -62
- package/src/__tests__/conversation-routes-disk-view.test.ts +275 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +16 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +324 -46
- package/src/__tests__/conversation-skill-tools.test.ts +7 -4
- package/src/__tests__/conversation-slash-commands.test.ts +33 -0
- package/src/__tests__/conversation-slash-queue.test.ts +89 -18
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
- package/src/__tests__/conversation-starter-routes.test.ts +126 -0
- package/src/__tests__/conversation-starters-cadence.test.ts +161 -0
- package/src/__tests__/conversation-store.test.ts +195 -0
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +226 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +193 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
- package/src/__tests__/credential-execution-approval-bridge.test.ts +32 -1
- package/src/__tests__/credential-health-service.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +6 -3
- package/src/__tests__/credential-vault-unit.test.ts +383 -7
- package/src/__tests__/credential-vault.test.ts +152 -13
- package/src/__tests__/credentials-cli.test.ts +42 -18
- package/src/__tests__/cross-provider-web-search.test.ts +146 -35
- package/src/__tests__/date-context.test.ts +4 -4
- package/src/__tests__/deterministic-verification-control-plane.test.ts +10 -1
- package/src/__tests__/device-id.test.ts +112 -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__/email-html-renderer.test.ts +71 -0
- package/src/__tests__/email-invite-adapter.test.ts +36 -32
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +256 -0
- package/src/__tests__/emit-event-signal.test.ts +71 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +222 -0
- package/src/__tests__/fixtures/mock-chrome-extension.ts +386 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +206 -1
- package/src/__tests__/gateway-only-guard.test.ts +2 -0
- package/src/__tests__/gemini-provider.test.ts +66 -2
- package/src/__tests__/get-skill-detail-audit.test.ts +325 -0
- package/src/__tests__/gmail-archive-fallback.test.ts +193 -0
- package/src/__tests__/gmail-archive-gate.test.ts +246 -0
- package/src/__tests__/gmail-preferences.test.ts +117 -0
- package/src/__tests__/guardian-routing-invariants.test.ts +70 -2
- package/src/__tests__/headless-browser-interactions.test.ts +738 -359
- package/src/__tests__/headless-browser-mode.test.ts +614 -0
- package/src/__tests__/headless-browser-navigate.test.ts +528 -49
- package/src/__tests__/headless-browser-read-tools.test.ts +274 -100
- package/src/__tests__/headless-browser-snapshot.test.ts +250 -77
- package/src/__tests__/heartbeat-service.test.ts +70 -17
- package/src/__tests__/home-state-routes.test.ts +162 -0
- package/src/__tests__/host-bash-proxy.test.ts +145 -1
- package/src/__tests__/host-browser-e2e-cloud.test.ts +596 -0
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +286 -0
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +374 -0
- package/src/__tests__/host-browser-event-routes.test.ts +350 -0
- package/src/__tests__/host-browser-proxy.test.ts +444 -0
- package/src/__tests__/host-browser-routes.test.ts +198 -0
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +423 -0
- package/src/__tests__/host-cu-proxy.test.ts +166 -1
- package/src/__tests__/host-file-proxy.test.ts +185 -1
- package/src/__tests__/host-file-read-tool.test.ts +52 -0
- package/src/__tests__/host-proxy-interface.test.ts +165 -0
- package/src/__tests__/host-shell-tool.test.ts +1 -11
- package/src/__tests__/http-user-message-parity.test.ts +1 -0
- package/src/__tests__/identity-intro-cache.test.ts +40 -10
- package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
- package/src/__tests__/integration-status.test.ts +6 -7
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +37 -12
- package/src/__tests__/llm-context-normalization.test.ts +488 -0
- package/src/__tests__/llm-context-route-provider.test.ts +86 -5
- package/src/__tests__/llm-usage-store.test.ts +363 -0
- package/src/__tests__/mcp-client-auth.test.ts +40 -4
- package/src/__tests__/mcp-health-check.test.ts +10 -3
- 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__/migration-cross-version-compatibility.test.ts +3 -1
- package/src/__tests__/migration-export-http.test.ts +67 -8
- package/src/__tests__/migration-export-streaming.test.ts +66 -0
- package/src/__tests__/migration-import-commit-http.test.ts +109 -7
- 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 +2 -2
- package/src/__tests__/native-host-marker-sync-guard.test.ts +157 -0
- package/src/__tests__/oauth-apps-routes.test.ts +18 -12
- package/src/__tests__/oauth-cli.test.ts +709 -60
- package/src/__tests__/oauth-connect-orchestrator.test.ts +118 -24
- package/src/__tests__/oauth-provider-seed-logos.test.ts +23 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +147 -10
- package/src/__tests__/oauth-provider-visibility.test.ts +19 -21
- package/src/__tests__/oauth-providers-routes.test.ts +52 -14
- package/src/__tests__/oauth-store.test.ts +1465 -176
- package/src/__tests__/oauth2-gateway-transport.test.ts +460 -26
- package/src/__tests__/onboarding-template-contract.test.ts +81 -70
- package/src/__tests__/openai-provider.test.ts +178 -2
- package/src/__tests__/openai-responses-cutover-guard.test.ts +184 -0
- package/src/__tests__/openai-responses-provider.test.ts +1105 -0
- package/src/__tests__/openrouter-token-estimation.test.ts +100 -0
- package/src/__tests__/outlook-categories.test.ts +1 -1
- package/src/__tests__/outlook-client-automation.test.ts +1 -1
- package/src/__tests__/outlook-compose-tools.test.ts +1 -1
- package/src/__tests__/outlook-email-watcher.test.ts +1 -1
- package/src/__tests__/outlook-follow-up.test.ts +1 -1
- package/src/__tests__/outlook-messaging-provider.test.ts +2 -2
- package/src/__tests__/outlook-trash.test.ts +1 -1
- package/src/__tests__/outlook-unsubscribe.test.ts +32 -3
- package/src/__tests__/permission-checker-host-gate.test.ts +74 -14
- package/src/__tests__/permission-mode.test.ts +28 -56
- package/src/__tests__/persona-resolver.test.ts +251 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +4 -0
- package/src/__tests__/platform-callback-registration.test.ts +19 -0
- package/src/__tests__/platform.test.ts +92 -1
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +343 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +267 -0
- package/src/__tests__/pricing.test.ts +174 -0
- package/src/__tests__/proxy-approval-callback.test.ts +18 -0
- package/src/__tests__/qdrant-manager.test.ts +29 -8
- 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 +423 -5
- package/src/__tests__/require-fresh-approval.test.ts +40 -1
- package/src/__tests__/sanitize-config-for-transfer.test.ts +132 -0
- package/src/__tests__/schedule-routes.test.ts +162 -0
- package/src/__tests__/search-skills-unified.test.ts +118 -0
- package/src/__tests__/secret-detection-handler.test.ts +84 -0
- package/src/__tests__/secret-ingress-http.test.ts +1 -0
- package/src/__tests__/secret-scanner-executor.test.ts +4 -0
- package/src/__tests__/secure-keys.test.ts +107 -0
- package/src/__tests__/send-endpoint-busy.test.ts +8 -1
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +49 -0
- package/src/__tests__/set-permission-mode.test.ts +13 -250
- package/src/__tests__/settings-routes.test.ts +201 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +801 -0
- package/src/__tests__/skills-files-catalog-fallback.test.ts +738 -0
- package/src/__tests__/skills.test.ts +5 -2
- package/src/__tests__/skillssh-files.test.ts +446 -0
- package/src/__tests__/slack-block-formatting.test.ts +110 -0
- package/src/__tests__/slack-channel-config.test.ts +576 -16
- package/src/__tests__/stt-catalog-parity.test.ts +282 -0
- package/src/__tests__/stt-stream-session.test.ts +535 -0
- package/src/__tests__/subagent-detail.test.ts +44 -2
- package/src/__tests__/subagent-disposal.test.ts +1 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +291 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +384 -0
- package/src/__tests__/subagent-manager-notify.test.ts +1 -0
- package/src/__tests__/subagent-notify-parent.test.ts +1 -0
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +411 -0
- package/src/__tests__/subagent-tools.test.ts +1 -0
- package/src/__tests__/subagent-types.test.ts +1 -0
- package/src/__tests__/system-prompt-ask-mode.test.ts +27 -71
- package/src/__tests__/system-prompt.test.ts +184 -27
- package/src/__tests__/task-scheduler.test.ts +32 -6
- package/src/__tests__/telegram-config.test.ts +10 -13
- package/src/__tests__/telephony-stt-routing.test.ts +329 -0
- package/src/__tests__/terminal-tools.test.ts +25 -5
- package/src/__tests__/test-preload.ts +18 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +4 -1
- package/src/__tests__/tool-approval-handler.test.ts +73 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +9 -5
- package/src/__tests__/tool-executor-shell-integration.test.ts +4 -0
- package/src/__tests__/tool-executor.test.ts +33 -24
- package/src/__tests__/tool-result-truncation.test.ts +36 -0
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +22 -0
- package/src/__tests__/top-level-renderer.test.ts +73 -1
- package/src/__tests__/transport-hints-queue.test.ts +14 -29
- package/src/__tests__/trust-store.test.ts +7 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +109 -0
- 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-format.test.ts +59 -0
- package/src/__tests__/update-bulletin.test.ts +206 -5
- package/src/__tests__/usage-routes.test.ts +25 -4
- package/src/__tests__/user-reference.test.ts +46 -61
- package/src/__tests__/v2-consent-policy.test.ts +103 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -0
- package/src/__tests__/voice-config-update.test.ts +403 -0
- package/src/__tests__/voice-quality.test.ts +434 -19
- 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-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-policy.test.ts +2 -0
- package/src/acp/client-handler.ts +30 -4
- package/src/agent/image-optimize.ts +24 -12
- package/src/agent/loop.ts +55 -9
- package/src/approvals/guardian-request-resolvers.ts +21 -15
- 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-session/__tests__/manager.test.ts +297 -0
- package/src/browser-session/backends/cdp-inspect.ts +30 -0
- package/src/browser-session/backends/extension.ts +26 -0
- package/src/browser-session/backends/local.ts +24 -0
- package/src/browser-session/events.ts +164 -0
- package/src/browser-session/index.ts +27 -0
- package/src/browser-session/manager.ts +159 -0
- package/src/browser-session/types.ts +28 -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/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 +8 -1
- package/src/channels/__tests__/types.test.ts +134 -0
- package/src/channels/types.ts +69 -3
- package/src/cli/__tests__/run-assistant-command.ts +11 -1
- package/src/cli/commands/__tests__/backup.test.ts +1165 -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 +22 -4
- package/src/cli/commands/__tests__/email-register.test.ts +4 -4
- package/src/cli/commands/__tests__/email-send.test.ts +37 -4
- 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/backup.ts +993 -0
- package/src/cli/commands/conversations.ts +77 -0
- package/src/cli/commands/credentials.ts +3 -4
- package/src/cli/commands/domain.ts +210 -0
- package/src/cli/commands/email.ts +273 -16
- package/src/cli/commands/mcp.ts +16 -4
- package/src/cli/commands/oauth/__tests__/connect.test.ts +56 -44
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +21 -21
- package/src/cli/commands/oauth/__tests__/mode.test.ts +17 -17
- package/src/cli/commands/oauth/__tests__/ping.test.ts +16 -16
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +32 -33
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +330 -0
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +117 -12
- package/src/cli/commands/oauth/__tests__/status.test.ts +10 -10
- package/src/cli/commands/oauth/__tests__/token.test.ts +7 -7
- package/src/cli/commands/oauth/apps.ts +7 -4
- package/src/cli/commands/oauth/connect.ts +6 -3
- package/src/cli/commands/oauth/disconnect.ts +1 -1
- package/src/cli/commands/oauth/mode.ts +12 -3
- package/src/cli/commands/oauth/providers.ts +215 -36
- package/src/cli/commands/oauth/shared.ts +7 -6
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +254 -0
- package/src/cli/commands/platform/__tests__/connect.test.ts +6 -0
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +6 -0
- package/src/cli/commands/platform/index.ts +107 -10
- package/src/cli/commands/usage.ts +10 -9
- package/src/cli/lib/daemon-credential-client.ts +4 -0
- package/src/cli/program.ts +30 -4
- 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/SKILL.md +26 -249
- package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +141 -0
- package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +56 -0
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +125 -0
- package/src/config/bundled-skills/browser/SKILL.md +30 -5
- package/src/config/bundled-skills/browser/TOOLS.json +123 -0
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-status.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +17 -0
- package/src/config/bundled-skills/contacts/SKILL.md +5 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -0
- package/src/config/bundled-skills/gmail/SKILL.md +54 -8
- package/src/config/bundled-skills/gmail/TOOLS.json +33 -3
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +116 -9
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +138 -11
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +59 -0
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +82 -0
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +113 -17
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +2 -2
- 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/tools/extract-keyframes.ts +0 -10
- package/src/config/bundled-skills/messaging/SKILL.md +3 -3
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +2 -2
- package/src/config/bundled-skills/outlook/SKILL.md +9 -2
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +2 -2
- package/src/config/bundled-skills/phone-calls/SKILL.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +27 -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/slack/SKILL.md +1 -0
- package/src/config/bundled-skills/subagent/SKILL.md +21 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +8 -4
- package/src/config/bundled-skills/tasks/SKILL.md +5 -0
- 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 +8 -0
- package/src/config/env-registry.ts +38 -0
- package/src/config/env.ts +49 -4
- package/src/config/feature-flag-registry.json +85 -14
- package/src/config/loader.ts +82 -13
- package/src/config/sanitize-for-transfer.ts +47 -0
- package/src/config/schema.ts +81 -15
- package/src/config/schemas/__tests__/stt.test.ts +43 -0
- package/src/config/schemas/analysis.ts +51 -0
- package/src/config/schemas/backup.ts +72 -0
- package/src/config/schemas/calls.ts +1 -26
- package/src/config/schemas/elevenlabs.ts +0 -59
- package/src/config/schemas/filing.ts +47 -7
- package/src/config/schemas/heartbeat.ts +27 -5
- package/src/config/schemas/host-browser.ts +112 -0
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/memory-lifecycle.ts +14 -2
- package/src/config/schemas/memory-retrieval.ts +103 -0
- package/src/config/schemas/security.ts +0 -6
- package/src/config/schemas/services.ts +52 -0
- package/src/config/schemas/stt.ts +59 -0
- package/src/config/schemas/tts.ts +230 -0
- package/src/config/schemas/updates.ts +14 -0
- package/src/config/skills.ts +4 -0
- package/src/config/types.ts +4 -1
- package/src/contacts/contact-store.ts +56 -11
- package/src/contacts/contacts-write.ts +38 -1
- package/src/context/post-turn-tool-result-truncation.ts +177 -0
- package/src/context/tool-result-truncation.ts +2 -1
- package/src/context/window-manager.ts +61 -10
- package/src/credential-execution/approval-bridge.ts +49 -15
- package/src/credential-execution/executable-discovery.ts +12 -2
- package/src/credential-execution/process-manager.ts +33 -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 +195 -0
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +127 -0
- package/src/daemon/app-source-watcher.ts +35 -0
- package/src/daemon/config-watcher.ts +99 -5
- package/src/daemon/context-overflow-approval.ts +5 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +23 -2
- package/src/daemon/conversation-agent-loop.ts +153 -42
- package/src/daemon/conversation-attachments.ts +40 -0
- package/src/daemon/conversation-error.ts +11 -0
- package/src/daemon/conversation-history.ts +40 -6
- package/src/daemon/conversation-launch.ts +220 -0
- package/src/daemon/conversation-lifecycle.ts +59 -9
- package/src/daemon/conversation-messaging.ts +37 -3
- package/src/daemon/conversation-notifiers.ts +5 -0
- package/src/daemon/conversation-process.ts +622 -13
- package/src/daemon/conversation-queue-manager.ts +24 -0
- package/src/daemon/conversation-runtime-assembly.ts +128 -36
- package/src/daemon/conversation-slash.ts +36 -0
- package/src/daemon/conversation-surfaces.ts +131 -40
- package/src/daemon/conversation-tool-setup.ts +99 -8
- package/src/daemon/conversation-usage.ts +7 -4
- package/src/daemon/conversation-workspace.ts +12 -0
- package/src/daemon/conversation.ts +292 -16
- package/src/daemon/date-context.ts +10 -10
- package/src/daemon/first-greeting.ts +3 -2
- package/src/daemon/handlers/config-slack-channel.ts +269 -94
- package/src/daemon/handlers/conversations.ts +13 -141
- package/src/daemon/handlers/shared.ts +80 -0
- package/src/daemon/handlers/skills.ts +483 -44
- package/src/daemon/host-bash-proxy.ts +48 -13
- package/src/daemon/host-browser-proxy.ts +192 -0
- package/src/daemon/host-cu-proxy.ts +36 -11
- package/src/daemon/host-file-proxy.ts +57 -9
- package/src/daemon/lifecycle.ts +179 -28
- package/src/daemon/message-protocol.ts +13 -0
- package/src/daemon/message-types/conversations.ts +89 -14
- package/src/daemon/message-types/home.ts +40 -0
- package/src/daemon/message-types/host-browser.ts +100 -0
- package/src/daemon/message-types/meet.ts +143 -0
- package/src/daemon/message-types/messages.ts +19 -5
- package/src/daemon/message-types/schedules.ts +34 -2
- package/src/daemon/message-types/skills.ts +26 -0
- package/src/daemon/message-types/subagents.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/server.ts +439 -14
- package/src/daemon/shutdown-handlers.ts +32 -4
- package/src/daemon/shutdown-registry.ts +40 -0
- package/src/daemon/tool-side-effects.ts +15 -0
- package/src/daemon/transport-hints.ts +5 -24
- package/src/email/html-renderer.ts +76 -0
- package/src/heartbeat/heartbeat-service.ts +93 -7
- 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 +194 -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 +398 -0
- package/src/home/assistant-feed-authoring.ts +124 -0
- package/src/home/emit-feed-event.ts +158 -0
- package/src/home/feed-scheduler.ts +247 -0
- package/src/home/feed-types.ts +181 -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 +384 -0
- package/src/hooks/runner.ts +7 -0
- package/src/inbound/platform-callback-registration.ts +30 -20
- package/src/inbound/public-ingress-urls.ts +12 -0
- package/src/instrument.ts +1 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +200 -0
- package/src/ipc/cli-client.ts +151 -0
- package/src/ipc/cli-server.ts +234 -0
- package/src/ipc/gateway-client.ts +180 -0
- package/src/ipc/routes/index.ts +5 -0
- package/src/ipc/routes/wake-conversation.ts +19 -0
- package/src/mcp/client.ts +59 -24
- 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 +232 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +196 -0
- package/src/memory/app-store.ts +31 -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 +73 -0
- package/src/memory/conversation-crud.ts +122 -0
- package/src/memory/conversation-disk-view.ts +7 -0
- package/src/memory/conversation-group-migration.ts +34 -2
- package/src/memory/conversation-queries.ts +6 -5
- package/src/memory/conversation-starters-cadence.ts +76 -0
- package/src/memory/conversation-title-service.ts +5 -2
- package/src/memory/db-init.ts +18 -0
- package/src/memory/db-maintenance.ts +108 -0
- package/src/memory/db.ts +1 -0
- package/src/memory/embedding-backend.test.ts +75 -0
- package/src/memory/embedding-backend.ts +131 -5
- package/src/memory/embedding-gemini.test.ts +54 -0
- package/src/memory/embedding-gemini.ts +20 -9
- package/src/memory/embedding-local.ts +176 -17
- package/src/memory/graph/consolidation.ts +10 -23
- package/src/memory/graph/conversation-graph-memory.ts +15 -0
- package/src/memory/graph/extraction-job.ts +15 -0
- package/src/memory/graph/extraction.test.ts +23 -0
- package/src/memory/graph/extraction.ts +8 -0
- package/src/memory/graph/retriever.ts +67 -40
- package/src/memory/graph/scoring.test.ts +186 -0
- package/src/memory/graph/scoring.ts +31 -1
- package/src/memory/graph/store.test.ts +7 -3
- package/src/memory/graph/store.ts +47 -12
- package/src/memory/graph/tools.ts +1 -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 +16 -10
- package/src/memory/jobs-store.ts +64 -4
- package/src/memory/jobs-worker.ts +22 -9
- package/src/memory/llm-usage-store.ts +137 -60
- package/src/memory/migrations/213-oauth-providers-scope-separator.ts +13 -0
- package/src/memory/migrations/214-oauth-providers-refresh-url.ts +11 -0
- package/src/memory/migrations/215-oauth-providers-revoke.ts +14 -0
- package/src/memory/migrations/216-oauth-providers-token-auth-method.ts +30 -0
- package/src/memory/migrations/217-conversation-host-access.ts +40 -0
- package/src/memory/migrations/218-oauth-providers-logo-url.ts +11 -0
- 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/index.ts +12 -0
- package/src/memory/migrations/registry.ts +16 -0
- package/src/memory/qdrant-manager.ts +43 -16
- package/src/memory/schema/conversations.ts +3 -0
- package/src/memory/schema/oauth.ts +21 -13
- package/src/memory/usage-buckets.ts +396 -0
- package/src/messaging/providers/gmail/client.ts +57 -6
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +282 -0
- package/src/messaging/providers/slack/adapter.ts +143 -38
- package/src/messaging/providers/slack/client.ts +16 -0
- package/src/messaging/providers/slack/types.ts +4 -0
- package/src/notifications/decision-engine.ts +3 -3
- package/src/notifications/signal.ts +5 -0
- package/src/oauth/AGENTS.md +76 -0
- package/src/oauth/__tests__/identity-verifier.test.ts +25 -19
- package/src/oauth/__tests__/seed-providers-managed.test.ts +32 -0
- package/src/oauth/byo-connection.test.ts +26 -9
- package/src/oauth/byo-connection.ts +10 -8
- package/src/oauth/connect-orchestrator.ts +25 -21
- package/src/oauth/connect-types.ts +3 -3
- package/src/oauth/connection-resolver.test.ts +17 -4
- package/src/oauth/connection-resolver.ts +22 -18
- package/src/oauth/connection.ts +3 -1
- package/src/oauth/manual-token-connection.ts +13 -13
- package/src/oauth/oauth-store.ts +223 -100
- package/src/oauth/platform-connection.test.ts +101 -3
- package/src/oauth/platform-connection.ts +56 -35
- package/src/oauth/provider-serializer.ts +31 -5
- package/src/oauth/revoke.ts +76 -0
- package/src/oauth/seed-providers.ts +133 -87
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +16 -6
- package/src/permissions/defaults.ts +49 -1
- package/src/permissions/permission-mode.ts +4 -11
- package/src/permissions/prompter.ts +13 -1
- package/src/permissions/trust-store.ts +3 -3
- package/src/permissions/v2-consent-policy.ts +87 -0
- package/src/permissions/workspace-policy.ts +3 -0
- package/src/platform/client.test.ts +10 -0
- package/src/platform/sync-identity.ts +129 -0
- package/src/prompts/persona-resolver.ts +126 -2
- package/src/prompts/system-prompt.ts +76 -38
- package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +3 -65
- package/src/prompts/templates/BOOTSTRAP.md +59 -105
- package/src/prompts/templates/SOUL.md +3 -1
- package/src/prompts/templates/UPDATES.md +12 -0
- package/src/prompts/templates/channels/slack.md +20 -0
- package/src/prompts/update-bulletin-format.ts +26 -9
- package/src/prompts/update-bulletin.ts +34 -23
- package/src/prompts/user-reference.ts +20 -17
- package/src/providers/__tests__/provider-secret-catalog.test.ts +42 -0
- package/src/providers/anthropic/client.ts +157 -60
- package/src/providers/fireworks/client.ts +2 -2
- package/src/providers/gemini/client.ts +9 -1
- package/src/providers/model-catalog.ts +6 -0
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/ollama/client.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +474 -0
- package/src/providers/openai/client.ts +25 -440
- package/src/providers/openai/responses-provider.ts +502 -0
- package/src/providers/openrouter/client.ts +101 -4
- package/src/providers/provider-secret-catalog.ts +139 -0
- package/src/providers/registry.ts +2 -2
- package/src/providers/retry.ts +14 -3
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +251 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +828 -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 +306 -0
- package/src/providers/speech-to-text/resolve.ts +386 -6
- package/src/providers/types.ts +10 -1
- package/src/runtime/AGENTS.md +65 -0
- package/src/runtime/__tests__/agent-wake.test.ts +831 -0
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +715 -0
- package/src/runtime/__tests__/capability-tokens.test.ts +258 -0
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +518 -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 +512 -0
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
- package/src/runtime/auth/__tests__/middleware.test.ts +116 -1
- package/src/runtime/auth/__tests__/route-policy.test.ts +48 -0
- package/src/runtime/auth/middleware.ts +98 -0
- package/src/runtime/auth/route-policy.ts +33 -9
- package/src/runtime/auth/token-service.ts +56 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- package/src/runtime/capability-tokens.ts +414 -0
- package/src/runtime/channel-approvals.ts +18 -5
- 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/chrome-extension-registry.ts +368 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +6 -0
- package/src/runtime/guardian-decision-types.ts +7 -0
- package/src/runtime/http-server.ts +815 -75
- package/src/runtime/http-types.ts +6 -2
- package/src/runtime/migrations/__tests__/rebind-secrets-credentials.test.ts +172 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +276 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +198 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +360 -0
- package/src/runtime/migrations/migration-transport.ts +7 -0
- package/src/runtime/migrations/migration-wizard.ts +23 -2
- package/src/runtime/migrations/rebind-secrets-screen.ts +76 -15
- package/src/runtime/migrations/vbundle-builder.ts +145 -38
- package/src/runtime/migrations/vbundle-import-analyzer.ts +96 -1
- package/src/runtime/migrations/vbundle-importer.ts +89 -5
- package/src/runtime/pending-interactions.ts +18 -13
- package/src/runtime/routes/__tests__/backup-routes.test.ts +967 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +507 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +208 -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-routes.ts +90 -16
- package/src/runtime/routes/attachment-routes.test.ts +9 -3
- package/src/runtime/routes/attachment-routes.ts +216 -17
- package/src/runtime/routes/backup-routes.ts +519 -0
- package/src/runtime/routes/browser-extension-pair-routes.ts +556 -0
- package/src/runtime/routes/btw-routes.ts +8 -6
- 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 -141
- package/src/runtime/routes/conversation-management-routes.ts +223 -0
- package/src/runtime/routes/conversation-routes.ts +598 -103
- package/src/runtime/routes/conversation-starter-routes.ts +78 -16
- package/src/runtime/routes/filing-routes.ts +93 -0
- package/src/runtime/routes/guardian-action-routes.ts +24 -13
- package/src/runtime/routes/home-feed-routes.ts +334 -0
- package/src/runtime/routes/home-state-routes.ts +138 -0
- package/src/runtime/routes/host-browser-routes.ts +268 -0
- package/src/runtime/routes/host-file-routes.ts +9 -1
- package/src/runtime/routes/identity-intro-cache.ts +7 -3
- package/src/runtime/routes/identity-routes.ts +262 -33
- 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 +11 -3
- package/src/runtime/routes/integrations/slack/share.ts +45 -7
- package/src/runtime/routes/llm-context-normalization.ts +303 -0
- package/src/runtime/routes/log-export-routes.ts +42 -22
- package/src/runtime/routes/memory-item-routes.test.ts +3 -2
- package/src/runtime/routes/memory-item-routes.ts +1 -7
- package/src/runtime/routes/migration-routes.ts +122 -2
- package/src/runtime/routes/oauth-apps.ts +15 -17
- package/src/runtime/routes/oauth-providers.ts +4 -0
- package/src/runtime/routes/schedule-routes.ts +24 -11
- package/src/runtime/routes/settings-routes.ts +31 -102
- package/src/runtime/routes/skills-routes.ts +128 -9
- package/src/runtime/routes/stt-routes.ts +233 -0
- package/src/runtime/routes/subagents-routes.ts +14 -10
- package/src/runtime/routes/surface-action-routes.ts +41 -2
- package/src/runtime/routes/tts-routes.ts +108 -24
- package/src/runtime/routes/usage-routes.ts +38 -9
- 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.ts +8 -1
- package/src/runtime/routes/workspace-routes.test.ts +22 -0
- package/src/runtime/routes/workspace-routes.ts +8 -1
- package/src/runtime/routes/workspace-utils.ts +2 -0
- package/src/runtime/runtime-mode.ts +33 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +444 -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 +344 -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 +49 -0
- package/src/runtime/slack-block-formatting.ts +437 -10
- package/src/schedule/scheduler.ts +57 -5
- package/src/security/ces-credential-client.ts +20 -0
- package/src/security/ces-rpc-credential-backend.ts +17 -0
- package/src/security/credential-backend.ts +5 -0
- package/src/security/oauth2.ts +68 -29
- package/src/security/secure-keys.ts +143 -27
- package/src/security/token-manager.ts +31 -10
- package/src/sequence/engine.ts +23 -0
- package/src/sequence/types.ts +1 -1
- package/src/skills/catalog-files.ts +554 -0
- 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-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 +392 -0
- package/src/stt/__tests__/types.test.ts +89 -0
- package/src/stt/daemon-batch-transcriber.ts +195 -0
- package/src/stt/stt-stream-session.ts +499 -0
- package/src/stt/types.ts +330 -0
- package/src/stt/wav-encoder.test.ts +373 -0
- package/src/stt/wav-encoder.ts +175 -0
- package/src/subagent/manager.ts +169 -40
- package/src/subagent/types.ts +19 -0
- package/src/tools/apps/executors.ts +11 -2
- package/src/tools/browser/__tests__/auth-detector.test.ts +202 -108
- package/src/tools/browser/__tests__/browser-mode.test.ts +119 -0
- package/src/tools/browser/__tests__/browser-status.test.ts +123 -0
- package/src/tools/browser/auth-detector.ts +43 -12
- package/src/tools/browser/browser-execution.ts +1787 -342
- package/src/tools/browser/browser-manager.ts +81 -12
- 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__/accessibility-snapshot.test.ts +318 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +1175 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +1263 -0
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +359 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +1993 -0
- package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-nested-frames.json +64 -0
- package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-simple.json +69 -0
- package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +310 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +96 -0
- package/src/tools/browser/cdp-client/accessibility-snapshot.ts +387 -0
- package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +695 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +1007 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +580 -0
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +744 -0
- package/src/tools/browser/cdp-client/cdp-inspect/ws-transport.ts +579 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +868 -0
- package/src/tools/browser/cdp-client/errors.ts +49 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +148 -0
- package/src/tools/browser/cdp-client/factory.ts +914 -0
- package/src/tools/browser/cdp-client/index.ts +28 -0
- package/src/tools/browser/cdp-client/local-cdp-client.ts +187 -0
- package/src/tools/browser/cdp-client/types.ts +120 -0
- package/src/tools/credentials/vault.ts +35 -6
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +1 -1
- package/src/tools/host-filesystem/read.ts +12 -15
- package/src/tools/host-filesystem/write.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +21 -16
- package/src/tools/network/web-fetch.ts +5 -2
- package/src/tools/network/web-search.ts +5 -2
- package/src/tools/permission-checker.ts +77 -82
- package/src/tools/registry.ts +0 -2
- package/src/tools/secret-detection-handler.ts +34 -0
- package/src/tools/shared/filesystem/image-read.ts +61 -40
- package/src/tools/shared/shell-output.ts +3 -1
- package/src/tools/side-effects.ts +2 -0
- package/src/tools/skills/sandbox-runner.ts +3 -2
- package/src/tools/subagent/spawn.ts +47 -3
- package/src/tools/subagent/status.ts +2 -0
- package/src/tools/system/register.ts +2 -16
- package/src/tools/terminal/safe-env.ts +15 -0
- package/src/tools/terminal/shell.ts +36 -20
- package/src/tools/tool-approval-handler.ts +48 -2
- package/src/tools/tool-manifest.ts +21 -0
- package/src/tools/types.ts +19 -0
- package/src/tools/ui-surface/definitions.ts +6 -1
- package/src/tts/__tests__/provider-adapters.test.ts +834 -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 +201 -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 +42 -0
- package/src/tts/providers/register-builtins.ts +130 -0
- package/src/tts/synthesize-text.ts +110 -0
- package/src/tts/tts-config-resolver.ts +78 -0
- package/src/tts/types.ts +153 -0
- package/src/types/onboarding-context.ts +7 -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/platform.ts +63 -24
- package/src/util/pricing.ts +66 -3
- 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 +23 -0
- package/src/watcher/watcher-store.ts +31 -0
- 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/registry.ts +16 -0
- package/src/workspace/top-level-renderer.ts +31 -1
- package/src/workspace/turn-commit.ts +31 -0
- package/src/__tests__/chrome-cdp.test.ts +0 -419
- package/src/__tests__/email-cli.test.ts +0 -297
- package/src/__tests__/email-service-config-fallback.test.ts +0 -102
- package/src/__tests__/permission-mode-sse.test.ts +0 -418
- package/src/__tests__/permission-mode-store.test.ts +0 -277
- package/src/browser-extension-relay/protocol.ts +0 -63
- package/src/browser-extension-relay/server.ts +0 -203
- package/src/cli/commands/browser-relay.ts +0 -536
- package/src/config/schemas/sandbox.ts +0 -14
- 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/permissions/permission-mode-store.ts +0 -180
- package/src/prompts/templates/USER.md +0 -13
- package/src/providers/speech-to-text/types.ts +0 -17
- package/src/tools/browser/chrome-cdp.ts +0 -239
- package/src/tools/system/set-permission-mode.ts +0 -103
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export {
|
|
2
|
+
CdpInspectClient,
|
|
3
|
+
type CdpInspectClientOptions,
|
|
4
|
+
type CdpInspectHelpers,
|
|
5
|
+
createCdpInspectClient,
|
|
6
|
+
} from "./cdp-inspect-client.js";
|
|
7
|
+
export { CdpError, type CdpErrorCode } from "./errors.js";
|
|
8
|
+
export {
|
|
9
|
+
createExtensionCdpClient,
|
|
10
|
+
ExtensionCdpClient,
|
|
11
|
+
} from "./extension-cdp-client.js";
|
|
12
|
+
export {
|
|
13
|
+
buildCandidateList,
|
|
14
|
+
buildChainedClient,
|
|
15
|
+
buildPinnedCandidateList,
|
|
16
|
+
getCdpClient,
|
|
17
|
+
type GetCdpClientOptions,
|
|
18
|
+
} from "./factory.js";
|
|
19
|
+
export { createLocalCdpClient, LocalCdpClient } from "./local-cdp-client.js";
|
|
20
|
+
export type {
|
|
21
|
+
AttemptDiagnostic,
|
|
22
|
+
AttemptStage,
|
|
23
|
+
BackendCandidate,
|
|
24
|
+
BrowserMode,
|
|
25
|
+
CdpClient,
|
|
26
|
+
CdpClientKind,
|
|
27
|
+
ScopedCdpClient,
|
|
28
|
+
} from "./types.js";
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { getLogger } from "../../../util/logger.js";
|
|
2
|
+
import { browserManager } from "../browser-manager.js";
|
|
3
|
+
import { CdpError } from "./errors.js";
|
|
4
|
+
import type { CdpClientKind, ScopedCdpClient } from "./types.js";
|
|
5
|
+
|
|
6
|
+
const log = getLogger("local-cdp-client");
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Minimal shape of the Playwright CDPSession we depend on. Avoids a
|
|
10
|
+
* direct Playwright type import so the CDP client stays buildable
|
|
11
|
+
* even when Playwright types are not present (dev builds, CI jobs
|
|
12
|
+
* that skip the playwright install).
|
|
13
|
+
*/
|
|
14
|
+
interface PlaywrightCdpSession {
|
|
15
|
+
send(method: string, params?: Record<string, unknown>): Promise<unknown>;
|
|
16
|
+
detach(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Minimal shape of the Playwright Page we use for CDP session
|
|
21
|
+
* creation. Intentionally narrow so we never have to import the
|
|
22
|
+
* Playwright types directly from this module.
|
|
23
|
+
*/
|
|
24
|
+
interface RawPlaywrightPage {
|
|
25
|
+
context(): {
|
|
26
|
+
newCDPSession(page: unknown): Promise<PlaywrightCdpSession>;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Playwright-backed implementation of {@link ScopedCdpClient}. Used
|
|
32
|
+
* for CLI conversations, headless cloud conversations, unit tests,
|
|
33
|
+
* and any desktop conversation that does not have a `hostBrowserProxy`
|
|
34
|
+
* configured.
|
|
35
|
+
*
|
|
36
|
+
* LocalCdpClient owns only the per-conversation CDP session; the
|
|
37
|
+
* underlying Chromium is still launched and torn down by
|
|
38
|
+
* `browserManager.ensureContext()` / `browserManager.shutdown()`.
|
|
39
|
+
*/
|
|
40
|
+
export class LocalCdpClient implements ScopedCdpClient {
|
|
41
|
+
readonly kind: CdpClientKind = "local";
|
|
42
|
+
|
|
43
|
+
private sessionPromise: Promise<PlaywrightCdpSession> | null = null;
|
|
44
|
+
private disposed = false;
|
|
45
|
+
|
|
46
|
+
constructor(public readonly conversationId: string) {}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Lazily create (and cache) a Playwright CDP session for this
|
|
50
|
+
* conversation. Concurrent callers share the same in-flight promise
|
|
51
|
+
* so `newCDPSession` is only called once per LocalCdpClient
|
|
52
|
+
* instance.
|
|
53
|
+
*
|
|
54
|
+
* If the underlying browser launch / `newCDPSession` rejects (e.g.
|
|
55
|
+
* a transient Chromium spawn failure), the cached promise is
|
|
56
|
+
* cleared so the next `ensureSession()` call retries from scratch
|
|
57
|
+
* instead of replaying the same rejection forever.
|
|
58
|
+
*/
|
|
59
|
+
private async ensureSession(): Promise<PlaywrightCdpSession> {
|
|
60
|
+
if (this.disposed) {
|
|
61
|
+
throw new CdpError("disposed", "LocalCdpClient already disposed");
|
|
62
|
+
}
|
|
63
|
+
if (this.sessionPromise) return this.sessionPromise;
|
|
64
|
+
const created = this.createSession();
|
|
65
|
+
this.sessionPromise = created;
|
|
66
|
+
// Clear the cached promise on rejection so the next call retries
|
|
67
|
+
// from scratch instead of replaying the same failure forever.
|
|
68
|
+
// Only clear if `created` is still the cached promise — a
|
|
69
|
+
// concurrent dispose may have already nulled it.
|
|
70
|
+
created.catch(() => {
|
|
71
|
+
if (this.sessionPromise === created) {
|
|
72
|
+
this.sessionPromise = null;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
return created;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private async createSession(): Promise<PlaywrightCdpSession> {
|
|
79
|
+
const page = await browserManager.getOrCreateSessionPage(
|
|
80
|
+
this.conversationId,
|
|
81
|
+
);
|
|
82
|
+
const rawPage = page as unknown as RawPlaywrightPage;
|
|
83
|
+
const session = await rawPage.context().newCDPSession(rawPage);
|
|
84
|
+
log.debug(
|
|
85
|
+
{ conversationId: this.conversationId },
|
|
86
|
+
"Created Playwright CDP session for LocalCdpClient",
|
|
87
|
+
);
|
|
88
|
+
return session;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async send<T = unknown>(
|
|
92
|
+
method: string,
|
|
93
|
+
params?: Record<string, unknown>,
|
|
94
|
+
signal?: AbortSignal,
|
|
95
|
+
): Promise<T> {
|
|
96
|
+
if (this.disposed) {
|
|
97
|
+
throw new CdpError("disposed", "LocalCdpClient already disposed", {
|
|
98
|
+
cdpMethod: method,
|
|
99
|
+
cdpParams: params,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (signal?.aborted) {
|
|
103
|
+
throw new CdpError("aborted", "Aborted before send", {
|
|
104
|
+
cdpMethod: method,
|
|
105
|
+
cdpParams: params,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
let session: PlaywrightCdpSession;
|
|
109
|
+
try {
|
|
110
|
+
session = await this.ensureSession();
|
|
111
|
+
} catch (err) {
|
|
112
|
+
if (signal?.aborted) {
|
|
113
|
+
throw new CdpError("aborted", "Aborted during send", {
|
|
114
|
+
cdpMethod: method,
|
|
115
|
+
cdpParams: params,
|
|
116
|
+
underlying: err,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Re-throw existing CdpError instances unchanged so we don't
|
|
120
|
+
// double-wrap (e.g. a "disposed" error raised by a concurrent
|
|
121
|
+
// dispose landing during ensureSession()).
|
|
122
|
+
if (err instanceof CdpError) {
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
125
|
+
// ensureSession failures (browser launch errors, Chromium
|
|
126
|
+
// spawn failures, etc) are surfaced as transport_error so
|
|
127
|
+
// callers can distinguish them from CDP protocol errors raised
|
|
128
|
+
// by session.send below.
|
|
129
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
130
|
+
throw new CdpError("transport_error", msg, {
|
|
131
|
+
cdpMethod: method,
|
|
132
|
+
cdpParams: params,
|
|
133
|
+
underlying: err,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
const result = (await session.send(method, params)) as T;
|
|
138
|
+
return result;
|
|
139
|
+
} catch (err) {
|
|
140
|
+
if (signal?.aborted) {
|
|
141
|
+
throw new CdpError("aborted", "Aborted during send", {
|
|
142
|
+
cdpMethod: method,
|
|
143
|
+
cdpParams: params,
|
|
144
|
+
underlying: err,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
if (err instanceof CdpError) {
|
|
148
|
+
throw err;
|
|
149
|
+
}
|
|
150
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
151
|
+
throw new CdpError("cdp_error", msg, {
|
|
152
|
+
cdpMethod: method,
|
|
153
|
+
cdpParams: params,
|
|
154
|
+
underlying: err,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
dispose(): void {
|
|
160
|
+
if (this.disposed) return;
|
|
161
|
+
this.disposed = true;
|
|
162
|
+
const pending = this.sessionPromise;
|
|
163
|
+
this.sessionPromise = null;
|
|
164
|
+
if (!pending) return;
|
|
165
|
+
pending
|
|
166
|
+
.then(async (session) => {
|
|
167
|
+
try {
|
|
168
|
+
await session.detach();
|
|
169
|
+
} catch (err) {
|
|
170
|
+
log.debug({ err }, "LocalCdpClient: session.detach threw (ignored)");
|
|
171
|
+
}
|
|
172
|
+
})
|
|
173
|
+
.catch(() => {
|
|
174
|
+
// Session never resolved — nothing to detach.
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Factory for a fresh {@link LocalCdpClient} bound to a conversation.
|
|
181
|
+
* Keeping the constructor + factory split lets the cdp-client factory
|
|
182
|
+
* branch between local and extension transports without
|
|
183
|
+
* exposing the class directly to callers.
|
|
184
|
+
*/
|
|
185
|
+
export function createLocalCdpClient(conversationId: string): LocalCdpClient {
|
|
186
|
+
return new LocalCdpClient(conversationId);
|
|
187
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal typed surface over Chrome DevTools Protocol. Implemented by
|
|
3
|
+
* LocalCdpClient (Playwright-backed, same-process Chromium),
|
|
4
|
+
* ExtensionCdpClient (routes through HostBrowserProxy to the user's
|
|
5
|
+
* Chrome via chrome.debugger), and CdpInspectClient (connects to a
|
|
6
|
+
* remote browser over a raw CDP WebSocket URL). Tools call
|
|
7
|
+
* `send(method, params)` with a CDP method name and return the raw
|
|
8
|
+
* CDP result object; errors are thrown as {@link CdpError}.
|
|
9
|
+
*/
|
|
10
|
+
export interface CdpClient {
|
|
11
|
+
/**
|
|
12
|
+
* Send a CDP command and await the result. `method` must be a
|
|
13
|
+
* well-known CDP method name (e.g. "Page.navigate",
|
|
14
|
+
* "Runtime.evaluate", "Accessibility.getFullAXTree"). `params` is
|
|
15
|
+
* forwarded verbatim.
|
|
16
|
+
*
|
|
17
|
+
* On success, returns the raw `result` object from the CDP response
|
|
18
|
+
* as `T`. On JSON-RPC error or transport failure, throws a
|
|
19
|
+
* {@link CdpError}. Abort propagates via `signal`; aborted calls
|
|
20
|
+
* throw an {@link CdpError} with `code === "aborted"`.
|
|
21
|
+
*/
|
|
22
|
+
send<T = unknown>(
|
|
23
|
+
method: string,
|
|
24
|
+
params?: Record<string, unknown>,
|
|
25
|
+
signal?: AbortSignal,
|
|
26
|
+
): Promise<T>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Release any backend-side resources (CDP sessions, in-flight
|
|
30
|
+
* requests, listeners). Idempotent. Calling `send` after `dispose`
|
|
31
|
+
* is allowed but should surface as an error.
|
|
32
|
+
*/
|
|
33
|
+
dispose(): void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Backend kind exposed by a concrete CdpClient. Used by tools that
|
|
38
|
+
* want to branch on the transport (e.g. browser_navigate should skip
|
|
39
|
+
* the sacrificial-profile screencast setup when running against the
|
|
40
|
+
* user's own Chrome via the extension).
|
|
41
|
+
*/
|
|
42
|
+
export type CdpClientKind = "local" | "extension" | "cdp-inspect";
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Backend mode preference for the CDP factory. Controls which
|
|
46
|
+
* transport is selected:
|
|
47
|
+
*
|
|
48
|
+
* - `"auto"` — default, existing priority-ordered fallback
|
|
49
|
+
* (extension → cdp-inspect → local).
|
|
50
|
+
* - `"extension"` — pin to the chrome-extension backend. Fails
|
|
51
|
+
* immediately if the host browser proxy is unavailable.
|
|
52
|
+
* - `"cdp-inspect"` — pin to the cdp-inspect backend. Fails
|
|
53
|
+
* immediately if cdp-inspect cannot connect.
|
|
54
|
+
* - `"local"` — pin to the local Playwright backend. No fallback.
|
|
55
|
+
*/
|
|
56
|
+
export type BrowserMode = "auto" | "extension" | "cdp-inspect" | "local";
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Stage at which a candidate attempt ended. Used in
|
|
60
|
+
* {@link AttemptDiagnostic} to indicate how far the attempt progressed.
|
|
61
|
+
*/
|
|
62
|
+
export type AttemptStage =
|
|
63
|
+
| "candidate_selection" // failed before construction (precondition not met)
|
|
64
|
+
| "construction" // create() threw
|
|
65
|
+
| "send" // manager.send() threw or returned an error envelope
|
|
66
|
+
| "success"; // command completed successfully
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Structured diagnostic for a single candidate attempt during the
|
|
70
|
+
* factory's failover walk. Collected into an array and attached to
|
|
71
|
+
* thrown {@link CdpError} instances so higher layers can render
|
|
72
|
+
* detailed failure information in user-facing tool errors.
|
|
73
|
+
*/
|
|
74
|
+
export interface AttemptDiagnostic {
|
|
75
|
+
/** Which backend kind was attempted. */
|
|
76
|
+
readonly candidateKind: CdpClientKind;
|
|
77
|
+
/** Why this candidate was included (from {@link BackendCandidate.reason}). */
|
|
78
|
+
readonly inclusionReason: string;
|
|
79
|
+
/** How far the attempt progressed before it ended. */
|
|
80
|
+
readonly stage: AttemptStage;
|
|
81
|
+
/** Error code from the CdpError, if the attempt failed. */
|
|
82
|
+
readonly errorCode?: string;
|
|
83
|
+
/** Error message from the CdpError, if the attempt failed. */
|
|
84
|
+
readonly errorMessage?: string;
|
|
85
|
+
/** Discovery-level error code extracted from the underlying error, if any. */
|
|
86
|
+
readonly discoveryCode?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Concrete CdpClient instance returned by the factory. Carries the
|
|
91
|
+
* backend `kind` for transport-aware branches in tool code.
|
|
92
|
+
*/
|
|
93
|
+
export interface ScopedCdpClient extends CdpClient {
|
|
94
|
+
readonly kind: CdpClientKind;
|
|
95
|
+
/** Stable conversation id this client is bound to. */
|
|
96
|
+
readonly conversationId: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* A deferred backend candidate used by the chained factory. Each
|
|
101
|
+
* candidate carries a `kind` label and a `create` thunk that
|
|
102
|
+
* materialises the underlying {@link CdpClient} + {@link BrowserBackend}
|
|
103
|
+
* on demand. The factory only calls `create()` when the candidate is
|
|
104
|
+
* actually selected (either as the primary or as a failover target),
|
|
105
|
+
* so backends that are never reached pay zero setup cost.
|
|
106
|
+
*/
|
|
107
|
+
export interface BackendCandidate {
|
|
108
|
+
readonly kind: CdpClientKind;
|
|
109
|
+
/** Human-readable reason this candidate was included. */
|
|
110
|
+
readonly reason: string;
|
|
111
|
+
/**
|
|
112
|
+
* Materialise the backend. Called at most once — the factory caches
|
|
113
|
+
* the result after the first successful CDP command so subsequent
|
|
114
|
+
* commands reuse the same backend (sticky semantics).
|
|
115
|
+
*/
|
|
116
|
+
create(): {
|
|
117
|
+
client: CdpClient;
|
|
118
|
+
backend: import("../../../browser-session/types.js").BrowserBackend;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getConfig } from "../../config/loader.js";
|
|
2
2
|
import {
|
|
3
|
+
clearSlackUserToken,
|
|
3
4
|
setSlackChannelConfig,
|
|
4
5
|
type SlackChannelConfigResult,
|
|
5
6
|
} from "../../daemon/handlers/config-slack-channel.js";
|
|
@@ -37,20 +38,26 @@ const log = getLogger("credential-vault");
|
|
|
37
38
|
function isSlackChannelCredential(
|
|
38
39
|
service: string,
|
|
39
40
|
field: string,
|
|
40
|
-
): field is "bot_token" | "app_token" {
|
|
41
|
+
): field is "bot_token" | "app_token" | "user_token" {
|
|
41
42
|
return (
|
|
42
43
|
service === "slack_channel" &&
|
|
43
|
-
(field === "bot_token" ||
|
|
44
|
+
(field === "bot_token" ||
|
|
45
|
+
field === "app_token" ||
|
|
46
|
+
field === "user_token")
|
|
44
47
|
);
|
|
45
48
|
}
|
|
46
49
|
|
|
47
50
|
async function storeSlackChannelCredential(
|
|
48
|
-
field: "bot_token" | "app_token",
|
|
51
|
+
field: "bot_token" | "app_token" | "user_token",
|
|
49
52
|
value: string,
|
|
50
53
|
): Promise<SlackChannelConfigResult> {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
if (field === "bot_token") {
|
|
55
|
+
return setSlackChannelConfig(value, undefined);
|
|
56
|
+
}
|
|
57
|
+
if (field === "app_token") {
|
|
58
|
+
return setSlackChannelConfig(undefined, value);
|
|
59
|
+
}
|
|
60
|
+
return setSlackChannelConfig(undefined, undefined, value);
|
|
54
61
|
}
|
|
55
62
|
|
|
56
63
|
function formatSlackChannelStatus(result: SlackChannelConfigResult): string {
|
|
@@ -457,6 +464,28 @@ class CredentialStoreTool implements Tool {
|
|
|
457
464
|
};
|
|
458
465
|
}
|
|
459
466
|
|
|
467
|
+
// Surgical delete for the Slack user_token: it grants read-only access
|
|
468
|
+
// to channels the bot isn't a member of, but the Socket Mode connection
|
|
469
|
+
// is powered by the bot + app tokens. Tearing down the oauth_connection
|
|
470
|
+
// row when only user_token is removed would flap the integration's
|
|
471
|
+
// connected state until the next sync. Keep bot+app teardown behavior
|
|
472
|
+
// unchanged — those tokens are what the connection depends on.
|
|
473
|
+
if (service === "slack_channel" && field === "user_token") {
|
|
474
|
+
const slackResult = await clearSlackUserToken();
|
|
475
|
+
if (!slackResult.success) {
|
|
476
|
+
return {
|
|
477
|
+
content: `Error: ${
|
|
478
|
+
slackResult.error ?? "failed to delete Slack user token"
|
|
479
|
+
}`,
|
|
480
|
+
isError: true,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
return {
|
|
484
|
+
content: `Deleted credential for ${service}/${field}.`,
|
|
485
|
+
isError: false,
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
|
|
460
489
|
const key = credentialKey(service, field);
|
|
461
490
|
const result = await deleteSecureKeyAsync(key);
|
|
462
491
|
if (result === "error") {
|
|
@@ -9,7 +9,7 @@ import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
|
9
9
|
class FileEditTool implements Tool {
|
|
10
10
|
name = "file_edit";
|
|
11
11
|
description =
|
|
12
|
-
"Replace an exact string in a file with a new string. Use this for surgical edits instead of rewriting entire files.
|
|
12
|
+
"Replace an exact string in a file on your own machine with a new string. Use this for surgical edits instead of rewriting entire files. Use host_file_edit for files on your guardian's device instead.";
|
|
13
13
|
category = "filesystem";
|
|
14
14
|
defaultRiskLevel = RiskLevel.Low;
|
|
15
15
|
|
|
@@ -8,7 +8,7 @@ import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
|
8
8
|
class FileListTool implements Tool {
|
|
9
9
|
name = "file_list";
|
|
10
10
|
description =
|
|
11
|
-
"List the contents of a directory. Returns file and subdirectory names with type indicators and sizes.";
|
|
11
|
+
"List the contents of a directory on your own machine. Returns file and subdirectory names with type indicators and sizes.";
|
|
12
12
|
category = "filesystem";
|
|
13
13
|
defaultRiskLevel = RiskLevel.Low;
|
|
14
14
|
|
|
@@ -14,7 +14,7 @@ import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
|
14
14
|
class FileReadTool implements Tool {
|
|
15
15
|
name = "file_read";
|
|
16
16
|
description =
|
|
17
|
-
"Read the contents of a file. For image files (JPEG, PNG, GIF, WebP), returns the image for visual analysis.
|
|
17
|
+
"Read the contents of a file on your own machine. For image files (JPEG, PNG, GIF, WebP), returns the image for visual analysis. Use host_file_read for files on your guardian's device instead.";
|
|
18
18
|
category = "filesystem";
|
|
19
19
|
defaultRiskLevel = RiskLevel.Low;
|
|
20
20
|
|
|
@@ -8,7 +8,8 @@ import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
|
8
8
|
|
|
9
9
|
class FileWriteTool implements Tool {
|
|
10
10
|
name = "file_write";
|
|
11
|
-
description =
|
|
11
|
+
description =
|
|
12
|
+
"Write content to a file on your own machine, creating it if it does not exist. Use host_file_write for files on your guardian's device instead.";
|
|
12
13
|
category = "filesystem";
|
|
13
14
|
defaultRiskLevel = RiskLevel.Low;
|
|
14
15
|
|
|
@@ -8,7 +8,7 @@ import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
|
8
8
|
class HostFileEditTool implements Tool {
|
|
9
9
|
name = "host_file_edit";
|
|
10
10
|
description =
|
|
11
|
-
"Replace exact text in a
|
|
11
|
+
"Replace exact text in a file on your guardian's device with new text. For files on your own machine, use file_edit instead.";
|
|
12
12
|
category = "host-filesystem";
|
|
13
13
|
defaultRiskLevel = RiskLevel.Medium;
|
|
14
14
|
|
|
@@ -13,7 +13,7 @@ import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
|
13
13
|
class HostFileReadTool implements Tool {
|
|
14
14
|
name = "host_file_read";
|
|
15
15
|
description =
|
|
16
|
-
"Read the contents of a file on
|
|
16
|
+
"Read the contents of a file on your guardian's device, including images (JPEG, PNG, GIF, WebP). For files on your own machine, use file_read instead.";
|
|
17
17
|
category = "host-filesystem";
|
|
18
18
|
defaultRiskLevel = RiskLevel.Medium;
|
|
19
19
|
|
|
@@ -54,21 +54,9 @@ class HostFileReadTool implements Tool {
|
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
// Image files must be handled locally — the host-file proxy protocol
|
|
58
|
-
// only carries {content, isError} and cannot transport contentBlocks
|
|
59
|
-
// (base64 image data). Check for image extensions before the proxy
|
|
60
|
-
// short-circuit so image reads work in managed/macOS+iOS sessions.
|
|
61
|
-
const ext = extname(rawPath).toLowerCase();
|
|
62
|
-
if (IMAGE_EXTENSIONS.has(ext)) {
|
|
63
|
-
const pathCheck = hostPolicy(rawPath);
|
|
64
|
-
if (!pathCheck.ok) {
|
|
65
|
-
return { content: `Error: ${pathCheck.error}`, isError: true };
|
|
66
|
-
}
|
|
67
|
-
return readImageFile(pathCheck.resolved);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
57
|
// Proxy to connected client for execution on the user's machine
|
|
71
|
-
// when a capable client is available (managed/cloud-hosted mode)
|
|
58
|
+
// when a capable client is available (managed/cloud-hosted mode),
|
|
59
|
+
// including image reads that need the host filesystem view.
|
|
72
60
|
if (context.hostFileProxy?.isAvailable()) {
|
|
73
61
|
return context.hostFileProxy.request(
|
|
74
62
|
{
|
|
@@ -82,6 +70,15 @@ class HostFileReadTool implements Tool {
|
|
|
82
70
|
);
|
|
83
71
|
}
|
|
84
72
|
|
|
73
|
+
const ext = extname(rawPath).toLowerCase();
|
|
74
|
+
if (IMAGE_EXTENSIONS.has(ext)) {
|
|
75
|
+
const pathCheck = hostPolicy(rawPath);
|
|
76
|
+
if (!pathCheck.ok) {
|
|
77
|
+
return { content: `Error: ${pathCheck.error}`, isError: true };
|
|
78
|
+
}
|
|
79
|
+
return readImageFile(pathCheck.resolved);
|
|
80
|
+
}
|
|
81
|
+
|
|
85
82
|
const ops = new FileSystemOps(hostPolicy);
|
|
86
83
|
|
|
87
84
|
const result = ops.readFileSafe({
|
|
@@ -8,7 +8,7 @@ import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
|
8
8
|
class HostFileWriteTool implements Tool {
|
|
9
9
|
name = "host_file_write";
|
|
10
10
|
description =
|
|
11
|
-
"Write content to a file on
|
|
11
|
+
"Write content to a file on your guardian's device, creating it if it does not exist. For files on your own machine, use file_write instead.";
|
|
12
12
|
category = "host-filesystem";
|
|
13
13
|
defaultRiskLevel = RiskLevel.Medium;
|
|
14
14
|
|
|
@@ -207,30 +207,35 @@ class HostShellTool implements Tool {
|
|
|
207
207
|
detached: true,
|
|
208
208
|
});
|
|
209
209
|
|
|
210
|
-
|
|
211
|
-
|
|
210
|
+
// Kill the entire process tree. Tries the process group first
|
|
211
|
+
// (negative PID), then falls back to killing the direct child if the
|
|
212
|
+
// PID is unavailable or the group kill fails.
|
|
213
|
+
const killTree = () => {
|
|
214
|
+
if (child.pid != null) {
|
|
215
|
+
try {
|
|
216
|
+
process.kill(-child.pid, "SIGKILL");
|
|
217
|
+
return;
|
|
218
|
+
} catch {
|
|
219
|
+
// Process group may have already exited — fall through.
|
|
220
|
+
}
|
|
221
|
+
}
|
|
212
222
|
try {
|
|
213
|
-
|
|
223
|
+
child.kill("SIGKILL");
|
|
214
224
|
} catch {
|
|
215
|
-
//
|
|
225
|
+
// Child may have already exited.
|
|
216
226
|
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
const timer = setTimeout(() => {
|
|
230
|
+
timedOut = true;
|
|
231
|
+
killTree();
|
|
217
232
|
}, timeoutMs);
|
|
218
233
|
|
|
219
234
|
// Cooperative cancellation via AbortSignal
|
|
220
|
-
const onAbort = () =>
|
|
221
|
-
try {
|
|
222
|
-
process.kill(-child.pid!, "SIGKILL");
|
|
223
|
-
} catch {
|
|
224
|
-
// Process group may have already exited.
|
|
225
|
-
}
|
|
226
|
-
};
|
|
235
|
+
const onAbort = () => killTree();
|
|
227
236
|
if (context.signal) {
|
|
228
237
|
if (context.signal.aborted) {
|
|
229
|
-
|
|
230
|
-
process.kill(-child.pid!, "SIGKILL");
|
|
231
|
-
} catch {
|
|
232
|
-
// Process group may have already exited.
|
|
233
|
-
}
|
|
238
|
+
killTree();
|
|
234
239
|
} else {
|
|
235
240
|
context.signal.addEventListener("abort", onAbort, { once: true });
|
|
236
241
|
}
|
|
@@ -8,6 +8,7 @@ import { Readable } from "node:stream";
|
|
|
8
8
|
import { RiskLevel } from "../../permissions/types.js";
|
|
9
9
|
import type { ToolDefinition } from "../../providers/types.js";
|
|
10
10
|
import { getLogger } from "../../util/logger.js";
|
|
11
|
+
import { safeStringSlice } from "../../util/unicode.js";
|
|
11
12
|
import { registerTool } from "../registry.js";
|
|
12
13
|
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
13
14
|
import {
|
|
@@ -357,11 +358,13 @@ function extractHtmlMetadata(html: string): {
|
|
|
357
358
|
// regex backtracking on large HTML documents.
|
|
358
359
|
// Strip <script> blocks first so that a literal "</head>" inside a script
|
|
359
360
|
// doesn't cause a false match that truncates the search region prematurely.
|
|
360
|
-
const candidate = html
|
|
361
|
+
const candidate = safeStringSlice(html, 0, 200_000);
|
|
361
362
|
const stripped = candidate.replace(/<script[\s>][\s\S]*?<\/script>/gi, "");
|
|
362
363
|
const headEnd = stripped.search(/<\/head[\s>]/i);
|
|
363
364
|
const searchRegion =
|
|
364
|
-
headEnd >= 0
|
|
365
|
+
headEnd >= 0
|
|
366
|
+
? safeStringSlice(stripped, 0, headEnd + 10)
|
|
367
|
+
: safeStringSlice(stripped, 0, 50_000);
|
|
365
368
|
|
|
366
369
|
const title = extractFirstMatch(
|
|
367
370
|
searchRegion,
|
|
@@ -61,6 +61,9 @@ async function getApiKey(
|
|
|
61
61
|
return (await getProviderKeyAsync("perplexity")) ?? undefined;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
const CITATION_INSTRUCTION =
|
|
65
|
+
"\n\nWhen presenting these results, cite sources as inline markdown hyperlinks next to the claims they support (e.g., 'according to [Source Title](url)'). Do not list references separately at the end.";
|
|
66
|
+
|
|
64
67
|
function formatBraveResults(
|
|
65
68
|
results: BraveSearchResult[],
|
|
66
69
|
query: string,
|
|
@@ -89,7 +92,7 @@ function formatBraveResults(
|
|
|
89
92
|
lines.push("");
|
|
90
93
|
}
|
|
91
94
|
|
|
92
|
-
return lines.join("\n");
|
|
95
|
+
return lines.join("\n") + CITATION_INSTRUCTION;
|
|
93
96
|
}
|
|
94
97
|
|
|
95
98
|
function formatPerplexityResults(
|
|
@@ -111,7 +114,7 @@ function formatPerplexityResults(
|
|
|
111
114
|
}
|
|
112
115
|
}
|
|
113
116
|
|
|
114
|
-
return lines.join("\n");
|
|
117
|
+
return lines.join("\n") + CITATION_INSTRUCTION;
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
async function executeBraveSearch(
|