@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
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
import type { ResolvedSystemPrompt } from "../agent/loop.js";
|
|
19
19
|
import { AgentLoop } from "../agent/loop.js";
|
|
20
20
|
import type {
|
|
21
|
+
InterfaceId,
|
|
21
22
|
TurnChannelContext,
|
|
22
23
|
TurnInterfaceContext,
|
|
23
24
|
} from "../channels/types.js";
|
|
@@ -27,6 +28,7 @@ import type { Speed } from "../config/schemas/inference.js";
|
|
|
27
28
|
import {
|
|
28
29
|
ContextWindowManager,
|
|
29
30
|
type ContextWindowResult,
|
|
31
|
+
getSummaryFromContextMessage,
|
|
30
32
|
} from "../context/window-manager.js";
|
|
31
33
|
import type { CesClient } from "../credential-execution/client.js";
|
|
32
34
|
import { EventBus } from "../events/bus.js";
|
|
@@ -42,22 +44,34 @@ import {
|
|
|
42
44
|
} from "../events/tool-profiling-listener.js";
|
|
43
45
|
import { registerToolTraceListener } from "../events/tool-trace-listener.js";
|
|
44
46
|
import { getHookManager } from "../hooks/manager.js";
|
|
47
|
+
import { enqueueAutoAnalysisOnCompaction } from "../memory/auto-analysis-enqueue.js";
|
|
45
48
|
import { resolveCanonicalGuardianRequest } from "../memory/canonical-guardian-store.js";
|
|
46
|
-
import {
|
|
49
|
+
import {
|
|
50
|
+
updateConversationContextWindow,
|
|
51
|
+
updateConversationHostAccess,
|
|
52
|
+
} from "../memory/conversation-crud.js";
|
|
47
53
|
import { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
|
|
48
54
|
import { PermissionPrompter } from "../permissions/prompter.js";
|
|
49
55
|
import { SecretPrompter } from "../permissions/secret-prompter.js";
|
|
50
56
|
import { patternMatchesCandidate } from "../permissions/trust-store.js";
|
|
51
57
|
import type { UserDecision } from "../permissions/types.js";
|
|
58
|
+
import {
|
|
59
|
+
isConversationHostAccessDecision,
|
|
60
|
+
isConversationHostAccessEnabled,
|
|
61
|
+
isConversationHostAccessEnablePrompt,
|
|
62
|
+
} from "../permissions/v2-consent-policy.js";
|
|
52
63
|
import { resolvePersonaContext } from "../prompts/persona-resolver.js";
|
|
53
64
|
import { buildSystemPrompt } from "../prompts/system-prompt.js";
|
|
54
|
-
import
|
|
65
|
+
import { resolveModelIntent } from "../providers/model-intents.js";
|
|
66
|
+
import type { Message, ModelIntent } from "../providers/types.js";
|
|
55
67
|
import type { Provider } from "../providers/types.js";
|
|
56
68
|
import type { TrustClass } from "../runtime/actor-trust-resolver.js";
|
|
57
69
|
import type { AuthContext } from "../runtime/auth/types.js";
|
|
58
70
|
import * as approvalOverrides from "../runtime/conversation-approval-overrides.js";
|
|
59
71
|
import * as pendingInteractions from "../runtime/pending-interactions.js";
|
|
60
72
|
import { ToolExecutor } from "../tools/executor.js";
|
|
73
|
+
import type { OnboardingContext } from "../types/onboarding-context.js";
|
|
74
|
+
import type { AbortReason } from "../util/abort-reasons.js";
|
|
61
75
|
import { getLogger } from "../util/logger.js";
|
|
62
76
|
import type { AssistantAttachmentDraft } from "./assistant-attachments.js";
|
|
63
77
|
import { runAgentLoopImpl } from "./conversation-agent-loop.js";
|
|
@@ -95,6 +109,7 @@ import {
|
|
|
95
109
|
createSurfaceMutex,
|
|
96
110
|
handleSurfaceAction as handleSurfaceActionImpl,
|
|
97
111
|
handleSurfaceUndo as handleSurfaceUndoImpl,
|
|
112
|
+
type SurfaceActionResult,
|
|
98
113
|
} from "./conversation-surfaces.js";
|
|
99
114
|
import type { ToolSetupContext } from "./conversation-tool-setup.js";
|
|
100
115
|
import {
|
|
@@ -104,6 +119,7 @@ import {
|
|
|
104
119
|
} from "./conversation-tool-setup.js";
|
|
105
120
|
import { refreshWorkspaceTopLevelContextIfNeeded as refreshWorkspaceImpl } from "./conversation-workspace.js";
|
|
106
121
|
import { HostBashProxy } from "./host-bash-proxy.js";
|
|
122
|
+
import { HostBrowserProxy } from "./host-browser-proxy.js";
|
|
107
123
|
import type { CuObservationResult } from "./host-cu-proxy.js";
|
|
108
124
|
import { HostCuProxy } from "./host-cu-proxy.js";
|
|
109
125
|
import { HostFileProxy } from "./host-file-proxy.js";
|
|
@@ -115,6 +131,7 @@ import type {
|
|
|
115
131
|
UserMessageAttachment,
|
|
116
132
|
} from "./message-protocol.js";
|
|
117
133
|
import type { ConversationTransportMetadata } from "./message-types/conversations.js";
|
|
134
|
+
import { isHostProxyTransport } from "./message-types/conversations.js";
|
|
118
135
|
import type {
|
|
119
136
|
AssistantActivityState,
|
|
120
137
|
ConfirmationStateChanged,
|
|
@@ -180,8 +197,22 @@ export class Conversation {
|
|
|
180
197
|
/** @internal */ taskRunId?: string;
|
|
181
198
|
/** @internal */ callSessionId?: string;
|
|
182
199
|
/** @internal */ hostBashProxy?: HostBashProxy;
|
|
200
|
+
/** @internal */ hostBrowserProxy?: HostBrowserProxy;
|
|
183
201
|
/** @internal */ hostCuProxy?: HostCuProxy;
|
|
184
202
|
/** @internal */ hostFileProxy?: HostFileProxy;
|
|
203
|
+
/**
|
|
204
|
+
* Optional override sender used by `restoreBrowserProxyAvailability` so
|
|
205
|
+
* registry-routed transports can preserve their sender across drain queue
|
|
206
|
+
* restores. When set, `restoreBrowserProxyAvailability()` uses this
|
|
207
|
+
* function instead of `sendToClient` so the drain-queue path doesn't
|
|
208
|
+
* clobber the registry-routed sender with the SSE hub emitter.
|
|
209
|
+
*
|
|
210
|
+
* Populated by the POST /messages handler when the guardian has an active
|
|
211
|
+
* extension connection in the `ChromeExtensionRegistry`, regardless of
|
|
212
|
+
* interface (chrome-extension, macOS, etc.). Cleared when a turn without
|
|
213
|
+
* an active extension connection takes over.
|
|
214
|
+
*/
|
|
215
|
+
/** @internal */ hostBrowserSenderOverride?: (msg: ServerMessage) => void;
|
|
185
216
|
/** @internal */ cesClient?: CesClient;
|
|
186
217
|
/** @internal */ readonly queue = new MessageQueue();
|
|
187
218
|
/** @internal */ currentActiveSurfaceId?: string;
|
|
@@ -243,11 +274,28 @@ export class Conversation {
|
|
|
243
274
|
data: SurfaceData;
|
|
244
275
|
actions?: Array<{ id: string; label: string; style?: string }>;
|
|
245
276
|
display?: string;
|
|
277
|
+
persistent?: boolean;
|
|
246
278
|
}> = [];
|
|
247
279
|
/** @internal */ workspaceTopLevelContext: string | null = null;
|
|
248
280
|
/** @internal */ workspaceTopLevelDirty = true;
|
|
281
|
+
/**
|
|
282
|
+
* Host home directory reported by the client (e.g. macOS
|
|
283
|
+
* `NSHomeDirectory()`). Populated from `HostProxyTransportMetadata` when
|
|
284
|
+
* a message arrives from an interface that supports host-proxy tools
|
|
285
|
+
* (see `supportsHostProxy`). Consumed by the `<workspace>` block renderer
|
|
286
|
+
* so platform-managed (containerized) daemons show the user's actual
|
|
287
|
+
* client-side home dir instead of the container's `os.homedir()`.
|
|
288
|
+
* @internal
|
|
289
|
+
*/
|
|
290
|
+
hostHomeDir?: string;
|
|
291
|
+
/**
|
|
292
|
+
* Host username reported by the client (e.g. macOS `NSUserName()`).
|
|
293
|
+
* See `hostHomeDir`.
|
|
294
|
+
* @internal
|
|
295
|
+
*/
|
|
296
|
+
hostUsername?: string;
|
|
249
297
|
public readonly traceEmitter: TraceEmitter;
|
|
250
|
-
|
|
298
|
+
/** @internal */ hasSystemPromptOverride: boolean;
|
|
251
299
|
public memoryPolicy: ConversationMemoryPolicy;
|
|
252
300
|
/** @internal */ readonly graphMemory: ConversationGraphMemory;
|
|
253
301
|
/** @internal */ activeContextNodeIds?: string[];
|
|
@@ -256,6 +304,14 @@ export class Conversation {
|
|
|
256
304
|
/** @internal */ turnCount = 0;
|
|
257
305
|
public lastAssistantAttachments: AssistantAttachmentDraft[] = [];
|
|
258
306
|
public lastAttachmentWarnings: string[] = [];
|
|
307
|
+
/**
|
|
308
|
+
* Pre-chat onboarding context provided by the native client.
|
|
309
|
+
* In-memory only — not persisted to the DB. Only relevant for the first
|
|
310
|
+
* turn of a brand-new conversation so the system prompt can personalize
|
|
311
|
+
* the opener and skip redundant discovery.
|
|
312
|
+
* @internal
|
|
313
|
+
*/
|
|
314
|
+
private onboardingContext?: OnboardingContext;
|
|
259
315
|
/** @internal */ currentTurnChannelContext: TurnChannelContext | null = null;
|
|
260
316
|
/** @internal */ currentTurnInterfaceContext: TurnInterfaceContext | null =
|
|
261
317
|
null;
|
|
@@ -282,6 +338,8 @@ export class Conversation {
|
|
|
282
338
|
sharedCesClient?: CesClient,
|
|
283
339
|
speedOverride?: Speed,
|
|
284
340
|
cacheTtl?: "5m" | "1h",
|
|
341
|
+
modelIntent?: ModelIntent,
|
|
342
|
+
modelOverride?: string,
|
|
285
343
|
) {
|
|
286
344
|
this.conversationId = conversationId;
|
|
287
345
|
this.systemPrompt = systemPrompt;
|
|
@@ -383,11 +441,19 @@ export class Conversation {
|
|
|
383
441
|
const hasSystemPromptOverride = systemPrompt !== buildSystemPrompt();
|
|
384
442
|
this.hasSystemPromptOverride = hasSystemPromptOverride;
|
|
385
443
|
|
|
444
|
+
// If an explicit modelOverride is supplied, use it verbatim. Otherwise,
|
|
445
|
+
// if modelIntent is set, resolve it against the active provider's
|
|
446
|
+
// intent → model mapping. The AgentLoop passes the resulting string
|
|
447
|
+
// through to `providerConfig.model` on every turn.
|
|
448
|
+
const resolvedModel: string | undefined =
|
|
449
|
+
modelOverride ??
|
|
450
|
+
(modelIntent ? resolveModelIntent(provider.name, modelIntent) : undefined);
|
|
451
|
+
|
|
386
452
|
const resolveSystemPromptCallback = (
|
|
387
453
|
_history: import("../providers/types.js").Message[],
|
|
388
454
|
): ResolvedSystemPrompt => {
|
|
389
|
-
const resolved = {
|
|
390
|
-
systemPrompt: hasSystemPromptOverride
|
|
455
|
+
const resolved: ResolvedSystemPrompt = {
|
|
456
|
+
systemPrompt: this.hasSystemPromptOverride
|
|
391
457
|
? systemPrompt
|
|
392
458
|
: (() => {
|
|
393
459
|
const persona = resolvePersonaContext(
|
|
@@ -399,10 +465,14 @@ export class Conversation {
|
|
|
399
465
|
userPersona: persona.userPersona,
|
|
400
466
|
channelPersona: persona.channelPersona,
|
|
401
467
|
userSlug: persona.userSlug,
|
|
468
|
+
onboardingContext: this.getOnboardingContext(),
|
|
402
469
|
});
|
|
403
470
|
})(),
|
|
404
471
|
maxTokens: configuredMaxTokens,
|
|
405
472
|
};
|
|
473
|
+
if (resolvedModel !== undefined) {
|
|
474
|
+
resolved.model = resolvedModel;
|
|
475
|
+
}
|
|
406
476
|
return resolved;
|
|
407
477
|
};
|
|
408
478
|
|
|
@@ -440,6 +510,16 @@ export class Conversation {
|
|
|
440
510
|
});
|
|
441
511
|
}
|
|
442
512
|
|
|
513
|
+
// ── Onboarding context ───────────────────────────────────────────
|
|
514
|
+
|
|
515
|
+
setOnboardingContext(ctx: OnboardingContext): void {
|
|
516
|
+
this.onboardingContext = ctx;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
getOnboardingContext(): OnboardingContext | undefined {
|
|
520
|
+
return this.onboardingContext;
|
|
521
|
+
}
|
|
522
|
+
|
|
443
523
|
// ── Lifecycle ────────────────────────────────────────────────────
|
|
444
524
|
|
|
445
525
|
async loadFromDb(): Promise<void> {
|
|
@@ -501,6 +581,7 @@ export class Conversation {
|
|
|
501
581
|
this.traceEmitter.updateSender(sendToClient);
|
|
502
582
|
if (!opts?.skipProxySenderUpdate) {
|
|
503
583
|
this.hostBashProxy?.updateSender(sendToClient, !hasNoClient);
|
|
584
|
+
this.hostBrowserProxy?.updateSender(sendToClient, !hasNoClient);
|
|
504
585
|
this.hostCuProxy?.updateSender(sendToClient, !hasNoClient);
|
|
505
586
|
this.hostFileProxy?.updateSender(sendToClient, !hasNoClient);
|
|
506
587
|
}
|
|
@@ -527,19 +608,62 @@ export class Conversation {
|
|
|
527
608
|
/** Mark host proxies as unavailable so tool execution uses local fallback. */
|
|
528
609
|
clearProxyAvailability(): void {
|
|
529
610
|
this.hostBashProxy?.updateSender(this.sendToClient, false);
|
|
611
|
+
this.hostBrowserProxy?.updateSender(this.sendToClient, false);
|
|
530
612
|
this.hostCuProxy?.updateSender(this.sendToClient, false);
|
|
531
613
|
this.hostFileProxy?.updateSender(this.sendToClient, false);
|
|
532
614
|
}
|
|
533
615
|
|
|
534
|
-
/**
|
|
535
|
-
|
|
616
|
+
/**
|
|
617
|
+
* Restore host proxy availability based on whether a real client is connected.
|
|
618
|
+
* When `skipBrowser` is true, the browser proxy is left untouched — use this
|
|
619
|
+
* when `restoreBrowserProxyAvailability()` will handle the browser proxy
|
|
620
|
+
* separately with the correct registry-routed sender.
|
|
621
|
+
*/
|
|
622
|
+
restoreProxyAvailability(options?: { skipBrowser?: boolean }): void {
|
|
536
623
|
if (!this.hasNoClient) {
|
|
537
624
|
this.hostBashProxy?.updateSender(this.sendToClient, true);
|
|
625
|
+
if (!options?.skipBrowser) {
|
|
626
|
+
this.hostBrowserProxy?.updateSender(this.sendToClient, true);
|
|
627
|
+
}
|
|
538
628
|
this.hostCuProxy?.updateSender(this.sendToClient, true);
|
|
539
629
|
this.hostFileProxy?.updateSender(this.sendToClient, true);
|
|
540
630
|
}
|
|
541
631
|
}
|
|
542
632
|
|
|
633
|
+
/**
|
|
634
|
+
* Restore host browser proxy availability only. Used for interfaces that
|
|
635
|
+
* support host_browser but not the full desktop proxy set, so calling
|
|
636
|
+
* restoreProxyAvailability() would incorrectly re-enable bash/file/CU
|
|
637
|
+
* proxies that should stay disabled. Applicable to chrome-extension turns
|
|
638
|
+
* (which only support host_browser) and macOS turns with an active
|
|
639
|
+
* extension connection (which route browser tools through the extension
|
|
640
|
+
* registry instead of cdp-inspect/local).
|
|
641
|
+
*
|
|
642
|
+
* Unlike `restoreProxyAvailability()`, this helper does NOT gate on
|
|
643
|
+
* `hasNoClient`. The chrome-extension interface is non-interactive (so
|
|
644
|
+
* `hasNoClient === true`), but it DOES have a connected client that can
|
|
645
|
+
* service `host_browser_request` events. Gating on `hasNoClient` would
|
|
646
|
+
* leave the just-constructed proxy unavailable and the only way to make
|
|
647
|
+
* it available would be to flip `hasNoClient` false, which would
|
|
648
|
+
* incorrectly enable host_bash/host_file/host_cu tool gating downstream.
|
|
649
|
+
*
|
|
650
|
+
* When `hostBrowserSenderOverride` is set, that function is used as the
|
|
651
|
+
* sender instead of `sendToClient`. This is required for any interface
|
|
652
|
+
* whose host_browser frames route through the ChromeExtensionRegistry
|
|
653
|
+
* WebSocket rather than the SSE hub: if the queue-drain path called this
|
|
654
|
+
* helper with `sendToClient`, the registry-routed sender established at
|
|
655
|
+
* turn-start would be clobbered by the SSE hub emitter and
|
|
656
|
+
* host_browser_request frames would stop reaching the extension.
|
|
657
|
+
*
|
|
658
|
+
* Callers must only invoke this when they know the current interface
|
|
659
|
+
* supports host_browser (see `supportsHostProxy(id, "host_browser")`)
|
|
660
|
+
* or has an active extension connection with a registry-routed sender.
|
|
661
|
+
*/
|
|
662
|
+
restoreBrowserProxyAvailability(): void {
|
|
663
|
+
const sender = this.hostBrowserSenderOverride ?? this.sendToClient;
|
|
664
|
+
this.hostBrowserProxy?.updateSender(sender, true);
|
|
665
|
+
}
|
|
666
|
+
|
|
543
667
|
setSubagentAllowedTools(tools: Set<string> | undefined): void {
|
|
544
668
|
this.subagentAllowedTools = tools;
|
|
545
669
|
}
|
|
@@ -548,6 +672,37 @@ export class Conversation {
|
|
|
548
672
|
this.isSubagent = value;
|
|
549
673
|
}
|
|
550
674
|
|
|
675
|
+
/**
|
|
676
|
+
* Prepend inherited parent messages into the in-memory message array so that
|
|
677
|
+
* the AgentLoop includes them in provider calls (enabling KV cache sharing).
|
|
678
|
+
*
|
|
679
|
+
* These messages are NOT persisted to the database — they exist only in
|
|
680
|
+
* memory. When the conversation is later read from DB via getMessages(),
|
|
681
|
+
* only the conversation's own persisted messages appear.
|
|
682
|
+
*
|
|
683
|
+
* Must be called before the first persistUserMessage() call — i.e. while
|
|
684
|
+
* `this.messages` is still empty.
|
|
685
|
+
*/
|
|
686
|
+
injectInheritedContext(messages: Message[]): void {
|
|
687
|
+
if (this.messages.length !== 0) {
|
|
688
|
+
throw new Error(
|
|
689
|
+
"injectInheritedContext must be called before any messages have been added",
|
|
690
|
+
);
|
|
691
|
+
}
|
|
692
|
+
this.messages = [...messages];
|
|
693
|
+
this.contextWindowManager.nonPersistedPrefixCount = messages.length;
|
|
694
|
+
this.contextWindowManager.summaryIsInjected =
|
|
695
|
+
getSummaryFromContextMessage(messages[0]) != null;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/**
|
|
699
|
+
* Return the system prompt string set at construction time (or its override).
|
|
700
|
+
* Fork consumers use this to pass the parent's system prompt to the fork.
|
|
701
|
+
*/
|
|
702
|
+
getCurrentSystemPrompt(): string {
|
|
703
|
+
return this.systemPrompt;
|
|
704
|
+
}
|
|
705
|
+
|
|
551
706
|
isProcessing(): boolean {
|
|
552
707
|
return this.processing;
|
|
553
708
|
}
|
|
@@ -563,13 +718,14 @@ export class Conversation {
|
|
|
563
718
|
return this.stale;
|
|
564
719
|
}
|
|
565
720
|
|
|
566
|
-
abort(): void {
|
|
567
|
-
abortConversation(this);
|
|
721
|
+
abort(reason?: AbortReason): void {
|
|
722
|
+
abortConversation(this, reason);
|
|
568
723
|
}
|
|
569
724
|
|
|
570
725
|
dispose(): void {
|
|
571
726
|
approvalOverrides.clearMode(this.conversationId);
|
|
572
727
|
this.hostBashProxy?.dispose();
|
|
728
|
+
this.hostBrowserProxy?.dispose();
|
|
573
729
|
this.hostCuProxy?.dispose();
|
|
574
730
|
this.hostFileProxy?.dispose();
|
|
575
731
|
// CES client is owned by DaemonServer — just drop the reference.
|
|
@@ -672,12 +828,35 @@ export class Conversation {
|
|
|
672
828
|
return;
|
|
673
829
|
}
|
|
674
830
|
|
|
831
|
+
const hostAccessEnablePrompt =
|
|
832
|
+
this.prompter.isHostAccessEnablePrompt(requestId) ||
|
|
833
|
+
isConversationHostAccessEnablePrompt(
|
|
834
|
+
pendingInteractions.get(requestId)?.confirmationDetails,
|
|
835
|
+
);
|
|
836
|
+
const effectiveDecision =
|
|
837
|
+
hostAccessEnablePrompt && !isConversationHostAccessDecision(decision)
|
|
838
|
+
? "deny"
|
|
839
|
+
: decision;
|
|
840
|
+
|
|
841
|
+
if (
|
|
842
|
+
hostAccessEnablePrompt &&
|
|
843
|
+
effectiveDecision === "allow" &&
|
|
844
|
+
!isConversationHostAccessEnabled(this.conversationId)
|
|
845
|
+
) {
|
|
846
|
+
updateConversationHostAccess(this.conversationId, true);
|
|
847
|
+
this.sendToClient({
|
|
848
|
+
type: "conversation_host_access_updated",
|
|
849
|
+
conversationId: this.conversationId,
|
|
850
|
+
hostAccess: true,
|
|
851
|
+
});
|
|
852
|
+
}
|
|
853
|
+
|
|
675
854
|
// Capture toolUseId before resolving (resolution deletes the pending entry)
|
|
676
855
|
const toolUseId = this.prompter.getToolUseId(requestId);
|
|
677
856
|
|
|
678
857
|
this.prompter.resolveConfirmation(
|
|
679
858
|
requestId,
|
|
680
|
-
|
|
859
|
+
effectiveDecision,
|
|
681
860
|
selectedPattern,
|
|
682
861
|
selectedScope,
|
|
683
862
|
decisionContext,
|
|
@@ -691,7 +870,7 @@ export class Conversation {
|
|
|
691
870
|
// so ALL callers (HTTP handlers, /v1/confirm, channel bridges) get
|
|
692
871
|
// consistent events without duplicating emission logic.
|
|
693
872
|
const resolvedState =
|
|
694
|
-
|
|
873
|
+
effectiveDecision === "deny" || effectiveDecision === "always_deny"
|
|
695
874
|
? ("denied" as const)
|
|
696
875
|
: ("approved" as const);
|
|
697
876
|
this.emitConfirmationStateChanged({
|
|
@@ -735,7 +914,12 @@ export class Conversation {
|
|
|
735
914
|
}
|
|
736
915
|
|
|
737
916
|
// Cascade to other pending confirmations that match this decision
|
|
738
|
-
this.cascadePendingApprovals(
|
|
917
|
+
this.cascadePendingApprovals(
|
|
918
|
+
requestId,
|
|
919
|
+
effectiveDecision,
|
|
920
|
+
selectedPattern,
|
|
921
|
+
hostAccessEnablePrompt,
|
|
922
|
+
);
|
|
739
923
|
}
|
|
740
924
|
|
|
741
925
|
/**
|
|
@@ -751,9 +935,14 @@ export class Conversation {
|
|
|
751
935
|
primaryRequestId: string,
|
|
752
936
|
decision: UserDecision,
|
|
753
937
|
selectedPattern?: string,
|
|
938
|
+
hostAccessEnablePrompt = false,
|
|
754
939
|
): void {
|
|
755
940
|
// Single-action decisions don't cascade
|
|
756
|
-
if (decision === "allow" || decision === "deny")
|
|
941
|
+
if (decision === "allow" || decision === "deny") {
|
|
942
|
+
if (!hostAccessEnablePrompt || decision !== "allow") {
|
|
943
|
+
return;
|
|
944
|
+
}
|
|
945
|
+
}
|
|
757
946
|
|
|
758
947
|
const pendingRequestIds = this.prompter.getPendingRequestIds();
|
|
759
948
|
if (pendingRequestIds.length === 0) return;
|
|
@@ -766,6 +955,28 @@ export class Conversation {
|
|
|
766
955
|
if (interaction.conversationId !== this.conversationId) continue;
|
|
767
956
|
if (interaction.kind !== "confirmation") continue;
|
|
768
957
|
|
|
958
|
+
if (
|
|
959
|
+
hostAccessEnablePrompt &&
|
|
960
|
+
(this.prompter.isHostAccessEnablePrompt(candidateId) ||
|
|
961
|
+
isConversationHostAccessEnablePrompt(interaction.confirmationDetails))
|
|
962
|
+
) {
|
|
963
|
+
// Enabling computer access is conversation-scoped, so sibling host
|
|
964
|
+
// prompts should resolve immediately once the first approval lands.
|
|
965
|
+
pendingInteractions.resolve(candidateId);
|
|
966
|
+
this.handleConfirmationResponse(
|
|
967
|
+
candidateId,
|
|
968
|
+
"allow",
|
|
969
|
+
undefined,
|
|
970
|
+
undefined,
|
|
971
|
+
undefined,
|
|
972
|
+
{
|
|
973
|
+
source: "system",
|
|
974
|
+
causedByRequestId: primaryRequestId,
|
|
975
|
+
},
|
|
976
|
+
);
|
|
977
|
+
continue;
|
|
978
|
+
}
|
|
979
|
+
|
|
769
980
|
const cascadeResult = this.shouldCascade(
|
|
770
981
|
decision,
|
|
771
982
|
selectedPattern,
|
|
@@ -868,9 +1079,23 @@ export class Conversation {
|
|
|
868
1079
|
this.hostBashProxy = proxy;
|
|
869
1080
|
}
|
|
870
1081
|
|
|
871
|
-
|
|
1082
|
+
resolveHostBrowser(
|
|
872
1083
|
requestId: string,
|
|
873
1084
|
response: { content: string; isError: boolean },
|
|
1085
|
+
): void {
|
|
1086
|
+
this.hostBrowserProxy?.resolve(requestId, response);
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
setHostBrowserProxy(proxy: HostBrowserProxy | undefined): void {
|
|
1090
|
+
if (this.hostBrowserProxy && this.hostBrowserProxy !== proxy) {
|
|
1091
|
+
this.hostBrowserProxy.dispose();
|
|
1092
|
+
}
|
|
1093
|
+
this.hostBrowserProxy = proxy;
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
resolveHostFile(
|
|
1097
|
+
requestId: string,
|
|
1098
|
+
response: { content: string; isError: boolean; imageData?: string },
|
|
874
1099
|
): void {
|
|
875
1100
|
this.hostFileProxy?.resolve(requestId, response);
|
|
876
1101
|
}
|
|
@@ -956,6 +1181,13 @@ export class Conversation {
|
|
|
956
1181
|
result.summaryText,
|
|
957
1182
|
this.contextCompactedMessageCount,
|
|
958
1183
|
);
|
|
1184
|
+
// Fire auto-analysis on compaction so the reflective agent can
|
|
1185
|
+
// crystallize anything worth remembering before the context window
|
|
1186
|
+
// narrows further.
|
|
1187
|
+
enqueueAutoAnalysisOnCompaction(
|
|
1188
|
+
this.conversationId,
|
|
1189
|
+
this.trustContext?.trustClass,
|
|
1190
|
+
);
|
|
959
1191
|
}
|
|
960
1192
|
return result;
|
|
961
1193
|
}
|
|
@@ -984,6 +1216,40 @@ export class Conversation {
|
|
|
984
1216
|
this.transportHints = hints;
|
|
985
1217
|
}
|
|
986
1218
|
|
|
1219
|
+
/**
|
|
1220
|
+
* Apply client-reported host environment (home dir, username) from
|
|
1221
|
+
* transport metadata onto the conversation. Only interfaces whose
|
|
1222
|
+
* interfaceId passes `supportsHostProxy()` contribute values — all other
|
|
1223
|
+
* interfaces (CLI, channels, iOS, chrome-extension) clear any previously
|
|
1224
|
+
* stored values so a conversation reused across interfaces doesn't leak
|
|
1225
|
+
* stale paths into later `<workspace>` blocks.
|
|
1226
|
+
*
|
|
1227
|
+
* Gating on `supportsHostProxy` (rather than a specific interface name)
|
|
1228
|
+
* keeps this in lock-step with the capability set defined in
|
|
1229
|
+
* `HostProxyInterfaceId` — adding a new host-capable client only requires
|
|
1230
|
+
* extending those two, not touching this method.
|
|
1231
|
+
*
|
|
1232
|
+
* Invalidates the cached workspace top-level block when values change so
|
|
1233
|
+
* the next render picks up the new host env.
|
|
1234
|
+
*/
|
|
1235
|
+
applyHostEnvFromTransport(transport: ConversationTransportMetadata): void {
|
|
1236
|
+
const prevHomeDir = this.hostHomeDir;
|
|
1237
|
+
const prevUsername = this.hostUsername;
|
|
1238
|
+
if (isHostProxyTransport(transport)) {
|
|
1239
|
+
this.hostHomeDir = transport.hostHomeDir;
|
|
1240
|
+
this.hostUsername = transport.hostUsername;
|
|
1241
|
+
} else {
|
|
1242
|
+
this.hostHomeDir = undefined;
|
|
1243
|
+
this.hostUsername = undefined;
|
|
1244
|
+
}
|
|
1245
|
+
if (
|
|
1246
|
+
prevHomeDir !== this.hostHomeDir ||
|
|
1247
|
+
prevUsername !== this.hostUsername
|
|
1248
|
+
) {
|
|
1249
|
+
this.workspaceTopLevelDirty = true;
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
|
|
987
1253
|
setAssistantId(assistantId: string | null): void {
|
|
988
1254
|
this.assistantId = assistantId ?? undefined;
|
|
989
1255
|
}
|
|
@@ -1026,6 +1292,16 @@ export class Conversation {
|
|
|
1026
1292
|
return this.currentTurnInterfaceContext;
|
|
1027
1293
|
}
|
|
1028
1294
|
|
|
1295
|
+
/**
|
|
1296
|
+
* Implements the `transportInterface` field of `SkillProjectionContext` so
|
|
1297
|
+
* that `isToolActiveForContext` can gate host tools by per-capability
|
|
1298
|
+
* `supportsHostProxy(transport, capability)`. Derived from the live turn
|
|
1299
|
+
* interface context so it tracks the connected client across turns.
|
|
1300
|
+
*/
|
|
1301
|
+
get transportInterface(): InterfaceId | undefined {
|
|
1302
|
+
return this.currentTurnInterfaceContext?.userMessageInterface;
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1029
1305
|
async persistUserMessage(
|
|
1030
1306
|
content: string,
|
|
1031
1307
|
attachments: UserMessageAttachment[],
|
|
@@ -1116,8 +1392,8 @@ export class Conversation {
|
|
|
1116
1392
|
surfaceId: string,
|
|
1117
1393
|
actionId: string,
|
|
1118
1394
|
data?: Record<string, unknown>,
|
|
1119
|
-
):
|
|
1120
|
-
handleSurfaceActionImpl(this, surfaceId, actionId, data);
|
|
1395
|
+
): Promise<SurfaceActionResult> {
|
|
1396
|
+
return handleSurfaceActionImpl(this, surfaceId, actionId, data);
|
|
1121
1397
|
}
|
|
1122
1398
|
|
|
1123
1399
|
handleSurfaceUndo(surfaceId: string): void {
|
|
@@ -18,14 +18,14 @@ export interface TemporalContextOptions {
|
|
|
18
18
|
userTimeZone?: string | null;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
const
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
21
|
+
const WEEKDAY_LONG = [
|
|
22
|
+
"Sunday",
|
|
23
|
+
"Monday",
|
|
24
|
+
"Tuesday",
|
|
25
|
+
"Wednesday",
|
|
26
|
+
"Thursday",
|
|
27
|
+
"Friday",
|
|
28
|
+
"Saturday",
|
|
29
29
|
] as const;
|
|
30
30
|
const UTC_GMT_OFFSET_TOKEN_RE = /^(?:UTC|GMT)([+-])(\d{1,2})(?::?(\d{2}))?$/i;
|
|
31
31
|
|
|
@@ -295,7 +295,7 @@ function formatLocalDate(date: Date, timeZone: string): string {
|
|
|
295
295
|
* Uses the timezone resolution cascade:
|
|
296
296
|
* explicit override → configured user tz → profile user tz → host fallback.
|
|
297
297
|
*
|
|
298
|
-
* Returns format: `2026-04-02 (
|
|
298
|
+
* Returns format: `2026-04-02 (Thursday) 01:52:33 -05:00 (America/Chicago)`
|
|
299
299
|
*/
|
|
300
300
|
export function formatTurnTimestamp(
|
|
301
301
|
options: TemporalContextOptions = {},
|
|
@@ -322,7 +322,7 @@ export function formatTurnTimestamp(
|
|
|
322
322
|
|
|
323
323
|
const dateStr = formatLocalDate(now, timeZone);
|
|
324
324
|
const todayParts = localDateParts(now, timeZone);
|
|
325
|
-
const dayName =
|
|
325
|
+
const dayName = WEEKDAY_LONG[todayParts.weekday];
|
|
326
326
|
|
|
327
327
|
const fmt = new Intl.DateTimeFormat("en-US", {
|
|
328
328
|
timeZone,
|
|
@@ -5,10 +5,11 @@ import { getWorkspacePromptPath } from "../util/platform.js";
|
|
|
5
5
|
/**
|
|
6
6
|
* The canned assistant response for the wake-up greeting on a fresh workspace.
|
|
7
7
|
* Warm, non-presumptuous greeting that communicates "I'm new," "I improve over
|
|
8
|
-
* time,"
|
|
8
|
+
* time," and invites the user to lead with whatever they want — a task, a
|
|
9
|
+
* question, or getting to know each other.
|
|
9
10
|
*/
|
|
10
11
|
export const CANNED_FIRST_GREETING =
|
|
11
|
-
"Hey
|
|
12
|
+
"Hey — I'm brand new. No name, no memories, no idea who you are yet. I'll get sharper the more we work together. What can I do for you?";
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Returns `true` when all of the following are true:
|