@vellumai/assistant 0.6.3 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +5 -0
- package/ARCHITECTURE.md +298 -39
- package/Dockerfile +14 -3
- package/README.md +3 -4
- package/bun.lock +13 -16
- package/docs/architecture/integrations.md +1 -20
- package/docs/architecture/security.md +16 -16
- package/docs/backup-troubleshooting.md +52 -0
- package/docs/browser-use-architecture-phase2.md +174 -0
- package/docs/error-handling.md +111 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +121 -0
- package/knip.json +20 -3
- package/node_modules/@vellumai/ces-contracts/bun.lock +8 -6
- package/node_modules/@vellumai/ces-contracts/package.json +5 -4
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/openapi.yaml +1094 -72
- package/package.json +9 -8
- package/scripts/generate-openapi.ts +50 -12
- package/scripts/test.sh +73 -18
- package/src/__tests__/agent-image-optimize.test.ts +28 -0
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +235 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +434 -12
- package/src/__tests__/approval-cascade.test.ts +31 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +550 -0
- package/src/__tests__/auto-analysis-prompt.test.ts +50 -0
- package/src/__tests__/browser-fill-credential.test.ts +12 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +52 -159
- package/src/__tests__/btw-routes.test.ts +54 -1
- package/src/__tests__/call-controller.test.ts +582 -22
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +27 -4
- package/src/__tests__/catalog-files.test.ts +138 -0
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-invite-transport.test.ts +2 -2
- package/src/__tests__/channel-readiness-routes.test.ts +16 -20
- package/src/__tests__/channel-readiness-service.test.ts +12 -7
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +576 -502
- package/src/__tests__/clawhub-files.test.ts +347 -0
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/commit-message-enrichment-service.test.ts +36 -19
- package/src/__tests__/compaction-circuit-breaker.test.ts +336 -0
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +83 -0
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +1458 -198
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
- package/src/__tests__/config-watcher.test.ts +45 -10
- package/src/__tests__/contact-store-user-file.test.ts +511 -0
- package/src/__tests__/contacts-write.test.ts +197 -0
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +618 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +32 -16
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +62 -17
- package/src/__tests__/conversation-agent-loop.test.ts +510 -84
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +165 -9
- package/src/__tests__/conversation-error.test.ts +102 -1
- package/src/__tests__/conversation-history-web-search.test.ts +17 -4
- package/src/__tests__/conversation-init.benchmark.test.ts +42 -1
- package/src/__tests__/conversation-launcher-skill-regression.test.ts +51 -0
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-list-source.test.ts +145 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +32 -16
- package/src/__tests__/conversation-process-callsite.test.ts +306 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +32 -16
- package/src/__tests__/conversation-queue.test.ts +932 -76
- package/src/__tests__/conversation-routes-disk-view.test.ts +299 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2790 -55
- package/src/__tests__/conversation-runtime-workspace.test.ts +12 -12
- package/src/__tests__/conversation-skill-tools.test.ts +12 -143
- package/src/__tests__/conversation-slash-commands.test.ts +33 -0
- package/src/__tests__/conversation-slash-queue.test.ts +120 -34
- package/src/__tests__/conversation-slash-unknown.test.ts +32 -16
- package/src/__tests__/conversation-speed-override.test.ts +30 -11
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +2 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +226 -0
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +3 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +31 -10
- package/src/__tests__/conversation-workspace-injection.test.ts +45 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +46 -16
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-health-service.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +8 -3
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +495 -3
- package/src/__tests__/credentials-cli.test.ts +32 -16
- package/src/__tests__/cross-provider-web-search.test.ts +230 -35
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +10 -1
- package/src/__tests__/device-id.test.ts +112 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +167 -4
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +1 -3
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/email-html-renderer.test.ts +71 -0
- package/src/__tests__/email-invite-adapter.test.ts +36 -32
- package/src/__tests__/emit-event-signal.test.ts +71 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +101 -15
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/fixtures/mock-chrome-extension.ts +11 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +206 -1
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/gemini-provider.test.ts +64 -3
- package/src/__tests__/get-skill-detail-audit.test.ts +325 -0
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +44 -1
- package/src/__tests__/headless-browser-mode.test.ts +614 -0
- package/src/__tests__/headless-browser-navigate.test.ts +142 -5
- package/src/__tests__/headless-browser-read-tools.test.ts +11 -0
- package/src/__tests__/headless-browser-snapshot.test.ts +10 -0
- package/src/__tests__/heartbeat-service.test.ts +166 -32
- package/src/__tests__/home-state-routes.test.ts +162 -0
- package/src/__tests__/host-bash-proxy.test.ts +0 -5
- package/src/__tests__/host-browser-e2e-cloud.test.ts +138 -4
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +4 -4
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +103 -0
- package/src/__tests__/host-cu-proxy.test.ts +0 -5
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/identity-intro-cache.test.ts +40 -10
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
- package/src/__tests__/intent-routing.test.ts +1 -40
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +609 -0
- package/src/__tests__/llm-context-route-provider.test.ts +86 -5
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/llm-usage-store.test.ts +363 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/media-stream-output.test.ts +555 -0
- package/src/__tests__/media-stream-parser.test.ts +374 -0
- package/src/__tests__/media-stream-server-integration.test.ts +1234 -0
- package/src/__tests__/media-stream-stt-session.test.ts +588 -0
- package/src/__tests__/media-turn-detector.test.ts +440 -0
- package/src/__tests__/message-queue.test.ts +125 -0
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-export-http.test.ts +6 -6
- package/src/__tests__/migration-import-commit-http.test.ts +8 -6
- package/src/__tests__/migration-import-from-url.test.ts +684 -0
- package/src/__tests__/migration-import-preflight-http.test.ts +6 -5
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +151 -0
- package/src/__tests__/model-intents.test.ts +10 -84
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/oauth-apps-routes.test.ts +1 -0
- package/src/__tests__/oauth-cli.test.ts +2 -0
- package/src/__tests__/oauth-connect-orchestrator.test.ts +2 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +1 -0
- package/src/__tests__/oauth-providers-routes.test.ts +2 -0
- package/src/__tests__/oauth-store.test.ts +95 -7
- package/src/__tests__/oauth2-gateway-transport.test.ts +257 -9
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/onboarding-template-contract.test.ts +6 -13
- package/src/__tests__/openai-provider.test.ts +183 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +184 -0
- package/src/__tests__/openai-responses-provider.test.ts +1501 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/openrouter-token-estimation.test.ts +100 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -1
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persona-resolver.test.ts +251 -0
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +5 -1
- package/src/__tests__/platform.test.ts +92 -1
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +47 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +267 -0
- package/src/__tests__/pricing.test.ts +224 -3
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +0 -1
- package/src/__tests__/qdrant-manager.test.ts +29 -8
- package/src/__tests__/reaction-persistence.test.ts +560 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +194 -0
- package/src/__tests__/relationship-state-contract.test.ts +175 -0
- package/src/__tests__/relay-server.test.ts +424 -6
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/search-skills-unified.test.ts +118 -0
- package/src/__tests__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +5 -1
- package/src/__tests__/secure-keys.test.ts +107 -0
- package/src/__tests__/send-endpoint-busy.test.ts +34 -2
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +80 -0
- package/src/__tests__/settings-routes.test.ts +201 -0
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +276 -145
- package/src/__tests__/skills-files-catalog-fallback.test.ts +381 -93
- package/src/__tests__/skills.test.ts +19 -30
- package/src/__tests__/skillssh-files.test.ts +446 -0
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-block-formatting.test.ts +110 -0
- package/src/__tests__/slack-channel-config.test.ts +564 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/stt-catalog-parity.test.ts +282 -0
- package/src/__tests__/stt-stream-session.test.ts +535 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +160 -3
- package/src/__tests__/system-prompt.test.ts +126 -53
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/telephony-stt-routing.test.ts +329 -0
- package/src/__tests__/terminal-tools.test.ts +26 -7
- package/src/__tests__/test-preload.ts +18 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -49
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +10 -6
- package/src/__tests__/tool-executor-shell-integration.test.ts +4 -0
- package/src/__tests__/tool-executor.test.ts +88 -113
- package/src/__tests__/tool-result-truncation.test.ts +36 -0
- package/src/__tests__/trust-store.test.ts +442 -103
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
- package/src/__tests__/tts-catalog-parity.test.ts +345 -0
- package/src/__tests__/twilio-routes-twiml.test.ts +512 -114
- package/src/__tests__/twilio-routes.test.ts +376 -0
- package/src/__tests__/unicode.test.ts +293 -0
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/usage-routes.test.ts +25 -4
- package/src/__tests__/user-reference.test.ts +46 -61
- package/src/__tests__/verification-control-plane-policy.test.ts +5 -22
- package/src/__tests__/voice-config-update.test.ts +403 -0
- package/src/__tests__/voice-quality.test.ts +434 -19
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-heartbeat-service.test.ts +7 -0
- package/src/__tests__/workspace-migration-033-stt-service-explicit-config.test.ts +547 -0
- package/src/__tests__/workspace-migration-034-remove-calls-voice-transcription-provider.test.ts +596 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +368 -0
- package/src/__tests__/workspace-migration-meets.test.ts +244 -0
- package/src/__tests__/workspace-migration-seed-device-id.test.ts +14 -20
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +1 -11
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/image-optimize.ts +24 -12
- package/src/agent/loop.ts +251 -19
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/backup/__tests__/backup-key.test.ts +152 -0
- package/src/backup/__tests__/backup-worker.test.ts +767 -0
- package/src/backup/__tests__/list-snapshots.test.ts +87 -0
- package/src/backup/__tests__/local-writer.test.ts +218 -0
- package/src/backup/__tests__/offsite-writer.test.ts +641 -0
- package/src/backup/__tests__/paths.test.ts +300 -0
- package/src/backup/__tests__/restore.test.ts +498 -0
- package/src/backup/__tests__/snapshot-lock.test.ts +352 -0
- package/src/backup/__tests__/stream-crypt.test.ts +228 -0
- package/src/backup/backup-key.ts +137 -0
- package/src/backup/backup-worker.ts +459 -0
- package/src/backup/list-snapshots.ts +147 -0
- package/src/backup/local-writer.ts +133 -0
- package/src/backup/offsite-writer.ts +222 -0
- package/src/backup/paths.ts +226 -0
- package/src/backup/restore.ts +322 -0
- package/src/backup/snapshot-lock.ts +431 -0
- package/src/backup/stream-crypt.ts +263 -0
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/bundler/package-resolver.ts +4 -0
- package/src/calls/audio-store.ts +11 -5
- package/src/calls/call-controller.ts +226 -71
- package/src/calls/call-domain.ts +9 -0
- package/src/calls/call-speech-output.ts +190 -0
- package/src/calls/call-transport.ts +77 -0
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/media-stream-audio-transcode.ts +173 -0
- package/src/calls/media-stream-output.ts +660 -0
- package/src/calls/media-stream-parser.ts +300 -0
- package/src/calls/media-stream-protocol.ts +166 -0
- package/src/calls/media-stream-server.ts +592 -0
- package/src/calls/media-stream-stt-session.ts +460 -0
- package/src/calls/media-turn-detector.ts +230 -0
- package/src/calls/relay-server.ts +90 -75
- package/src/calls/resolve-call-tts-provider.ts +136 -0
- package/src/calls/telephony-stt-routing.ts +145 -0
- package/src/calls/tts-call-strategy.ts +161 -0
- package/src/calls/tts-text-sanitizer.ts +32 -16
- package/src/calls/twilio-routes.ts +281 -17
- package/src/calls/voice-quality.ts +78 -35
- package/src/calls/voice-session-bridge.ts +9 -1
- package/src/channels/types.ts +16 -0
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/__tests__/run-assistant-command.ts +11 -1
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/backup.test.ts +1165 -0
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +234 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +132 -0
- package/src/cli/commands/__tests__/email-attachment.test.ts +422 -0
- package/src/cli/commands/__tests__/email-download.test.ts +16 -1
- package/src/cli/commands/__tests__/email-list.test.ts +28 -4
- package/src/cli/commands/__tests__/email-register.test.ts +4 -4
- package/src/cli/commands/__tests__/email-send.test.ts +130 -5
- package/src/cli/commands/__tests__/email-status.test.ts +5 -1
- package/src/cli/commands/__tests__/email-unregister.test.ts +34 -5
- package/src/cli/commands/__tests__/image-generation.test.ts +666 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +451 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +594 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/backup.ts +993 -0
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/completions.ts +0 -3
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +90 -0
- package/src/cli/commands/credentials.ts +0 -1
- package/src/cli/commands/domain.ts +210 -0
- package/src/cli/commands/email.ts +308 -16
- package/src/cli/commands/image-generation.ts +300 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/oauth/__tests__/connect.test.ts +12 -0
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +1 -0
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -0
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -0
- package/src/cli/commands/oauth/mode.ts +12 -3
- package/src/cli/commands/oauth/providers.ts +15 -0
- package/src/cli/commands/oauth/shared.ts +2 -1
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +4 -10
- package/src/cli/commands/platform/__tests__/connect.test.ts +6 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -2
- package/src/cli/commands/platform/__tests__/status.test.ts +6 -1
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +53 -8
- package/src/cli.ts +0 -37
- package/src/config/__tests__/backup-schema.test.ts +134 -0
- package/src/config/assistant-feature-flags.ts +61 -62
- package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +37 -1
- package/src/config/bundled-skills/contacts/SKILL.md +2 -2
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +23 -1
- package/src/config/bundled-skills/media-processing/SKILL.md +3 -9
- package/src/config/bundled-skills/media-processing/TOOLS.json +1 -6
- package/src/config/bundled-skills/media-processing/__tests__/audio-transcribe.test.ts +125 -0
- package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +181 -0
- package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +141 -0
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +32 -87
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +8 -4
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +0 -10
- package/src/config/bundled-skills/messaging/SKILL.md +5 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +9 -2
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +11 -12
- package/src/config/bundled-skills/phone-calls/SKILL.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +28 -18
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +3 -3
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +26 -22
- package/src/config/bundled-skills/transcribe/SKILL.md +9 -14
- package/src/config/bundled-skills/transcribe/TOOLS.json +2 -7
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +256 -0
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +38 -188
- package/src/config/bundled-tool-registry.ts +0 -167
- package/src/config/env-registry.ts +24 -0
- package/src/config/env.ts +39 -10
- package/src/config/feature-flag-registry.json +63 -15
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +220 -22
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +65 -51
- package/src/config/schemas/__tests__/stt.test.ts +43 -0
- package/src/config/schemas/analysis.ts +32 -0
- package/src/config/schemas/backup.ts +72 -0
- package/src/config/schemas/calls.ts +1 -30
- package/src/config/schemas/elevenlabs.ts +0 -59
- package/src/config/schemas/filing.ts +49 -14
- package/src/config/schemas/heartbeat.ts +27 -10
- package/src/config/schemas/host-browser.ts +47 -1
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +318 -0
- package/src/config/schemas/memory-lifecycle.ts +14 -2
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +53 -4
- package/src/config/schemas/stt.ts +60 -0
- package/src/config/schemas/tts.ts +283 -0
- package/src/config/schemas/updates.ts +14 -0
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skills.ts +6 -2
- package/src/config/types.ts +4 -0
- package/src/contacts/contact-store.ts +56 -11
- package/src/contacts/contacts-write.ts +38 -1
- package/src/context/__tests__/compact-prompt.test.ts +45 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/post-turn-tool-result-truncation.ts +3 -2
- package/src/context/prompts/compact.md +12 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/tool-result-truncation.ts +2 -1
- package/src/context/window-manager.ts +272 -35
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +23 -2
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +96 -2
- package/src/credential-health/credential-health-service.ts +366 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +324 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +497 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +17 -8
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +127 -0
- package/src/daemon/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +99 -6
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +85 -12
- package/src/daemon/conversation-agent-loop.ts +563 -104
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +46 -0
- package/src/daemon/conversation-history.ts +40 -6
- package/src/daemon/conversation-launch.ts +220 -0
- package/src/daemon/conversation-lifecycle.ts +85 -11
- package/src/daemon/conversation-messaging.ts +110 -7
- package/src/daemon/conversation-notifiers.ts +5 -0
- package/src/daemon/conversation-process.ts +591 -23
- package/src/daemon/conversation-queue-manager.ts +27 -0
- package/src/daemon/conversation-runtime-assembly.ts +769 -28
- package/src/daemon/conversation-slash.ts +38 -2
- package/src/daemon/conversation-surfaces.ts +483 -5
- package/src/daemon/conversation-tool-setup.ts +35 -5
- package/src/daemon/conversation-usage.ts +8 -5
- package/src/daemon/conversation.ts +193 -47
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +54 -12
- package/src/daemon/handlers/config-slack-channel.ts +269 -94
- package/src/daemon/handlers/conversations.ts +13 -3
- package/src/daemon/handlers/shared.ts +51 -1
- package/src/daemon/handlers/skills.ts +323 -79
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/host-browser-proxy.ts +2 -1
- package/src/daemon/lifecycle.ts +185 -26
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/conversations.ts +48 -1
- package/src/daemon/message-types/home.ts +40 -0
- package/src/daemon/message-types/meet.ts +143 -0
- package/src/daemon/message-types/messages.ts +23 -1
- package/src/daemon/message-types/schedules.ts +34 -2
- package/src/daemon/message-types/skills.ts +16 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +463 -10
- package/src/daemon/shutdown-handlers.ts +32 -4
- package/src/daemon/shutdown-registry.ts +40 -0
- package/src/daemon/tool-side-effects.ts +9 -9
- package/src/daemon/watch-handler.ts +4 -4
- package/src/daemon/web-search-history.ts +126 -0
- package/src/email/html-renderer.ts +76 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/heartbeat-service.ts +156 -22
- package/src/home/__tests__/assistant-feed-authoring.test.ts +156 -0
- package/src/home/__tests__/emit-feed-event.test.ts +169 -0
- package/src/home/__tests__/feed-scheduler.test.ts +222 -0
- package/src/home/__tests__/feed-types.test.ts +275 -0
- package/src/home/__tests__/feed-writer.test.ts +688 -0
- package/src/home/__tests__/phase5-exit-criteria.test.ts +212 -0
- package/src/home/__tests__/platform-gmail-digest.test.ts +222 -0
- package/src/home/__tests__/progress-formula.test.ts +213 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +740 -0
- package/src/home/__tests__/rollup-producer.test.ts +442 -0
- package/src/home/assistant-feed-authoring.ts +128 -0
- package/src/home/emit-feed-event.ts +162 -0
- package/src/home/feed-scheduler.ts +263 -0
- package/src/home/feed-types.ts +235 -0
- package/src/home/feed-writer.ts +469 -0
- package/src/home/platform-gmail-digest.ts +163 -0
- package/src/home/progress-formula.ts +86 -0
- package/src/home/relationship-state-writer.ts +824 -0
- package/src/home/relationship-state.ts +143 -0
- package/src/home/rollup-producer.ts +413 -0
- package/src/home/suggested-prompts.ts +101 -0
- package/src/hooks/runner.ts +7 -0
- package/src/inbound/platform-callback-registration.ts +12 -3
- package/src/inbound/public-ingress-urls.ts +12 -0
- package/src/instrument.ts +1 -1
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/cli-ipc.test.ts +200 -0
- package/src/ipc/__tests__/socket-path.test.ts +73 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +152 -0
- package/src/ipc/cli-server.ts +252 -0
- package/src/ipc/gateway-client.ts +180 -0
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +61 -0
- package/src/ipc/routes/browser.ts +96 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/index.ts +21 -0
- package/src/ipc/routes/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/wake-conversation.ts +19 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +100 -0
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +356 -0
- package/src/memory/__tests__/auto-analysis-guard.test.ts +57 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +233 -0
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +196 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/app-store.ts +1 -1
- package/src/memory/attachments-store.ts +70 -0
- package/src/memory/auto-analysis-enqueue.ts +127 -0
- package/src/memory/auto-analysis-guard.ts +27 -0
- package/src/memory/cleanup-schedule-state.ts +37 -0
- package/src/memory/conversation-analyze-job.ts +74 -0
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +199 -0
- package/src/memory/conversation-disk-view.ts +7 -0
- package/src/memory/conversation-group-migration.ts +65 -1
- package/src/memory/conversation-queries.ts +6 -5
- package/src/memory/conversation-title-service.ts +7 -4
- package/src/memory/db-init.ts +8 -0
- package/src/memory/db-maintenance.ts +108 -0
- package/src/memory/db.ts +1 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/graph/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +104 -29
- package/src/memory/graph/extraction.test.ts +295 -2
- package/src/memory/graph/extraction.ts +181 -51
- package/src/memory/graph/graph-search.test.ts +92 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +257 -66
- package/src/memory/graph/scoring.test.ts +186 -0
- package/src/memory/graph/scoring.ts +31 -1
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/group-crud.ts +6 -1
- package/src/memory/indexer.ts +95 -16
- package/src/memory/job-handlers/cleanup.ts +11 -8
- package/src/memory/job-handlers/conversation-starters.ts +39 -30
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +106 -5
- package/src/memory/jobs-worker.ts +26 -9
- package/src/memory/llm-usage-store.ts +92 -56
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/219-oauth-providers-token-exchange-body-format.ts +15 -0
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +190 -0
- package/src/memory/migrations/221-conversations-archived-at.ts +16 -0
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/index.ts +7 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/pkb/pkb-index.test.ts +368 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +251 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +438 -0
- package/src/memory/pkb/pkb-search.ts +137 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.ts +122 -1
- package/src/memory/qdrant-manager.ts +43 -16
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/oauth.ts +3 -0
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/memory/usage-buckets.ts +396 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +79 -6
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +282 -0
- package/src/messaging/providers/slack/adapter.ts +155 -38
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/client.ts +16 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1373 -0
- package/src/messaging/providers/slack/render-transcript.ts +443 -0
- package/src/messaging/providers/slack/types.ts +4 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/decision-engine.ts +6 -12
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/notifications/signal.ts +5 -0
- package/src/oauth/__tests__/identity-verifier.test.ts +1 -0
- package/src/oauth/byo-connection.test.ts +18 -1
- package/src/oauth/byo-connection.ts +3 -1
- package/src/oauth/connect-orchestrator.ts +2 -0
- package/src/oauth/connection-resolver.ts +6 -2
- package/src/oauth/connection.ts +2 -0
- package/src/oauth/oauth-store.ts +10 -0
- package/src/oauth/platform-connection.test.ts +145 -0
- package/src/oauth/platform-connection.ts +62 -31
- package/src/oauth/seed-providers.ts +10 -1
- package/src/permissions/approval-policy.test.ts +948 -0
- package/src/permissions/approval-policy.ts +257 -0
- package/src/permissions/bash-risk-classifier.test.ts +1208 -0
- package/src/permissions/bash-risk-classifier.ts +707 -0
- package/src/permissions/checker.ts +218 -699
- package/src/permissions/command-registry.test.ts +535 -0
- package/src/permissions/command-registry.ts +825 -0
- package/src/permissions/defaults.ts +71 -75
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/risk-types.ts +205 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +164 -65
- package/src/permissions/types.ts +23 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +1 -13
- package/src/platform/client.test.ts +10 -0
- package/src/platform/client.ts +19 -1
- package/src/platform/sync-identity.ts +129 -0
- package/src/prompts/persona-resolver.ts +127 -3
- package/src/prompts/system-prompt.ts +78 -38
- package/src/prompts/templates/BOOTSTRAP.md +5 -5
- package/src/prompts/templates/SOUL.md +5 -3
- package/src/prompts/templates/channels/slack.md +20 -0
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/prompts/user-reference.ts +20 -17
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +42 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +335 -70
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/fireworks/client.ts +2 -2
- package/src/providers/gemini/client.ts +74 -3
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +502 -28
- package/src/providers/model-intents.ts +8 -8
- package/src/providers/ollama/client.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +530 -0
- package/src/providers/openai/client.ts +25 -440
- package/src/providers/openai/responses-provider.ts +579 -0
- package/src/providers/openrouter/client.ts +168 -4
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-secret-catalog.ts +139 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +21 -10
- package/src/providers/retry.ts +185 -39
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +251 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +883 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +980 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +767 -0
- package/src/providers/speech-to-text/deepgram.test.ts +332 -0
- package/src/providers/speech-to-text/deepgram.ts +115 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.test.ts +743 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +625 -0
- package/src/providers/speech-to-text/google-gemini.test.ts +226 -0
- package/src/providers/speech-to-text/google-gemini.ts +101 -0
- package/src/providers/speech-to-text/openai-whisper-stream.test.ts +564 -0
- package/src/providers/speech-to-text/openai-whisper-stream.ts +381 -0
- package/src/providers/speech-to-text/openai-whisper.test.ts +1 -37
- package/src/providers/speech-to-text/openai-whisper.ts +63 -33
- package/src/providers/speech-to-text/provider-catalog.ts +323 -0
- package/src/providers/speech-to-text/resolve.ts +393 -6
- package/src/providers/speech-to-text/xai-realtime.test.ts +578 -0
- package/src/providers/speech-to-text/xai-realtime.ts +796 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +102 -3
- package/src/runtime/AGENTS.md +45 -3
- package/src/runtime/__tests__/agent-wake.test.ts +872 -0
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/__tests__/runtime-mode.test.ts +62 -0
- package/src/runtime/__tests__/slack-block-formatting.test.ts +481 -0
- package/src/runtime/agent-wake.ts +553 -0
- package/src/runtime/auth/__tests__/route-policy.test.ts +40 -0
- package/src/runtime/auth/route-policy.ts +34 -5
- package/src/runtime/auth/token-service.ts +56 -1
- package/src/runtime/btw-sidechain.ts +15 -3
- package/src/runtime/capability-tokens.ts +10 -10
- package/src/runtime/channel-invite-transport.ts +1 -1
- package/src/runtime/channel-invite-transports/email.ts +14 -6
- package/src/runtime/channel-readiness-service.ts +12 -22
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/chrome-extension-registry.ts +38 -2
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +447 -11
- package/src/runtime/http-types.ts +29 -3
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +36 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +360 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/migration-transport.ts +1 -0
- package/src/runtime/migrations/migration-wizard.ts +1 -0
- package/src/runtime/migrations/vbundle-import-analyzer.ts +77 -1
- package/src/runtime/migrations/vbundle-importer.ts +187 -8
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/pending-interactions.ts +0 -11
- package/src/runtime/routes/__tests__/backup-routes.test.ts +967 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +618 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +247 -0
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +474 -0
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +148 -17
- package/src/runtime/routes/app-management-routes.ts +12 -18
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +58 -0
- package/src/runtime/routes/approval-routes.ts +12 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/attachment-routes.test.ts +9 -3
- package/src/runtime/routes/attachment-routes.ts +216 -17
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/backup-routes.ts +519 -0
- package/src/runtime/routes/browser-extension-pair-routes.ts +82 -23
- package/src/runtime/routes/btw-routes.ts +9 -10
- package/src/runtime/routes/contact-routes.test.ts +298 -0
- package/src/runtime/routes/contact-routes.ts +132 -5
- package/src/runtime/routes/conversation-analysis-routes.ts +22 -142
- package/src/runtime/routes/conversation-management-routes.ts +133 -0
- package/src/runtime/routes/conversation-routes.ts +487 -160
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/filing-routes.ts +93 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +452 -0
- package/src/runtime/routes/home-state-routes.ts +138 -0
- package/src/runtime/routes/host-browser-routes.ts +3 -14
- package/src/runtime/routes/identity-intro-cache.ts +7 -3
- package/src/runtime/routes/identity-routes.ts +3 -17
- package/src/runtime/routes/inbound-message-handler.ts +912 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +46 -39
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +15 -15
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +137 -0
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +179 -0
- package/src/runtime/routes/integrations/slack/channel.ts +36 -6
- package/src/runtime/routes/integrations/slack/share.ts +45 -7
- package/src/runtime/routes/llm-context-normalization.ts +325 -0
- package/src/runtime/routes/memory-item-routes.test.ts +3 -2
- package/src/runtime/routes/migration-routes.ts +722 -91
- package/src/runtime/routes/settings-routes.ts +26 -7
- package/src/runtime/routes/skills-routes.ts +76 -7
- package/src/runtime/routes/stt-routes.ts +233 -0
- package/src/runtime/routes/surface-action-routes.ts +41 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/tts-routes.ts +108 -24
- package/src/runtime/routes/usage-routes.ts +30 -2
- package/src/runtime/routes/user-route-dispatcher.ts +50 -5
- package/src/runtime/routes/user-routes.ts +13 -1
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +11 -3
- package/src/runtime/runtime-mode.ts +33 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +426 -0
- package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +67 -0
- package/src/runtime/services/__tests__/auto-analysis-prompt.test.ts +53 -0
- package/src/runtime/services/__tests__/manual-analysis-prompt.test.ts +41 -0
- package/src/runtime/services/analyze-conversation.ts +340 -0
- package/src/runtime/services/analyze-deps-singleton.ts +32 -0
- package/src/runtime/services/auto-analysis-prompt.ts +55 -0
- package/src/runtime/skill-route-registry.ts +71 -0
- package/src/runtime/slack-block-formatting.ts +437 -10
- package/src/schedule/scheduler.ts +58 -0
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +122 -37
- package/src/security/secure-keys.ts +32 -10
- package/src/security/token-manager.ts +35 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/sequence/engine.ts +23 -0
- package/src/sequence/types.ts +1 -1
- package/src/skills/catalog-cache.ts +26 -7
- package/src/skills/catalog-files.ts +64 -2
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/category-inference.ts +122 -0
- package/src/skills/clawhub-files.ts +213 -0
- package/src/skills/clawhub.ts +84 -23
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/skills/skill-file-provider.ts +40 -0
- package/src/skills/skillssh-files.ts +395 -0
- package/src/skills/skillssh-registry.ts +4 -4
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +468 -0
- package/src/stt/__tests__/types.test.ts +89 -0
- package/src/stt/daemon-batch-transcriber.ts +228 -0
- package/src/stt/stt-stream-session.ts +506 -0
- package/src/stt/types.ts +334 -0
- package/src/stt/wav-encoder.test.ts +373 -0
- package/src/stt/wav-encoder.ts +175 -0
- package/src/subagent/manager.ts +79 -27
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-mode.test.ts +119 -0
- package/src/tools/browser/__tests__/browser-status.test.ts +166 -0
- package/src/tools/browser/browser-execution.ts +1208 -41
- package/src/tools/browser/browser-manager.ts +45 -0
- package/src/tools/browser/browser-mode-constants.ts +12 -0
- package/src/tools/browser/browser-mode.ts +92 -0
- package/src/tools/browser/browser-status-constants.ts +33 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +393 -0
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +29 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +1648 -32
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +264 -0
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +205 -17
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +254 -21
- package/src/tools/browser/cdp-client/errors.ts +15 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +39 -16
- package/src/tools/browser/cdp-client/factory.ts +797 -87
- package/src/tools/browser/cdp-client/index.ts +16 -2
- package/src/tools/browser/cdp-client/types.ts +68 -0
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +41 -7
- package/src/tools/executor.ts +4 -0
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/web-fetch.ts +25 -12
- package/src/tools/network/web-search.ts +20 -2
- package/src/tools/permission-checker.ts +36 -15
- package/src/tools/policy-context.ts +25 -8
- package/src/tools/registry.ts +55 -3
- package/src/tools/shared/shell-output.ts +3 -1
- package/src/tools/side-effects.ts +0 -9
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +6 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +11 -2
- package/src/tools/terminal/shell.ts +16 -4
- package/src/tools/tool-manifest.ts +6 -0
- package/src/tools/types.ts +29 -3
- package/src/tools/ui-surface/definitions.ts +6 -1
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +1061 -0
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +196 -0
- package/src/tts/__tests__/provider-catalog.test.ts +183 -0
- package/src/tts/__tests__/provider-registry.test.ts +90 -0
- package/src/tts/provider-catalog.ts +219 -0
- package/src/tts/provider-registry.ts +73 -0
- package/src/tts/providers/deepgram-provider.ts +219 -0
- package/src/tts/providers/elevenlabs-provider.ts +211 -0
- package/src/tts/providers/fish-audio-provider.ts +183 -0
- package/src/tts/providers/index.ts +44 -0
- package/src/tts/providers/register-builtins.ts +130 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/synthesize-text.ts +110 -0
- package/src/tts/tts-config-resolver.ts +78 -0
- package/src/tts/types.ts +199 -0
- package/src/types/onboarding-context.ts +7 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/abort-reasons.ts +58 -0
- package/src/util/device-id.ts +32 -16
- package/src/util/errors.ts +9 -1
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +56 -12
- package/src/util/pricing.ts +78 -5
- package/src/util/spawn.ts +1 -1
- package/src/util/truncate.ts +4 -2
- package/src/util/unicode.ts +201 -0
- package/src/version.ts +19 -24
- package/src/watcher/engine.ts +24 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/watcher/watcher-store.ts +31 -0
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/003-seed-device-id.ts +9 -3
- package/src/workspace/migrations/017-seed-persona-dirs.ts +68 -4
- package/src/workspace/migrations/029-seed-pkb.ts +1 -1
- package/src/workspace/migrations/031-drop-user-md.ts +317 -0
- package/src/workspace/migrations/031-llm-log-retention-zero-to-null.ts +73 -0
- package/src/workspace/migrations/032-tts-provider-unification.ts +227 -0
- package/src/workspace/migrations/033-stt-service-explicit-config.ts +122 -0
- package/src/workspace/migrations/034-remove-calls-voice-transcription-provider.ts +215 -0
- package/src/workspace/migrations/035-seed-slack-channel-persona.ts +50 -0
- package/src/workspace/migrations/036-update-pkb-index-bar.ts +37 -0
- package/src/workspace/migrations/037-create-meets-dir.ts +61 -0
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +57 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +32 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/src/workspace/top-level-renderer.ts +13 -1
- package/src/workspace/turn-commit.ts +31 -0
- package/src/__tests__/email-cli.test.ts +0 -297
- package/src/__tests__/email-service-config-fallback.test.ts +0 -102
- package/src/__tests__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -250
- package/src/__tests__/update-bulletin-format.test.ts +0 -122
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -277
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/browser-relay.ts +0 -466
- package/src/cli/commands/doctor.ts +0 -341
- package/src/config/bundled-skills/browser/SKILL.md +0 -63
- package/src/config/bundled-skills/browser/TOOLS.json +0 -393
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -32
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/gmail/SKILL.md +0 -175
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -558
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -149
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -220
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -251
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/slack/SKILL.md +0 -107
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/email/guardrails.ts +0 -221
- package/src/email/provider.ts +0 -117
- package/src/email/providers/agentmail.ts +0 -361
- package/src/email/providers/index.ts +0 -65
- package/src/email/service.ts +0 -384
- package/src/email/types.ts +0 -126
- package/src/prompts/templates/UPDATES.md +0 -38
- package/src/prompts/templates/USER.md +0 -13
- package/src/prompts/update-bulletin-format.ts +0 -68
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -128
- package/src/providers/speech-to-text/types.ts +0 -17
- package/src/runtime/routes/browser-cdp-routes.ts +0 -229
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
1
4
|
import type { ContextWindowConfig } from "../config/types.js";
|
|
2
5
|
import type {
|
|
3
6
|
ContentBlock,
|
|
@@ -5,7 +8,9 @@ import type {
|
|
|
5
8
|
Message,
|
|
6
9
|
Provider,
|
|
7
10
|
} from "../providers/types.js";
|
|
11
|
+
import { resolveBundledDir } from "../util/bundled-asset.js";
|
|
8
12
|
import { getLogger } from "../util/logger.js";
|
|
13
|
+
import { safeStringSlice } from "../util/unicode.js";
|
|
9
14
|
import {
|
|
10
15
|
estimateContentBlockTokens,
|
|
11
16
|
estimatePromptTokens,
|
|
@@ -25,11 +30,38 @@ const COMPACTION_TOOL_RESULT_MAX_CHARS = 6_000;
|
|
|
25
30
|
const MIN_COMPACTABLE_PERSISTED_MESSAGES = 2;
|
|
26
31
|
const INTERNAL_CONTEXT_SUMMARY_MESSAGES = new WeakSet<Message>();
|
|
27
32
|
|
|
28
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Load the compaction summary system prompt from the bundled markdown asset.
|
|
35
|
+
*
|
|
36
|
+
* `resolveBundledDir` handles the compiled-binary case where the caller path
|
|
37
|
+
* points to `/$bunfs/` and the asset lives next to the executable (macOS app
|
|
38
|
+
* bundle `Contents/Resources/` or sibling dir). In source mode it falls back
|
|
39
|
+
* to the sibling `prompts/` directory.
|
|
40
|
+
*/
|
|
41
|
+
export function loadCompactPrompt(): string {
|
|
42
|
+
const callerDir = import.meta.dirname ?? __dirname;
|
|
43
|
+
const promptsDir = resolveBundledDir(callerDir, "prompts", "compact-prompts");
|
|
44
|
+
const promptPath = join(promptsDir, "compact.md");
|
|
45
|
+
const contents = readFileSync(promptPath, "utf-8");
|
|
46
|
+
if (contents.length === 0) {
|
|
47
|
+
throw new Error(
|
|
48
|
+
`compact.md at ${promptPath} is empty — compaction summary prompt missing`,
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
return contents;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Hardcoded fallback prompt used when the bundled `compact.md` asset is
|
|
56
|
+
* missing or unreadable, so the daemon can still compact conversations
|
|
57
|
+
* rather than failing module import at startup.
|
|
58
|
+
*/
|
|
59
|
+
const SUMMARY_PROMPT_FALLBACK = [
|
|
29
60
|
"You compress long assistant conversations into durable working memory.",
|
|
30
61
|
"Focus on actionable state, not prose.",
|
|
31
62
|
"Preserve concrete facts: goals, constraints, decisions, pending questions, file paths, commands, errors, and TODOs.",
|
|
32
63
|
"Remove repetition and stale details that were superseded.",
|
|
64
|
+
'Thread anchors: when a "Retained Thread References" section is present, each listed reply cites its parent via `→ Mxxxxxx`. If that parent appears in the Transcript, preserve its text verbatim (reactions may be aggregated as "N users reacted"). Omit when the section is absent.',
|
|
33
65
|
"Return concise markdown using these section headers exactly:",
|
|
34
66
|
"## Goals",
|
|
35
67
|
"## Constraints",
|
|
@@ -39,6 +71,42 @@ const SUMMARY_SYSTEM_PROMPT = [
|
|
|
39
71
|
"## Recent Progress",
|
|
40
72
|
].join("\n");
|
|
41
73
|
|
|
74
|
+
/**
|
|
75
|
+
* Load the compact prompt with graceful fallback. If `loader` throws (missing
|
|
76
|
+
* or unreadable bundled asset, partial deployment, filesystem corruption),
|
|
77
|
+
* logs a warning and returns the hardcoded fallback string so module import
|
|
78
|
+
* never fails. The loader is injectable for testability.
|
|
79
|
+
*/
|
|
80
|
+
export function loadCompactPromptOrFallback(
|
|
81
|
+
loader: () => string = loadCompactPrompt,
|
|
82
|
+
): string {
|
|
83
|
+
try {
|
|
84
|
+
return loader();
|
|
85
|
+
} catch (err) {
|
|
86
|
+
log.warn(
|
|
87
|
+
{ err },
|
|
88
|
+
"Failed to load compact.md from bundle; using inline fallback prompt. The bundled asset may be missing or unreadable.",
|
|
89
|
+
);
|
|
90
|
+
return SUMMARY_PROMPT_FALLBACK;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const SUMMARY_SYSTEM_PROMPT = loadCompactPromptOrFallback();
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Pattern matching a Slack-style reply tag-line's parent-alias reference.
|
|
98
|
+
* The chronological renderer emits reply lines as
|
|
99
|
+
* `[MM/DD/YY HH:MM @sender → Mxxxxxx]: body`, or, for edited replies,
|
|
100
|
+
* `[MM/DD/YY HH:MM @sender → Mxxxxxx, edited MM/DD/YY HH:MM]: body`. The
|
|
101
|
+
* character after the 6-hex parent alias is therefore `]` for a plain reply
|
|
102
|
+
* or `,` for an edited one — the regex accepts either. `Mxxxxxx` is the
|
|
103
|
+
* first 6 hex chars of sha256(threadTs). A retained-tail text block that
|
|
104
|
+
* contains this pattern is carrying a live reference to a parent that may
|
|
105
|
+
* still live in the compactable region — the summarizer needs to know about
|
|
106
|
+
* it to act on the Thread-anchors clause of SUMMARY_SYSTEM_PROMPT.
|
|
107
|
+
*/
|
|
108
|
+
const THREAD_REPLY_REFERENCE_PATTERN = /→ M[0-9a-f]{6}[,\]]/;
|
|
109
|
+
|
|
42
110
|
export interface ContextWindowResult {
|
|
43
111
|
messages: Message[];
|
|
44
112
|
compacted: boolean;
|
|
@@ -57,6 +125,13 @@ export interface ContextWindowResult {
|
|
|
57
125
|
summaryRawResponses?: unknown[];
|
|
58
126
|
summaryText: string;
|
|
59
127
|
reason?: string;
|
|
128
|
+
/**
|
|
129
|
+
* True when the summary LLM call threw and the local fallback produced the
|
|
130
|
+
* summary. Callers use this to distinguish provider-side summary failures
|
|
131
|
+
* from successful compactions so they can apply circuit-breaker logic
|
|
132
|
+
* without losing the fallback-compacted messages.
|
|
133
|
+
*/
|
|
134
|
+
summaryFailed?: boolean;
|
|
60
135
|
}
|
|
61
136
|
|
|
62
137
|
export interface ShouldCompactResult {
|
|
@@ -72,13 +147,22 @@ export interface ContextWindowCompactOptions {
|
|
|
72
147
|
* Override the minimum number of recent user turns to preserve.
|
|
73
148
|
* Set to `0` for emergency recovery that can compact the entire history
|
|
74
149
|
* (except the summary message itself). When omitted, the default floor
|
|
75
|
-
*
|
|
150
|
+
* is `1` (or `8` when `conversationOriginChannel === "slack"`).
|
|
76
151
|
*/
|
|
77
152
|
minKeepRecentUserTurns?: number;
|
|
153
|
+
/**
|
|
154
|
+
* Origin channel hint used when `minKeepRecentUserTurns` is omitted.
|
|
155
|
+
* Slack-originated conversations bump the default keep floor so multi-turn
|
|
156
|
+
* thread context (replies, quoted messages) is not summarized away too
|
|
157
|
+
* aggressively. Explicit `minKeepRecentUserTurns` overrides this hint.
|
|
158
|
+
*/
|
|
159
|
+
conversationOriginChannel?: string;
|
|
78
160
|
/**
|
|
79
161
|
* Override the target input token budget used for keep-boundary
|
|
80
|
-
* projected-fit checks.
|
|
81
|
-
*
|
|
162
|
+
* projected-fit checks. Clamped to no looser than `config.targetInputTokens`
|
|
163
|
+
* — i.e. the override may only demand a *stricter* fit. Passing a looser
|
|
164
|
+
* value has no effect. Intended for forced recovery paths that need a
|
|
165
|
+
* tighter target than the default.
|
|
82
166
|
*/
|
|
83
167
|
targetInputTokensOverride?: number;
|
|
84
168
|
/**
|
|
@@ -110,6 +194,16 @@ export class ContextWindowManager {
|
|
|
110
194
|
* after a successful compaction pass.
|
|
111
195
|
*/
|
|
112
196
|
nonPersistedPrefixCount = 0;
|
|
197
|
+
/**
|
|
198
|
+
* True when the message at index 0 is a context summary that was inherited
|
|
199
|
+
* from a parent fork (i.e. injected as part of the non-persisted prefix),
|
|
200
|
+
* rather than produced by this conversation's own compaction. The parent
|
|
201
|
+
* summary sits at index 0 but is excluded from `compactableMessages` by
|
|
202
|
+
* `summaryOffset`, so its slot in `nonPersistedPrefixCount` must be
|
|
203
|
+
* accounted for separately. Cleared after the first compaction replaces
|
|
204
|
+
* the parent summary with a child-owned one.
|
|
205
|
+
*/
|
|
206
|
+
summaryIsInjected = false;
|
|
113
207
|
/**
|
|
114
208
|
* Cached resolved system prompt. Lazily populated on first access via the
|
|
115
209
|
* `systemPrompt` getter and cleared after each compaction pass so the next
|
|
@@ -124,6 +218,16 @@ export class ContextWindowManager {
|
|
|
124
218
|
this.toolTokenBudget = options.toolTokenBudget ?? 0;
|
|
125
219
|
}
|
|
126
220
|
|
|
221
|
+
/**
|
|
222
|
+
* Provider key for the local token estimator. Wrapper providers (e.g.
|
|
223
|
+
* OpenRouter routing to `anthropic/*`) override `tokenEstimationProvider`
|
|
224
|
+
* so image/PDF sizing uses the same rules as the upstream API instead of
|
|
225
|
+
* the generic `base64/4` fallback.
|
|
226
|
+
*/
|
|
227
|
+
private get estimationProviderName(): string {
|
|
228
|
+
return this.provider.tokenEstimationProvider ?? this.provider.name;
|
|
229
|
+
}
|
|
230
|
+
|
|
127
231
|
/** Lazily resolve and cache the system prompt for the duration of a compaction pass. */
|
|
128
232
|
private get systemPrompt(): string {
|
|
129
233
|
if (this._resolvedSystemPrompt !== undefined) {
|
|
@@ -151,7 +255,7 @@ export class ContextWindowManager {
|
|
|
151
255
|
if (!this.config.enabled) return { needed: false, estimatedTokens: 0 };
|
|
152
256
|
try {
|
|
153
257
|
const estimated = estimatePromptTokens(messages, this.systemPrompt, {
|
|
154
|
-
providerName: this.
|
|
258
|
+
providerName: this.estimationProviderName,
|
|
155
259
|
toolTokenBudget: this.toolTokenBudget,
|
|
156
260
|
});
|
|
157
261
|
const threshold = Math.floor(
|
|
@@ -183,7 +287,7 @@ export class ContextWindowManager {
|
|
|
183
287
|
const previousEstimatedInputTokens =
|
|
184
288
|
options?.precomputedEstimate ??
|
|
185
289
|
estimatePromptTokens(messages, this.systemPrompt, {
|
|
186
|
-
providerName: this.
|
|
290
|
+
providerName: this.estimationProviderName,
|
|
187
291
|
toolTokenBudget: this.toolTokenBudget,
|
|
188
292
|
});
|
|
189
293
|
const thresholdTokens = Math.floor(
|
|
@@ -253,6 +357,8 @@ export class ContextWindowManager {
|
|
|
253
357
|
const keepPlan = this.pickKeepBoundary(messages, userTurnStarts, {
|
|
254
358
|
minKeepRecentUserTurns: options?.minKeepRecentUserTurns,
|
|
255
359
|
targetInputTokensOverride: options?.targetInputTokensOverride,
|
|
360
|
+
conversationOriginChannel: options?.conversationOriginChannel,
|
|
361
|
+
force: options?.force,
|
|
256
362
|
});
|
|
257
363
|
if (keepPlan.keepFromIndex <= summaryOffset) {
|
|
258
364
|
// All turns fit after truncation projection, but the real in-memory
|
|
@@ -266,7 +372,7 @@ export class ContextWindowManager {
|
|
|
266
372
|
const didTruncate = truncatedCount > 0;
|
|
267
373
|
const estimatedAfterTruncation = didTruncate
|
|
268
374
|
? estimatePromptTokens(truncatedMessages, this.systemPrompt, {
|
|
269
|
-
providerName: this.
|
|
375
|
+
providerName: this.estimationProviderName,
|
|
270
376
|
toolTokenBudget: this.toolTokenBudget,
|
|
271
377
|
})
|
|
272
378
|
: previousEstimatedInputTokens;
|
|
@@ -313,8 +419,15 @@ export class ContextWindowManager {
|
|
|
313
419
|
};
|
|
314
420
|
}
|
|
315
421
|
|
|
422
|
+
// When the summary at index 0 was injected from a parent fork, it
|
|
423
|
+
// contributes 1 to `nonPersistedPrefixCount` but is excluded from
|
|
424
|
+
// `compactableMessages` by `summaryOffset`; subtract it here so the
|
|
425
|
+
// remaining injected count lines up with compactableMessages. A summary
|
|
426
|
+
// produced by this conversation's own prior compaction is not part of
|
|
427
|
+
// `nonPersistedPrefixCount` (already decremented), so no subtraction.
|
|
428
|
+
const injectedSummaryOffset = this.summaryIsInjected ? summaryOffset : 0;
|
|
316
429
|
const injectedInCompactable = Math.min(
|
|
317
|
-
Math.max(0, this.nonPersistedPrefixCount -
|
|
430
|
+
Math.max(0, this.nonPersistedPrefixCount - injectedSummaryOffset),
|
|
318
431
|
compactableMessages.length,
|
|
319
432
|
);
|
|
320
433
|
const compactedPersistedMessages =
|
|
@@ -331,7 +444,7 @@ export class ContextWindowManager {
|
|
|
331
444
|
projectedMessages,
|
|
332
445
|
this.systemPrompt,
|
|
333
446
|
{
|
|
334
|
-
providerName: this.
|
|
447
|
+
providerName: this.estimationProviderName,
|
|
335
448
|
toolTokenBudget: this.toolTokenBudget,
|
|
336
449
|
},
|
|
337
450
|
);
|
|
@@ -419,13 +532,18 @@ export class ContextWindowManager {
|
|
|
419
532
|
};
|
|
420
533
|
}
|
|
421
534
|
|
|
535
|
+
const retainedThreadRefs = collectRetainedThreadReferences(
|
|
536
|
+
messages.slice(keepPlan.keepFromIndex),
|
|
537
|
+
);
|
|
422
538
|
const transcriptBlocks = this.capTranscriptBlocksToTokenBudget(
|
|
423
539
|
serializeMessagesToContentBlocks(compactableMessages),
|
|
424
540
|
existingSummary ?? "No previous summary.",
|
|
541
|
+
retainedThreadRefs,
|
|
425
542
|
);
|
|
426
543
|
const summaryUpdate = await this.updateSummary(
|
|
427
544
|
existingSummary ?? "No previous summary.",
|
|
428
545
|
transcriptBlocks,
|
|
546
|
+
retainedThreadRefs,
|
|
429
547
|
signal,
|
|
430
548
|
);
|
|
431
549
|
const summary = summaryUpdate.summary;
|
|
@@ -435,6 +553,7 @@ export class ContextWindowManager {
|
|
|
435
553
|
const summaryCacheCreationInputTokens =
|
|
436
554
|
summaryUpdate.cacheCreationInputTokens;
|
|
437
555
|
const summaryCacheReadInputTokens = summaryUpdate.cacheReadInputTokens;
|
|
556
|
+
const summaryFailed = summaryUpdate.failed;
|
|
438
557
|
const summaryRawResponses: unknown[] = [];
|
|
439
558
|
if (Array.isArray(summaryUpdate.rawResponse)) {
|
|
440
559
|
summaryRawResponses.push(...summaryUpdate.rawResponse);
|
|
@@ -460,15 +579,22 @@ export class ContextWindowManager {
|
|
|
460
579
|
compactedMessages,
|
|
461
580
|
this.systemPrompt,
|
|
462
581
|
{
|
|
463
|
-
providerName: this.
|
|
582
|
+
providerName: this.estimationProviderName,
|
|
464
583
|
toolTokenBudget: this.toolTokenBudget,
|
|
465
584
|
},
|
|
466
585
|
);
|
|
467
|
-
// Consume the injected prefix messages that were compacted away.
|
|
586
|
+
// Consume the injected prefix messages that were compacted away. When the
|
|
587
|
+
// parent-injected summary was replaced by a freshly produced child summary,
|
|
588
|
+
// also consume its slot (it was excluded from injectedInCompactable via
|
|
589
|
+
// injectedSummaryOffset) and clear the flag so subsequent compactions treat
|
|
590
|
+
// the summary at index 0 as child-owned.
|
|
468
591
|
this.nonPersistedPrefixCount = Math.max(
|
|
469
592
|
0,
|
|
470
|
-
this.nonPersistedPrefixCount -
|
|
593
|
+
this.nonPersistedPrefixCount -
|
|
594
|
+
injectedInCompactable -
|
|
595
|
+
injectedSummaryOffset,
|
|
471
596
|
);
|
|
597
|
+
this.summaryIsInjected = false;
|
|
472
598
|
|
|
473
599
|
log.info(
|
|
474
600
|
{
|
|
@@ -499,6 +625,7 @@ export class ContextWindowManager {
|
|
|
499
625
|
summaryCacheReadInputTokens,
|
|
500
626
|
summaryRawResponses,
|
|
501
627
|
summaryText: summary,
|
|
628
|
+
summaryFailed,
|
|
502
629
|
};
|
|
503
630
|
}
|
|
504
631
|
|
|
@@ -515,14 +642,24 @@ export class ContextWindowManager {
|
|
|
515
642
|
opts?: {
|
|
516
643
|
minKeepRecentUserTurns?: number;
|
|
517
644
|
targetInputTokensOverride?: number;
|
|
645
|
+
conversationOriginChannel?: string;
|
|
646
|
+
force?: boolean;
|
|
518
647
|
},
|
|
519
648
|
): { keepFromIndex: number; keepTurns: number } {
|
|
649
|
+
// Slack-originated conversations rely on multi-turn thread context
|
|
650
|
+
// (reply chains, quoted messages, contextual references). Bump the
|
|
651
|
+
// default keep floor for them so compaction does not summarize away
|
|
652
|
+
// recent turns that the next reply may directly cite. Explicit
|
|
653
|
+
// `minKeepRecentUserTurns` (including emergency `0`) wins.
|
|
654
|
+
const defaultTurns = opts?.conversationOriginChannel === "slack" ? 8 : 1;
|
|
520
655
|
const minFloor = Math.min(
|
|
521
|
-
Math.max(0, Math.floor(opts?.minKeepRecentUserTurns ??
|
|
656
|
+
Math.max(0, Math.floor(opts?.minKeepRecentUserTurns ?? defaultTurns)),
|
|
522
657
|
userTurnStarts.length,
|
|
523
658
|
);
|
|
524
|
-
const targetTokens =
|
|
525
|
-
opts?.targetInputTokensOverride ?? this.targetInputTokens
|
|
659
|
+
const targetTokens = Math.min(
|
|
660
|
+
opts?.targetInputTokensOverride ?? this.targetInputTokens,
|
|
661
|
+
this.targetInputTokens,
|
|
662
|
+
);
|
|
526
663
|
|
|
527
664
|
// Binary search for the maximum keepTurns whose projected tokens fit
|
|
528
665
|
// within the budget. Token count is monotonically non-decreasing with
|
|
@@ -541,7 +678,7 @@ export class ContextWindowManager {
|
|
|
541
678
|
COMPACTION_TOOL_RESULT_MAX_CHARS,
|
|
542
679
|
);
|
|
543
680
|
return estimatePromptTokens(projectedMessages, this.systemPrompt, {
|
|
544
|
-
providerName: this.
|
|
681
|
+
providerName: this.estimationProviderName,
|
|
545
682
|
toolTokenBudget: this.toolTokenBudget,
|
|
546
683
|
});
|
|
547
684
|
};
|
|
@@ -564,6 +701,32 @@ export class ContextWindowManager {
|
|
|
564
701
|
lo = hi;
|
|
565
702
|
}
|
|
566
703
|
|
|
704
|
+
// Under forced compaction with only the implicit default floor in play,
|
|
705
|
+
// that floor stops being an absolute override when the kept region still
|
|
706
|
+
// exceeds the target. Walk keepTurns below the floor — down to 0 if
|
|
707
|
+
// needed — so /compact can always drive the conversation toward target,
|
|
708
|
+
// even when the floor turn itself is oversized (e.g. a huge paste in the
|
|
709
|
+
// last user message). Exceptions that still treat the floor as hard:
|
|
710
|
+
// - Explicit `minKeepRecentUserTurns` (the caller opted in to that
|
|
711
|
+
// floor; emergency recovery already passes 0 when it wants to go all
|
|
712
|
+
// the way down).
|
|
713
|
+
// - Slack origin (the bumped 8-turn floor protects thread reply chains
|
|
714
|
+
// and quoted-message context that the next reply may directly cite).
|
|
715
|
+
// Automatic mid-loop compaction (force !== true) always honors the floor
|
|
716
|
+
// so the in-flight agent turn isn't summarized away.
|
|
717
|
+
const floorIsImplicitDefault =
|
|
718
|
+
opts?.minKeepRecentUserTurns === undefined &&
|
|
719
|
+
opts?.conversationOriginChannel !== "slack";
|
|
720
|
+
if (
|
|
721
|
+
opts?.force &&
|
|
722
|
+
floorIsImplicitDefault &&
|
|
723
|
+
projectedTokensForKeep(lo) > targetTokens
|
|
724
|
+
) {
|
|
725
|
+
while (lo > 0 && projectedTokensForKeep(lo) > targetTokens) {
|
|
726
|
+
lo--;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
|
|
567
730
|
const keepTurns = lo;
|
|
568
731
|
const rawKeepFromIndex =
|
|
569
732
|
keepTurns === 0
|
|
@@ -595,10 +758,13 @@ export class ContextWindowManager {
|
|
|
595
758
|
private capTranscriptBlocksToTokenBudget(
|
|
596
759
|
blocks: ContentBlock[],
|
|
597
760
|
currentSummary: string,
|
|
761
|
+
retainedThreadRefs: string[],
|
|
598
762
|
): ContentBlock[] {
|
|
763
|
+
const retainedRefsText = retainedThreadRefs.join("\n");
|
|
599
764
|
const overheadTokens =
|
|
600
765
|
estimateTextTokens(SUMMARY_SYSTEM_PROMPT) +
|
|
601
766
|
estimateTextTokens(currentSummary) +
|
|
767
|
+
estimateTextTokens(retainedRefsText) +
|
|
602
768
|
// Scaffolding text in buildSummaryContentBlocks ("Update the summary...",
|
|
603
769
|
// section headers, etc.) — generous fixed estimate.
|
|
604
770
|
200 +
|
|
@@ -610,7 +776,9 @@ export class ContextWindowManager {
|
|
|
610
776
|
);
|
|
611
777
|
|
|
612
778
|
const estimateBlockTokens = (b: ContentBlock): number =>
|
|
613
|
-
estimateContentBlockTokens(b, {
|
|
779
|
+
estimateContentBlockTokens(b, {
|
|
780
|
+
providerName: this.estimationProviderName,
|
|
781
|
+
});
|
|
614
782
|
|
|
615
783
|
let totalTokens = 0;
|
|
616
784
|
for (const block of blocks) {
|
|
@@ -623,7 +791,11 @@ export class ContextWindowManager {
|
|
|
623
791
|
// images to drop. Images are high-cost and their text context (message
|
|
624
792
|
// headers, surrounding tool_use/tool_result serializations) is preserved.
|
|
625
793
|
const result = [...blocks];
|
|
626
|
-
for (
|
|
794
|
+
for (
|
|
795
|
+
let i = 0;
|
|
796
|
+
i < result.length && totalTokens > maxTranscriptTokens;
|
|
797
|
+
i++
|
|
798
|
+
) {
|
|
627
799
|
if (result[i].type === "image") {
|
|
628
800
|
totalTokens -= estimateBlockTokens(result[i]);
|
|
629
801
|
const stub: ContentBlock = {
|
|
@@ -641,7 +813,11 @@ export class ContextWindowManager {
|
|
|
641
813
|
// than dropping it entirely so the summarizer always has content to work with.
|
|
642
814
|
let dropUntil = 0;
|
|
643
815
|
let droppedTokens = 0;
|
|
644
|
-
for (
|
|
816
|
+
for (
|
|
817
|
+
let i = 0;
|
|
818
|
+
i < result.length && totalTokens > maxTranscriptTokens;
|
|
819
|
+
i++
|
|
820
|
+
) {
|
|
645
821
|
const blockTokens = estimateBlockTokens(result[i]);
|
|
646
822
|
const excess = totalTokens - maxTranscriptTokens;
|
|
647
823
|
if (blockTokens > excess && result[i].type === "text") {
|
|
@@ -689,6 +865,7 @@ export class ContextWindowManager {
|
|
|
689
865
|
private async updateSummary(
|
|
690
866
|
currentSummary: string,
|
|
691
867
|
transcriptBlocks: ContentBlock[],
|
|
868
|
+
retainedThreadRefs: string[],
|
|
692
869
|
signal?: AbortSignal,
|
|
693
870
|
): Promise<{
|
|
694
871
|
summary: string;
|
|
@@ -698,12 +875,20 @@ export class ContextWindowManager {
|
|
|
698
875
|
cacheCreationInputTokens: number;
|
|
699
876
|
cacheReadInputTokens: number;
|
|
700
877
|
rawResponse?: unknown;
|
|
878
|
+
/**
|
|
879
|
+
* True when the provider.sendMessage call threw and the local fallback
|
|
880
|
+
* was used. Callers (the agent loop) use this to drive circuit-breaker
|
|
881
|
+
* state without having to reimplement the fallback themselves.
|
|
882
|
+
*/
|
|
883
|
+
failed: boolean;
|
|
701
884
|
}> {
|
|
702
885
|
const contentBlocks = buildSummaryContentBlocks(
|
|
703
886
|
currentSummary,
|
|
704
887
|
transcriptBlocks,
|
|
888
|
+
retainedThreadRefs,
|
|
705
889
|
);
|
|
706
890
|
const summaryMessage: Message = { role: "user", content: contentBlocks };
|
|
891
|
+
let failed = false;
|
|
707
892
|
try {
|
|
708
893
|
const response = await this.provider.sendMessage(
|
|
709
894
|
[summaryMessage],
|
|
@@ -726,15 +911,19 @@ export class ContextWindowManager {
|
|
|
726
911
|
response.usage.cacheCreationInputTokens ?? 0,
|
|
727
912
|
cacheReadInputTokens: response.usage.cacheReadInputTokens ?? 0,
|
|
728
913
|
rawResponse: response.rawResponse,
|
|
914
|
+
failed: false,
|
|
729
915
|
};
|
|
730
916
|
}
|
|
731
917
|
} catch (err) {
|
|
918
|
+
failed = true;
|
|
732
919
|
log.warn({ err }, "Summary generation failed, using local fallback");
|
|
733
920
|
}
|
|
734
921
|
|
|
735
922
|
// Fallback: extract text-only transcript for local summary generation.
|
|
736
923
|
const textTranscript = transcriptBlocks
|
|
737
|
-
.filter(
|
|
924
|
+
.filter(
|
|
925
|
+
(b): b is Extract<ContentBlock, { type: "text" }> => b.type === "text",
|
|
926
|
+
)
|
|
738
927
|
.map((b) => b.text)
|
|
739
928
|
.join("\n\n");
|
|
740
929
|
|
|
@@ -745,6 +934,7 @@ export class ContextWindowManager {
|
|
|
745
934
|
model: "",
|
|
746
935
|
cacheCreationInputTokens: 0,
|
|
747
936
|
cacheReadInputTokens: 0,
|
|
937
|
+
failed,
|
|
748
938
|
};
|
|
749
939
|
}
|
|
750
940
|
|
|
@@ -752,7 +942,7 @@ export class ContextWindowManager {
|
|
|
752
942
|
// Budget in tokens → approximate char limit (4 chars ≈ 1 token).
|
|
753
943
|
const maxChars = this.summaryMaxTokens * 4;
|
|
754
944
|
if (summary.length <= maxChars) return summary;
|
|
755
|
-
return `${summary
|
|
945
|
+
return `${safeStringSlice(summary, 0, maxChars)}...`;
|
|
756
946
|
}
|
|
757
947
|
}
|
|
758
948
|
|
|
@@ -821,7 +1011,11 @@ function adjustForToolPairs(
|
|
|
821
1011
|
// Collect tool_use_ids referenced by tool_results in this user message
|
|
822
1012
|
const referencedIds = new Set<string>();
|
|
823
1013
|
for (const block of msg.content) {
|
|
824
|
-
if (
|
|
1014
|
+
if (
|
|
1015
|
+
(block.type === "tool_result" ||
|
|
1016
|
+
block.type === "web_search_tool_result") &&
|
|
1017
|
+
"tool_use_id" in block
|
|
1018
|
+
) {
|
|
825
1019
|
referencedIds.add((block as { tool_use_id: string }).tool_use_id);
|
|
826
1020
|
}
|
|
827
1021
|
}
|
|
@@ -897,26 +1091,68 @@ export function createContextSummaryMessage(summary: string): Message {
|
|
|
897
1091
|
function buildSummaryContentBlocks(
|
|
898
1092
|
currentSummary: string,
|
|
899
1093
|
transcriptBlocks: ContentBlock[],
|
|
1094
|
+
retainedThreadRefs: string[],
|
|
900
1095
|
): ContentBlock[] {
|
|
1096
|
+
const lines = [
|
|
1097
|
+
"Update the summary with new transcript data.",
|
|
1098
|
+
"If new information conflicts with older notes, keep the most recent and explicit detail.",
|
|
1099
|
+
"Keep all unresolved asks and next steps.",
|
|
1100
|
+
"For any images included below, describe their visual content in the summary so the information is preserved after compaction.",
|
|
1101
|
+
"",
|
|
1102
|
+
"### Existing Summary",
|
|
1103
|
+
currentSummary.trim().length > 0 ? currentSummary.trim() : "None.",
|
|
1104
|
+
"",
|
|
1105
|
+
];
|
|
1106
|
+
if (retainedThreadRefs.length > 0) {
|
|
1107
|
+
lines.push(
|
|
1108
|
+
"### Retained Thread References",
|
|
1109
|
+
"These reply tag lines remain in the live context after compaction. Each `→ Mxxxxxx` cites a parent message by alias; if that parent appears in the Transcript below, preserve its text verbatim.",
|
|
1110
|
+
...retainedThreadRefs.map((ref) => `- ${ref}`),
|
|
1111
|
+
"",
|
|
1112
|
+
);
|
|
1113
|
+
}
|
|
1114
|
+
lines.push("### Transcript");
|
|
901
1115
|
return [
|
|
902
1116
|
{
|
|
903
1117
|
type: "text",
|
|
904
|
-
text:
|
|
905
|
-
"Update the summary with new transcript data.",
|
|
906
|
-
"If new information conflicts with older notes, keep the most recent and explicit detail.",
|
|
907
|
-
"Keep all unresolved asks and next steps.",
|
|
908
|
-
"For any images included below, describe their visual content in the summary so the information is preserved after compaction.",
|
|
909
|
-
"",
|
|
910
|
-
"### Existing Summary",
|
|
911
|
-
currentSummary.trim().length > 0 ? currentSummary.trim() : "None.",
|
|
912
|
-
"",
|
|
913
|
-
"### Transcript",
|
|
914
|
-
].join("\n"),
|
|
1118
|
+
text: lines.join("\n"),
|
|
915
1119
|
} as ContentBlock,
|
|
916
1120
|
...transcriptBlocks,
|
|
917
1121
|
];
|
|
918
1122
|
}
|
|
919
1123
|
|
|
1124
|
+
/**
|
|
1125
|
+
* Scan retained-tail messages for Slack-style reply tag lines that cite a
|
|
1126
|
+
* thread parent via the `→ Mxxxxxx` alias convention. Returns the full tag
|
|
1127
|
+
* line for each match (de-duplicated, order-preserved) so the summarizer
|
|
1128
|
+
* has a concrete list of parents whose text must be preserved verbatim.
|
|
1129
|
+
*
|
|
1130
|
+
* Non-slack conversations and retained tails without any reply markers
|
|
1131
|
+
* produce an empty list — in that case the summarizer is told explicitly
|
|
1132
|
+
* that no verbatim preservation is required.
|
|
1133
|
+
*/
|
|
1134
|
+
function collectRetainedThreadReferences(
|
|
1135
|
+
retainedMessages: Message[],
|
|
1136
|
+
): string[] {
|
|
1137
|
+
const seen = new Set<string>();
|
|
1138
|
+
const out: string[] = [];
|
|
1139
|
+
for (const msg of retainedMessages) {
|
|
1140
|
+
for (const block of msg.content) {
|
|
1141
|
+
if (block.type !== "text") continue;
|
|
1142
|
+
const text = (block as { text: string }).text;
|
|
1143
|
+
for (const line of text.split("\n")) {
|
|
1144
|
+
if (!THREAD_REPLY_REFERENCE_PATTERN.test(line)) continue;
|
|
1145
|
+
const trimmed = line.trim();
|
|
1146
|
+
if (trimmed.length === 0) continue;
|
|
1147
|
+
if (seen.has(trimmed)) continue;
|
|
1148
|
+
seen.add(trimmed);
|
|
1149
|
+
out.push(trimmed);
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
return out;
|
|
1154
|
+
}
|
|
1155
|
+
|
|
920
1156
|
/**
|
|
921
1157
|
* Serialize messages into a sequence of content blocks. Text-based content
|
|
922
1158
|
* (tool calls, tool results, thinking, etc.) is serialized into text blocks.
|
|
@@ -937,7 +1173,8 @@ function serializeMessagesToContentBlocks(messages: Message[]): ContentBlock[] {
|
|
|
937
1173
|
textLines.length = 0;
|
|
938
1174
|
}
|
|
939
1175
|
blocks.push(block);
|
|
940
|
-
} else if (block.type === "tool_result") {
|
|
1176
|
+
} else if (block.type === "tool_result") {
|
|
1177
|
+
// guard:allow-tool-result-only — web_search_tool_result handled by serializeBlock via else branch
|
|
941
1178
|
// Extract images from tool_result contentBlocks before serializing.
|
|
942
1179
|
const collectedImages: ImageContent[] = [];
|
|
943
1180
|
textLines.push(serializeToolResultBlock(block, collectedImages));
|
|
@@ -1025,7 +1262,7 @@ function serializeBlock(block: ContentBlock): string {
|
|
|
1025
1262
|
|
|
1026
1263
|
function clampText(text: string): string {
|
|
1027
1264
|
if (text.length <= MAX_BLOCK_PREVIEW_CHARS) return text;
|
|
1028
|
-
return `${text
|
|
1265
|
+
return `${safeStringSlice(text, 0, MAX_BLOCK_PREVIEW_CHARS)}... [truncated ${
|
|
1029
1266
|
text.length - MAX_BLOCK_PREVIEW_CHARS
|
|
1030
1267
|
} chars]`;
|
|
1031
1268
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import { existsSync } from "node:fs";
|
|
20
|
-
import { join } from "node:path";
|
|
20
|
+
import { dirname, join } from "node:path";
|
|
21
21
|
|
|
22
22
|
import { getIsContainerized } from "../config/env-registry.js";
|
|
23
23
|
import { getLogger } from "../util/logger.js";
|
|
@@ -65,9 +65,30 @@ function getManagedBootstrapSocketPath(): string {
|
|
|
65
65
|
* `getDataDir()` (under `~/.vellum/workspace/data`) was previously included
|
|
66
66
|
* but is inside the sandbox write boundary, so a sandboxed tool could plant
|
|
67
67
|
* a malicious binary there. Removed to close the sandbox-escape vector.
|
|
68
|
+
*
|
|
69
|
+
* Search order:
|
|
70
|
+
* 1. Alongside the running executable, but ONLY when running from a
|
|
71
|
+
* packaged macOS app bundle (`<App>.app/Contents/MacOS/credential-executor`).
|
|
72
|
+
* In dev mode, `process.execPath` points at the bun/node install dir
|
|
73
|
+
* (e.g. `~/.bun/bin`), where an unrelated file named `credential-executor`
|
|
74
|
+
* could be picked up by accident.
|
|
75
|
+
* 2. `<binDir>/credential-executor` — user-installed override (dev flow).
|
|
68
76
|
*/
|
|
69
77
|
function getLocalBinarySearchPaths(): string[] {
|
|
70
|
-
|
|
78
|
+
const paths: string[] = [];
|
|
79
|
+
|
|
80
|
+
// Only check the sibling of process.execPath when running from a packaged
|
|
81
|
+
// app bundle — the .app/Contents/MacOS directory is a controlled location.
|
|
82
|
+
// In dev mode, process.execPath is the bun/node binary (e.g. ~/.bun/bin/bun)
|
|
83
|
+
// and a sibling lookup there could discover an unrelated or untrusted
|
|
84
|
+
// executable.
|
|
85
|
+
const execDir = dirname(process.execPath);
|
|
86
|
+
if (execDir.includes(".app/Contents/MacOS")) {
|
|
87
|
+
paths.push(join(execDir, "credential-executor"));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
paths.push(join(getBinDir(), "credential-executor"));
|
|
91
|
+
return paths;
|
|
71
92
|
}
|
|
72
93
|
|
|
73
94
|
// ---------------------------------------------------------------------------
|