@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
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs an OAuth2 loopback flow to install the user's Slack app and capture
|
|
3
|
+
* bot + user tokens in a single exchange.
|
|
4
|
+
*
|
|
5
|
+
* Prerequisites: client_id, client_secret, and app_token must already be
|
|
6
|
+
* stored in the credential vault (service: slack_channel).
|
|
7
|
+
*
|
|
8
|
+
* The handler reads client credentials from secure storage, starts a
|
|
9
|
+
* loopback OAuth server on port 17322, opens the browser to Slack's
|
|
10
|
+
* authorize URL, and waits for the user to click "Allow". Slack's
|
|
11
|
+
* oauth.v2.access response contains both the bot token (access_token)
|
|
12
|
+
* and user token (authed_user.access_token). Both are stored via
|
|
13
|
+
* setSlackChannelConfig.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { credentialKey } from "../../security/credential-key.js";
|
|
17
|
+
import { startOAuth2Flow } from "../../security/oauth2.js";
|
|
18
|
+
import { getSecureKeyAsync } from "../../security/secure-keys.js";
|
|
19
|
+
import { openInHostBrowser } from "../../util/browser.js";
|
|
20
|
+
import { getLogger } from "../../util/logger.js";
|
|
21
|
+
import { setSlackChannelConfig } from "./config-slack-channel.js";
|
|
22
|
+
|
|
23
|
+
const log = getLogger("slack-channel-oauth-install");
|
|
24
|
+
|
|
25
|
+
/** Port pre-registered for Slack in seed-providers.ts. */
|
|
26
|
+
const SLACK_LOOPBACK_PORT = 17322;
|
|
27
|
+
|
|
28
|
+
/** Bot scopes matching the manifest in SKILL.md. */
|
|
29
|
+
const BOT_SCOPES = [
|
|
30
|
+
"app_mentions:read",
|
|
31
|
+
"assistant:write",
|
|
32
|
+
"channels:history",
|
|
33
|
+
"channels:join",
|
|
34
|
+
"channels:read",
|
|
35
|
+
"chat:write",
|
|
36
|
+
"files:read",
|
|
37
|
+
"files:write",
|
|
38
|
+
"groups:history",
|
|
39
|
+
"groups:read",
|
|
40
|
+
"im:history",
|
|
41
|
+
"im:read",
|
|
42
|
+
"im:write",
|
|
43
|
+
"mpim:history",
|
|
44
|
+
"mpim:read",
|
|
45
|
+
"reactions:read",
|
|
46
|
+
"reactions:write",
|
|
47
|
+
"users:read",
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
/** User scopes matching the manifest in SKILL.md. */
|
|
51
|
+
const USER_SCOPES = [
|
|
52
|
+
"channels:history",
|
|
53
|
+
"channels:read",
|
|
54
|
+
"groups:history",
|
|
55
|
+
"groups:read",
|
|
56
|
+
"im:history",
|
|
57
|
+
"im:read",
|
|
58
|
+
"mpim:history",
|
|
59
|
+
"mpim:read",
|
|
60
|
+
"users:read",
|
|
61
|
+
"search:read",
|
|
62
|
+
"reactions:read",
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
export interface SlackOAuthInstallResult {
|
|
66
|
+
success: boolean;
|
|
67
|
+
hasBotToken: boolean;
|
|
68
|
+
hasUserToken: boolean;
|
|
69
|
+
error?: string;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export async function runSlackChannelOAuthInstall(): Promise<SlackOAuthInstallResult> {
|
|
73
|
+
// Read client credentials from secure storage
|
|
74
|
+
const clientId = await getSecureKeyAsync(
|
|
75
|
+
credentialKey("slack_channel", "client_id"),
|
|
76
|
+
);
|
|
77
|
+
if (!clientId) {
|
|
78
|
+
return {
|
|
79
|
+
success: false,
|
|
80
|
+
hasBotToken: false,
|
|
81
|
+
hasUserToken: false,
|
|
82
|
+
error:
|
|
83
|
+
"Client ID not found in credential store. Store it first via credential_store prompt (service: slack_channel, field: client_id).",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const clientSecret = await getSecureKeyAsync(
|
|
88
|
+
credentialKey("slack_channel", "client_secret"),
|
|
89
|
+
);
|
|
90
|
+
if (!clientSecret) {
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
hasBotToken: false,
|
|
94
|
+
hasUserToken: false,
|
|
95
|
+
error:
|
|
96
|
+
"Client Secret not found in credential store. Store it first via credential_store prompt (service: slack_channel, field: client_secret).",
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const appToken = await getSecureKeyAsync(
|
|
101
|
+
credentialKey("slack_channel", "app_token"),
|
|
102
|
+
);
|
|
103
|
+
if (!appToken) {
|
|
104
|
+
return {
|
|
105
|
+
success: false,
|
|
106
|
+
hasBotToken: false,
|
|
107
|
+
hasUserToken: false,
|
|
108
|
+
error:
|
|
109
|
+
"App Token not found in credential store. Store it first via credential_store prompt (service: slack_channel, field: app_token).",
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
log.info("Starting Slack OAuth install flow via loopback");
|
|
114
|
+
|
|
115
|
+
let result;
|
|
116
|
+
try {
|
|
117
|
+
result = await startOAuth2Flow(
|
|
118
|
+
{
|
|
119
|
+
authorizeUrl: "https://slack.com/oauth/v2/authorize",
|
|
120
|
+
tokenExchangeUrl: "https://slack.com/api/oauth.v2.access",
|
|
121
|
+
scopes: BOT_SCOPES,
|
|
122
|
+
clientId,
|
|
123
|
+
clientSecret,
|
|
124
|
+
scopeSeparator: ",",
|
|
125
|
+
authorizeParams: {
|
|
126
|
+
user_scope: USER_SCOPES.join(","),
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
openUrl: (url) => openInHostBrowser(url),
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
callbackTransport: "loopback",
|
|
134
|
+
loopbackPort: SLACK_LOOPBACK_PORT,
|
|
135
|
+
},
|
|
136
|
+
);
|
|
137
|
+
} catch (err) {
|
|
138
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
139
|
+
log.error({ err: msg }, "Slack OAuth install flow failed");
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
hasBotToken: false,
|
|
143
|
+
hasUserToken: false,
|
|
144
|
+
error: `OAuth flow failed: ${msg}`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Slack's oauth.v2.access returns:
|
|
149
|
+
// access_token: "xoxb-..." (bot token)
|
|
150
|
+
// authed_user: { access_token: "xoxp-..." } (user token)
|
|
151
|
+
const raw = result.rawTokenResponse;
|
|
152
|
+
const botToken = raw.access_token as string | undefined;
|
|
153
|
+
const authedUser = raw.authed_user as { access_token?: string } | undefined;
|
|
154
|
+
const userToken = authedUser?.access_token as string | undefined;
|
|
155
|
+
|
|
156
|
+
if (!botToken) {
|
|
157
|
+
log.error(
|
|
158
|
+
{ rawKeys: Object.keys(raw) },
|
|
159
|
+
"Slack OAuth response missing bot access_token",
|
|
160
|
+
);
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
hasBotToken: false,
|
|
164
|
+
hasUserToken: false,
|
|
165
|
+
error:
|
|
166
|
+
"Slack OAuth response did not include a bot token (access_token). The app may not have bot scopes configured.",
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
log.info(
|
|
171
|
+
{ hasBotToken: true, hasUserToken: !!userToken },
|
|
172
|
+
"Slack OAuth tokens received, storing via setSlackChannelConfig",
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
// Store bot token (and user token if present) via the Slack channel handler,
|
|
176
|
+
// which validates tokens and persists workspace metadata.
|
|
177
|
+
const configResult = await setSlackChannelConfig(
|
|
178
|
+
botToken,
|
|
179
|
+
appToken,
|
|
180
|
+
userToken,
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
if (!configResult.success) {
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
hasBotToken: false,
|
|
187
|
+
hasUserToken: false,
|
|
188
|
+
error: configResult.error ?? "Failed to store Slack tokens",
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
success: true,
|
|
194
|
+
hasBotToken: true,
|
|
195
|
+
hasUserToken: !!userToken,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
@@ -77,7 +77,8 @@ export class HostBrowserProxy {
|
|
|
77
77
|
"Host browser proxy request timed out",
|
|
78
78
|
);
|
|
79
79
|
resolve({
|
|
80
|
-
content:
|
|
80
|
+
content:
|
|
81
|
+
"Host browser proxy timed out waiting for extension response (check browser-relay connectivity and /v1/host-browser-result callback failures such as 404/401).",
|
|
81
82
|
isError: true,
|
|
82
83
|
});
|
|
83
84
|
}, timeoutSec * 1000);
|
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
|
|
1
3
|
import { config as dotenvConfig } from "dotenv";
|
|
2
4
|
|
|
5
|
+
import type { BackupWorkerHandle } from "../backup/backup-worker.js";
|
|
6
|
+
import { startBackupWorker } from "../backup/backup-worker.js";
|
|
3
7
|
import { setPointerMessageProcessor } from "../calls/call-pointer-messages.js";
|
|
4
8
|
import { reconcileCallsOnStartup } from "../calls/call-recovery.js";
|
|
5
9
|
import { setRelayBroadcast } from "../calls/relay-server.js";
|
|
@@ -34,6 +38,11 @@ import {
|
|
|
34
38
|
} from "../credential-execution/startup-timeout.js";
|
|
35
39
|
import { FilingService } from "../filing/filing-service.js";
|
|
36
40
|
import { HeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
41
|
+
import {
|
|
42
|
+
type FeedSchedulerHandle,
|
|
43
|
+
startFeedScheduler,
|
|
44
|
+
} from "../home/feed-scheduler.js";
|
|
45
|
+
import { backfillRelationshipStateIfMissing } from "../home/relationship-state-writer.js";
|
|
37
46
|
import { getHookManager } from "../hooks/manager.js";
|
|
38
47
|
import { installTemplates } from "../hooks/templates.js";
|
|
39
48
|
import { closeSentry, initSentry, setSentryDeviceId } from "../instrument.js";
|
|
@@ -65,7 +74,6 @@ import {
|
|
|
65
74
|
import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
|
|
66
75
|
import { seedOAuthProviders } from "../oauth/seed-providers.js";
|
|
67
76
|
import { ensurePromptFiles } from "../prompts/system-prompt.js";
|
|
68
|
-
import { syncUpdateBulletinOnStartup } from "../prompts/update-bulletin.js";
|
|
69
77
|
import { resolveManagedProxyContext } from "../providers/managed-proxy/context.js";
|
|
70
78
|
import { buildAssistantEvent } from "../runtime/assistant-event.js";
|
|
71
79
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
@@ -82,6 +90,7 @@ import {
|
|
|
82
90
|
} from "../runtime/capability-tokens.js";
|
|
83
91
|
import { ensureVellumGuardianBinding } from "../runtime/guardian-vellum-migration.js";
|
|
84
92
|
import { RuntimeHttpServer } from "../runtime/http-server.js";
|
|
93
|
+
import { recoverInterruptedImport } from "../runtime/migrations/vbundle-streaming-importer.js";
|
|
85
94
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
86
95
|
import {
|
|
87
96
|
onCesClientChanged,
|
|
@@ -89,6 +98,7 @@ import {
|
|
|
89
98
|
setCesReconnect,
|
|
90
99
|
} from "../security/secure-keys.js";
|
|
91
100
|
import { UsageTelemetryReporter } from "../telemetry/usage-telemetry-reporter.js";
|
|
101
|
+
import { registerBuiltinTtsProviders } from "../tts/providers/register-builtins.js";
|
|
92
102
|
import { getDeviceId } from "../util/device-id.js";
|
|
93
103
|
import { getLogger, initLogger } from "../util/logger.js";
|
|
94
104
|
import {
|
|
@@ -270,6 +280,36 @@ export async function runDaemon(): Promise<void> {
|
|
|
270
280
|
|
|
271
281
|
ensureDataDir();
|
|
272
282
|
|
|
283
|
+
// Recover from any streaming `.vbundle` import that was interrupted by a
|
|
284
|
+
// crash or SIGKILL. If the previous process died between
|
|
285
|
+
// `carryOverPreservedPaths` and the atomic workspace swap, the live
|
|
286
|
+
// workspace may be missing `data/db` / `data/qdrant` / etc. The marker
|
|
287
|
+
// at `<workspaceDir>.import-marker.json` (persisted before any rename
|
|
288
|
+
// runs) tells us where the orphaned preserved paths landed; the
|
|
289
|
+
// recovery helper moves them back into the live workspace and cleans
|
|
290
|
+
// up the temp tree. Running this BEFORE `initializeDb()` ensures the
|
|
291
|
+
// DB singleton opens against the fully-restored `assistant.db`.
|
|
292
|
+
try {
|
|
293
|
+
const recoveryResult = await recoverInterruptedImport(getWorkspaceDir());
|
|
294
|
+
if (!recoveryResult.ok) {
|
|
295
|
+
// Rollback is intentionally unresolved — backup/temp/marker are
|
|
296
|
+
// preserved on disk so an operator (or a later retry) can finish
|
|
297
|
+
// the recovery. Log loudly so ops sees it, but don't block start-up:
|
|
298
|
+
// the daemon still needs to come up for diagnostics. The next
|
|
299
|
+
// `streamCommitImport` will refuse to start a new import until the
|
|
300
|
+
// marker is resolved.
|
|
301
|
+
log.error(
|
|
302
|
+
{ failedCount: recoveryResult.failedCount },
|
|
303
|
+
"Interrupted-import recovery is INCOMPLETE; leftover .pre-import-* / .import-* scratch dirs remain in the workspace. Manual intervention may be required before the next import can run.",
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
} catch (err) {
|
|
307
|
+
log.warn(
|
|
308
|
+
{ err },
|
|
309
|
+
"recoverInterruptedImport threw during daemon startup; continuing",
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
273
313
|
// Load (or generate + persist) the auth signing key so tokens survive
|
|
274
314
|
// daemon restarts.
|
|
275
315
|
const signingKey = resolveSigningKey();
|
|
@@ -292,8 +332,8 @@ export async function runDaemon(): Promise<void> {
|
|
|
292
332
|
// Pre-populate the feature flag cache from the gateway so all
|
|
293
333
|
// subsequent sync isAssistantFeatureFlagEnabled() calls have data.
|
|
294
334
|
// Fired non-blocking so a slow or unreachable gateway doesn't delay
|
|
295
|
-
// daemon startup (the
|
|
296
|
-
// stall the critical path).
|
|
335
|
+
// daemon startup (the IPC call has a 3s connect + 5s call timeout
|
|
336
|
+
// that would otherwise stall the critical path).
|
|
297
337
|
void initFeatureFlagOverrides().catch((err) =>
|
|
298
338
|
log.warn({ err }, "Background feature flag init failed"),
|
|
299
339
|
);
|
|
@@ -379,6 +419,29 @@ export async function runDaemon(): Promise<void> {
|
|
|
379
419
|
);
|
|
380
420
|
}
|
|
381
421
|
|
|
422
|
+
// One-time backfill of `relationship-state.json` for existing or
|
|
423
|
+
// upgraded users so they don't land on an empty Home page after the
|
|
424
|
+
// Phase 3 ship. Runs after DB init + workspace migrations so the
|
|
425
|
+
// writer can actually resolve the guardian persona file and list
|
|
426
|
+
// connected OAuth providers — firing this from `ensurePromptFiles()`
|
|
427
|
+
// would be too early (DB isn't ready yet) and produce a degraded
|
|
428
|
+
// snapshot with zero facts and zero unlocked capabilities.
|
|
429
|
+
//
|
|
430
|
+
// Deferred via `setImmediate` so any sync filesystem/DB work the
|
|
431
|
+
// writer does (`readdirSync`, `readFileSync`, contact + provider
|
|
432
|
+
// lookups) happens on a later tick, off the startup critical path.
|
|
433
|
+
// Failures are logged — not silenced — to match the pattern used by
|
|
434
|
+
// other `void … .catch()` fire-and-forgets in this file and the
|
|
435
|
+
// assistant/CLAUDE.md rule that all errors must be observable.
|
|
436
|
+
setImmediate(() => {
|
|
437
|
+
void backfillRelationshipStateIfMissing().catch((err) =>
|
|
438
|
+
log.warn(
|
|
439
|
+
{ err },
|
|
440
|
+
"Relationship state backfill failed — continuing startup",
|
|
441
|
+
),
|
|
442
|
+
);
|
|
443
|
+
});
|
|
444
|
+
|
|
382
445
|
// Backfill injection templates on Slack bot token credentials so the
|
|
383
446
|
// credential proxy can inject Authorization headers. Safe on every startup.
|
|
384
447
|
try {
|
|
@@ -463,10 +526,10 @@ export async function runDaemon(): Promise<void> {
|
|
|
463
526
|
);
|
|
464
527
|
}
|
|
465
528
|
|
|
466
|
-
// Write a dev-only fallback capability token to
|
|
467
|
-
// so developers can manually pair the chrome
|
|
468
|
-
// native messaging helper. Production pairing
|
|
469
|
-
// `POST /v1/browser-extension-pair` via the native helper.
|
|
529
|
+
// Write a dev-only fallback capability token to the per-instance
|
|
530
|
+
// protected directory so developers can manually pair the chrome
|
|
531
|
+
// extension without the native messaging helper. Production pairing
|
|
532
|
+
// goes through `POST /v1/browser-extension-pair` via the native helper.
|
|
470
533
|
try {
|
|
471
534
|
writeDaemonTokenFallback(localGuardianPrincipalId);
|
|
472
535
|
} catch (err) {
|
|
@@ -476,12 +539,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
476
539
|
);
|
|
477
540
|
}
|
|
478
541
|
|
|
479
|
-
try {
|
|
480
|
-
syncUpdateBulletinOnStartup();
|
|
481
|
-
} catch (err) {
|
|
482
|
-
log.warn({ err }, "Bulletin sync failed — continuing startup");
|
|
483
|
-
}
|
|
484
|
-
|
|
485
542
|
// Recover orphaned work items that were left in 'running' state when the
|
|
486
543
|
// daemon previously crashed or was killed mid-task.
|
|
487
544
|
const orphanedRunning = listWorkItems({ status: "running" });
|
|
@@ -591,18 +648,36 @@ export async function runDaemon(): Promise<void> {
|
|
|
591
648
|
// falling back to the encrypted file store.
|
|
592
649
|
if (cesResult.processManager) {
|
|
593
650
|
const pm = cesResult.processManager;
|
|
651
|
+
|
|
652
|
+
// Snapshot the managed-proxy context and assistant ID at CES startup
|
|
653
|
+
// so the reconnect closure below never calls back into
|
|
654
|
+
// `resolveManagedProxyContext()`. That function reads the assistant
|
|
655
|
+
// API key via `getSecureKeyAsync()`, which — once `setCesClient()`
|
|
656
|
+
// has resolved the backend to CES RPC — routes the read through CES
|
|
657
|
+
// itself. During a reconnect the old transport is dead and a new
|
|
658
|
+
// one is being set up by this very closure, so the nested credential
|
|
659
|
+
// read recursively awaits its own in-flight reconnection and
|
|
660
|
+
// deadlocks until `CREDENTIAL_OP_TIMEOUT_MS` (45s) fires. That
|
|
661
|
+
// 45-second stall delays every CES restart and causes dependent
|
|
662
|
+
// credential reads (e.g. Meet's STT provider resolution) to return
|
|
663
|
+
// `undefined` during the window. API key rotation uses the
|
|
664
|
+
// `updateAssistantApiKey` RPC on the live client, not a reconnect,
|
|
665
|
+
// so caching at startup is safe.
|
|
666
|
+
const startupProxyCtx = await resolveManagedProxyContext();
|
|
667
|
+
const startupAssistantId = getPlatformAssistantId();
|
|
668
|
+
|
|
594
669
|
setCesReconnect(async () => {
|
|
595
670
|
try {
|
|
596
671
|
await pm.stop();
|
|
597
672
|
const transport = await pm.start();
|
|
598
673
|
const newClient = createCesClient(transport);
|
|
599
|
-
const proxyCtx = await resolveManagedProxyContext();
|
|
600
|
-
const assistantId = getPlatformAssistantId();
|
|
601
674
|
const { accepted, reason } = await newClient.handshake({
|
|
602
|
-
...(
|
|
603
|
-
? { assistantApiKey:
|
|
675
|
+
...(startupProxyCtx.assistantApiKey
|
|
676
|
+
? { assistantApiKey: startupProxyCtx.assistantApiKey }
|
|
677
|
+
: {}),
|
|
678
|
+
...(startupAssistantId
|
|
679
|
+
? { assistantId: startupAssistantId }
|
|
604
680
|
: {}),
|
|
605
|
-
...(assistantId ? { assistantId } : {}),
|
|
606
681
|
});
|
|
607
682
|
if (accepted) {
|
|
608
683
|
log.info("CES reconnection handshake accepted");
|
|
@@ -637,12 +712,31 @@ export async function runDaemon(): Promise<void> {
|
|
|
637
712
|
await server.start();
|
|
638
713
|
log.info("Daemon startup: DaemonServer started");
|
|
639
714
|
|
|
640
|
-
//
|
|
641
|
-
//
|
|
715
|
+
// Kick off the update bulletin background job AFTER `server.start()`
|
|
716
|
+
// resolves. `server.start()` installs the default wake resolver (via
|
|
717
|
+
// `registerDefaultWakeResolver()`), which the job depends on to actually
|
|
718
|
+
// invoke the agent. Dispatching before that point races the resolver
|
|
719
|
+
// registration and causes `wakeAgentForOpportunity()` to silently return
|
|
720
|
+
// `{invoked: false}`, leaving an orphan background conversation and a
|
|
721
|
+
// wasted LLM title-generation call every startup.
|
|
722
|
+
//
|
|
723
|
+
// Kept fire-and-forget (`void import(...).then(...).catch(...)`) so the
|
|
724
|
+
// daemon never blocks startup on it.
|
|
725
|
+
if (dbReady) {
|
|
726
|
+
void import("../prompts/update-bulletin-job.js")
|
|
727
|
+
.then((m) => m.runUpdateBulletinJobIfNeeded())
|
|
728
|
+
.catch((err) =>
|
|
729
|
+
log.warn({ err }, "Update bulletin job failed — continuing startup"),
|
|
730
|
+
);
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
// Mutable refs for Qdrant, memory worker, and backup worker so background
|
|
734
|
+
// init can assign them and the shutdown handler always sees the latest value.
|
|
642
735
|
const bgRefs: {
|
|
643
736
|
qdrantManager: QdrantManager | null;
|
|
644
737
|
memoryWorker: { stop(): void } | null;
|
|
645
|
-
|
|
738
|
+
backupWorker: BackupWorkerHandle | null;
|
|
739
|
+
} = { qdrantManager: null, memoryWorker: null, backupWorker: null };
|
|
646
740
|
|
|
647
741
|
// Initialize Qdrant vector store and memory worker in the background so the
|
|
648
742
|
// RuntimeHttpServer can start accepting requests without waiting for Qdrant.
|
|
@@ -720,11 +814,43 @@ export async function runDaemon(): Promise<void> {
|
|
|
720
814
|
"Qdrant client initialization failed — memory features will be degraded",
|
|
721
815
|
);
|
|
722
816
|
}
|
|
817
|
+
|
|
818
|
+
// Reconcile the PKB Qdrant index against the on-disk tree. Kept
|
|
819
|
+
// inside the `qdrantStarted` guard so we don't call
|
|
820
|
+
// `getQdrantClient()` (which throws "not initialized") on every
|
|
821
|
+
// startup when Qdrant is unavailable. Fire-and-forget so enqueued
|
|
822
|
+
// re-index jobs drain in the background and first-turn latency
|
|
823
|
+
// stays unaffected.
|
|
824
|
+
void (async () => {
|
|
825
|
+
try {
|
|
826
|
+
const { reconcilePkbIndex } =
|
|
827
|
+
await import("../memory/pkb/pkb-reconcile.js");
|
|
828
|
+
const { PKB_WORKSPACE_SCOPE } =
|
|
829
|
+
await import("../memory/pkb/types.js");
|
|
830
|
+
const pkbRoot = join(getWorkspaceDir(), "pkb");
|
|
831
|
+
await reconcilePkbIndex(pkbRoot, PKB_WORKSPACE_SCOPE);
|
|
832
|
+
} catch (err) {
|
|
833
|
+
log.warn(
|
|
834
|
+
{ err },
|
|
835
|
+
"PKB index reconciliation failed — continuing startup",
|
|
836
|
+
);
|
|
837
|
+
}
|
|
838
|
+
})();
|
|
723
839
|
}
|
|
724
840
|
|
|
725
841
|
log.info("Daemon startup: starting memory worker");
|
|
726
842
|
bgRefs.memoryWorker = startMemoryJobsWorker();
|
|
727
843
|
|
|
844
|
+
log.info("Daemon startup: starting backup worker");
|
|
845
|
+
try {
|
|
846
|
+
bgRefs.backupWorker = startBackupWorker();
|
|
847
|
+
} catch (err) {
|
|
848
|
+
log.warn(
|
|
849
|
+
{ err },
|
|
850
|
+
"Backup worker failed to start — continuing without backups",
|
|
851
|
+
);
|
|
852
|
+
}
|
|
853
|
+
|
|
728
854
|
// Seed capability graph nodes (new memory graph system)
|
|
729
855
|
try {
|
|
730
856
|
const {
|
|
@@ -760,11 +886,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
760
886
|
}
|
|
761
887
|
}
|
|
762
888
|
|
|
763
|
-
// Fire-and-forget: Qdrant init runs concurrently with the rest of startup
|
|
764
|
-
void initializeQdrantAndMemory().catch((err) =>
|
|
765
|
-
log.warn({ err }, "Background Qdrant init failed"),
|
|
766
|
-
);
|
|
767
|
-
|
|
768
889
|
registerWatcherProviders();
|
|
769
890
|
registerMessagingProviders();
|
|
770
891
|
|
|
@@ -889,6 +1010,19 @@ export async function runDaemon(): Promise<void> {
|
|
|
889
1010
|
},
|
|
890
1011
|
);
|
|
891
1012
|
|
|
1013
|
+
// Home activity feed scheduler — drives the assistant reflection
|
|
1014
|
+
// loop + the platform Gmail digest. Fire-and-forget; a startup
|
|
1015
|
+
// failure must never block the rest of daemon boot (CLAUDE.md).
|
|
1016
|
+
let feedScheduler: FeedSchedulerHandle | null = null;
|
|
1017
|
+
try {
|
|
1018
|
+
feedScheduler = startFeedScheduler();
|
|
1019
|
+
} catch (err) {
|
|
1020
|
+
log.warn(
|
|
1021
|
+
{ err },
|
|
1022
|
+
"Failed to start home feed scheduler — continuing startup",
|
|
1023
|
+
);
|
|
1024
|
+
}
|
|
1025
|
+
|
|
892
1026
|
// Start the runtime HTTP server. Required for iOS pairing (gateway proxies
|
|
893
1027
|
// to it) and optional REST API access. Defaults to port 7821.
|
|
894
1028
|
let runtimeHttp: RuntimeHttpServer | null = null;
|
|
@@ -1027,8 +1161,19 @@ export async function runDaemon(): Promise<void> {
|
|
|
1027
1161
|
onProviderCredentialsChanged: () =>
|
|
1028
1162
|
server.refreshConversationsForProviderChange(),
|
|
1029
1163
|
getHeartbeatService: () => server.getHeartbeatService(),
|
|
1164
|
+
getFilingService: () => server.getFilingService(),
|
|
1030
1165
|
});
|
|
1031
1166
|
|
|
1167
|
+
// Fire-and-forget: Qdrant init and memory worker startup run concurrently
|
|
1168
|
+
// with the rest of daemon boot. Must run AFTER `new RuntimeHttpServer(...)`
|
|
1169
|
+
// so the analyze-deps singleton (populated inside `buildRouteTable()`) is
|
|
1170
|
+
// available before the memory worker can claim leftover
|
|
1171
|
+
// `conversation_analyze` jobs from a prior run. See the daemon-startup
|
|
1172
|
+
// ordering test in `assistant/src/daemon/__tests__/`.
|
|
1173
|
+
void initializeQdrantAndMemory().catch((err) =>
|
|
1174
|
+
log.warn({ err }, "Background Qdrant init failed"),
|
|
1175
|
+
);
|
|
1176
|
+
|
|
1032
1177
|
// Inject voice bridge deps BEFORE attempting to start the HTTP server.
|
|
1033
1178
|
// The bridge must be available even when the HTTP server fails to bind.
|
|
1034
1179
|
setVoiceBridgeDeps({
|
|
@@ -1208,6 +1353,17 @@ export async function runDaemon(): Promise<void> {
|
|
|
1208
1353
|
runtimeHttp = null;
|
|
1209
1354
|
}
|
|
1210
1355
|
|
|
1356
|
+
// Register built-in TTS providers so the provider abstraction can resolve
|
|
1357
|
+
// them by ID. Must happen before call controllers or routes are created.
|
|
1358
|
+
try {
|
|
1359
|
+
registerBuiltinTtsProviders();
|
|
1360
|
+
} catch (err) {
|
|
1361
|
+
log.warn(
|
|
1362
|
+
{ err },
|
|
1363
|
+
"TTS provider registration failed — continuing with degraded TTS",
|
|
1364
|
+
);
|
|
1365
|
+
}
|
|
1366
|
+
|
|
1211
1367
|
// Initialize providers and tools after the HTTP server is listening so
|
|
1212
1368
|
// health-check and pairing requests can be served immediately. Wrapped in
|
|
1213
1369
|
// its own try/catch so a failure here doesn't tear down the running HTTP
|
|
@@ -1333,6 +1489,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
1333
1489
|
}),
|
|
1334
1490
|
});
|
|
1335
1491
|
filing.start();
|
|
1492
|
+
server.setFilingService(filing);
|
|
1336
1493
|
log.info(
|
|
1337
1494
|
{
|
|
1338
1495
|
enabled: filingConfig.enabled,
|
|
@@ -1356,7 +1513,9 @@ export async function runDaemon(): Promise<void> {
|
|
|
1356
1513
|
hookManager,
|
|
1357
1514
|
runtimeHttp,
|
|
1358
1515
|
scheduler,
|
|
1516
|
+
feedScheduler,
|
|
1359
1517
|
getMemoryWorker: () => bgRefs.memoryWorker,
|
|
1518
|
+
getBackupWorker: () => bgRefs.backupWorker,
|
|
1360
1519
|
getQdrantManager: () => bgRefs.qdrantManager,
|
|
1361
1520
|
mcpManager,
|
|
1362
1521
|
telemetryReporter,
|
|
@@ -22,12 +22,14 @@ export * from "./message-types/conversations.js";
|
|
|
22
22
|
export * from "./message-types/diagnostics.js";
|
|
23
23
|
export * from "./message-types/documents.js";
|
|
24
24
|
export * from "./message-types/guardian-actions.js";
|
|
25
|
+
export * from "./message-types/home.js";
|
|
25
26
|
export * from "./message-types/host-bash.js";
|
|
26
27
|
export * from "./message-types/host-browser.js";
|
|
27
28
|
export * from "./message-types/host-cu.js";
|
|
28
29
|
export * from "./message-types/host-file.js";
|
|
29
30
|
export * from "./message-types/inbox.js";
|
|
30
31
|
export * from "./message-types/integrations.js";
|
|
32
|
+
export * from "./message-types/meet.js";
|
|
31
33
|
export * from "./message-types/memory.js";
|
|
32
34
|
export * from "./message-types/messages.js";
|
|
33
35
|
export * from "./message-types/notifications.js";
|
|
@@ -77,6 +79,7 @@ import type {
|
|
|
77
79
|
_GuardianActionsClientMessages,
|
|
78
80
|
_GuardianActionsServerMessages,
|
|
79
81
|
} from "./message-types/guardian-actions.js";
|
|
82
|
+
import type { _HomeServerMessages } from "./message-types/home.js";
|
|
80
83
|
import type { _HostBashServerMessages } from "./message-types/host-bash.js";
|
|
81
84
|
import type {
|
|
82
85
|
_HostBrowserClientMessages,
|
|
@@ -92,6 +95,7 @@ import type {
|
|
|
92
95
|
_IntegrationsClientMessages,
|
|
93
96
|
_IntegrationsServerMessages,
|
|
94
97
|
} from "./message-types/integrations.js";
|
|
98
|
+
import type { _MeetServerMessages } from "./message-types/meet.js";
|
|
95
99
|
import type { _MemoryServerMessages } from "./message-types/memory.js";
|
|
96
100
|
import type {
|
|
97
101
|
_MessagesClientMessages,
|
|
@@ -191,10 +195,12 @@ export type ServerMessage =
|
|
|
191
195
|
| _SubagentsServerMessages
|
|
192
196
|
| _DocumentsServerMessages
|
|
193
197
|
| _GuardianActionsServerMessages
|
|
198
|
+
| _HomeServerMessages
|
|
194
199
|
| _HostBashServerMessages
|
|
195
200
|
| _HostBrowserServerMessages
|
|
196
201
|
| _HostCuServerMessages
|
|
197
202
|
| _HostFileServerMessages
|
|
203
|
+
| _MeetServerMessages
|
|
198
204
|
| _MemoryServerMessages
|
|
199
205
|
| _WorkspaceServerMessages
|
|
200
206
|
| _SchedulesServerMessages
|
|
@@ -434,6 +434,19 @@ export interface ContextCompacted {
|
|
|
434
434
|
summaryModel: string;
|
|
435
435
|
}
|
|
436
436
|
|
|
437
|
+
/**
|
|
438
|
+
* Emitted when the compaction circuit breaker trips. After three consecutive
|
|
439
|
+
* summary-LLM failures (with local fallback covering each), auto-compaction is
|
|
440
|
+
* suspended until `openUntil` to avoid repeatedly hammering a broken provider.
|
|
441
|
+
* User-initiated compaction (`/compact`, `force: true`) bypasses the breaker.
|
|
442
|
+
*/
|
|
443
|
+
export interface CompactionCircuitOpen {
|
|
444
|
+
type: "compaction_circuit_open";
|
|
445
|
+
reason: "3_consecutive_failures";
|
|
446
|
+
/** Timestamp (ms since epoch) when the breaker will allow auto-compaction again. */
|
|
447
|
+
openUntil: number;
|
|
448
|
+
}
|
|
449
|
+
|
|
437
450
|
export type ConversationErrorCode =
|
|
438
451
|
| "PROVIDER_NETWORK"
|
|
439
452
|
| "PROVIDER_RATE_LIMIT"
|
|
@@ -461,6 +474,20 @@ export interface ConversationErrorMessage {
|
|
|
461
474
|
errorCategory?: string;
|
|
462
475
|
}
|
|
463
476
|
|
|
477
|
+
/** Reason the conversation list was invalidated. */
|
|
478
|
+
export type ConversationListInvalidatedReason =
|
|
479
|
+
| "created"
|
|
480
|
+
| "renamed"
|
|
481
|
+
| "deleted"
|
|
482
|
+
| "reordered"
|
|
483
|
+
| "seen_changed";
|
|
484
|
+
|
|
485
|
+
/** Server push — tells clients their sidebar conversation list is stale. */
|
|
486
|
+
export interface ConversationListInvalidated {
|
|
487
|
+
type: "conversation_list_invalidated";
|
|
488
|
+
reason: ConversationListInvalidatedReason;
|
|
489
|
+
}
|
|
490
|
+
|
|
464
491
|
/** Server push — broadcast when a schedule creates a conversation. */
|
|
465
492
|
export interface ScheduleConversationCreated {
|
|
466
493
|
type: "schedule_conversation_created";
|
|
@@ -469,6 +496,23 @@ export interface ScheduleConversationCreated {
|
|
|
469
496
|
title: string;
|
|
470
497
|
}
|
|
471
498
|
|
|
499
|
+
/**
|
|
500
|
+
* Server push — instructs the client to open and focus a conversation. If
|
|
501
|
+
* the conversation isn't already present in the client's sidebar list (e.g.
|
|
502
|
+
* it was just created via `POST /v1/conversations`), the client should stub
|
|
503
|
+
* a sidebar entry using the provided `title` before navigating.
|
|
504
|
+
*/
|
|
505
|
+
export interface OpenConversation {
|
|
506
|
+
type: "open_conversation";
|
|
507
|
+
conversationId: string;
|
|
508
|
+
/** Optional conversation title; supplied when the client may not yet have the conversation in its list. */
|
|
509
|
+
title?: string;
|
|
510
|
+
/** Optional message ID to scroll to after focus. */
|
|
511
|
+
anchorMessageId?: string;
|
|
512
|
+
/** When `false`, the client should register the conversation in its sidebar (so it's visible and navigable) but must NOT switch focus to it. Omitting the field defaults to `true` for backward compatibility with existing single-target 'jump to conversation' callers. */
|
|
513
|
+
focus?: boolean;
|
|
514
|
+
}
|
|
515
|
+
|
|
472
516
|
// --- Domain-level union aliases (consumed by the barrel file) ---
|
|
473
517
|
|
|
474
518
|
export type _ConversationsClientMessages =
|
|
@@ -500,6 +544,7 @@ export type _ConversationsServerMessages =
|
|
|
500
544
|
| UsageUpdate
|
|
501
545
|
| UsageResponse
|
|
502
546
|
| ContextCompacted
|
|
547
|
+
| CompactionCircuitOpen
|
|
503
548
|
| ConversationErrorMessage
|
|
504
549
|
| ConversationInfo
|
|
505
550
|
| ConversationTitleUpdated
|
|
@@ -507,4 +552,6 @@ export type _ConversationsServerMessages =
|
|
|
507
552
|
| ConversationsClearResponse
|
|
508
553
|
| ConversationSearchResponse
|
|
509
554
|
| MessageContentResponse
|
|
510
|
-
|
|
|
555
|
+
| ConversationListInvalidated
|
|
556
|
+
| ScheduleConversationCreated
|
|
557
|
+
| OpenConversation;
|