@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,553 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic agent-loop wake mechanism for internal opportunities.
|
|
3
|
+
*
|
|
4
|
+
* Provides `wakeAgentForOpportunity()` — a callable used by subsystems
|
|
5
|
+
* (e.g. meet chat-opportunity detector, scheduled tasks, memory-reducer
|
|
6
|
+
* inferences) that want to invoke the agent loop without a user message.
|
|
7
|
+
*
|
|
8
|
+
* Semantics:
|
|
9
|
+
* - Resolves the conversation context exactly as a normal user turn.
|
|
10
|
+
* - Appends `hint` as a non-persisted internal user message visible to
|
|
11
|
+
* the LLM only — never shows up in the transcript or SSE feed.
|
|
12
|
+
* Format: `"[opportunity:${source}] ${hint}"`.
|
|
13
|
+
* - Invokes the agent loop with all conversation tools available.
|
|
14
|
+
* - No tool calls AND no assistant text → silent no-op (nothing persisted,
|
|
15
|
+
* nothing emitted). Returns `{ invoked: true, producedToolCalls: false }`.
|
|
16
|
+
* - Tool calls produced → normal tool execution runs (the conversation's
|
|
17
|
+
* `AgentLoop` has its tool executor already wired). Returns
|
|
18
|
+
* `{ invoked: true, producedToolCalls: true }`.
|
|
19
|
+
*
|
|
20
|
+
* Concurrency:
|
|
21
|
+
* - If a user turn (or another wake) is currently in flight on the same
|
|
22
|
+
* conversation, the wake is queued behind it (single-flight per
|
|
23
|
+
* `conversationId`).
|
|
24
|
+
* - While the wake's agent loop is running, the conversation is marked
|
|
25
|
+
* as processing (via {@link WakeTarget.markProcessing}) so a user send
|
|
26
|
+
* that arrives mid-wake is queued by `enqueueMessage` instead of
|
|
27
|
+
* launching a concurrent `agentLoop.run()` on the same conversation.
|
|
28
|
+
*
|
|
29
|
+
* Logging:
|
|
30
|
+
* - Emits one structured log line per wake:
|
|
31
|
+
* `{ source, conversationId, durationMs, producedToolCalls, toolNamesCalled }`.
|
|
32
|
+
*
|
|
33
|
+
* Skill isolation:
|
|
34
|
+
* - This file lives in `assistant/src/runtime/` and is intentionally
|
|
35
|
+
* generic. It does not reference Meet or any specific skill. The Meet
|
|
36
|
+
* integration is wired up by `MeetSessionManager` (see PR 7).
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
import type { AgentEvent, AgentLoop } from "../agent/loop.js";
|
|
40
|
+
import type { Message } from "../providers/types.js";
|
|
41
|
+
import { getLogger } from "../util/logger.js";
|
|
42
|
+
|
|
43
|
+
const log = getLogger("agent-wake");
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Minimum surface area of a conversation needed to wake it. Defined as an
|
|
47
|
+
* interface rather than importing `Conversation` directly so the wake
|
|
48
|
+
* helper stays decoupled from the heavyweight conversation class and is
|
|
49
|
+
* easy to exercise under unit tests.
|
|
50
|
+
*
|
|
51
|
+
* Translation note: the wake deliberately hands the adapter a raw
|
|
52
|
+
* {@link AgentEvent} via {@link emitAgentEvent} rather than a
|
|
53
|
+
* `ServerMessage`. The normal user-turn path translates `AgentEvent` into
|
|
54
|
+
* the correctly-shaped wire protocol frames (e.g.
|
|
55
|
+
* `text_delta` → `assistant_text_delta` with `conversationId`) via the
|
|
56
|
+
* canonical handler in `conversation-agent-loop-handlers.ts`. Passing raw
|
|
57
|
+
* events means the adapter can reuse that translation rather than the
|
|
58
|
+
* wake helper shipping malformed frames.
|
|
59
|
+
*/
|
|
60
|
+
export interface WakeTarget {
|
|
61
|
+
readonly conversationId: string;
|
|
62
|
+
readonly agentLoop: Pick<AgentLoop, "run">;
|
|
63
|
+
/**
|
|
64
|
+
* Live LLM-visible history. We read a snapshot, append the internal hint
|
|
65
|
+
* for the run, and then (on non-empty output) append the resulting
|
|
66
|
+
* assistant message(s) to this array so subsequent turns see them.
|
|
67
|
+
*/
|
|
68
|
+
getMessages(): Message[];
|
|
69
|
+
pushMessage(message: Message): void;
|
|
70
|
+
/**
|
|
71
|
+
* Forward a raw agent event so the adapter can translate it to the
|
|
72
|
+
* correct `ServerMessage` shape (e.g. stamping `conversationId`,
|
|
73
|
+
* renaming `text_delta` → `assistant_text_delta`) before emission.
|
|
74
|
+
*
|
|
75
|
+
* Only called when the wake produces output worth emitting — silent
|
|
76
|
+
* no-op wakes never flush buffered events.
|
|
77
|
+
*/
|
|
78
|
+
emitAgentEvent(event: AgentEvent): void;
|
|
79
|
+
/** True if the conversation is already processing a turn. */
|
|
80
|
+
isProcessing(): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Toggle the conversation's in-flight processing marker. The wake
|
|
83
|
+
* wraps its `agentLoop.run()` invocation in
|
|
84
|
+
* `markProcessing(true) … markProcessing(false)` so a concurrent user
|
|
85
|
+
* send sees `isProcessing() === true` and queues the message instead
|
|
86
|
+
* of spawning a parallel agent loop.
|
|
87
|
+
*/
|
|
88
|
+
markProcessing(on: boolean): void;
|
|
89
|
+
/**
|
|
90
|
+
* Persist a single tail message produced by the wake (assistant
|
|
91
|
+
* outputs and intervening tool_result user messages). The daemon
|
|
92
|
+
* adapter is responsible for building channel/interface metadata and
|
|
93
|
+
* syncing the persisted message to the disk view so wake-produced
|
|
94
|
+
* messages match the canonical user-turn persistence path. Kept as a
|
|
95
|
+
* hook so `runtime/agent-wake.ts` stays decoupled from daemon
|
|
96
|
+
* internals (trust context, turn channel/interface contexts,
|
|
97
|
+
* disk-view layout).
|
|
98
|
+
*/
|
|
99
|
+
persistTailMessage(message: Message): Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* Drain any messages that arrived (and were queued) while the wake
|
|
102
|
+
* was running. Optional because not every wake target has a queue —
|
|
103
|
+
* unit-test stubs typically omit it.
|
|
104
|
+
*
|
|
105
|
+
* The wake invokes this in its `finally` block AFTER
|
|
106
|
+
* `markProcessing(false)`. Order matters: if drain ran while
|
|
107
|
+
* processing was still true, `enqueueMessage`'s gate
|
|
108
|
+
* (`if (!ctx.processing) return ...`) would still see processing=true
|
|
109
|
+
* and the drain itself would be a no-op against any racy late sends.
|
|
110
|
+
* Running drain after processing is released matches the canonical
|
|
111
|
+
* user-turn finally path in `conversation-agent-loop.ts`.
|
|
112
|
+
*/
|
|
113
|
+
drainQueue?(): Promise<void>;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface WakeOptions {
|
|
117
|
+
conversationId: string;
|
|
118
|
+
hint: string;
|
|
119
|
+
source: string;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Reason a wake returned `invoked: false`. Callers (CLI, update-bulletin
|
|
124
|
+
* job) need to distinguish "conversation doesn't exist" from "conversation
|
|
125
|
+
* exists but stayed busy past the wait-until-idle timeout" — the former is
|
|
126
|
+
* a user-visible error, the latter is an expected transient condition.
|
|
127
|
+
*/
|
|
128
|
+
export type WakeSkipReason = "not_found" | "timeout" | "no_resolver";
|
|
129
|
+
|
|
130
|
+
export interface WakeResult {
|
|
131
|
+
invoked: boolean;
|
|
132
|
+
producedToolCalls: boolean;
|
|
133
|
+
/** Present only when `invoked: false`; identifies why the wake was skipped. */
|
|
134
|
+
reason?: WakeSkipReason;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Dependencies injected for testing. Production callers can omit this
|
|
139
|
+
* argument entirely and rely on a process-wide default resolver registered
|
|
140
|
+
* at daemon startup via {@link registerDefaultWakeResolver}.
|
|
141
|
+
*/
|
|
142
|
+
export interface WakeDeps {
|
|
143
|
+
/** Resolve the wake target for a conversationId. Returns `null` if not found. */
|
|
144
|
+
resolveTarget: (conversationId: string) => Promise<WakeTarget | null>;
|
|
145
|
+
/** Timestamp source (for deterministic tests). */
|
|
146
|
+
now?: () => number;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ── Process-wide default resolver ────────────────────────────────────
|
|
150
|
+
//
|
|
151
|
+
// PR 6 shipped `wakeAgentForOpportunity` with a required `deps` argument
|
|
152
|
+
// carrying an explicit `resolveTarget`. PR 7 needs to call the helper
|
|
153
|
+
// from code paths (e.g. `MeetSessionManager.join`) that don't know how
|
|
154
|
+
// to build a `WakeTarget` — the adapter that wraps a live `Conversation`
|
|
155
|
+
// lives in the daemon, not the skill. To avoid importing daemon code
|
|
156
|
+
// into `runtime/agent-wake.ts` (and the skill bundle that wires
|
|
157
|
+
// proactive-chat into the manager), we expose a module-level default
|
|
158
|
+
// resolver that the daemon installs once at startup. Callers that don't
|
|
159
|
+
// pass explicit `deps` fall back to it. Tests that pass explicit deps
|
|
160
|
+
// are unaffected — the default is never consulted when deps are
|
|
161
|
+
// supplied.
|
|
162
|
+
|
|
163
|
+
let _defaultResolver:
|
|
164
|
+
| ((conversationId: string) => Promise<WakeTarget | null>)
|
|
165
|
+
| null = null;
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Install the process-wide default resolver. Called once at daemon
|
|
169
|
+
* startup (see `DaemonServer.start()`) with an adapter that looks up a
|
|
170
|
+
* live {@link Conversation} and wraps it as a {@link WakeTarget}.
|
|
171
|
+
*
|
|
172
|
+
* Calling this more than once replaces the prior resolver — the daemon
|
|
173
|
+
* startup path should call it exactly once, but tests that want to
|
|
174
|
+
* exercise the default path can register a mock and reset via
|
|
175
|
+
* {@link resetDefaultWakeResolverForTests}.
|
|
176
|
+
*/
|
|
177
|
+
export function registerDefaultWakeResolver(
|
|
178
|
+
resolver: (conversationId: string) => Promise<WakeTarget | null>,
|
|
179
|
+
): void {
|
|
180
|
+
_defaultResolver = resolver;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Reset the process-wide default resolver. Test-only.
|
|
185
|
+
*
|
|
186
|
+
* @internal
|
|
187
|
+
*/
|
|
188
|
+
export function resetDefaultWakeResolverForTests(): void {
|
|
189
|
+
_defaultResolver = null;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// ── Per-conversation single-flight lock ───────────────────────────────
|
|
193
|
+
//
|
|
194
|
+
// Simple promise-chain map. When a wake arrives and another run is in
|
|
195
|
+
// flight, we chain onto its tail so the wake runs *after* the current
|
|
196
|
+
// work completes. Using the tail promise avoids awaiting every prior
|
|
197
|
+
// completion in the chain (only the last one matters) and keeps memory
|
|
198
|
+
// bounded — the map entry is cleared once the chain completes.
|
|
199
|
+
|
|
200
|
+
const wakeChain = new Map<string, Promise<void>>();
|
|
201
|
+
|
|
202
|
+
async function runSingleFlight<T>(
|
|
203
|
+
conversationId: string,
|
|
204
|
+
fn: () => Promise<T>,
|
|
205
|
+
): Promise<T> {
|
|
206
|
+
const prior = wakeChain.get(conversationId) ?? Promise.resolve();
|
|
207
|
+
let release!: () => void;
|
|
208
|
+
const next = new Promise<void>((resolve) => {
|
|
209
|
+
release = resolve;
|
|
210
|
+
});
|
|
211
|
+
// Install our tail *before* awaiting so later callers chain behind us.
|
|
212
|
+
wakeChain.set(conversationId, next);
|
|
213
|
+
try {
|
|
214
|
+
await prior;
|
|
215
|
+
return await fn();
|
|
216
|
+
} finally {
|
|
217
|
+
// Only clear the map entry if nothing chained behind us in the meantime.
|
|
218
|
+
if (wakeChain.get(conversationId) === next) {
|
|
219
|
+
wakeChain.delete(conversationId);
|
|
220
|
+
}
|
|
221
|
+
release();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Small helper: if a conversation reports `isProcessing()`, poll briefly
|
|
227
|
+
* so we don't try to start a second agent loop concurrently. We rely
|
|
228
|
+
* primarily on the single-flight chain above to serialize *wakes*; this
|
|
229
|
+
* extra check catches the case where a user turn started independently
|
|
230
|
+
* while our wake was queued.
|
|
231
|
+
*/
|
|
232
|
+
async function waitUntilIdle(
|
|
233
|
+
target: WakeTarget,
|
|
234
|
+
nowFn: () => number,
|
|
235
|
+
timeoutMs = 30_000,
|
|
236
|
+
): Promise<boolean> {
|
|
237
|
+
const deadline = nowFn() + timeoutMs;
|
|
238
|
+
while (target.isProcessing() && nowFn() < deadline) {
|
|
239
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
240
|
+
}
|
|
241
|
+
return !target.isProcessing();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Inspect the post-run history slice to decide whether the wake produced
|
|
246
|
+
* output worth persisting/emitting, and collect any tool-use names from
|
|
247
|
+
* the *first* assistant reply (used only for logging).
|
|
248
|
+
*/
|
|
249
|
+
function inspectWakeOutput(
|
|
250
|
+
baselineLength: number,
|
|
251
|
+
updatedHistory: Message[],
|
|
252
|
+
): {
|
|
253
|
+
tailMessages: Message[];
|
|
254
|
+
hasVisibleText: boolean;
|
|
255
|
+
toolUseNames: string[];
|
|
256
|
+
} {
|
|
257
|
+
// The agent loop appends assistant messages (and tool_result user
|
|
258
|
+
// messages) onto the history it was given. We gave it baseline +
|
|
259
|
+
// internal hint, so anything at index >= baselineLength + 1 came from
|
|
260
|
+
// the run.
|
|
261
|
+
const firstAssistantIndex = baselineLength + 1;
|
|
262
|
+
if (updatedHistory.length <= firstAssistantIndex) {
|
|
263
|
+
return { tailMessages: [], hasVisibleText: false, toolUseNames: [] };
|
|
264
|
+
}
|
|
265
|
+
const tailMessages = updatedHistory.slice(firstAssistantIndex);
|
|
266
|
+
|
|
267
|
+
// Scan every tail message for visible text or tool_use blocks. A
|
|
268
|
+
// multi-step run (assistant → tool_result → assistant) still counts as
|
|
269
|
+
// "produced output" when the final assistant message is just a summary
|
|
270
|
+
// — we must persist the entire tail so the DB mirrors in-memory
|
|
271
|
+
// history.
|
|
272
|
+
let hasVisibleText = false;
|
|
273
|
+
const toolUseNames: string[] = [];
|
|
274
|
+
for (const msg of tailMessages) {
|
|
275
|
+
if (msg.role !== "assistant") continue;
|
|
276
|
+
const blocks = Array.isArray(msg.content) ? msg.content : [];
|
|
277
|
+
for (const block of blocks) {
|
|
278
|
+
if (block.type === "text" && typeof block.text === "string") {
|
|
279
|
+
if (block.text.trim().length > 0) {
|
|
280
|
+
hasVisibleText = true;
|
|
281
|
+
}
|
|
282
|
+
} else if (block.type === "tool_use") {
|
|
283
|
+
toolUseNames.push(block.name);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return { tailMessages, hasVisibleText, toolUseNames };
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Wake the agent loop on a conversation without a user message.
|
|
292
|
+
*
|
|
293
|
+
* See module-level doc for semantics. Safe to call concurrently; wakes
|
|
294
|
+
* are serialized per `conversationId`.
|
|
295
|
+
*
|
|
296
|
+
* The `deps` argument is optional in production — when omitted, the
|
|
297
|
+
* process-wide resolver registered by
|
|
298
|
+
* {@link registerDefaultWakeResolver} is used. Tests that want tight
|
|
299
|
+
* control over resolution continue to pass explicit deps.
|
|
300
|
+
*/
|
|
301
|
+
export async function wakeAgentForOpportunity(
|
|
302
|
+
opts: WakeOptions,
|
|
303
|
+
deps?: WakeDeps,
|
|
304
|
+
): Promise<WakeResult> {
|
|
305
|
+
const { conversationId, hint, source } = opts;
|
|
306
|
+
const resolveTarget = deps?.resolveTarget ?? _defaultResolver;
|
|
307
|
+
if (!resolveTarget) {
|
|
308
|
+
log.warn(
|
|
309
|
+
{ conversationId, source },
|
|
310
|
+
"agent-wake: no resolver available (default resolver not registered and no deps passed); skipping",
|
|
311
|
+
);
|
|
312
|
+
return { invoked: false, producedToolCalls: false, reason: "no_resolver" };
|
|
313
|
+
}
|
|
314
|
+
const nowFn = deps?.now ?? Date.now;
|
|
315
|
+
const startedAt = nowFn();
|
|
316
|
+
|
|
317
|
+
return runSingleFlight(conversationId, async () => {
|
|
318
|
+
const target = await resolveTarget(conversationId);
|
|
319
|
+
if (!target) {
|
|
320
|
+
log.warn(
|
|
321
|
+
{ conversationId, source },
|
|
322
|
+
"agent-wake: conversation not found; skipping",
|
|
323
|
+
);
|
|
324
|
+
return { invoked: false, producedToolCalls: false, reason: "not_found" };
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
const idle = await waitUntilIdle(target, nowFn);
|
|
328
|
+
if (!idle) {
|
|
329
|
+
log.warn(
|
|
330
|
+
{ conversationId, source },
|
|
331
|
+
"agent-wake: conversation still processing after timeout; skipping",
|
|
332
|
+
);
|
|
333
|
+
return { invoked: false, producedToolCalls: false, reason: "timeout" };
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const baseline = target.getMessages();
|
|
337
|
+
const hintContent = `[opportunity:${source}] ${hint}`;
|
|
338
|
+
const hintMessage: Message = {
|
|
339
|
+
role: "user",
|
|
340
|
+
content: [{ type: "text", text: hintContent }],
|
|
341
|
+
};
|
|
342
|
+
const runInput: Message[] = [...baseline, hintMessage];
|
|
343
|
+
|
|
344
|
+
// Buffer events during the run. If the agent produces no visible
|
|
345
|
+
// output and no tool calls, we drop everything silently. If it does,
|
|
346
|
+
// we flush the buffered events via the target's translation-aware
|
|
347
|
+
// emitter so clients receive correctly-shaped wire frames (e.g.
|
|
348
|
+
// `assistant_text_delta` with `conversationId`, not the raw
|
|
349
|
+
// `text_delta` variant of `AgentEvent`).
|
|
350
|
+
const buffered: AgentEvent[] = [];
|
|
351
|
+
const onEvent = (event: AgentEvent): void => {
|
|
352
|
+
buffered.push(event);
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
// Mark processing for the duration of the run so a concurrent user
|
|
356
|
+
// send is queued by `enqueueMessage()` rather than spawning a second
|
|
357
|
+
// concurrent agent loop on the same conversation (which would
|
|
358
|
+
// interleave writes to `conversation.messages`).
|
|
359
|
+
target.markProcessing(true);
|
|
360
|
+
|
|
361
|
+
let runError: Error | null = null;
|
|
362
|
+
let producedToolCalls = false;
|
|
363
|
+
let toolUseNames: string[] = [];
|
|
364
|
+
let tailMessageCount = 0;
|
|
365
|
+
let drainedInTry = false;
|
|
366
|
+
try {
|
|
367
|
+
let updatedHistory: Message[];
|
|
368
|
+
try {
|
|
369
|
+
updatedHistory = await target.agentLoop.run(
|
|
370
|
+
runInput,
|
|
371
|
+
onEvent,
|
|
372
|
+
undefined, // no external abort signal
|
|
373
|
+
`wake:${source}`,
|
|
374
|
+
);
|
|
375
|
+
} catch (err) {
|
|
376
|
+
// Capture the error for post-finally logging, then short-circuit
|
|
377
|
+
// the rest of the try body — no tail to push/persist when the
|
|
378
|
+
// run threw mid-flight. The outer finally still runs to release
|
|
379
|
+
// `processing` and drain the queue.
|
|
380
|
+
runError = err instanceof Error ? err : new Error(String(err));
|
|
381
|
+
return { invoked: true, producedToolCalls: false };
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Run completed cleanly. Inspect the tail and, if there was real
|
|
385
|
+
// output, push to in-memory history + persist + flush buffered
|
|
386
|
+
// events BEFORE the finally hands control to drainQueue. The
|
|
387
|
+
// canonical user-turn pattern (conversation-agent-loop.ts:1860,
|
|
388
|
+
// 2106-2126) updates `ctx.messages` first, then resets
|
|
389
|
+
// `ctx.processing = false`, then calls `ctx.drainQueue(...)`. We
|
|
390
|
+
// mirror that order here so a message queued during the wake is
|
|
391
|
+
// dequeued against an already-updated history — otherwise
|
|
392
|
+
// `drainSingleMessage` reads `ctx.messages` mid-tail and writes a
|
|
393
|
+
// DB row that lands out of chronological order (queued user msg
|
|
394
|
+
// before the wake's just-produced assistant outputs).
|
|
395
|
+
const {
|
|
396
|
+
tailMessages,
|
|
397
|
+
hasVisibleText,
|
|
398
|
+
toolUseNames: names,
|
|
399
|
+
} = inspectWakeOutput(baseline.length, updatedHistory);
|
|
400
|
+
toolUseNames = names;
|
|
401
|
+
producedToolCalls = names.length > 0;
|
|
402
|
+
const producedOutput = producedToolCalls || hasVisibleText;
|
|
403
|
+
|
|
404
|
+
if (!producedOutput || tailMessages.length === 0) {
|
|
405
|
+
// Silent no-op: drop buffered events, push nothing, persist
|
|
406
|
+
// nothing, emit nothing. The finally still runs drainQueue so a
|
|
407
|
+
// racy queued message isn't stranded.
|
|
408
|
+
return { invoked: true, producedToolCalls: false };
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
tailMessageCount = tailMessages.length;
|
|
412
|
+
|
|
413
|
+
// Output produced: flush buffered client events through the
|
|
414
|
+
// target's translator. The internal hint is NOT emitted.
|
|
415
|
+
for (const event of buffered) {
|
|
416
|
+
try {
|
|
417
|
+
target.emitAgentEvent(event);
|
|
418
|
+
} catch (err) {
|
|
419
|
+
log.warn(
|
|
420
|
+
{ conversationId, source, err },
|
|
421
|
+
"agent-wake: client emitter threw; continuing",
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// Append every tail message to live in-memory history. Without
|
|
427
|
+
// this, the next turn would rebuild from DB and lose the live
|
|
428
|
+
// references. Done BEFORE persist so a synchronous reader of
|
|
429
|
+
// `getMessages()` sees the full conversation immediately.
|
|
430
|
+
for (const msg of tailMessages) {
|
|
431
|
+
target.pushMessage(msg);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Persist every tail message (assistant outputs + tool_result
|
|
435
|
+
// user messages from the loop's own tool execution). If we only
|
|
436
|
+
// persisted the first assistant message, a rehydration from DB
|
|
437
|
+
// would have a `tool_use` with no matching `tool_result`, which
|
|
438
|
+
// the provider would reject on the next turn. Persistence is
|
|
439
|
+
// delegated to the target so the daemon adapter can build
|
|
440
|
+
// channel/interface metadata (`provenanceFromTrustContext` + turn
|
|
441
|
+
// channel/interface contexts) and sync to the disk view, matching
|
|
442
|
+
// the canonical user-turn path.
|
|
443
|
+
for (const msg of tailMessages) {
|
|
444
|
+
try {
|
|
445
|
+
await target.persistTailMessage(msg);
|
|
446
|
+
} catch (err) {
|
|
447
|
+
log.warn(
|
|
448
|
+
{ conversationId, source, err, role: msg.role },
|
|
449
|
+
"agent-wake: failed to persist wake-tail message",
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Drain queued messages AFTER tail is pushed + persisted so the
|
|
455
|
+
// next dequeued user message sees the complete, up-to-date
|
|
456
|
+
// history. markProcessing(false) must come first (the queue only
|
|
457
|
+
// accepts entries while processing === true, and drain expects
|
|
458
|
+
// processing to already be false). The finally block handles the
|
|
459
|
+
// error/early-return paths where no tail was produced.
|
|
460
|
+
try {
|
|
461
|
+
target.markProcessing(false);
|
|
462
|
+
} catch (err) {
|
|
463
|
+
log.warn(
|
|
464
|
+
{ conversationId, source, err },
|
|
465
|
+
"agent-wake: markProcessing(false) threw; continuing",
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
if (target.drainQueue) {
|
|
469
|
+
try {
|
|
470
|
+
await target.drainQueue();
|
|
471
|
+
} catch (err) {
|
|
472
|
+
log.warn(
|
|
473
|
+
{ conversationId, source, err },
|
|
474
|
+
"agent-wake: drainQueue threw; continuing",
|
|
475
|
+
);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
drainedInTry = true;
|
|
479
|
+
|
|
480
|
+
return { invoked: true, producedToolCalls };
|
|
481
|
+
} finally {
|
|
482
|
+
// The success path (above) already called markProcessing(false)
|
|
483
|
+
// + drainQueue after tail persist. This catch-all handles the
|
|
484
|
+
// error and early-return paths where no tail was produced — those
|
|
485
|
+
// exit the try body before reaching the drain block, so
|
|
486
|
+
// `drainedInTry` is still false.
|
|
487
|
+
if (!drainedInTry) {
|
|
488
|
+
try {
|
|
489
|
+
target.markProcessing(false);
|
|
490
|
+
} catch (err) {
|
|
491
|
+
log.warn(
|
|
492
|
+
{ conversationId, source, err },
|
|
493
|
+
"agent-wake: markProcessing(false) threw; continuing",
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
if (target.drainQueue) {
|
|
497
|
+
try {
|
|
498
|
+
await target.drainQueue();
|
|
499
|
+
} catch (err) {
|
|
500
|
+
log.warn(
|
|
501
|
+
{ conversationId, source, err },
|
|
502
|
+
"agent-wake: drainQueue threw; continuing",
|
|
503
|
+
);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
const durationMs = nowFn() - startedAt;
|
|
509
|
+
if (runError) {
|
|
510
|
+
log.error(
|
|
511
|
+
{ conversationId, source, durationMs, err: runError },
|
|
512
|
+
"agent-wake: agent loop threw; treating as no-op",
|
|
513
|
+
);
|
|
514
|
+
} else if (tailMessageCount === 0) {
|
|
515
|
+
log.info(
|
|
516
|
+
{
|
|
517
|
+
source,
|
|
518
|
+
conversationId,
|
|
519
|
+
durationMs,
|
|
520
|
+
producedToolCalls: false,
|
|
521
|
+
toolNamesCalled: [],
|
|
522
|
+
},
|
|
523
|
+
"agent-wake: no output; silent no-op",
|
|
524
|
+
);
|
|
525
|
+
} else {
|
|
526
|
+
log.info(
|
|
527
|
+
{
|
|
528
|
+
source,
|
|
529
|
+
conversationId,
|
|
530
|
+
durationMs,
|
|
531
|
+
producedToolCalls,
|
|
532
|
+
toolNamesCalled: toolUseNames,
|
|
533
|
+
tailMessageCount,
|
|
534
|
+
},
|
|
535
|
+
"agent-wake: produced output",
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// ── Test-only helpers ────────────────────────────────────────────────
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Reset the internal single-flight map. Exported for tests that want a
|
|
546
|
+
* clean slate between cases. Not part of the public API — do not call
|
|
547
|
+
* from production code.
|
|
548
|
+
*
|
|
549
|
+
* @internal
|
|
550
|
+
*/
|
|
551
|
+
export function __resetWakeChainForTests(): void {
|
|
552
|
+
wakeChain.clear();
|
|
553
|
+
}
|
|
@@ -182,4 +182,44 @@ describe("enforcePolicy", () => {
|
|
|
182
182
|
expect(policy).toBeDefined();
|
|
183
183
|
expect(policy!.requiredScopes).toContain("chat.read");
|
|
184
184
|
});
|
|
185
|
+
|
|
186
|
+
// -- STT transcribe policy ------------------------------------------------
|
|
187
|
+
|
|
188
|
+
test("stt/transcribe is registered as a protected endpoint", () => {
|
|
189
|
+
authDisabled = false;
|
|
190
|
+
const policy = getPolicy("stt/transcribe");
|
|
191
|
+
expect(policy).toBeDefined();
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test("stt/transcribe requires chat.write scope", () => {
|
|
195
|
+
authDisabled = false;
|
|
196
|
+
const policy = getPolicy("stt/transcribe");
|
|
197
|
+
expect(policy).toBeDefined();
|
|
198
|
+
expect(policy!.requiredScopes).toContain("chat.write");
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test("stt/transcribe allows actor, svc_gateway, svc_daemon, and local principals", () => {
|
|
202
|
+
authDisabled = false;
|
|
203
|
+
const policy = getPolicy("stt/transcribe");
|
|
204
|
+
expect(policy).toBeDefined();
|
|
205
|
+
expect(policy!.allowedPrincipalTypes).toContain("actor");
|
|
206
|
+
expect(policy!.allowedPrincipalTypes).toContain("svc_gateway");
|
|
207
|
+
expect(policy!.allowedPrincipalTypes).toContain("svc_daemon");
|
|
208
|
+
expect(policy!.allowedPrincipalTypes).toContain("local");
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test("stt/transcribe denies actor without chat.write scope", () => {
|
|
212
|
+
authDisabled = false;
|
|
213
|
+
const ctx = buildTestContext({ scopes: ["chat.read"] });
|
|
214
|
+
const result = enforcePolicy("stt/transcribe", ctx);
|
|
215
|
+
expect(result).not.toBeNull();
|
|
216
|
+
expect(result!.status).toBe(403);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
test("stt/transcribe allows actor with chat.write scope", () => {
|
|
220
|
+
authDisabled = false;
|
|
221
|
+
const ctx = buildTestContext({ scopes: ["chat.write"] });
|
|
222
|
+
const result = enforcePolicy("stt/transcribe", ctx);
|
|
223
|
+
expect(result).toBeNull();
|
|
224
|
+
});
|
|
185
225
|
});
|
|
@@ -181,6 +181,10 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
181
181
|
// Settings / integrations / identity
|
|
182
182
|
{ endpoint: "identity", scopes: ["settings.read"] },
|
|
183
183
|
{ endpoint: "identity/intro", scopes: ["settings.read"] },
|
|
184
|
+
{ endpoint: "home/state", scopes: ["settings.read"] },
|
|
185
|
+
{ endpoint: "home/feed", scopes: ["settings.read"] },
|
|
186
|
+
{ endpoint: "home/feed:PATCH", scopes: ["settings.write"] },
|
|
187
|
+
{ endpoint: "home/feed/actions", scopes: ["settings.write"] },
|
|
184
188
|
{ endpoint: "brain-graph", scopes: ["settings.read"] },
|
|
185
189
|
{ endpoint: "brain-graph-ui", scopes: ["settings.read"] },
|
|
186
190
|
{ endpoint: "contacts", scopes: ["settings.read"] },
|
|
@@ -210,6 +214,10 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
210
214
|
endpoint: "integrations/slack/channel/config:DELETE",
|
|
211
215
|
scopes: ["settings.write"],
|
|
212
216
|
},
|
|
217
|
+
{
|
|
218
|
+
endpoint: "integrations/slack/channel/oauth-install:POST",
|
|
219
|
+
scopes: ["settings.write"],
|
|
220
|
+
},
|
|
213
221
|
{ endpoint: "channel-verification-sessions", scopes: ["settings.write"] },
|
|
214
222
|
{
|
|
215
223
|
endpoint: "channel-verification-sessions:DELETE",
|
|
@@ -380,6 +388,7 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
380
388
|
{ endpoint: "messages/llm-context", scopes: ["chat.read"] },
|
|
381
389
|
{ endpoint: "llm-request-logs/payload", scopes: ["chat.read"] },
|
|
382
390
|
{ endpoint: "messages/tts", scopes: ["chat.read"] },
|
|
391
|
+
{ endpoint: "tts/synthesize", scopes: ["chat.read"] },
|
|
383
392
|
|
|
384
393
|
// Queued message deletion
|
|
385
394
|
{ endpoint: "messages/queued", scopes: ["chat.write"] },
|
|
@@ -432,11 +441,17 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
432
441
|
{ endpoint: "channels/delivery-ack", scopes: ["internal.write"] },
|
|
433
442
|
|
|
434
443
|
// Migrations
|
|
435
|
-
{ endpoint: "migrations/validate", scopes: ["settings.
|
|
444
|
+
{ endpoint: "migrations/validate", scopes: ["settings.read"] },
|
|
436
445
|
{ endpoint: "migrations/export", scopes: ["settings.write"] },
|
|
437
446
|
{ endpoint: "migrations/import-preflight", scopes: ["settings.write"] },
|
|
438
447
|
{ endpoint: "migrations/import", scopes: ["settings.write"] },
|
|
439
448
|
|
|
449
|
+
// Backups
|
|
450
|
+
{ endpoint: "backups", scopes: ["settings.read"] },
|
|
451
|
+
{ endpoint: "backups/create", scopes: ["settings.write"] },
|
|
452
|
+
{ endpoint: "backups/restore", scopes: ["settings.write"] },
|
|
453
|
+
{ endpoint: "backups/verify", scopes: ["settings.read"] },
|
|
454
|
+
|
|
440
455
|
// Settings (voice, avatar, client settings)
|
|
441
456
|
{ endpoint: "settings/voice", scopes: ["settings.write"] },
|
|
442
457
|
{ endpoint: "settings/avatar/generate", scopes: ["settings.write"] },
|
|
@@ -451,6 +466,21 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
451
466
|
{ endpoint: "schedules/run", scopes: ["settings.write"] },
|
|
452
467
|
{ endpoint: "schedules/cancel", scopes: ["settings.write"] },
|
|
453
468
|
|
|
469
|
+
// Filing
|
|
470
|
+
{ endpoint: "filing", scopes: ["settings.read"] },
|
|
471
|
+
{ endpoint: "filing:POST", scopes: ["settings.write"] },
|
|
472
|
+
|
|
473
|
+
// Heartbeat (config, runs, checklist — all share the "heartbeat" policyKey)
|
|
474
|
+
{ endpoint: "heartbeat:GET", scopes: ["settings.read"] },
|
|
475
|
+
{ endpoint: "heartbeat", scopes: ["settings.write"] },
|
|
476
|
+
|
|
477
|
+
// Notification delivery ack from clients
|
|
478
|
+
{ endpoint: "notification-intent-result", scopes: ["settings.write"] },
|
|
479
|
+
|
|
480
|
+
// Platform config (base URL)
|
|
481
|
+
{ endpoint: "config/platform:GET", scopes: ["settings.read"] },
|
|
482
|
+
{ endpoint: "config/platform", scopes: ["settings.write"] },
|
|
483
|
+
|
|
454
484
|
// Diagnostics
|
|
455
485
|
{ endpoint: "export", scopes: ["settings.read"] },
|
|
456
486
|
{ endpoint: "diagnostics/env-vars", scopes: ["settings.read"] },
|
|
@@ -458,6 +488,9 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
458
488
|
// Dictation
|
|
459
489
|
{ endpoint: "dictation", scopes: ["chat.write"] },
|
|
460
490
|
|
|
491
|
+
// Speech-to-text
|
|
492
|
+
{ endpoint: "stt/transcribe", scopes: ["chat.write"] },
|
|
493
|
+
|
|
461
494
|
// OAuth / integrations
|
|
462
495
|
{ endpoint: "oauth/start", scopes: ["settings.write"] },
|
|
463
496
|
{ endpoint: "integrations/oauth/start", scopes: ["settings.write"] }, // legacy alias
|
|
@@ -480,10 +513,6 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
480
513
|
// Tools
|
|
481
514
|
{ endpoint: "tools", scopes: ["settings.read"] },
|
|
482
515
|
{ endpoint: "tools/simulate-permission", scopes: ["settings.read"] },
|
|
483
|
-
|
|
484
|
-
// Browser CDP shim — backs the `assistant browser chrome relay` CLI used
|
|
485
|
-
// by the in-tree Amazon and Influencer skills.
|
|
486
|
-
{ endpoint: "browser-cdp", scopes: ["settings.write"] },
|
|
487
516
|
];
|
|
488
517
|
|
|
489
518
|
for (const { endpoint, scopes } of ACTOR_ENDPOINTS) {
|