@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
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
import { homedir } from "node:os";
|
|
23
23
|
import { dirname, join } from "node:path";
|
|
24
24
|
|
|
25
|
+
import { getIsContainerized } from "../../config/env-registry.js";
|
|
25
26
|
import { getLogger } from "../../util/logger.js";
|
|
26
27
|
import { getDeprecatedDir } from "../../util/platform.js";
|
|
27
28
|
import { CURRENT_POLICY_EPOCH, isStaleEpoch } from "./policy.js";
|
|
@@ -115,6 +116,58 @@ export function loadOrCreateSigningKey(): Buffer {
|
|
|
115
116
|
return newKey;
|
|
116
117
|
}
|
|
117
118
|
|
|
119
|
+
/**
|
|
120
|
+
* Best-effort sync of the env-resolved signing key to the canonical disk
|
|
121
|
+
* path so out-of-process CLI commands (e.g. browser relay) that load from
|
|
122
|
+
* disk converge on the same key the daemon uses.
|
|
123
|
+
*
|
|
124
|
+
* Security note: this does NOT expand the signing key's exposure surface.
|
|
125
|
+
* `loadOrCreateSigningKey()` already writes a signing key to the exact same
|
|
126
|
+
* disk path (getSigningKeyPath()) with the same mode (0600). A signing key
|
|
127
|
+
* is always on disk for CLI subprocesses to read — this function just
|
|
128
|
+
* ensures the disk key matches the env-provided key so those subprocesses
|
|
129
|
+
* mint tokens the daemon will actually accept.
|
|
130
|
+
*
|
|
131
|
+
* Skipped in containerized mode where disk key files are not used.
|
|
132
|
+
* Uses atomic write (tmp + rename) with mode 0600 for safe persistence.
|
|
133
|
+
* Never throws -- logs a warning on write failure and continues with
|
|
134
|
+
* the in-memory key.
|
|
135
|
+
*/
|
|
136
|
+
function syncEnvSigningKeyToDiskIfNeeded(key: Buffer): void {
|
|
137
|
+
if (getIsContainerized()) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const keyPath = getSigningKeyPath();
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
// If the file already exists and is byte-equal, no-op.
|
|
145
|
+
if (existsSync(keyPath)) {
|
|
146
|
+
const existing = readFileSync(keyPath);
|
|
147
|
+
if (existing.length === key.length && timingSafeEqual(existing, key)) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Write atomically: tmp file + rename.
|
|
153
|
+
const dir = dirname(keyPath);
|
|
154
|
+
if (!existsSync(dir)) {
|
|
155
|
+
mkdirSync(dir, { recursive: true });
|
|
156
|
+
}
|
|
157
|
+
const tmpPath = keyPath + ".tmp." + process.pid;
|
|
158
|
+
writeFileSync(tmpPath, key, { mode: 0o600 });
|
|
159
|
+
renameSync(tmpPath, keyPath);
|
|
160
|
+
chmodSync(keyPath, 0o600);
|
|
161
|
+
|
|
162
|
+
log.info("Synced env signing key to disk for CLI convergence");
|
|
163
|
+
} catch (err) {
|
|
164
|
+
log.warn(
|
|
165
|
+
{ err },
|
|
166
|
+
"Failed to sync env signing key to disk — continuing with in-memory key",
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
118
171
|
/**
|
|
119
172
|
* Resolve the signing key for the daemon from the `ACTOR_TOKEN_SIGNING_KEY`
|
|
120
173
|
* env var (hex-encoded, 64 chars). The CLI launcher sets this before
|
|
@@ -128,8 +181,10 @@ export function resolveSigningKey(): Buffer {
|
|
|
128
181
|
`Invalid ACTOR_TOKEN_SIGNING_KEY: expected 64 hex characters, got ${envKey.length} chars`,
|
|
129
182
|
);
|
|
130
183
|
}
|
|
184
|
+
const key = Buffer.from(envKey, "hex");
|
|
185
|
+
syncEnvSigningKeyToDiskIfNeeded(key);
|
|
131
186
|
log.info("Signing key loaded from ACTOR_TOKEN_SIGNING_KEY env var");
|
|
132
|
-
return
|
|
187
|
+
return key;
|
|
133
188
|
}
|
|
134
189
|
|
|
135
190
|
// Fallback: env var not set (e.g. daemon spawned by cli/src/lib/local.ts
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
1
2
|
import { buildToolDefinitions } from "../daemon/conversation-tool-setup.js";
|
|
2
3
|
import { buildSystemPrompt } from "../prompts/system-prompt.js";
|
|
3
4
|
import {
|
|
@@ -7,7 +8,6 @@ import {
|
|
|
7
8
|
} from "../providers/provider-send-message.js";
|
|
8
9
|
import type {
|
|
9
10
|
Message,
|
|
10
|
-
ModelIntent,
|
|
11
11
|
Provider,
|
|
12
12
|
ProviderEvent,
|
|
13
13
|
ProviderResponse,
|
|
@@ -29,12 +29,21 @@ export interface RunBtwSidechainParams {
|
|
|
29
29
|
systemPrompt?: string;
|
|
30
30
|
tools?: ToolDefinition[];
|
|
31
31
|
maxTokens?: number;
|
|
32
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Unified call-site identifier. The provider layer resolves
|
|
34
|
+
* provider/model/maxTokens/effort/speed/temperature/thinking/contextWindow
|
|
35
|
+
* via `resolveCallSiteConfig(callSite, config.llm)`. Defaults to
|
|
36
|
+
* `'identityIntro'` since this side-chain runner was originally introduced
|
|
37
|
+
* for the identity intro generation path; callers (greeting, title, etc.)
|
|
38
|
+
* override it with their own call-site ID.
|
|
39
|
+
*/
|
|
40
|
+
callSite?: LLMCallSite;
|
|
33
41
|
signal?: AbortSignal;
|
|
34
42
|
timeoutMs?: number;
|
|
35
43
|
onEvent?: (event: ProviderEvent) => void;
|
|
36
44
|
userPersona?: string | null;
|
|
37
45
|
channelPersona?: string | null;
|
|
46
|
+
userSlug?: string | null;
|
|
38
47
|
}
|
|
39
48
|
|
|
40
49
|
export interface RunBtwSidechainResult {
|
|
@@ -70,6 +79,7 @@ export async function runBtwSidechain(
|
|
|
70
79
|
excludeBootstrap: true,
|
|
71
80
|
userPersona: params.userPersona,
|
|
72
81
|
channelPersona: params.channelPersona,
|
|
82
|
+
userSlug: params.userSlug,
|
|
73
83
|
}));
|
|
74
84
|
|
|
75
85
|
const { signal: timeoutSignal, cleanup } = createTimeout(
|
|
@@ -87,7 +97,9 @@ export async function runBtwSidechain(
|
|
|
87
97
|
config: {
|
|
88
98
|
max_tokens: params.maxTokens ?? 1024,
|
|
89
99
|
tool_choice: { type: "none" },
|
|
90
|
-
|
|
100
|
+
// Default call site is "identityIntro" — the original purpose of
|
|
101
|
+
// this side-chain runner. Callers may override per invocation.
|
|
102
|
+
callSite: params.callSite ?? ("identityIntro" as LLMCallSite),
|
|
91
103
|
},
|
|
92
104
|
onEvent: (event) => {
|
|
93
105
|
if (event.type === "text_delta") {
|
|
@@ -27,7 +27,6 @@ import {
|
|
|
27
27
|
unlinkSync,
|
|
28
28
|
writeFileSync,
|
|
29
29
|
} from "node:fs";
|
|
30
|
-
import { homedir } from "node:os";
|
|
31
30
|
import { dirname, join } from "node:path";
|
|
32
31
|
|
|
33
32
|
import { getLogger } from "../util/logger.js";
|
|
@@ -375,18 +374,19 @@ export function verifyHostBrowserCapability(
|
|
|
375
374
|
* (PRs 7/12/13).
|
|
376
375
|
*/
|
|
377
376
|
export function getDaemonTokenFilePath(): string {
|
|
378
|
-
//
|
|
379
|
-
//
|
|
380
|
-
//
|
|
381
|
-
//
|
|
382
|
-
|
|
377
|
+
// Stored under the per-instance protected directory. Both writer and
|
|
378
|
+
// reader run in the same daemon process, so they resolve the same
|
|
379
|
+
// per-instance path (honoring BASE_DATA_DIR for multi-instance setups).
|
|
380
|
+
// This is a dev-only convenience path — production pairing goes through
|
|
381
|
+
// the native messaging flow.
|
|
382
|
+
return join(getProtectedDir(), "daemon-token");
|
|
383
383
|
}
|
|
384
384
|
|
|
385
385
|
/**
|
|
386
|
-
* Write a freshly-minted capability token to
|
|
387
|
-
* 0600 permissions. Swallows
|
|
388
|
-
*
|
|
389
|
-
* requirement.
|
|
386
|
+
* Write a freshly-minted capability token to the per-instance dev token
|
|
387
|
+
* file (see `getDaemonTokenFilePath`) with 0600 permissions. Swallows
|
|
388
|
+
* errors so a failure here never blocks daemon startup — this is a
|
|
389
|
+
* dev-convenience path, not a production auth requirement.
|
|
390
390
|
*/
|
|
391
391
|
export function writeDaemonTokenFallback(guardianId: string): void {
|
|
392
392
|
try {
|
|
@@ -58,7 +58,7 @@ export interface ChannelInviteAdapter {
|
|
|
58
58
|
|
|
59
59
|
/**
|
|
60
60
|
* Resolve the channel-specific handle to reach the assistant (e.g.
|
|
61
|
-
* "@botName", "+15551234567", "hello@
|
|
61
|
+
* "@botName", "+15551234567", "hello@vellum.me").
|
|
62
62
|
* Returns `undefined` when the handle cannot be resolved (e.g.
|
|
63
63
|
* credentials not yet configured).
|
|
64
64
|
*/
|
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
* Email channel invite adapter.
|
|
3
3
|
*
|
|
4
4
|
* Resolves the assistant's email address for use in invite instructions.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* generic "on Email" wording instead of a misleading stub address.
|
|
5
|
+
* Reads the address from workspace config (`email.address`). Returns
|
|
6
|
+
* `undefined` when no address is configured, which causes the invite
|
|
7
|
+
* instruction generator to emit generic "on Email" wording.
|
|
9
8
|
*
|
|
10
9
|
* Email invites use the universal 6-digit code path for redemption, so
|
|
11
10
|
* this adapter only implements `resolveChannelHandleAsync` — no
|
|
12
11
|
* `buildShareLink` or `extractInboundToken` needed.
|
|
13
12
|
*/
|
|
14
13
|
|
|
15
|
-
import {
|
|
14
|
+
import { getNestedValue, loadRawConfig } from "../../config/loader.js";
|
|
16
15
|
import type { ChannelInviteAdapter } from "../channel-invite-transport.js";
|
|
17
16
|
|
|
18
17
|
// ---------------------------------------------------------------------------
|
|
@@ -23,6 +22,15 @@ export const emailInviteAdapter: ChannelInviteAdapter = {
|
|
|
23
22
|
channel: "email",
|
|
24
23
|
|
|
25
24
|
async resolveChannelHandleAsync(): Promise<string | undefined> {
|
|
26
|
-
|
|
25
|
+
try {
|
|
26
|
+
const raw = loadRawConfig();
|
|
27
|
+
const address = getNestedValue(raw, "email.address");
|
|
28
|
+
if (typeof address === "string" && address.length > 0) {
|
|
29
|
+
return address;
|
|
30
|
+
}
|
|
31
|
+
} catch {
|
|
32
|
+
// Config unavailable
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
27
35
|
},
|
|
28
36
|
};
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { resolveTwilioPhoneNumber } from "../calls/twilio-config.js";
|
|
2
2
|
import { hasTwilioCredentials } from "../calls/twilio-rest.js";
|
|
3
3
|
import { getChannelInvitePolicy } from "../channels/config.js";
|
|
4
|
-
import { getConfig, loadRawConfig } from "../config/loader.js";
|
|
4
|
+
import { getConfig, getNestedValue, loadRawConfig } from "../config/loader.js";
|
|
5
5
|
import { isEmailEnabled } from "../email/feature-gate.js";
|
|
6
|
-
import { getEmailService } from "../email/service.js";
|
|
7
6
|
import { shouldUsePlatformCallbacks } from "../inbound/platform-callback-registration.js";
|
|
8
7
|
import { credentialKey } from "../security/credential-key.js";
|
|
9
8
|
import { getSecureKeyAsync } from "../security/secure-keys.js";
|
|
@@ -81,8 +80,9 @@ async function checkCredential(
|
|
|
81
80
|
|
|
82
81
|
/** Check that public ingress is configured and enabled. */
|
|
83
82
|
function checkIngress(allowManagedCallbacks = false): ReadinessCheckResult {
|
|
84
|
-
const { configured, usesManagedCallbacks } =
|
|
85
|
-
|
|
83
|
+
const { configured, usesManagedCallbacks } = hasWebhookRoutingConfigured(
|
|
84
|
+
allowManagedCallbacks,
|
|
85
|
+
);
|
|
86
86
|
return check(
|
|
87
87
|
"ingress",
|
|
88
88
|
configured,
|
|
@@ -150,17 +150,13 @@ const telegramProbe: ChannelProbe = {
|
|
|
150
150
|
const emailProbe: ChannelProbe = {
|
|
151
151
|
channel: "email",
|
|
152
152
|
async runLocalChecks(): Promise<ReadinessCheckResult[]> {
|
|
153
|
-
const hasApiKey = !!(
|
|
154
|
-
(await getSecureKeyAsync("agentmail")) ||
|
|
155
|
-
(await getSecureKeyAsync(credentialKey("agentmail", "api_key")))
|
|
156
|
-
);
|
|
157
153
|
const invitePolicy = getChannelInvitePolicy("email");
|
|
158
154
|
return [
|
|
159
155
|
check(
|
|
160
|
-
"
|
|
161
|
-
|
|
162
|
-
"
|
|
163
|
-
"
|
|
156
|
+
"platform_email",
|
|
157
|
+
true,
|
|
158
|
+
"Email is handled through the platform (Mailgun)",
|
|
159
|
+
"Email requires platform registration",
|
|
164
160
|
),
|
|
165
161
|
check(
|
|
166
162
|
"invite_policy",
|
|
@@ -172,23 +168,17 @@ const emailProbe: ChannelProbe = {
|
|
|
172
168
|
];
|
|
173
169
|
},
|
|
174
170
|
async runRemoteChecks(): Promise<ReadinessCheckResult[]> {
|
|
175
|
-
// Only worth checking if the API key is present
|
|
176
|
-
const hasApiKey = !!(
|
|
177
|
-
(await getSecureKeyAsync("agentmail")) ||
|
|
178
|
-
(await getSecureKeyAsync(credentialKey("agentmail", "api_key")))
|
|
179
|
-
);
|
|
180
|
-
if (!hasApiKey) return [];
|
|
181
|
-
|
|
182
171
|
try {
|
|
183
|
-
const
|
|
184
|
-
const
|
|
172
|
+
const raw = loadRawConfig();
|
|
173
|
+
const address = getNestedValue(raw, "email.address");
|
|
174
|
+
const hasInbox = typeof address === "string" && address.length > 0;
|
|
185
175
|
return [
|
|
186
176
|
{
|
|
187
177
|
name: "inbox_configured",
|
|
188
178
|
passed: hasInbox,
|
|
189
179
|
message: hasInbox
|
|
190
180
|
? `Inbox address is configured (${address})`
|
|
191
|
-
: "No inbox address configured —
|
|
181
|
+
: "No inbox address configured — register one with: assistant email register <username>",
|
|
192
182
|
},
|
|
193
183
|
];
|
|
194
184
|
} catch (err) {
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { renderHistoryContent } from "../daemon/handlers/shared.js";
|
|
2
2
|
import * as attachmentsStore from "../memory/attachments-store.js";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
getMessageById,
|
|
5
|
+
getMessages,
|
|
6
|
+
updateMessageMetadata,
|
|
7
|
+
} from "../memory/conversation-crud.js";
|
|
8
|
+
import { readSlackMetadata } from "../messaging/providers/slack/message-metadata.js";
|
|
9
|
+
import { getLogger } from "../util/logger.js";
|
|
4
10
|
import type { ChannelDeliveryResult } from "./gateway-client.js";
|
|
5
11
|
import { deliverChannelReply } from "./gateway-client.js";
|
|
6
12
|
import type { RuntimeAttachmentMetadata } from "./http-types.js";
|
|
@@ -9,6 +15,8 @@ import {
|
|
|
9
15
|
textToSlackBlocks,
|
|
10
16
|
} from "./slack-block-formatting.js";
|
|
11
17
|
|
|
18
|
+
const log = getLogger("channel-reply-delivery");
|
|
19
|
+
|
|
12
20
|
const INTER_SEGMENT_DELAY_MS = 150;
|
|
13
21
|
|
|
14
22
|
type DeliverRenderedReplyParams = {
|
|
@@ -206,6 +214,22 @@ export async function deliverReplyViaCallback(
|
|
|
206
214
|
kind: a.kind,
|
|
207
215
|
}));
|
|
208
216
|
|
|
217
|
+
// Compose an `onMessageTs` that reconciles `slackMeta.channelTs` on the
|
|
218
|
+
// persisted assistant row once Slack returns the authoritative ts. The
|
|
219
|
+
// assistant row was written BEFORE the gateway POST in
|
|
220
|
+
// `handleMessageComplete`, so the partial `slackMeta` it carries is
|
|
221
|
+
// missing `channelTs` and would otherwise be rejected by
|
|
222
|
+
// `readSlackMetadata`, dropping the row out of chronological/thread-tag
|
|
223
|
+
// rendering. We only act on the FIRST ts (top-level segment); any
|
|
224
|
+
// subsequent split segments become independent Slack messages with
|
|
225
|
+
// their own ts and are not represented as separate DB rows.
|
|
226
|
+
const reconcileOnMessageTs = makeChannelTsReconciler(msgs[i].id);
|
|
227
|
+
const callerOnMessageTs = options?.onMessageTs;
|
|
228
|
+
const composedOnMessageTs = (ts: string): void => {
|
|
229
|
+
reconcileOnMessageTs(ts);
|
|
230
|
+
callerOnMessageTs?.(ts);
|
|
231
|
+
};
|
|
232
|
+
|
|
209
233
|
await deliverRenderedReplyViaCallback({
|
|
210
234
|
callbackUrl,
|
|
211
235
|
chatId: externalChatId,
|
|
@@ -219,8 +243,88 @@ export async function deliverReplyViaCallback(
|
|
|
219
243
|
ephemeral: options?.ephemeral,
|
|
220
244
|
user: options?.user,
|
|
221
245
|
messageTs: options?.messageTs,
|
|
222
|
-
onMessageTs:
|
|
246
|
+
onMessageTs: composedOnMessageTs,
|
|
223
247
|
});
|
|
224
248
|
break;
|
|
225
249
|
}
|
|
226
250
|
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Build a one-shot `onMessageTs` handler that reconciles the persisted
|
|
254
|
+
* assistant message's `slackMeta.channelTs` from Slack's authoritative `ts`.
|
|
255
|
+
*
|
|
256
|
+
* Behavior:
|
|
257
|
+
* - Acts only on the first invocation per delivery (subsequent segments
|
|
258
|
+
* correspond to independent Slack messages with their own ts and are not
|
|
259
|
+
* represented as separate DB rows).
|
|
260
|
+
* - No-op when the row was not persisted with a `slackMeta` envelope (the
|
|
261
|
+
* channel was not Slack at write-time, e.g. vellum/telegram outbound).
|
|
262
|
+
* - No-op when the row's existing `slackMeta` already parses cleanly via
|
|
263
|
+
* `readSlackMetadata` (channelTs already present, e.g. from a prior
|
|
264
|
+
* reconciliation).
|
|
265
|
+
* - Failures are logged and swallowed so a transient DB error cannot break
|
|
266
|
+
* the outbound delivery itself.
|
|
267
|
+
*/
|
|
268
|
+
function makeChannelTsReconciler(messageId: string): (ts: string) => void {
|
|
269
|
+
let applied = false;
|
|
270
|
+
return (ts: string): void => {
|
|
271
|
+
if (applied) return;
|
|
272
|
+
applied = true;
|
|
273
|
+
if (!ts) return;
|
|
274
|
+
try {
|
|
275
|
+
// Re-read the row's current metadata so a concurrent edit-propagation
|
|
276
|
+
// write (e.g. `editedAt`) is not clobbered. `updateMessageMetadata`
|
|
277
|
+
// shallow-merges into the top-level envelope, and the slackMeta
|
|
278
|
+
// sub-object is merged manually below so we can preserve fields on
|
|
279
|
+
// the partial pre-send envelope (`mergeSlackMetadata` would call
|
|
280
|
+
// `readSlackMetadata` which rejects the partial form for lacking
|
|
281
|
+
// channelTs — exactly the state we are reconciling).
|
|
282
|
+
const row = getMessageById(messageId);
|
|
283
|
+
if (row === null || row.metadata === null) return;
|
|
284
|
+
let envelope: Record<string, unknown>;
|
|
285
|
+
try {
|
|
286
|
+
envelope = JSON.parse(row.metadata) as Record<string, unknown>;
|
|
287
|
+
} catch {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
const slackMetaRaw =
|
|
291
|
+
typeof envelope.slackMeta === "string" ? envelope.slackMeta : null;
|
|
292
|
+
if (slackMetaRaw === null) return;
|
|
293
|
+
// If the existing slackMeta already parses cleanly via the strict
|
|
294
|
+
// reader, channelTs is already present (a prior reconciliation ran,
|
|
295
|
+
// or backfill stamped the field) — nothing to do.
|
|
296
|
+
if (readSlackMetadata(slackMetaRaw) !== null) return;
|
|
297
|
+
// Lenient parse of the partial slackMeta so we can preserve every
|
|
298
|
+
// field already written by `handleMessageComplete` (source,
|
|
299
|
+
// eventKind, channelId, threadTs, ...) while patching channelTs in.
|
|
300
|
+
let existingSlackMeta: Record<string, unknown>;
|
|
301
|
+
try {
|
|
302
|
+
const parsed = JSON.parse(slackMetaRaw) as unknown;
|
|
303
|
+
if (
|
|
304
|
+
parsed === null ||
|
|
305
|
+
typeof parsed !== "object" ||
|
|
306
|
+
Array.isArray(parsed)
|
|
307
|
+
) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
existingSlackMeta = parsed as Record<string, unknown>;
|
|
311
|
+
} catch {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const mergedSlackMeta = JSON.stringify({
|
|
315
|
+
...existingSlackMeta,
|
|
316
|
+
channelTs: ts,
|
|
317
|
+
// Force `source: "slack"` for parity with `mergeSlackMetadata`'s
|
|
318
|
+
// invariant — the reader rejects anything else and we never want a
|
|
319
|
+
// reconciled row to slip through with a stale source.
|
|
320
|
+
source: "slack",
|
|
321
|
+
});
|
|
322
|
+
updateMessageMetadata(messageId, { slackMeta: mergedSlackMeta });
|
|
323
|
+
} catch (err) {
|
|
324
|
+
log.warn(
|
|
325
|
+
{ err, messageId },
|
|
326
|
+
"Failed to reconcile slackMeta.channelTs on outbound assistant row",
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
}
|
|
@@ -20,8 +20,10 @@
|
|
|
20
20
|
* - When a caller does not pin a specific instance, the registry picks
|
|
21
21
|
* the "most recently active" instance for the guardian (highest
|
|
22
22
|
* `lastActiveAt` timestamp). `lastActiveAt` is bumped on register and
|
|
23
|
-
* on every successful `send()
|
|
24
|
-
*
|
|
23
|
+
* on every successful `send()` — but NOT by keepalive pings. Keepalive
|
|
24
|
+
* frames update a separate `lastKeepaliveAt` field that is used only
|
|
25
|
+
* for liveness checks, preventing idle instances from stealing the
|
|
26
|
+
* routing default via periodic keepalive traffic.
|
|
25
27
|
* - When no `clientInstanceId` is present on the handshake (older
|
|
26
28
|
* extension builds, dev bypass paths), we synthesize a placeholder
|
|
27
29
|
* `legacy:<connectionId>` key. The send/lookup path treats it the
|
|
@@ -65,8 +67,20 @@ export interface ChromeExtensionConnection {
|
|
|
65
67
|
* connection — updated on register and on each successful `send()`.
|
|
66
68
|
* Used by the default-send routing path to pick the "most recently
|
|
67
69
|
* active" instance when the caller does not pin a specific one.
|
|
70
|
+
*
|
|
71
|
+
* Crucially, this is NOT updated by keepalive pings — those update
|
|
72
|
+
* `lastKeepaliveAt` instead. This separation prevents idle instances
|
|
73
|
+
* from stealing the routing default via periodic keepalive traffic.
|
|
68
74
|
*/
|
|
69
75
|
lastActiveAt: number;
|
|
76
|
+
/**
|
|
77
|
+
* Wall-clock timestamp (ms) of the most recent keepalive ping
|
|
78
|
+
* received on this connection. Updated exclusively by `touch()`
|
|
79
|
+
* (i.e. keepalive frames). Does NOT affect routing — used only for
|
|
80
|
+
* liveness checks (e.g. a future stale-connection sweep can evict
|
|
81
|
+
* connections whose `lastKeepaliveAt` is too far in the past).
|
|
82
|
+
*/
|
|
83
|
+
lastKeepaliveAt?: number;
|
|
70
84
|
/**
|
|
71
85
|
* Monotonic registration sequence number assigned by the registry
|
|
72
86
|
* on each `register()` call. Used as a tuple-secondary tiebreaker
|
|
@@ -198,6 +212,28 @@ export class ChromeExtensionRegistry {
|
|
|
198
212
|
}
|
|
199
213
|
}
|
|
200
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Update the `lastKeepaliveAt` timestamp for the connection identified
|
|
217
|
+
* by `connectionId`, without changing routing semantics or registration
|
|
218
|
+
* state. Used by keepalive frames to signal that the extension is still
|
|
219
|
+
* alive and reachable. Deliberately does NOT update `lastActiveAt` — that
|
|
220
|
+
* field is reserved for actual CDP traffic (register, send) so that idle
|
|
221
|
+
* instances cannot steal the routing default via periodic keepalive pings.
|
|
222
|
+
*
|
|
223
|
+
* No-op if no connection with the given id is currently registered
|
|
224
|
+
* (e.g. after a race between disconnect and a trailing keepalive frame).
|
|
225
|
+
*/
|
|
226
|
+
touch(connectionId: string): void {
|
|
227
|
+
for (const instances of this.byGuardian.values()) {
|
|
228
|
+
for (const conn of instances.values()) {
|
|
229
|
+
if (conn.id === connectionId) {
|
|
230
|
+
conn.lastKeepaliveAt = Date.now();
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
201
237
|
/**
|
|
202
238
|
* Return the default "active" connection for a guardian — the
|
|
203
239
|
* instance with the most recent `lastActiveAt` timestamp. Ties on
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight informational decision token for interactive UI outcomes.
|
|
3
|
+
*
|
|
4
|
+
* Minted when a confirmation-style surface is `submitted`. The token is
|
|
5
|
+
* **non-authoritative** — it carries metadata about the decision for
|
|
6
|
+
* audit and correlation purposes only. It does not grant any capability
|
|
7
|
+
* and must not be used for enforcement or replay protection (that is
|
|
8
|
+
* explicitly out of scope for v1).
|
|
9
|
+
*
|
|
10
|
+
* Format: base64url-encoded JSON payload + `.` + random nonce.
|
|
11
|
+
* The nonce makes tokens unique even for identical payloads; the
|
|
12
|
+
* payload is readable by any consumer without a secret.
|
|
13
|
+
*
|
|
14
|
+
* This module is intentionally decoupled from the existing auth/token
|
|
15
|
+
* infrastructure in `runtime/auth/` — it serves a different purpose
|
|
16
|
+
* and should remain independent.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { randomBytes } from "node:crypto";
|
|
20
|
+
|
|
21
|
+
// ── Token shape ──────────────────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
export interface DecisionTokenPayload {
|
|
24
|
+
/** Conversation the decision belongs to. */
|
|
25
|
+
conversationId: string;
|
|
26
|
+
/** Surface identifier that was displayed. */
|
|
27
|
+
surfaceId: string;
|
|
28
|
+
/** The action ID the user selected (e.g. "confirm"). Only present on affirmative confirmation. */
|
|
29
|
+
action: string;
|
|
30
|
+
/** ISO-8601 timestamp when the decision was recorded. */
|
|
31
|
+
issuedAt: string;
|
|
32
|
+
/** ISO-8601 timestamp after which the token should be considered stale. */
|
|
33
|
+
expiresAt: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Default token lifetime: 5 minutes. */
|
|
37
|
+
const DEFAULT_TTL_MS = 5 * 60 * 1000;
|
|
38
|
+
|
|
39
|
+
// ── Minting ──────────────────────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Mint an informational decision token.
|
|
43
|
+
*
|
|
44
|
+
* The returned string is `<base64url-payload>.<random-nonce>`. It is
|
|
45
|
+
* short-lived (default 5 minutes) and non-authoritative.
|
|
46
|
+
*
|
|
47
|
+
* @param opts - Decision metadata.
|
|
48
|
+
* @param opts.conversationId - Conversation scope.
|
|
49
|
+
* @param opts.surfaceId - Surface that was displayed.
|
|
50
|
+
* @param opts.action - Terminal action taken by the user.
|
|
51
|
+
* @param opts.ttlMs - Token lifetime in milliseconds (default 5 min).
|
|
52
|
+
* @returns The minted token string.
|
|
53
|
+
*/
|
|
54
|
+
export function mintDecisionToken(opts: {
|
|
55
|
+
conversationId: string;
|
|
56
|
+
surfaceId: string;
|
|
57
|
+
action: string;
|
|
58
|
+
ttlMs?: number;
|
|
59
|
+
}): string {
|
|
60
|
+
const now = new Date();
|
|
61
|
+
const ttl = opts.ttlMs ?? DEFAULT_TTL_MS;
|
|
62
|
+
const expiresAt = new Date(now.getTime() + ttl);
|
|
63
|
+
|
|
64
|
+
const payload: DecisionTokenPayload = {
|
|
65
|
+
conversationId: opts.conversationId,
|
|
66
|
+
surfaceId: opts.surfaceId,
|
|
67
|
+
action: opts.action,
|
|
68
|
+
issuedAt: now.toISOString(),
|
|
69
|
+
expiresAt: expiresAt.toISOString(),
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const encoded = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
|
73
|
+
const nonce = randomBytes(12).toString("hex");
|
|
74
|
+
|
|
75
|
+
return `${encoded}.${nonce}`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// ── Decoding (informational only) ────────────────────────────────────
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Decode a decision token's payload.
|
|
82
|
+
*
|
|
83
|
+
* This is a pure decoding step — there is no signature verification
|
|
84
|
+
* because the token is non-authoritative. Consumers should treat the
|
|
85
|
+
* payload as informational metadata, not a trust assertion.
|
|
86
|
+
*
|
|
87
|
+
* @param token - The token string produced by {@link mintDecisionToken}.
|
|
88
|
+
* @returns The decoded payload, or `null` if the token is malformed.
|
|
89
|
+
*/
|
|
90
|
+
export function decodeDecisionToken(
|
|
91
|
+
token: string,
|
|
92
|
+
): DecisionTokenPayload | null {
|
|
93
|
+
const dotIdx = token.indexOf(".");
|
|
94
|
+
if (dotIdx < 0) return null;
|
|
95
|
+
|
|
96
|
+
const encodedPayload = token.slice(0, dotIdx);
|
|
97
|
+
try {
|
|
98
|
+
const json = Buffer.from(encodedPayload, "base64url").toString("utf-8");
|
|
99
|
+
const parsed = JSON.parse(json) as Record<string, unknown>;
|
|
100
|
+
|
|
101
|
+
// Minimal structural validation
|
|
102
|
+
if (
|
|
103
|
+
typeof parsed.conversationId !== "string" ||
|
|
104
|
+
typeof parsed.surfaceId !== "string" ||
|
|
105
|
+
typeof parsed.action !== "string" ||
|
|
106
|
+
typeof parsed.issuedAt !== "string" ||
|
|
107
|
+
typeof parsed.expiresAt !== "string"
|
|
108
|
+
) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return parsed as unknown as DecisionTokenPayload;
|
|
113
|
+
} catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -397,8 +397,8 @@ export async function deliverApprovalPrompt(
|
|
|
397
397
|
approval: ApprovalUIMetadata,
|
|
398
398
|
assistantId?: string,
|
|
399
399
|
bearerToken?: string,
|
|
400
|
-
): Promise<
|
|
401
|
-
|
|
400
|
+
): Promise<ChannelDeliveryResult> {
|
|
401
|
+
return deliverChannelReply(
|
|
402
402
|
callbackUrl,
|
|
403
403
|
{ chatId, text, approval, assistantId },
|
|
404
404
|
bearerToken,
|
|
@@ -48,6 +48,29 @@ export interface RouteQueryParam {
|
|
|
48
48
|
* The generate-openapi script converts these to JSON Schema via z.toJSONSchema(). */
|
|
49
49
|
export type RouteBodySchema = z.ZodType;
|
|
50
50
|
|
|
51
|
+
/**
|
|
52
|
+
* Description for a non-200 response variant. Used when an endpoint has
|
|
53
|
+
* meaningful alternate response shapes that clients should handle (e.g.
|
|
54
|
+
* 502 `fetch_failed` on POST /v1/migrations/import when the URL body path
|
|
55
|
+
* can't reach the upstream bundle host).
|
|
56
|
+
*/
|
|
57
|
+
export interface RouteAdditionalResponse {
|
|
58
|
+
description: string;
|
|
59
|
+
/** Zod schema or plain JSON Schema fragment. */
|
|
60
|
+
schema?: RouteBodySchema | Record<string, unknown>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Request-body variant keyed by Content-Type. Use this when an endpoint
|
|
65
|
+
* accepts multiple body shapes (e.g. `application/octet-stream` OR
|
|
66
|
+
* `application/json`). For the common single-JSON case, use `requestBody`.
|
|
67
|
+
*/
|
|
68
|
+
export interface RouteRequestBodyVariant {
|
|
69
|
+
contentType: string;
|
|
70
|
+
/** Zod schema or plain JSON Schema fragment. Plain objects are embedded verbatim. */
|
|
71
|
+
schema: RouteBodySchema | Record<string, unknown>;
|
|
72
|
+
}
|
|
73
|
+
|
|
51
74
|
/**
|
|
52
75
|
* A single route entry in the declarative table.
|
|
53
76
|
*
|
|
@@ -76,8 +99,17 @@ export interface RouteDefinition {
|
|
|
76
99
|
queryParams?: RouteQueryParam[];
|
|
77
100
|
/** Zod schema for the request body (POST/PUT/PATCH/DELETE). */
|
|
78
101
|
requestBody?: RouteBodySchema;
|
|
102
|
+
/**
|
|
103
|
+
* Alternate request-body variants keyed by Content-Type. When set,
|
|
104
|
+
* overrides `requestBody` in the generated OpenAPI spec — use this for
|
|
105
|
+
* endpoints that accept multiple body shapes on the same URL (e.g.
|
|
106
|
+
* raw bytes OR JSON URL).
|
|
107
|
+
*/
|
|
108
|
+
requestBodies?: RouteRequestBodyVariant[];
|
|
79
109
|
/** Zod schema for the 200 response body. */
|
|
80
110
|
responseBody?: RouteBodySchema;
|
|
111
|
+
/** Additional non-200 responses documented in the generated OpenAPI spec. */
|
|
112
|
+
additionalResponses?: Record<string, RouteAdditionalResponse>;
|
|
81
113
|
}
|
|
82
114
|
|
|
83
115
|
// ---------------------------------------------------------------------------
|