@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,127 @@
|
|
|
1
|
+
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
2
|
+
import { getConfig } from "../config/loader.js";
|
|
3
|
+
import {
|
|
4
|
+
isUntrustedTrustClass,
|
|
5
|
+
type TrustClass,
|
|
6
|
+
} from "../runtime/actor-trust-resolver.js";
|
|
7
|
+
import { getLogger } from "../util/logger.js";
|
|
8
|
+
import { isAutoAnalysisConversation } from "./auto-analysis-guard.js";
|
|
9
|
+
import { getConversationType } from "./conversation-crud.js";
|
|
10
|
+
import { upsertAutoAnalysisJob } from "./jobs-store.js";
|
|
11
|
+
|
|
12
|
+
const log = getLogger("auto-analysis-enqueue");
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Trigger reason for an auto-analysis enqueue.
|
|
16
|
+
* - `"batch"`: source conversation crossed the batch threshold — enqueue
|
|
17
|
+
* immediately (`runAfter = now`) but still upsert so a pending job
|
|
18
|
+
* coalesces rapid threshold crossings into one.
|
|
19
|
+
* - `"idle"`: source conversation has been idle long enough to warrant a
|
|
20
|
+
* debounced analysis pass.
|
|
21
|
+
* - `"lifecycle"`: a conversation lifecycle transition (e.g. resume,
|
|
22
|
+
* close) should trigger a debounced analysis pass.
|
|
23
|
+
* - `"compaction"`: context was just compacted — some recent turns are
|
|
24
|
+
* now hidden behind a summary, so crystallize anything worth
|
|
25
|
+
* remembering before the window narrows further. Fires immediately
|
|
26
|
+
* (`runAfter = now`) like `"batch"`.
|
|
27
|
+
*/
|
|
28
|
+
export type AutoAnalysisTrigger =
|
|
29
|
+
| "batch"
|
|
30
|
+
| "idle"
|
|
31
|
+
| "lifecycle"
|
|
32
|
+
| "compaction";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Conditionally enqueue a `conversation_analyze` job for the given
|
|
36
|
+
* conversation. Skips silently when:
|
|
37
|
+
* - the `auto-analyze` feature flag is disabled, OR
|
|
38
|
+
* - the source conversation is itself an auto-analysis conversation
|
|
39
|
+
* (recursion guard — we never analyze our own analysis output), OR
|
|
40
|
+
* - the source conversation is private (`analyzeConversation` rejects
|
|
41
|
+
* private conversations, so enqueueing would guarantee a failed job).
|
|
42
|
+
*
|
|
43
|
+
* Immediate triggers (`"batch"`, `"compaction"`) and debounced triggers
|
|
44
|
+
* (`"idle"`, `"lifecycle"`) are written to separate rows keyed by a
|
|
45
|
+
* `triggerGroup` discriminator. This prevents an idle enqueue from
|
|
46
|
+
* pushing an already-scheduled batch row's `runAfter` into the future
|
|
47
|
+
* (and vice versa). Within each group, rapid enqueues still coalesce to
|
|
48
|
+
* a single pending row via `upsertAutoAnalysisJob`.
|
|
49
|
+
*/
|
|
50
|
+
export function enqueueAutoAnalysisIfEnabled(args: {
|
|
51
|
+
conversationId: string;
|
|
52
|
+
trigger: AutoAnalysisTrigger;
|
|
53
|
+
}): void {
|
|
54
|
+
const { conversationId, trigger } = args;
|
|
55
|
+
|
|
56
|
+
let config;
|
|
57
|
+
try {
|
|
58
|
+
config = getConfig();
|
|
59
|
+
} catch (err) {
|
|
60
|
+
log.warn(
|
|
61
|
+
{ err, conversationId },
|
|
62
|
+
"Skipping auto-analysis enqueue: failed to load config",
|
|
63
|
+
);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!isAssistantFeatureFlagEnabled("auto-analyze", config)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (isAutoAnalysisConversation(conversationId)) {
|
|
72
|
+
log.debug(
|
|
73
|
+
{ conversationId, trigger },
|
|
74
|
+
"Skipping auto-analysis enqueue: source is an auto-analysis conversation",
|
|
75
|
+
);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (getConversationType(conversationId) === "private") {
|
|
80
|
+
log.debug(
|
|
81
|
+
{ conversationId, trigger },
|
|
82
|
+
"Skipping auto-analysis enqueue: source is a private conversation",
|
|
83
|
+
);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const idleTimeoutMs = config.analysis?.idleTimeoutMs ?? 600_000;
|
|
88
|
+
const runImmediately = trigger === "batch" || trigger === "compaction";
|
|
89
|
+
const triggerGroup: "immediate" | "debounced" = runImmediately
|
|
90
|
+
? "immediate"
|
|
91
|
+
: "debounced";
|
|
92
|
+
const runAfter = runImmediately ? Date.now() : Date.now() + idleTimeoutMs;
|
|
93
|
+
|
|
94
|
+
try {
|
|
95
|
+
upsertAutoAnalysisJob({ conversationId, triggerGroup }, runAfter);
|
|
96
|
+
} catch (err) {
|
|
97
|
+
log.warn(
|
|
98
|
+
{ err, conversationId, trigger },
|
|
99
|
+
"Failed to enqueue auto-analysis job",
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Fire an auto-analysis enqueue from a compaction site. Wraps
|
|
106
|
+
* `enqueueAutoAnalysisIfEnabled` with the trust-class gate and
|
|
107
|
+
* best-effort error handling used at every compaction call site, so
|
|
108
|
+
* the six compaction paths (forceCompact, preflight, overflow reducer,
|
|
109
|
+
* mid-loop, and two emergency paths) stay in sync.
|
|
110
|
+
*
|
|
111
|
+
* Trust gate mirrors the memory-extraction trust boundary applied in
|
|
112
|
+
* `disposeConversation` — we don't trigger analysis (which runs with
|
|
113
|
+
* guardian trust + full tools) for conversations with an untrusted actor.
|
|
114
|
+
*/
|
|
115
|
+
export function enqueueAutoAnalysisOnCompaction(
|
|
116
|
+
conversationId: string,
|
|
117
|
+
trustClass: TrustClass | undefined,
|
|
118
|
+
): void {
|
|
119
|
+
if (isUntrustedTrustClass(trustClass)) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
enqueueAutoAnalysisIfEnabled({ conversationId, trigger: "compaction" });
|
|
124
|
+
} catch {
|
|
125
|
+
// Best-effort — never block compaction on enqueue failures.
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { getConversationSource } from "./conversation-crud.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The `source` value used for conversations created by the auto-analysis
|
|
5
|
+
* loop. Single source of truth — downstream code (enqueue helper,
|
|
6
|
+
* service auto-branch) imports this constant rather than hardcoding the
|
|
7
|
+
* string.
|
|
8
|
+
*/
|
|
9
|
+
export const AUTO_ANALYSIS_SOURCE = "auto-analysis";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Dedicated `group_id` value for auto-analysis rolling conversations.
|
|
13
|
+
* Placed in the `system:background` group alongside heartbeat and filing
|
|
14
|
+
* conversations, rendered as a "Reflections" sub-group in the sidebar.
|
|
15
|
+
*/
|
|
16
|
+
export const AUTO_ANALYSIS_GROUP_ID = "system:background";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Returns true if the conversation's `source` column is `"auto-analysis"`,
|
|
20
|
+
* meaning it was produced by the auto-analysis loop. Callers use this to
|
|
21
|
+
* skip both `graph_extract` and `conversation_analyze` enqueues so we
|
|
22
|
+
* never (a) analyze our own analysis output or (b) extract memory from
|
|
23
|
+
* reflective musings (the analysis agent writes memory directly via tools).
|
|
24
|
+
*/
|
|
25
|
+
export function isAutoAnalysisConversation(conversationId: string): boolean {
|
|
26
|
+
return getConversationSource(conversationId) === AUTO_ANALYSIS_SOURCE;
|
|
27
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared state for the cleanup-scheduler throttle.
|
|
3
|
+
*
|
|
4
|
+
* `maybeEnqueueScheduledCleanupJobs` in jobs-worker.ts gates cleanup-job
|
|
5
|
+
* enqueueing behind a 6-hour window (configurable via
|
|
6
|
+
* memory.cleanup.enqueueIntervalMs). This module owns the "last enqueue"
|
|
7
|
+
* timestamp so that code paths outside jobs-worker — notably
|
|
8
|
+
* ConfigWatcher.refreshConfigFromSources — can reset the throttle without
|
|
9
|
+
* pulling in jobs-worker's large transitive import graph.
|
|
10
|
+
*
|
|
11
|
+
* The ConfigWatcher uses resetCleanupScheduleThrottle() to ensure that
|
|
12
|
+
* retention changes made via the UI (which flow through config.json →
|
|
13
|
+
* invalidateConfigCache → refreshConfigFromSources) take effect on the
|
|
14
|
+
* very next scheduler tick instead of waiting out the remaining window.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
let lastScheduledCleanupEnqueueMs = 0;
|
|
18
|
+
|
|
19
|
+
/** Read the timestamp of the most recent enqueue (0 if never/reset). */
|
|
20
|
+
export function getLastScheduledCleanupEnqueueMs(): number {
|
|
21
|
+
return lastScheduledCleanupEnqueueMs;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Record that an enqueue just happened at `nowMs`. */
|
|
25
|
+
export function markScheduledCleanupEnqueued(nowMs: number): void {
|
|
26
|
+
lastScheduledCleanupEnqueueMs = nowMs;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Clear the throttle so the next `maybeEnqueueScheduledCleanupJobs` call
|
|
31
|
+
* bypasses the `enqueueIntervalMs` window. Used by ConfigWatcher when
|
|
32
|
+
* retention settings change, and by tests that need deterministic
|
|
33
|
+
* scheduling.
|
|
34
|
+
*/
|
|
35
|
+
export function resetCleanupScheduleThrottle(): void {
|
|
36
|
+
lastScheduledCleanupEnqueueMs = 0;
|
|
37
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Auto-analyze — conversation_analyze job handler
|
|
3
|
+
//
|
|
4
|
+
// Bridges the jobs worker to the shared analyzeConversation() service. The
|
|
5
|
+
// deps bundle is stashed on a module singleton during daemon startup; if it
|
|
6
|
+
// isn't set yet the handler throws BackendUnavailableError so the worker
|
|
7
|
+
// defers with exponential backoff until deps become available.
|
|
8
|
+
//
|
|
9
|
+
// The service itself distinguishes manual vs. auto triggers: this handler
|
|
10
|
+
// always invokes with `trigger: "auto"`, so the rolling analysis conversation
|
|
11
|
+
// logic and recursion guard apply.
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
import type { AssistantConfig } from "../config/types.js";
|
|
15
|
+
import { analyzeConversation } from "../runtime/services/analyze-conversation.js";
|
|
16
|
+
import { getAnalysisDeps } from "../runtime/services/analyze-deps-singleton.js";
|
|
17
|
+
import { BackendUnavailableError } from "../util/errors.js";
|
|
18
|
+
import { getLogger } from "../util/logger.js";
|
|
19
|
+
import { enqueueAutoAnalysisIfEnabled } from "./auto-analysis-enqueue.js";
|
|
20
|
+
import type { MemoryJob } from "./jobs-store.js";
|
|
21
|
+
|
|
22
|
+
const log = getLogger("conversation-analyze-job");
|
|
23
|
+
|
|
24
|
+
export async function conversationAnalyzeJob(
|
|
25
|
+
job: MemoryJob<{ conversationId?: string }>,
|
|
26
|
+
_config: AssistantConfig,
|
|
27
|
+
): Promise<void> {
|
|
28
|
+
const { conversationId } = job.payload;
|
|
29
|
+
if (!conversationId) {
|
|
30
|
+
log.warn({ jobId: job.id }, "Skipping job: missing conversationId");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const deps = getAnalysisDeps();
|
|
35
|
+
if (!deps) {
|
|
36
|
+
// Daemon hasn't finished startup. Throw BackendUnavailableError so the
|
|
37
|
+
// worker defers the job with exponential backoff instead of completing
|
|
38
|
+
// it. Returning success here would permanently drop the job via
|
|
39
|
+
// completeMemoryJob — conversations with a pre-existing queued job
|
|
40
|
+
// during startup and no subsequent activity would never be analyzed.
|
|
41
|
+
// The deferral budget (50 × up to 5min backoff) is generous enough to
|
|
42
|
+
// outlast any realistic startup delay.
|
|
43
|
+
log.warn(
|
|
44
|
+
{ jobId: job.id, conversationId },
|
|
45
|
+
"Deferring job: analysis deps not yet initialized",
|
|
46
|
+
);
|
|
47
|
+
throw new BackendUnavailableError(
|
|
48
|
+
"Analysis deps not yet initialized during daemon startup",
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const result = await analyzeConversation(conversationId, deps, {
|
|
53
|
+
trigger: "auto",
|
|
54
|
+
});
|
|
55
|
+
if ("error" in result) {
|
|
56
|
+
log.warn(
|
|
57
|
+
{ jobId: job.id, conversationId, error: result.error },
|
|
58
|
+
"Auto-analysis service rejected source conversation",
|
|
59
|
+
);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (result.skipped) {
|
|
63
|
+
// The rolling analysis conversation was still processing a prior run, so
|
|
64
|
+
// this invocation was a no-op. Schedule a debounced follow-up ourselves
|
|
65
|
+
// — otherwise, if no later batch/idle/lifecycle trigger arrives (e.g.
|
|
66
|
+
// the conversation goes quiet after a long in-flight analysis), new
|
|
67
|
+
// source messages would stay un-analyzed indefinitely.
|
|
68
|
+
enqueueAutoAnalysisIfEnabled({ conversationId, trigger: "idle" });
|
|
69
|
+
log.debug(
|
|
70
|
+
{ jobId: job.id, conversationId },
|
|
71
|
+
"Auto-analysis skipped (rolling conversation busy); requeued follow-up",
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -172,11 +172,8 @@ export function seedForkedConversationAttention(params: {
|
|
|
172
172
|
latestAssistantMessageId: string | null;
|
|
173
173
|
latestAssistantMessageAt: number | null;
|
|
174
174
|
}): void {
|
|
175
|
-
const {
|
|
176
|
-
|
|
177
|
-
latestAssistantMessageId,
|
|
178
|
-
latestAssistantMessageAt,
|
|
179
|
-
} = params;
|
|
175
|
+
const { conversationId, latestAssistantMessageId, latestAssistantMessageAt } =
|
|
176
|
+
params;
|
|
180
177
|
|
|
181
178
|
if (!latestAssistantMessageId || latestAssistantMessageAt == null) {
|
|
182
179
|
return;
|
|
@@ -458,9 +455,15 @@ function resolveAssistantCursor(params: {
|
|
|
458
455
|
* This uses the existing attention projection instead of adding a separate
|
|
459
456
|
* manual-unread state machine.
|
|
460
457
|
*/
|
|
461
|
-
|
|
458
|
+
/**
|
|
459
|
+
* Returns `true` when the seen cursor was actually rewound (state changed),
|
|
460
|
+
* `false` when the conversation was already unread (no-op).
|
|
461
|
+
* Throws `UserError` when there is no assistant message to mark unread.
|
|
462
|
+
*/
|
|
463
|
+
export function markConversationUnread(conversationId: string): boolean {
|
|
462
464
|
const db = getDb();
|
|
463
465
|
const now = Date.now();
|
|
466
|
+
let changed = false;
|
|
464
467
|
|
|
465
468
|
db.transaction((tx) => {
|
|
466
469
|
const state = tx
|
|
@@ -511,6 +514,7 @@ export function markConversationUnread(conversationId: string): void {
|
|
|
511
514
|
updatedAt: now,
|
|
512
515
|
})
|
|
513
516
|
.run();
|
|
517
|
+
changed = true;
|
|
514
518
|
return;
|
|
515
519
|
}
|
|
516
520
|
|
|
@@ -524,7 +528,10 @@ export function markConversationUnread(conversationId: string): void {
|
|
|
524
528
|
eq(conversationAssistantAttentionState.conversationId, conversationId),
|
|
525
529
|
)
|
|
526
530
|
.run();
|
|
531
|
+
changed = true;
|
|
527
532
|
});
|
|
533
|
+
|
|
534
|
+
return changed;
|
|
528
535
|
}
|
|
529
536
|
|
|
530
537
|
// ── getAttentionStateByConversationIds ───────────────────────────────
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
gte,
|
|
11
11
|
inArray,
|
|
12
12
|
isNull,
|
|
13
|
+
like,
|
|
13
14
|
lt,
|
|
14
15
|
lte,
|
|
15
16
|
sql,
|
|
@@ -23,6 +24,7 @@ import { CHANNEL_IDS, INTERFACE_IDS, isChannelId } from "../channels/types.js";
|
|
|
23
24
|
import { getConfig } from "../config/loader.js";
|
|
24
25
|
import type { TrustContext } from "../daemon/conversation-runtime-assembly.js";
|
|
25
26
|
import { UserError } from "../util/errors.js";
|
|
27
|
+
import { safeParseRecord } from "../util/json.js";
|
|
26
28
|
import { getLogger } from "../util/logger.js";
|
|
27
29
|
import { getConversationsDir } from "../util/platform.js";
|
|
28
30
|
import { createRowMapper } from "../util/row-mapper.js";
|
|
@@ -30,6 +32,7 @@ import {
|
|
|
30
32
|
deleteOrphanAttachments,
|
|
31
33
|
linkAttachmentToMessage,
|
|
32
34
|
} from "./attachments-store.js";
|
|
35
|
+
import { AUTO_ANALYSIS_SOURCE } from "./auto-analysis-guard.js";
|
|
33
36
|
import {
|
|
34
37
|
projectAssistantMessage,
|
|
35
38
|
seedForkedConversationAttention,
|
|
@@ -101,6 +104,9 @@ export const messageMetadataSchema = z
|
|
|
101
104
|
forkSourceMessageId: z.string().optional(),
|
|
102
105
|
/** Image source paths from desktop attachments, keyed by filename. */
|
|
103
106
|
imageSourcePaths: z.record(z.string(), z.string()).optional(),
|
|
107
|
+
memoryInjectedBlock: z.string().optional(),
|
|
108
|
+
turnContextBlock: z.string().optional(),
|
|
109
|
+
pkbSystemReminderBlock: z.string().optional(),
|
|
104
110
|
})
|
|
105
111
|
.passthrough();
|
|
106
112
|
|
|
@@ -174,6 +180,7 @@ export interface ConversationRow {
|
|
|
174
180
|
isAutoTitle: number;
|
|
175
181
|
scheduleJobId: string | null;
|
|
176
182
|
lastMessageAt: number | null;
|
|
183
|
+
archivedAt: number | null;
|
|
177
184
|
}
|
|
178
185
|
|
|
179
186
|
export const parseConversation = createRowMapper<
|
|
@@ -201,6 +208,7 @@ export const parseConversation = createRowMapper<
|
|
|
201
208
|
isAutoTitle: "isAutoTitle",
|
|
202
209
|
scheduleJobId: "scheduleJobId",
|
|
203
210
|
lastMessageAt: "lastMessageAt",
|
|
211
|
+
archivedAt: "archivedAt",
|
|
204
212
|
});
|
|
205
213
|
|
|
206
214
|
export interface MessageRow {
|
|
@@ -248,6 +256,7 @@ export function createConversation(
|
|
|
248
256
|
scheduleJobId?: string;
|
|
249
257
|
groupId?: string;
|
|
250
258
|
hostAccess?: boolean;
|
|
259
|
+
forkParentConversationId?: string;
|
|
251
260
|
},
|
|
252
261
|
) {
|
|
253
262
|
const db = getDb();
|
|
@@ -284,6 +293,7 @@ export function createConversation(
|
|
|
284
293
|
source,
|
|
285
294
|
memoryScopeId,
|
|
286
295
|
scheduleJobId: opts.scheduleJobId ?? null,
|
|
296
|
+
forkParentConversationId: opts.forkParentConversationId ?? null,
|
|
287
297
|
};
|
|
288
298
|
|
|
289
299
|
// Retry on SQLITE_BUSY and SQLITE_IOERR — transient disk I/O errors or WAL
|
|
@@ -379,6 +389,52 @@ export function countConversationsByScheduleJobId(
|
|
|
379
389
|
);
|
|
380
390
|
}
|
|
381
391
|
|
|
392
|
+
/**
|
|
393
|
+
* Find the rolling analysis conversation for a given source conversation,
|
|
394
|
+
* or null if none exists yet. Used by the auto-analyze loop to append
|
|
395
|
+
* to an existing analysis conversation rather than creating a new one
|
|
396
|
+
* each time the analyze job fires.
|
|
397
|
+
*
|
|
398
|
+
* Returns the most recently updated match if multiple exist (defensive —
|
|
399
|
+
* shouldn't happen in normal operation but the contract is well-defined).
|
|
400
|
+
*
|
|
401
|
+
* Hits `idx_conversations_fork_parent_conversation_id` for the
|
|
402
|
+
* `forkParentConversationId` lookup.
|
|
403
|
+
*/
|
|
404
|
+
export function findAnalysisConversationFor(
|
|
405
|
+
parentConversationId: string,
|
|
406
|
+
): { id: string } | null {
|
|
407
|
+
const db = getDb();
|
|
408
|
+
const row = db
|
|
409
|
+
.select({ id: conversations.id })
|
|
410
|
+
.from(conversations)
|
|
411
|
+
.where(
|
|
412
|
+
and(
|
|
413
|
+
eq(conversations.source, AUTO_ANALYSIS_SOURCE),
|
|
414
|
+
eq(conversations.forkParentConversationId, parentConversationId),
|
|
415
|
+
),
|
|
416
|
+
)
|
|
417
|
+
.orderBy(desc(conversations.updatedAt))
|
|
418
|
+
.limit(1)
|
|
419
|
+
.get();
|
|
420
|
+
return row ? { id: row.id } : null;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Returns the `source` column for the given conversation, or null if
|
|
425
|
+
* not found. Tiny convenience used by the recursion guard in the
|
|
426
|
+
* auto-analyze loop.
|
|
427
|
+
*/
|
|
428
|
+
export function getConversationSource(conversationId: string): string | null {
|
|
429
|
+
const db = getDb();
|
|
430
|
+
const row = db
|
|
431
|
+
.select({ source: conversations.source })
|
|
432
|
+
.from(conversations)
|
|
433
|
+
.where(eq(conversations.id, conversationId))
|
|
434
|
+
.get();
|
|
435
|
+
return row?.source ?? null;
|
|
436
|
+
}
|
|
437
|
+
|
|
382
438
|
export function getConversationType(
|
|
383
439
|
conversationId: string,
|
|
384
440
|
): "standard" | "private" {
|
|
@@ -991,6 +1047,49 @@ export function getMessages(conversationId: string): MessageRow[] {
|
|
|
991
1047
|
.map(parseMessage);
|
|
992
1048
|
}
|
|
993
1049
|
|
|
1050
|
+
/**
|
|
1051
|
+
* Count messages whose metadata JSON contains a `slackMeta` envelope, capped
|
|
1052
|
+
* at `limit`. Pushes the cap into SQL (`LIKE` + `LIMIT`) so warm Slack DM
|
|
1053
|
+
* conversations don't require a full-table scan + JSON parse on every
|
|
1054
|
+
* inbound message to confirm the cold-start threshold has been cleared.
|
|
1055
|
+
* Returns the number of matching rows up to `limit`; callers compare against
|
|
1056
|
+
* the cold-start threshold to decide whether to backfill.
|
|
1057
|
+
*/
|
|
1058
|
+
export function countMessagesWithSlackMeta(
|
|
1059
|
+
conversationId: string,
|
|
1060
|
+
limit: number,
|
|
1061
|
+
): number {
|
|
1062
|
+
const db = getDb();
|
|
1063
|
+
const rows = db
|
|
1064
|
+
.select({ one: sql`1` })
|
|
1065
|
+
.from(messages)
|
|
1066
|
+
.where(
|
|
1067
|
+
and(
|
|
1068
|
+
eq(messages.conversationId, conversationId),
|
|
1069
|
+
like(messages.metadata, '%"slackMeta"%'),
|
|
1070
|
+
),
|
|
1071
|
+
)
|
|
1072
|
+
.limit(limit)
|
|
1073
|
+
.all();
|
|
1074
|
+
return rows.length;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
/**
|
|
1078
|
+
* Efficient existence check — returns true if the conversation has at least
|
|
1079
|
+
* one message row. Uses `LIMIT 1` + `select({ 1 })` to avoid loading and
|
|
1080
|
+
* parsing any message content.
|
|
1081
|
+
*/
|
|
1082
|
+
export function hasMessages(conversationId: string): boolean {
|
|
1083
|
+
const db = getDb();
|
|
1084
|
+
const row = db
|
|
1085
|
+
.select({ one: sql`1` })
|
|
1086
|
+
.from(messages)
|
|
1087
|
+
.where(eq(messages.conversationId, conversationId))
|
|
1088
|
+
.limit(1)
|
|
1089
|
+
.get();
|
|
1090
|
+
return row !== undefined;
|
|
1091
|
+
}
|
|
1092
|
+
|
|
994
1093
|
export interface PaginatedMessagesResult {
|
|
995
1094
|
messages: MessageRow[];
|
|
996
1095
|
hasMore: boolean;
|
|
@@ -1062,6 +1161,27 @@ export function getLastAssistantTimestampBefore(
|
|
|
1062
1161
|
return row?.createdAt ?? 0;
|
|
1063
1162
|
}
|
|
1064
1163
|
|
|
1164
|
+
export function getLastUserTimestampBefore(
|
|
1165
|
+
conversationId: string,
|
|
1166
|
+
beforeTimestamp: number,
|
|
1167
|
+
): number {
|
|
1168
|
+
const db = getDb();
|
|
1169
|
+
const row = db
|
|
1170
|
+
.select({ createdAt: messages.createdAt })
|
|
1171
|
+
.from(messages)
|
|
1172
|
+
.where(
|
|
1173
|
+
and(
|
|
1174
|
+
eq(messages.conversationId, conversationId),
|
|
1175
|
+
eq(messages.role, "user"),
|
|
1176
|
+
lt(messages.createdAt, beforeTimestamp),
|
|
1177
|
+
),
|
|
1178
|
+
)
|
|
1179
|
+
.orderBy(desc(messages.createdAt))
|
|
1180
|
+
.limit(1)
|
|
1181
|
+
.get();
|
|
1182
|
+
return row?.createdAt ?? 0;
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1065
1185
|
/** Fetch a single message by ID, optionally scoped to a specific conversation. */
|
|
1066
1186
|
export function getMessageById(
|
|
1067
1187
|
messageId: string,
|
|
@@ -1146,6 +1266,31 @@ export function updateConversationHostAccess(
|
|
|
1146
1266
|
.run();
|
|
1147
1267
|
}
|
|
1148
1268
|
|
|
1269
|
+
export function archiveConversation(id: string): boolean {
|
|
1270
|
+
const conv = getConversation(id);
|
|
1271
|
+
if (!conv) return false;
|
|
1272
|
+
const now = Date.now();
|
|
1273
|
+
rawRun(
|
|
1274
|
+
"UPDATE conversations SET archived_at = ?, updated_at = ? WHERE id = ?",
|
|
1275
|
+
now,
|
|
1276
|
+
now,
|
|
1277
|
+
id,
|
|
1278
|
+
);
|
|
1279
|
+
return true;
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
export function unarchiveConversation(id: string): boolean {
|
|
1283
|
+
const conv = getConversation(id);
|
|
1284
|
+
if (!conv) return false;
|
|
1285
|
+
const now = Date.now();
|
|
1286
|
+
rawRun(
|
|
1287
|
+
"UPDATE conversations SET archived_at = NULL, updated_at = ? WHERE id = ?",
|
|
1288
|
+
now,
|
|
1289
|
+
id,
|
|
1290
|
+
);
|
|
1291
|
+
return true;
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1149
1294
|
/**
|
|
1150
1295
|
* Delete all conversations, messages, and related data (tool invocations,
|
|
1151
1296
|
* memory segments, etc.) from the daemon database.
|
|
@@ -1357,6 +1502,60 @@ export function updateMessageMetadata(
|
|
|
1357
1502
|
.run();
|
|
1358
1503
|
}
|
|
1359
1504
|
|
|
1505
|
+
/**
|
|
1506
|
+
* Bulk-remove the `pkbSystemReminderBlock` field from every user-message
|
|
1507
|
+
* metadata row in a conversation. Called from compaction-strip sites so
|
|
1508
|
+
* post-restart rehydration stays consistent with the in-memory state
|
|
1509
|
+
* produced by `stripInjectionsForCompaction` (which removes
|
|
1510
|
+
* `<system_reminder>` from live messages but cannot touch the DB).
|
|
1511
|
+
*/
|
|
1512
|
+
export function clearPkbSystemReminderMetadataForConversation(
|
|
1513
|
+
conversationId: string,
|
|
1514
|
+
): void {
|
|
1515
|
+
rawRun(
|
|
1516
|
+
`UPDATE messages
|
|
1517
|
+
SET metadata = json_remove(metadata, '$.pkbSystemReminderBlock')
|
|
1518
|
+
WHERE conversation_id = ?
|
|
1519
|
+
AND role = 'user'
|
|
1520
|
+
AND metadata IS NOT NULL
|
|
1521
|
+
AND json_extract(metadata, '$.pkbSystemReminderBlock') IS NOT NULL`,
|
|
1522
|
+
conversationId,
|
|
1523
|
+
);
|
|
1524
|
+
}
|
|
1525
|
+
|
|
1526
|
+
/**
|
|
1527
|
+
* Atomically update both `content` and (shallow-merged) `metadata` for a
|
|
1528
|
+
* message. Used by edit-propagation paths that need to update the message
|
|
1529
|
+
* body and stamp metadata (e.g. `slackMeta.editedAt`) in a single
|
|
1530
|
+
* transaction so a partial write cannot leak.
|
|
1531
|
+
*
|
|
1532
|
+
* `metadataUpdates` is shallow-merged into the existing top-level metadata
|
|
1533
|
+
* object. To merge into a nested sub-key (e.g. `slackMeta`), the caller
|
|
1534
|
+
* must compute the merged sub-value first and pass `{ slackMeta: merged }`.
|
|
1535
|
+
*/
|
|
1536
|
+
export function updateMessageContentAndMetadata(
|
|
1537
|
+
messageId: string,
|
|
1538
|
+
newContent: string,
|
|
1539
|
+
metadataUpdates: Record<string, unknown>,
|
|
1540
|
+
): void {
|
|
1541
|
+
const db = getDb();
|
|
1542
|
+
db.transaction((tx) => {
|
|
1543
|
+
const row = tx
|
|
1544
|
+
.select({ metadata: messages.metadata })
|
|
1545
|
+
.from(messages)
|
|
1546
|
+
.where(eq(messages.id, messageId))
|
|
1547
|
+
.get();
|
|
1548
|
+
const existing = row?.metadata ? safeParseRecord(row.metadata) : {};
|
|
1549
|
+
tx.update(messages)
|
|
1550
|
+
.set({
|
|
1551
|
+
content: newContent,
|
|
1552
|
+
metadata: JSON.stringify({ ...existing, ...metadataUpdates }),
|
|
1553
|
+
})
|
|
1554
|
+
.where(eq(messages.id, messageId))
|
|
1555
|
+
.run();
|
|
1556
|
+
});
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1360
1559
|
/**
|
|
1361
1560
|
* Re-link all attachments from a set of source messages to a target message.
|
|
1362
1561
|
* Used during message consolidation so that attachments linked to deleted
|
|
@@ -310,6 +310,13 @@ export function syncMessageToDisk(
|
|
|
310
310
|
if (toolResults.length > 0) record.toolResults = toolResults;
|
|
311
311
|
if (attachmentFilenames.length > 0)
|
|
312
312
|
record.attachments = attachmentFilenames;
|
|
313
|
+
if (message.metadata) {
|
|
314
|
+
try {
|
|
315
|
+
record.metadata = JSON.parse(message.metadata);
|
|
316
|
+
} catch {
|
|
317
|
+
// Invalid JSON — omit metadata from disk record
|
|
318
|
+
}
|
|
319
|
+
}
|
|
313
320
|
|
|
314
321
|
appendFileSync(
|
|
315
322
|
join(dirPath, "messages.jsonl"),
|
|
@@ -57,7 +57,7 @@ export function ensureGroupMigration(): void {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
// 3. Seed system groups
|
|
60
|
+
// 3. Seed system groups.
|
|
61
61
|
const now = Math.floor(Date.now() / 1000);
|
|
62
62
|
rawExec(`
|
|
63
63
|
INSERT OR IGNORE INTO conversation_groups (id, name, sort_position, is_system_group, created_at, updated_at)
|
|
@@ -213,5 +213,69 @@ export function ensureGroupMigration(): void {
|
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
+
// 6. One-time migration: move auto-analysis conversations from system:reflections to system:background
|
|
217
|
+
const reflectionsMigrateDone = rawGet<{ id: string }>(
|
|
218
|
+
"SELECT id FROM conversation_groups WHERE id = '_reflections_to_background_complete'",
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
if (!reflectionsMigrateDone) {
|
|
222
|
+
try {
|
|
223
|
+
rawExec("BEGIN");
|
|
224
|
+
|
|
225
|
+
rawExec(`
|
|
226
|
+
UPDATE conversations SET group_id = 'system:background'
|
|
227
|
+
WHERE group_id = 'system:reflections'
|
|
228
|
+
`);
|
|
229
|
+
|
|
230
|
+
rawExec(`
|
|
231
|
+
INSERT OR IGNORE INTO conversation_groups (id, name, sort_position, is_system_group)
|
|
232
|
+
VALUES ('_reflections_to_background_complete', '_reflections_to_background_complete', -1, TRUE)
|
|
233
|
+
`);
|
|
234
|
+
|
|
235
|
+
rawExec("COMMIT");
|
|
236
|
+
} catch (err) {
|
|
237
|
+
rawExec("ROLLBACK");
|
|
238
|
+
log.error({ err }, "reflections-to-background migration failed, rolled back");
|
|
239
|
+
throw err;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// 7. One-time cleanup: delete the orphaned system:reflections group row.
|
|
244
|
+
//
|
|
245
|
+
// Reflections render as a sub-group under Background via the client's
|
|
246
|
+
// sub-group label provider; the standalone system:reflections group is no
|
|
247
|
+
// longer referenced by any conversation after step 6. Leaving the row in
|
|
248
|
+
// place causes the macOS sidebar to render an empty duplicate "Reflections"
|
|
249
|
+
// entry with a fallback folder icon alongside the Background sub-group.
|
|
250
|
+
const reflectionsGroupDeleted = rawGet<{ id: string }>(
|
|
251
|
+
"SELECT id FROM conversation_groups WHERE id = '_reflections_group_deleted_complete'",
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
if (!reflectionsGroupDeleted) {
|
|
255
|
+
try {
|
|
256
|
+
rawExec("BEGIN");
|
|
257
|
+
|
|
258
|
+
// Belt-and-suspenders: re-run the conversation move in case a straggler
|
|
259
|
+
// crept in between step 6's sentinel being set and this step shipping.
|
|
260
|
+
rawExec(`
|
|
261
|
+
UPDATE conversations SET group_id = 'system:background'
|
|
262
|
+
WHERE group_id = 'system:reflections'
|
|
263
|
+
`);
|
|
264
|
+
|
|
265
|
+
rawExec(`DELETE FROM conversation_groups WHERE id = 'system:reflections'`);
|
|
266
|
+
|
|
267
|
+
rawExec(`
|
|
268
|
+
INSERT OR IGNORE INTO conversation_groups (id, name, sort_position, is_system_group)
|
|
269
|
+
VALUES ('_reflections_group_deleted_complete', '_reflections_group_deleted_complete', -1, TRUE)
|
|
270
|
+
`);
|
|
271
|
+
|
|
272
|
+
rawExec("COMMIT");
|
|
273
|
+
} catch (err) {
|
|
274
|
+
rawExec("ROLLBACK");
|
|
275
|
+
log.error({ err }, "reflections-group deletion failed, rolled back");
|
|
276
|
+
throw err;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
216
280
|
migrated = true;
|
|
217
281
|
}
|