@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
|
@@ -22,10 +22,16 @@ import type {
|
|
|
22
22
|
TurnChannelContext,
|
|
23
23
|
TurnInterfaceContext,
|
|
24
24
|
} from "../channels/types.js";
|
|
25
|
+
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
25
26
|
import { getConfig } from "../config/loader.js";
|
|
27
|
+
import {
|
|
28
|
+
derefToolResultReReads,
|
|
29
|
+
postTurnTruncateToolResults,
|
|
30
|
+
} from "../context/post-turn-tool-result-truncation.js";
|
|
26
31
|
import { estimatePromptTokens } from "../context/token-estimator.js";
|
|
27
32
|
import type { ContextWindowManager } from "../context/window-manager.js";
|
|
28
33
|
import type { ToolProfiler } from "../events/tool-profiling-listener.js";
|
|
34
|
+
import { writeRelationshipState } from "../home/relationship-state-writer.js";
|
|
29
35
|
import { getHookManager } from "../hooks/manager.js";
|
|
30
36
|
import {
|
|
31
37
|
clearSentryConversationContext,
|
|
@@ -33,17 +39,21 @@ import {
|
|
|
33
39
|
} from "../instrument.js";
|
|
34
40
|
import { commitAppTurnChanges } from "../memory/app-git-service.js";
|
|
35
41
|
import { getApp, listAppFiles, resolveAppDir } from "../memory/app-store.js";
|
|
42
|
+
import { enqueueAutoAnalysisOnCompaction } from "../memory/auto-analysis-enqueue.js";
|
|
36
43
|
import {
|
|
37
44
|
addMessage,
|
|
38
45
|
deleteMessageById,
|
|
39
46
|
getConversation,
|
|
40
47
|
getConversationOriginChannel,
|
|
41
48
|
getConversationOriginInterface,
|
|
49
|
+
getLastUserTimestampBefore,
|
|
50
|
+
getMessageById,
|
|
42
51
|
provenanceFromTrustContext,
|
|
43
52
|
updateConversationContextWindow,
|
|
44
53
|
updateConversationTitle,
|
|
45
54
|
updateMessageMetadata,
|
|
46
55
|
} from "../memory/conversation-crud.js";
|
|
56
|
+
import { getResolvedConversationDirPath } from "../memory/conversation-directories.js";
|
|
47
57
|
import { syncMessageToDisk } from "../memory/conversation-disk-view.js";
|
|
48
58
|
import {
|
|
49
59
|
isReplaceableTitle,
|
|
@@ -58,8 +68,10 @@ import type { ContentBlock, Message } from "../providers/types.js";
|
|
|
58
68
|
import type { Provider } from "../providers/types.js";
|
|
59
69
|
import { resolveActorTrust } from "../runtime/actor-trust-resolver.js";
|
|
60
70
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
71
|
+
import { getSubagentManager } from "../subagent/index.js";
|
|
61
72
|
import type { UsageActor } from "../usage/actors.js";
|
|
62
73
|
import { getLogger } from "../util/logger.js";
|
|
74
|
+
import { timeAgo } from "../util/time.js";
|
|
63
75
|
import { truncate } from "../util/truncate.js";
|
|
64
76
|
import { getWorkspaceGitService } from "../workspace/git-service.js";
|
|
65
77
|
import { commitTurnChanges } from "../workspace/turn-commit.js";
|
|
@@ -100,9 +112,9 @@ import type {
|
|
|
100
112
|
} from "./conversation-runtime-assembly.js";
|
|
101
113
|
import {
|
|
102
114
|
applyRuntimeInjections,
|
|
115
|
+
buildSubagentStatusBlock,
|
|
103
116
|
buildUnifiedTurnContextBlock,
|
|
104
117
|
findLastInjectedNowContent,
|
|
105
|
-
findLastInjectedPkbContent,
|
|
106
118
|
inboundActorContextFromTrust,
|
|
107
119
|
inboundActorContextFromTrustContext,
|
|
108
120
|
readNowScratchpad,
|
|
@@ -230,6 +242,7 @@ export interface AgentLoopConversationContext {
|
|
|
230
242
|
data: SurfaceData;
|
|
231
243
|
actions?: Array<{ id: string; label: string; style?: string }>;
|
|
232
244
|
display?: string;
|
|
245
|
+
persistent?: boolean;
|
|
233
246
|
}>;
|
|
234
247
|
|
|
235
248
|
workingDir: string;
|
|
@@ -242,6 +255,8 @@ export interface AgentLoopConversationContext {
|
|
|
242
255
|
currentTurnChannelCapabilities?: ChannelCapabilities;
|
|
243
256
|
commandIntent?: { type: string; payload?: string; languageCode?: string };
|
|
244
257
|
trustContext?: TrustContext;
|
|
258
|
+
/** Task-run scope for the current turn. Cleared at turn end so queued/drained turns don't inherit it. */
|
|
259
|
+
taskRunId?: string;
|
|
245
260
|
assistantId?: string;
|
|
246
261
|
voiceCallControlPrompt?: string;
|
|
247
262
|
transportHints?: string[];
|
|
@@ -262,6 +277,8 @@ export interface AgentLoopConversationContext {
|
|
|
262
277
|
lastAttachmentWarnings: string[];
|
|
263
278
|
|
|
264
279
|
hasNoClient: boolean;
|
|
280
|
+
/** True when this conversation is itself a subagent (suppresses subagent status injection). */
|
|
281
|
+
isSubagent?: boolean;
|
|
265
282
|
headlessLock?: boolean;
|
|
266
283
|
readonly streamThinking: boolean;
|
|
267
284
|
readonly prompter: PermissionPrompter;
|
|
@@ -504,6 +521,7 @@ export async function runAgentLoopImpl(
|
|
|
504
521
|
|
|
505
522
|
const isFirstMessage = ctx.messages.length === 1;
|
|
506
523
|
let shouldInjectWorkspace = isFirstMessage;
|
|
524
|
+
let compactedThisTurn = false;
|
|
507
525
|
|
|
508
526
|
const compactCheck = ctx.contextWindowManager.shouldCompact(ctx.messages);
|
|
509
527
|
if (compactCheck.needed) {
|
|
@@ -534,6 +552,13 @@ export async function runAgentLoopImpl(
|
|
|
534
552
|
compacted.summaryText,
|
|
535
553
|
ctx.contextCompactedMessageCount,
|
|
536
554
|
);
|
|
555
|
+
// Fire auto-analysis on compaction so the reflective agent can
|
|
556
|
+
// crystallize anything worth remembering before the context window
|
|
557
|
+
// narrows further.
|
|
558
|
+
enqueueAutoAnalysisOnCompaction(
|
|
559
|
+
ctx.conversationId,
|
|
560
|
+
ctx.trustContext?.trustClass,
|
|
561
|
+
);
|
|
537
562
|
onEvent({
|
|
538
563
|
type: "context_compacted",
|
|
539
564
|
previousEstimatedInputTokens: compacted.previousEstimatedInputTokens,
|
|
@@ -559,6 +584,9 @@ export async function runAgentLoopImpl(
|
|
|
559
584
|
collapseRawResponses(compacted.summaryRawResponses),
|
|
560
585
|
);
|
|
561
586
|
shouldInjectWorkspace = true;
|
|
587
|
+
if (compacted.compactedPersistedMessages > 0) {
|
|
588
|
+
compactedThisTurn = true;
|
|
589
|
+
}
|
|
562
590
|
}
|
|
563
591
|
|
|
564
592
|
const state = createEventHandlerState();
|
|
@@ -763,14 +791,35 @@ export async function runAgentLoopImpl(
|
|
|
763
791
|
const isGuardian =
|
|
764
792
|
resolvedInboundActorContext?.trustClass === "guardian" ||
|
|
765
793
|
!resolvedInboundActorContext;
|
|
794
|
+
|
|
795
|
+
// Surface long gaps between user messages so the model can acknowledge
|
|
796
|
+
// the absence naturally. Gated at >12h to avoid noisy injection during
|
|
797
|
+
// normal back-and-forth turns.
|
|
798
|
+
const TWELVE_HOURS_MS = 12 * 60 * 60 * 1000;
|
|
799
|
+
let timeSinceLastMessage: string | null = null;
|
|
800
|
+
const currentUserMessage = getMessageById(userMessageId);
|
|
801
|
+
if (currentUserMessage) {
|
|
802
|
+
const prevUserTs = getLastUserTimestampBefore(
|
|
803
|
+
ctx.conversationId,
|
|
804
|
+
currentUserMessage.createdAt,
|
|
805
|
+
);
|
|
806
|
+
if (
|
|
807
|
+
prevUserTs > 0 &&
|
|
808
|
+
currentUserMessage.createdAt - prevUserTs > TWELVE_HOURS_MS
|
|
809
|
+
) {
|
|
810
|
+
timeSinceLastMessage = timeAgo(prevUserTs);
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
|
|
766
814
|
const unifiedTurnContextStr = buildUnifiedTurnContextBlock(
|
|
767
815
|
isGuardian
|
|
768
|
-
? { timestamp, interfaceName, channelName }
|
|
816
|
+
? { timestamp, interfaceName, channelName, timeSinceLastMessage }
|
|
769
817
|
: {
|
|
770
818
|
timestamp,
|
|
771
819
|
interfaceName,
|
|
772
820
|
channelName,
|
|
773
821
|
actorContext: resolvedInboundActorContext,
|
|
822
|
+
timeSinceLastMessage,
|
|
774
823
|
},
|
|
775
824
|
);
|
|
776
825
|
|
|
@@ -779,24 +828,24 @@ export async function runAgentLoopImpl(
|
|
|
779
828
|
const isInteractiveResolved =
|
|
780
829
|
options?.isInteractive ?? (!ctx.hasNoClient && !ctx.headlessLock);
|
|
781
830
|
|
|
782
|
-
//
|
|
783
|
-
//
|
|
784
|
-
//
|
|
831
|
+
// Inject NOW.md and PKB content only on the first turn (or after
|
|
832
|
+
// compaction re-strips them). Old injections persist in history and
|
|
833
|
+
// are never stripped on normal turns — this preserves the cached prefix.
|
|
785
834
|
const currentNowContent = readNowScratchpad();
|
|
786
|
-
const
|
|
787
|
-
const nowScratchpad =
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
// Only inject PKB if it changed since the last injection in the
|
|
791
|
-
// conversation. Keeping the previous injection in place avoids mutating
|
|
792
|
-
// historical user messages and preserves the cached prefix.
|
|
793
|
-
// Note: injectPkbContext escapes </pkb> sequences before writing to history,
|
|
794
|
-
// so we must apply the same escaping before comparing to avoid false mismatches.
|
|
835
|
+
const shouldInjectNowAndPkb = isFirstMessage || compactedThisTurn;
|
|
836
|
+
const nowScratchpad = shouldInjectNowAndPkb ? currentNowContent : null;
|
|
837
|
+
|
|
795
838
|
const currentPkbContent = readPkbContext();
|
|
796
|
-
const
|
|
797
|
-
const
|
|
798
|
-
|
|
799
|
-
|
|
839
|
+
const pkbContext = shouldInjectNowAndPkb ? currentPkbContent : null;
|
|
840
|
+
const pkbActive = currentPkbContent !== null;
|
|
841
|
+
|
|
842
|
+
// Subagent status injection — gives the parent LLM visibility into active/completed children.
|
|
843
|
+
// Skipped when this conversation IS a subagent (no nesting) or has no children.
|
|
844
|
+
const subagentStatusBlock = ctx.isSubagent
|
|
845
|
+
? null
|
|
846
|
+
: buildSubagentStatusBlock(
|
|
847
|
+
getSubagentManager().getChildrenOf(ctx.conversationId),
|
|
848
|
+
);
|
|
800
849
|
|
|
801
850
|
// Shared injection options — reused whenever we need to re-inject after reduction.
|
|
802
851
|
const injectionOpts = {
|
|
@@ -808,10 +857,12 @@ export async function runAgentLoopImpl(
|
|
|
808
857
|
channelCommandContext: ctx.commandIntent ?? null,
|
|
809
858
|
unifiedTurnContext: unifiedTurnContextStr,
|
|
810
859
|
pkbContext,
|
|
860
|
+
pkbActive,
|
|
811
861
|
nowScratchpad,
|
|
812
862
|
voiceCallControlPrompt: ctx.voiceCallControlPrompt ?? null,
|
|
813
863
|
transportHints: ctx.transportHints ?? null,
|
|
814
864
|
isNonInteractive: !isInteractiveResolved,
|
|
865
|
+
subagentStatusBlock,
|
|
815
866
|
} as const;
|
|
816
867
|
|
|
817
868
|
let currentInjectionMode: InjectionMode = "full";
|
|
@@ -896,6 +947,11 @@ export async function runAgentLoopImpl(
|
|
|
896
947
|
step.compactionResult.summaryText,
|
|
897
948
|
ctx.contextCompactedMessageCount,
|
|
898
949
|
);
|
|
950
|
+
// Fire auto-analysis on compaction — see forceCompact() for rationale.
|
|
951
|
+
enqueueAutoAnalysisOnCompaction(
|
|
952
|
+
ctx.conversationId,
|
|
953
|
+
ctx.trustContext?.trustClass,
|
|
954
|
+
);
|
|
899
955
|
onEvent({
|
|
900
956
|
type: "context_compacted",
|
|
901
957
|
previousEstimatedInputTokens:
|
|
@@ -933,8 +989,12 @@ export async function runAgentLoopImpl(
|
|
|
933
989
|
// value from injectionOpts to avoid duplicate injection.
|
|
934
990
|
runMessages = applyRuntimeInjections(ctx.messages, {
|
|
935
991
|
...injectionOpts,
|
|
936
|
-
...(step.compactionResult?.compacted && {
|
|
937
|
-
|
|
992
|
+
...(step.compactionResult?.compacted && {
|
|
993
|
+
pkbContext: currentPkbContent,
|
|
994
|
+
}),
|
|
995
|
+
...(step.compactionResult?.compacted && {
|
|
996
|
+
nowScratchpad: currentNowContent,
|
|
997
|
+
}),
|
|
938
998
|
workspaceTopLevelContext: shouldInjectWorkspace
|
|
939
999
|
? ctx.workspaceTopLevelContext
|
|
940
1000
|
: null,
|
|
@@ -1096,6 +1156,11 @@ export async function runAgentLoopImpl(
|
|
|
1096
1156
|
midLoopCompact.summaryText,
|
|
1097
1157
|
ctx.contextCompactedMessageCount,
|
|
1098
1158
|
);
|
|
1159
|
+
// Fire auto-analysis on compaction — see forceCompact() for rationale.
|
|
1160
|
+
enqueueAutoAnalysisOnCompaction(
|
|
1161
|
+
ctx.conversationId,
|
|
1162
|
+
ctx.trustContext?.trustClass,
|
|
1163
|
+
);
|
|
1099
1164
|
onEvent({
|
|
1100
1165
|
type: "context_compacted",
|
|
1101
1166
|
previousEstimatedInputTokens:
|
|
@@ -1139,8 +1204,7 @@ export async function runAgentLoopImpl(
|
|
|
1139
1204
|
mode: currentInjectionMode,
|
|
1140
1205
|
});
|
|
1141
1206
|
if (isTrustedActor && currentInjectionMode !== "minimal") {
|
|
1142
|
-
|
|
1143
|
-
runMessages = memResult.runMessages;
|
|
1207
|
+
ctx.graphMemory.retrackCachedNodes();
|
|
1144
1208
|
}
|
|
1145
1209
|
preRepairMessages = runMessages;
|
|
1146
1210
|
preRunHistoryLength = runMessages.length;
|
|
@@ -1213,12 +1277,12 @@ export async function runAgentLoopImpl(
|
|
|
1213
1277
|
// limit), incorporate those new messages into ctx.messages so the
|
|
1214
1278
|
// convergence loop operates on the full (larger) history.
|
|
1215
1279
|
if (state.contextTooLargeDetected) {
|
|
1216
|
-
//
|
|
1217
|
-
//
|
|
1218
|
-
//
|
|
1219
|
-
//
|
|
1220
|
-
|
|
1221
|
-
|
|
1280
|
+
// Detect whether ctx.messages currently lacks NOW.md so we know if
|
|
1281
|
+
// it needs to be re-injected. Mid-loop compaction (line ~1067) may
|
|
1282
|
+
// have already stripped injections before escalating here, so we
|
|
1283
|
+
// check actual message state rather than tracking mutation sites.
|
|
1284
|
+
let convergenceStripped =
|
|
1285
|
+
findLastInjectedNowContent(ctx.messages) === null;
|
|
1222
1286
|
|
|
1223
1287
|
if (updatedHistory.length > preRunHistoryLength) {
|
|
1224
1288
|
ctx.messages = stripInjectionsForCompaction(updatedHistory);
|
|
@@ -1314,6 +1378,11 @@ export async function runAgentLoopImpl(
|
|
|
1314
1378
|
step.compactionResult.summaryText,
|
|
1315
1379
|
ctx.contextCompactedMessageCount,
|
|
1316
1380
|
);
|
|
1381
|
+
// Fire auto-analysis on compaction — see forceCompact() for rationale.
|
|
1382
|
+
enqueueAutoAnalysisOnCompaction(
|
|
1383
|
+
ctx.conversationId,
|
|
1384
|
+
ctx.trustContext?.trustClass,
|
|
1385
|
+
);
|
|
1317
1386
|
onEvent({
|
|
1318
1387
|
type: "context_compacted",
|
|
1319
1388
|
previousEstimatedInputTokens:
|
|
@@ -1358,8 +1427,7 @@ export async function runAgentLoopImpl(
|
|
|
1358
1427
|
mode: currentInjectionMode,
|
|
1359
1428
|
});
|
|
1360
1429
|
if (isTrustedActor && currentInjectionMode !== "minimal") {
|
|
1361
|
-
|
|
1362
|
-
runMessages = memResult.runMessages;
|
|
1430
|
+
ctx.graphMemory.retrackCachedNodes();
|
|
1363
1431
|
}
|
|
1364
1432
|
preRepairMessages = runMessages;
|
|
1365
1433
|
preRunHistoryLength = runMessages.length;
|
|
@@ -1438,6 +1506,11 @@ export async function runAgentLoopImpl(
|
|
|
1438
1506
|
emergencyCompact.summaryText,
|
|
1439
1507
|
ctx.contextCompactedMessageCount,
|
|
1440
1508
|
);
|
|
1509
|
+
// Fire auto-analysis on compaction — see forceCompact() for rationale.
|
|
1510
|
+
enqueueAutoAnalysisOnCompaction(
|
|
1511
|
+
ctx.conversationId,
|
|
1512
|
+
ctx.trustContext?.trustClass,
|
|
1513
|
+
);
|
|
1441
1514
|
onEvent({
|
|
1442
1515
|
type: "context_compacted",
|
|
1443
1516
|
previousEstimatedInputTokens:
|
|
@@ -1481,9 +1554,7 @@ export async function runAgentLoopImpl(
|
|
|
1481
1554
|
mode: currentInjectionMode,
|
|
1482
1555
|
});
|
|
1483
1556
|
if (isTrustedActor && currentInjectionMode !== "minimal") {
|
|
1484
|
-
|
|
1485
|
-
ctx.graphMemory.reinjectCachedMemory(runMessages);
|
|
1486
|
-
runMessages = memResult.runMessages;
|
|
1557
|
+
ctx.graphMemory.retrackCachedNodes();
|
|
1487
1558
|
}
|
|
1488
1559
|
preRepairMessages = runMessages;
|
|
1489
1560
|
preRunHistoryLength = runMessages.length;
|
|
@@ -1558,6 +1629,11 @@ export async function runAgentLoopImpl(
|
|
|
1558
1629
|
emergencyCompact.summaryText,
|
|
1559
1630
|
ctx.contextCompactedMessageCount,
|
|
1560
1631
|
);
|
|
1632
|
+
// Fire auto-analysis on compaction — see forceCompact() for rationale.
|
|
1633
|
+
enqueueAutoAnalysisOnCompaction(
|
|
1634
|
+
ctx.conversationId,
|
|
1635
|
+
ctx.trustContext?.trustClass,
|
|
1636
|
+
);
|
|
1561
1637
|
onEvent({
|
|
1562
1638
|
type: "context_compacted",
|
|
1563
1639
|
previousEstimatedInputTokens:
|
|
@@ -1601,8 +1677,7 @@ export async function runAgentLoopImpl(
|
|
|
1601
1677
|
mode: currentInjectionMode,
|
|
1602
1678
|
});
|
|
1603
1679
|
if (isTrustedActor && currentInjectionMode !== "minimal") {
|
|
1604
|
-
|
|
1605
|
-
runMessages = memResult.runMessages;
|
|
1680
|
+
ctx.graphMemory.retrackCachedNodes();
|
|
1606
1681
|
}
|
|
1607
1682
|
preRepairMessages = runMessages;
|
|
1608
1683
|
preRunHistoryLength = runMessages.length;
|
|
@@ -1733,13 +1808,39 @@ export async function runAgentLoopImpl(
|
|
|
1733
1808
|
// would create a duplicate plain-text bubble below the alert card.
|
|
1734
1809
|
}
|
|
1735
1810
|
|
|
1736
|
-
|
|
1811
|
+
let restoredHistory = [...preRepairMessages, ...newMessages];
|
|
1737
1812
|
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
{
|
|
1742
|
-
|
|
1813
|
+
// Post-turn tool result truncation: save large results to disk and
|
|
1814
|
+
// replace in-context content with a prefix/suffix stub + file pointer.
|
|
1815
|
+
if (isAssistantFeatureFlagEnabled("tool-result-truncation", config)) {
|
|
1816
|
+
try {
|
|
1817
|
+
const conv = getConversation(ctx.conversationId);
|
|
1818
|
+
if (conv) {
|
|
1819
|
+
const convDir = getResolvedConversationDirPath(
|
|
1820
|
+
ctx.conversationId,
|
|
1821
|
+
conv.createdAt,
|
|
1822
|
+
);
|
|
1823
|
+
const { messages: derefMessages, dereferencedCount } =
|
|
1824
|
+
derefToolResultReReads(restoredHistory);
|
|
1825
|
+
const { messages: truncatedMessages, truncatedCount } =
|
|
1826
|
+
postTurnTruncateToolResults(derefMessages, {
|
|
1827
|
+
conversationDir: convDir,
|
|
1828
|
+
});
|
|
1829
|
+
if (truncatedCount > 0 || dereferencedCount > 0) {
|
|
1830
|
+
rlog.info(
|
|
1831
|
+
{ truncatedCount, dereferencedCount },
|
|
1832
|
+
"Post-turn tool result truncation applied",
|
|
1833
|
+
);
|
|
1834
|
+
}
|
|
1835
|
+
restoredHistory = truncatedMessages;
|
|
1836
|
+
}
|
|
1837
|
+
} catch (err) {
|
|
1838
|
+
rlog.warn(
|
|
1839
|
+
{ err },
|
|
1840
|
+
"Post-turn tool result truncation failed (non-fatal)",
|
|
1841
|
+
);
|
|
1842
|
+
}
|
|
1843
|
+
}
|
|
1743
1844
|
|
|
1744
1845
|
// Persist injections in history: runtime-injected context stays on
|
|
1745
1846
|
// historical user messages so the conversation prefix is stable for
|
|
@@ -1761,7 +1862,7 @@ export async function runAgentLoopImpl(
|
|
|
1761
1862
|
state.exchangeProviderName,
|
|
1762
1863
|
state.exchangeLlmCallCount,
|
|
1763
1864
|
{
|
|
1764
|
-
tokens:
|
|
1865
|
+
tokens: state.lastCallInputTokens,
|
|
1765
1866
|
maxTokens: config.contextWindow.maxInputTokens,
|
|
1766
1867
|
},
|
|
1767
1868
|
);
|
|
@@ -1980,6 +2081,12 @@ export async function runAgentLoopImpl(
|
|
|
1980
2081
|
|
|
1981
2082
|
// Commit app changes (fire-and-forget — apps repo is separate from workspace)
|
|
1982
2083
|
void commitAppTurnChanges(ctx.conversationId, ctx.turnCount);
|
|
2084
|
+
|
|
2085
|
+
// Recompute relationship-state.json at turn boundary (fire-and-forget).
|
|
2086
|
+
// The writer swallows its own errors, but we still guard with catch()
|
|
2087
|
+
// here so a regression in the writer can never bubble out of the
|
|
2088
|
+
// agent loop and reject an otherwise-complete turn.
|
|
2089
|
+
void writeRelationshipState().catch(() => {});
|
|
1983
2090
|
}
|
|
1984
2091
|
|
|
1985
2092
|
ctx.profiler.emitSummary(ctx.traceEmitter, reqId);
|
|
@@ -1995,6 +2102,10 @@ export async function runAgentLoopImpl(
|
|
|
1995
2102
|
// Channel command intents (e.g. Telegram /start) are single-turn metadata.
|
|
1996
2103
|
// Clear at turn end so they never leak into subsequent unrelated messages.
|
|
1997
2104
|
ctx.commandIntent = undefined;
|
|
2105
|
+
// taskRunId scopes ephemeral task-run permissions to a single turn. Clear
|
|
2106
|
+
// before drainQueue so queued/drained turns on a reused conversation can't
|
|
2107
|
+
// inherit stale in-task-run scope from the turn that just finished.
|
|
2108
|
+
ctx.taskRunId = undefined;
|
|
1998
2109
|
|
|
1999
2110
|
// Consolidation deferred to compaction: keeping assistant + tool_result
|
|
2000
2111
|
// messages unconsolidated preserves the exact message structure sent to
|
|
@@ -13,6 +13,11 @@ import {
|
|
|
13
13
|
import type { PermissionPrompter } from "../permissions/prompter.js";
|
|
14
14
|
import { addRule } from "../permissions/trust-store.js";
|
|
15
15
|
import { isAllowDecision } from "../permissions/types.js";
|
|
16
|
+
import {
|
|
17
|
+
CONVERSATION_HOST_ACCESS_PROMPT,
|
|
18
|
+
isConversationHostAccessEnabled,
|
|
19
|
+
isPermissionControlsV2Enabled,
|
|
20
|
+
} from "../permissions/v2-consent-policy.js";
|
|
16
21
|
import type { ContentBlock } from "../providers/types.js";
|
|
17
22
|
import { getLogger } from "../util/logger.js";
|
|
18
23
|
import {
|
|
@@ -45,6 +50,41 @@ export async function approveHostAttachmentRead(
|
|
|
45
50
|
): Promise<boolean> {
|
|
46
51
|
const toolName = "host_file_read";
|
|
47
52
|
const input = { path: filePath };
|
|
53
|
+
|
|
54
|
+
if (isPermissionControlsV2Enabled()) {
|
|
55
|
+
if (isConversationHostAccessEnabled(conversationId)) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// HTTP-created sessions use a no-op sendToClient — prompting would
|
|
60
|
+
// block for the full permission timeout before auto-denying.
|
|
61
|
+
if (hasNoClient) {
|
|
62
|
+
log.info(
|
|
63
|
+
{ filePath },
|
|
64
|
+
"Denying host attachment read: no interactive client connected",
|
|
65
|
+
);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const response = await prompter.prompt(
|
|
70
|
+
toolName,
|
|
71
|
+
input,
|
|
72
|
+
"low",
|
|
73
|
+
CONVERSATION_HOST_ACCESS_PROMPT.allowlistOptions,
|
|
74
|
+
CONVERSATION_HOST_ACCESS_PROMPT.scopeOptions,
|
|
75
|
+
undefined,
|
|
76
|
+
conversationId,
|
|
77
|
+
"host",
|
|
78
|
+
CONVERSATION_HOST_ACCESS_PROMPT.persistentDecisionsAllowed,
|
|
79
|
+
undefined,
|
|
80
|
+
CONVERSATION_HOST_ACCESS_PROMPT.temporaryOptionsAvailable,
|
|
81
|
+
undefined,
|
|
82
|
+
true,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
return response.decision === "allow";
|
|
86
|
+
}
|
|
87
|
+
|
|
48
88
|
const decision = await check(toolName, input, workingDir);
|
|
49
89
|
|
|
50
90
|
if (decision.decision === "allow") {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getProviderRoutingSource } from "../providers/registry.js";
|
|
2
|
+
import { isAbortReason } from "../util/abort-reasons.js";
|
|
2
3
|
import { ProviderError, ProviderNotConfiguredError } from "../util/errors.js";
|
|
3
4
|
import type {
|
|
4
5
|
ConversationErrorCode,
|
|
@@ -110,11 +111,21 @@ export interface ErrorContext {
|
|
|
110
111
|
* Returns true if the error looks like a user-initiated cancellation
|
|
111
112
|
* (AbortError or explicit cancel). These should use `generation_cancelled`
|
|
112
113
|
* instead of `conversation_error`.
|
|
114
|
+
*
|
|
115
|
+
* Provider SDKs wrap the underlying AbortError in their own error class
|
|
116
|
+
* (e.g. `ProviderError("Anthropic API error (undefined): Request was aborted.")`),
|
|
117
|
+
* which erases the `AbortError` name. To compensate, the daemon tags every
|
|
118
|
+
* `controller.abort(reason)` call with an `AbortReason` object — when the
|
|
119
|
+
* wrapped `ProviderError` carries that tagged reason, we treat it as a user
|
|
120
|
+
* cancellation regardless of error class.
|
|
113
121
|
*/
|
|
114
122
|
export function isUserCancellation(error: unknown, ctx: ErrorContext): boolean {
|
|
115
123
|
if (!ctx.aborted) return false;
|
|
116
124
|
if (error instanceof DOMException && error.name === "AbortError") return true;
|
|
117
125
|
if (error instanceof Error && error.name === "AbortError") return true;
|
|
126
|
+
if (error instanceof ProviderError && isAbortReason(error.abortReason)) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
118
129
|
return false;
|
|
119
130
|
}
|
|
120
131
|
|
|
@@ -15,6 +15,7 @@ import { withQdrantBreaker } from "../memory/qdrant-circuit-breaker.js";
|
|
|
15
15
|
import { getQdrantClient } from "../memory/qdrant-client.js";
|
|
16
16
|
import type { ContentBlock, Message } from "../providers/types.js";
|
|
17
17
|
import { getLogger } from "../util/logger.js";
|
|
18
|
+
import { truncate } from "../util/truncate.js";
|
|
18
19
|
import type { ServerMessage } from "./message-protocol.js";
|
|
19
20
|
import type { TraceEmitter } from "./trace-emitter.js";
|
|
20
21
|
|
|
@@ -564,10 +565,43 @@ export async function regenerate(
|
|
|
564
565
|
// in both this.messages and the DB.
|
|
565
566
|
conversation.processing = true;
|
|
566
567
|
conversation.abortController = new AbortController();
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
568
|
+
const resolvedRequestId = requestId ?? uuid();
|
|
569
|
+
conversation.currentRequestId = resolvedRequestId;
|
|
570
|
+
|
|
571
|
+
// Fire-and-forget: matches the /v1/messages pattern so the HTTP handler
|
|
572
|
+
// returns 202 immediately rather than blocking on the full agent turn.
|
|
573
|
+
// Otherwise the client's 15s POST timeout fires on any non-trivial
|
|
574
|
+
// regenerate and surfaces a misleading "Failed to regenerate message"
|
|
575
|
+
// banner even though the response streams in normally via SSE.
|
|
576
|
+
//
|
|
577
|
+
// runAgentLoop catches most errors internally and emits `request_error`
|
|
578
|
+
// itself, but anything thrown from its `finally` block (commit, drain,
|
|
579
|
+
// profiler) would otherwise escape silently because the caller does
|
|
580
|
+
// not await the agent loop. Emit a structured trace event so the
|
|
581
|
+
// observability contract is preserved on those paths too.
|
|
582
|
+
void conversation
|
|
583
|
+
.runAgentLoop(content, existingUserMessageId, onEvent, {
|
|
584
|
+
skipPreMessageRollback: true,
|
|
585
|
+
isUserMessage: true,
|
|
586
|
+
})
|
|
587
|
+
.catch((err) => {
|
|
588
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
589
|
+
log.error(
|
|
590
|
+
{ err, conversationId: conversation.conversationId },
|
|
591
|
+
"runAgentLoop after regenerate failed",
|
|
592
|
+
);
|
|
593
|
+
conversation.traceEmitter.emit(
|
|
594
|
+
"request_error",
|
|
595
|
+
truncate(message, 200, ""),
|
|
596
|
+
{
|
|
597
|
+
requestId: resolvedRequestId,
|
|
598
|
+
status: "error",
|
|
599
|
+
attributes: {
|
|
600
|
+
errorClass: err instanceof Error ? err.constructor.name : "Error",
|
|
601
|
+
message: truncate(message, 500, ""),
|
|
602
|
+
source: "regenerate_fire_and_forget",
|
|
603
|
+
},
|
|
604
|
+
},
|
|
605
|
+
);
|
|
606
|
+
});
|
|
573
607
|
}
|