@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
|
@@ -30,6 +30,7 @@ export interface SlackChannelConfigResult {
|
|
|
30
30
|
success: boolean;
|
|
31
31
|
hasBotToken: boolean;
|
|
32
32
|
hasAppToken: boolean;
|
|
33
|
+
hasUserToken: boolean;
|
|
33
34
|
connected: boolean;
|
|
34
35
|
teamId?: string;
|
|
35
36
|
teamName?: string;
|
|
@@ -58,18 +59,33 @@ function ensureBotTokenInjectionTemplates(): void {
|
|
|
58
59
|
});
|
|
59
60
|
}
|
|
60
61
|
|
|
62
|
+
/** Ensure the user token credential has injection templates for the proxy. */
|
|
63
|
+
function ensureUserTokenInjectionTemplates(): void {
|
|
64
|
+
upsertCredentialMetadata("slack_channel", "user_token", {
|
|
65
|
+
allowedDomains: ["slack.com"],
|
|
66
|
+
injectionTemplates: SLACK_INJECTION_TEMPLATES,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
61
70
|
/**
|
|
62
|
-
* Backfill injection templates on the Slack
|
|
71
|
+
* Backfill injection templates on the Slack credentials.
|
|
63
72
|
* Called on daemon startup so existing credentials get proxy support.
|
|
64
73
|
*/
|
|
65
74
|
export function backfillSlackInjectionTemplates(): void {
|
|
66
|
-
const
|
|
75
|
+
const botMeta = getCredentialMetadata("slack_channel", "bot_token");
|
|
67
76
|
if (
|
|
68
|
-
|
|
69
|
-
(!
|
|
77
|
+
botMeta &&
|
|
78
|
+
(!botMeta.injectionTemplates || botMeta.injectionTemplates.length === 0)
|
|
70
79
|
) {
|
|
71
80
|
ensureBotTokenInjectionTemplates();
|
|
72
81
|
}
|
|
82
|
+
const userMeta = getCredentialMetadata("slack_channel", "user_token");
|
|
83
|
+
if (
|
|
84
|
+
userMeta &&
|
|
85
|
+
(!userMeta.injectionTemplates || userMeta.injectionTemplates.length === 0)
|
|
86
|
+
) {
|
|
87
|
+
ensureUserTokenInjectionTemplates();
|
|
88
|
+
}
|
|
73
89
|
}
|
|
74
90
|
|
|
75
91
|
// -- Business logic --
|
|
@@ -87,6 +103,9 @@ export async function getSlackChannelConfig(): Promise<SlackChannelConfigResult>
|
|
|
87
103
|
const hasAppToken = !!(await getSecureKeyAsync(
|
|
88
104
|
credentialKey("slack_channel", "app_token"),
|
|
89
105
|
));
|
|
106
|
+
const hasUserToken = !!(await getSecureKeyAsync(
|
|
107
|
+
credentialKey("slack_channel", "user_token"),
|
|
108
|
+
));
|
|
90
109
|
const conn = getConnectionByProvider("slack_channel");
|
|
91
110
|
const connected =
|
|
92
111
|
!!(conn && conn.status === "active") && hasBotToken && hasAppToken;
|
|
@@ -96,11 +115,15 @@ export async function getSlackChannelConfig(): Promise<SlackChannelConfigResult>
|
|
|
96
115
|
if (hasBotToken) {
|
|
97
116
|
ensureBotTokenInjectionTemplates();
|
|
98
117
|
}
|
|
118
|
+
if (hasUserToken) {
|
|
119
|
+
ensureUserTokenInjectionTemplates();
|
|
120
|
+
}
|
|
99
121
|
|
|
100
122
|
return {
|
|
101
123
|
success: true,
|
|
102
124
|
hasBotToken,
|
|
103
125
|
hasAppToken,
|
|
126
|
+
hasUserToken,
|
|
104
127
|
connected,
|
|
105
128
|
...(teamId ? { teamId } : {}),
|
|
106
129
|
...(teamName ? { teamName } : {}),
|
|
@@ -109,9 +132,37 @@ export async function getSlackChannelConfig(): Promise<SlackChannelConfigResult>
|
|
|
109
132
|
};
|
|
110
133
|
}
|
|
111
134
|
|
|
135
|
+
/** Build an error-path result snapshot that reports the current credential state. */
|
|
136
|
+
async function currentErrorSnapshot(
|
|
137
|
+
error: string,
|
|
138
|
+
): Promise<SlackChannelConfigResult> {
|
|
139
|
+
const errHasBotToken = !!(await getSecureKeyAsync(
|
|
140
|
+
credentialKey("slack_channel", "bot_token"),
|
|
141
|
+
));
|
|
142
|
+
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
143
|
+
credentialKey("slack_channel", "app_token"),
|
|
144
|
+
));
|
|
145
|
+
const errHasUserToken = !!(await getSecureKeyAsync(
|
|
146
|
+
credentialKey("slack_channel", "user_token"),
|
|
147
|
+
));
|
|
148
|
+
const errConn = getConnectionByProvider("slack_channel");
|
|
149
|
+
return {
|
|
150
|
+
success: false,
|
|
151
|
+
hasBotToken: errHasBotToken,
|
|
152
|
+
hasAppToken: errHasAppToken,
|
|
153
|
+
hasUserToken: errHasUserToken,
|
|
154
|
+
connected:
|
|
155
|
+
!!(errConn && errConn.status === "active") &&
|
|
156
|
+
errHasBotToken &&
|
|
157
|
+
errHasAppToken,
|
|
158
|
+
error,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
112
162
|
export async function setSlackChannelConfig(
|
|
113
163
|
botToken?: string,
|
|
114
164
|
appToken?: string,
|
|
165
|
+
userToken?: string,
|
|
115
166
|
): Promise<SlackChannelConfigResult> {
|
|
116
167
|
let metadata: {
|
|
117
168
|
teamId?: string;
|
|
@@ -138,25 +189,9 @@ export async function setSlackChannelConfig(
|
|
|
138
189
|
user?: string;
|
|
139
190
|
};
|
|
140
191
|
if (!data.ok) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
)
|
|
144
|
-
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
145
|
-
credentialKey("slack_channel", "app_token"),
|
|
146
|
-
));
|
|
147
|
-
const errConn = getConnectionByProvider("slack_channel");
|
|
148
|
-
return {
|
|
149
|
-
success: false,
|
|
150
|
-
hasBotToken: errHasBotToken,
|
|
151
|
-
hasAppToken: errHasAppToken,
|
|
152
|
-
connected:
|
|
153
|
-
!!(errConn && errConn.status === "active") &&
|
|
154
|
-
errHasBotToken &&
|
|
155
|
-
errHasAppToken,
|
|
156
|
-
error: `Slack API validation failed: ${
|
|
157
|
-
data.error ?? "unknown error"
|
|
158
|
-
}`,
|
|
159
|
-
};
|
|
192
|
+
return currentErrorSnapshot(
|
|
193
|
+
`Slack API validation failed: ${data.error ?? "unknown error"}`,
|
|
194
|
+
);
|
|
160
195
|
}
|
|
161
196
|
metadata = {
|
|
162
197
|
teamId: data.team_id,
|
|
@@ -166,23 +201,7 @@ export async function setSlackChannelConfig(
|
|
|
166
201
|
};
|
|
167
202
|
} catch (err) {
|
|
168
203
|
const message = err instanceof Error ? err.message : String(err);
|
|
169
|
-
|
|
170
|
-
credentialKey("slack_channel", "bot_token"),
|
|
171
|
-
));
|
|
172
|
-
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
173
|
-
credentialKey("slack_channel", "app_token"),
|
|
174
|
-
));
|
|
175
|
-
const errConn = getConnectionByProvider("slack_channel");
|
|
176
|
-
return {
|
|
177
|
-
success: false,
|
|
178
|
-
hasBotToken: errHasBotToken,
|
|
179
|
-
hasAppToken: errHasAppToken,
|
|
180
|
-
connected:
|
|
181
|
-
!!(errConn && errConn.status === "active") &&
|
|
182
|
-
errHasBotToken &&
|
|
183
|
-
errHasAppToken,
|
|
184
|
-
error: `Failed to validate bot token: ${message}`,
|
|
185
|
-
};
|
|
204
|
+
return currentErrorSnapshot(`Failed to validate bot token: ${message}`);
|
|
186
205
|
}
|
|
187
206
|
|
|
188
207
|
const stored = await setSecureKeyAsync(
|
|
@@ -190,23 +209,7 @@ export async function setSlackChannelConfig(
|
|
|
190
209
|
botToken,
|
|
191
210
|
);
|
|
192
211
|
if (!stored) {
|
|
193
|
-
|
|
194
|
-
credentialKey("slack_channel", "bot_token"),
|
|
195
|
-
));
|
|
196
|
-
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
197
|
-
credentialKey("slack_channel", "app_token"),
|
|
198
|
-
));
|
|
199
|
-
const errConn = getConnectionByProvider("slack_channel");
|
|
200
|
-
return {
|
|
201
|
-
success: false,
|
|
202
|
-
hasBotToken: errHasBotToken,
|
|
203
|
-
hasAppToken: errHasAppToken,
|
|
204
|
-
connected:
|
|
205
|
-
!!(errConn && errConn.status === "active") &&
|
|
206
|
-
errHasBotToken &&
|
|
207
|
-
errHasAppToken,
|
|
208
|
-
error: "Failed to store bot token in secure storage",
|
|
209
|
-
};
|
|
212
|
+
return currentErrorSnapshot("Failed to store bot token in secure storage");
|
|
210
213
|
}
|
|
211
214
|
|
|
212
215
|
ensureBotTokenInjectionTemplates();
|
|
@@ -218,6 +221,73 @@ export async function setSlackChannelConfig(
|
|
|
218
221
|
setNestedValue(raw, "slack.botUsername", metadata.botUsername ?? "");
|
|
219
222
|
saveRawConfig(raw);
|
|
220
223
|
invalidateConfigCache();
|
|
224
|
+
|
|
225
|
+
// Cross-check existing user_token against the newly-stored bot_token's
|
|
226
|
+
// workspace. A user_token persisted under a previous workspace (or whose
|
|
227
|
+
// auth.test returns ok:false) must be cleared so reads and writes never
|
|
228
|
+
// fan out across workspaces.
|
|
229
|
+
//
|
|
230
|
+
// IMPORTANT: we only clear on a definitive negative signal —
|
|
231
|
+
// (a) auth.test returned ok:false, or
|
|
232
|
+
// (b) auth.test returned ok:true with a team_id that differs from the new
|
|
233
|
+
// bot_token's team_id.
|
|
234
|
+
//
|
|
235
|
+
// Transient failures (network error, non-JSON response, JSON parse error)
|
|
236
|
+
// must NOT wipe a still-valid user_token: for user-scope installs,
|
|
237
|
+
// re-issuing can require admin approval. The adapter already tolerates a
|
|
238
|
+
// stale token — it will surface on next real use, at which point the user
|
|
239
|
+
// can re-run setup.
|
|
240
|
+
const existingUserToken = await getSecureKeyAsync(
|
|
241
|
+
credentialKey("slack_channel", "user_token"),
|
|
242
|
+
);
|
|
243
|
+
if (existingUserToken) {
|
|
244
|
+
let shouldClear = false;
|
|
245
|
+
let clearReason: string | undefined;
|
|
246
|
+
try {
|
|
247
|
+
const res = await fetch("https://slack.com/api/auth.test", {
|
|
248
|
+
method: "POST",
|
|
249
|
+
headers: { Authorization: `Bearer ${existingUserToken}` },
|
|
250
|
+
});
|
|
251
|
+
const data = (await res.json()) as {
|
|
252
|
+
ok: boolean;
|
|
253
|
+
error?: string;
|
|
254
|
+
team_id?: string;
|
|
255
|
+
};
|
|
256
|
+
if (!data.ok) {
|
|
257
|
+
shouldClear = true;
|
|
258
|
+
clearReason = "User token validation failed; it has been removed.";
|
|
259
|
+
} else if (
|
|
260
|
+
metadata.teamId &&
|
|
261
|
+
data.team_id &&
|
|
262
|
+
data.team_id !== metadata.teamId
|
|
263
|
+
) {
|
|
264
|
+
shouldClear = true;
|
|
265
|
+
clearReason =
|
|
266
|
+
"User token from a different workspace was removed.";
|
|
267
|
+
}
|
|
268
|
+
} catch (err) {
|
|
269
|
+
// Transient failure (DNS error, network blip, connection reset,
|
|
270
|
+
// non-JSON response, JSON parse failure). Leave the user_token in
|
|
271
|
+
// place — we have no definitive signal that it's invalid. Future
|
|
272
|
+
// reads that actually hit Slack will fail naturally if the token is
|
|
273
|
+
// actually bad, and the user can re-run setup then.
|
|
274
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
275
|
+
_log.warn(
|
|
276
|
+
{ err: message },
|
|
277
|
+
"Skipping user_token re-validation due to transient error; leaving existing user_token in place.",
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
if (shouldClear) {
|
|
281
|
+
const cleared = await clearSlackUserToken();
|
|
282
|
+
if (!cleared.success) {
|
|
283
|
+
const failMsg =
|
|
284
|
+
"User token workspace mismatch detected but removal failed; please clear it manually.";
|
|
285
|
+
warning = warning ? `${warning} ${failMsg}` : failMsg;
|
|
286
|
+
} else if (clearReason) {
|
|
287
|
+
warning = warning ? `${warning} ${clearReason}` : clearReason;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
221
291
|
} else {
|
|
222
292
|
// Use existing metadata from config if no new bot token provided
|
|
223
293
|
const { teamId, teamName, botUserId, botUsername } = getConfig().slack;
|
|
@@ -232,23 +302,7 @@ export async function setSlackChannelConfig(
|
|
|
232
302
|
// Validate and store app token
|
|
233
303
|
if (appToken) {
|
|
234
304
|
if (!appToken.startsWith("xapp-")) {
|
|
235
|
-
|
|
236
|
-
credentialKey("slack_channel", "bot_token"),
|
|
237
|
-
));
|
|
238
|
-
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
239
|
-
credentialKey("slack_channel", "app_token"),
|
|
240
|
-
));
|
|
241
|
-
const errConn = getConnectionByProvider("slack_channel");
|
|
242
|
-
return {
|
|
243
|
-
success: false,
|
|
244
|
-
hasBotToken: errHasBotToken,
|
|
245
|
-
hasAppToken: errHasAppToken,
|
|
246
|
-
connected:
|
|
247
|
-
!!(errConn && errConn.status === "active") &&
|
|
248
|
-
errHasBotToken &&
|
|
249
|
-
errHasAppToken,
|
|
250
|
-
error: 'Invalid app token: must start with "xapp-"',
|
|
251
|
-
};
|
|
305
|
+
return currentErrorSnapshot('Invalid app token: must start with "xapp-"');
|
|
252
306
|
}
|
|
253
307
|
|
|
254
308
|
const stored = await setSecureKeyAsync(
|
|
@@ -256,41 +310,86 @@ export async function setSlackChannelConfig(
|
|
|
256
310
|
appToken,
|
|
257
311
|
);
|
|
258
312
|
if (!stored) {
|
|
259
|
-
|
|
260
|
-
credentialKey("slack_channel", "bot_token"),
|
|
261
|
-
));
|
|
262
|
-
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
263
|
-
credentialKey("slack_channel", "app_token"),
|
|
264
|
-
));
|
|
265
|
-
const errConn = getConnectionByProvider("slack_channel");
|
|
266
|
-
return {
|
|
267
|
-
success: false,
|
|
268
|
-
hasBotToken: errHasBotToken,
|
|
269
|
-
hasAppToken: errHasAppToken,
|
|
270
|
-
connected:
|
|
271
|
-
!!(errConn && errConn.status === "active") &&
|
|
272
|
-
errHasBotToken &&
|
|
273
|
-
errHasAppToken,
|
|
274
|
-
error: "Failed to store app token in secure storage",
|
|
275
|
-
};
|
|
313
|
+
return currentErrorSnapshot("Failed to store app token in secure storage");
|
|
276
314
|
}
|
|
277
315
|
|
|
278
316
|
upsertCredentialMetadata("slack_channel", "app_token", {});
|
|
279
317
|
}
|
|
280
318
|
|
|
319
|
+
// Validate and store user token (optional — grants read access to channels
|
|
320
|
+
// the bot isn't a member of; writes always continue to go through the bot).
|
|
321
|
+
if (userToken) {
|
|
322
|
+
if (!userToken.startsWith("xoxp-")) {
|
|
323
|
+
return currentErrorSnapshot(
|
|
324
|
+
'Invalid user token: must start with "xoxp-"',
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
let userTeamId: string | undefined;
|
|
329
|
+
try {
|
|
330
|
+
const res = await fetch("https://slack.com/api/auth.test", {
|
|
331
|
+
method: "POST",
|
|
332
|
+
headers: { Authorization: `Bearer ${userToken}` },
|
|
333
|
+
});
|
|
334
|
+
const data = (await res.json()) as {
|
|
335
|
+
ok: boolean;
|
|
336
|
+
error?: string;
|
|
337
|
+
team_id?: string;
|
|
338
|
+
};
|
|
339
|
+
if (!data.ok) {
|
|
340
|
+
return currentErrorSnapshot(
|
|
341
|
+
`Slack API validation failed: ${data.error ?? "unknown error"}`,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
userTeamId = data.team_id;
|
|
345
|
+
} catch (err) {
|
|
346
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
347
|
+
return currentErrorSnapshot(
|
|
348
|
+
`Failed to validate user token: ${message}`,
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Cross-check: if a bot token has already been configured, the user token
|
|
353
|
+
// must be for the same workspace. If no bot token is configured yet, store
|
|
354
|
+
// provisionally and skip the cross-check — the order of setup can vary.
|
|
355
|
+
const existingBotTeamId = metadata.teamId;
|
|
356
|
+
if (existingBotTeamId && userTeamId && existingBotTeamId !== userTeamId) {
|
|
357
|
+
return currentErrorSnapshot(
|
|
358
|
+
"User token is for a different workspace than the bot token",
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const stored = await setSecureKeyAsync(
|
|
363
|
+
credentialKey("slack_channel", "user_token"),
|
|
364
|
+
userToken,
|
|
365
|
+
);
|
|
366
|
+
if (!stored) {
|
|
367
|
+
return currentErrorSnapshot(
|
|
368
|
+
"Failed to store user token in secure storage",
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
ensureUserTokenInjectionTemplates();
|
|
373
|
+
}
|
|
374
|
+
|
|
281
375
|
const hasBotToken = !!(await getSecureKeyAsync(
|
|
282
376
|
credentialKey("slack_channel", "bot_token"),
|
|
283
377
|
));
|
|
284
378
|
const hasAppToken = !!(await getSecureKeyAsync(
|
|
285
379
|
credentialKey("slack_channel", "app_token"),
|
|
286
380
|
));
|
|
381
|
+
const hasUserToken = !!(await getSecureKeyAsync(
|
|
382
|
+
credentialKey("slack_channel", "user_token"),
|
|
383
|
+
));
|
|
287
384
|
|
|
288
385
|
if (hasBotToken && !hasAppToken) {
|
|
289
|
-
|
|
386
|
+
const msg =
|
|
290
387
|
"Bot token stored but app token is missing — connection incomplete.";
|
|
388
|
+
warning = warning ? `${warning} ${msg}` : msg;
|
|
291
389
|
} else if (!hasBotToken && hasAppToken) {
|
|
292
|
-
|
|
390
|
+
const msg =
|
|
293
391
|
"App token stored but bot token is missing — connection incomplete.";
|
|
392
|
+
warning = warning ? `${warning} ${msg}` : msg;
|
|
294
393
|
}
|
|
295
394
|
|
|
296
395
|
// Sync oauth_connection record so getConnectionByProvider("slack_channel")
|
|
@@ -309,12 +408,79 @@ export async function setSlackChannelConfig(
|
|
|
309
408
|
success: true,
|
|
310
409
|
hasBotToken,
|
|
311
410
|
hasAppToken,
|
|
411
|
+
hasUserToken,
|
|
312
412
|
connected: hasBotToken && hasAppToken,
|
|
313
413
|
...metadata,
|
|
314
414
|
...(warning ? { warning } : {}),
|
|
315
415
|
};
|
|
316
416
|
}
|
|
317
417
|
|
|
418
|
+
/**
|
|
419
|
+
* Surgically remove the Slack user_token credential.
|
|
420
|
+
*
|
|
421
|
+
* Deletes only the user_token secure key and its credential metadata. Leaves
|
|
422
|
+
* the bot_token, app_token, oauth_connection row, and Slack config metadata
|
|
423
|
+
* untouched so the Socket Mode connection stays up. Returns a
|
|
424
|
+
* `SlackChannelConfigResult` reflecting the remaining state. A `not-found`
|
|
425
|
+
* delete outcome is reported as a failure to match the credential_store
|
|
426
|
+
* delete semantics (callers and automation rely on missing-credential
|
|
427
|
+
* detection).
|
|
428
|
+
*/
|
|
429
|
+
export async function clearSlackUserToken(): Promise<SlackChannelConfigResult> {
|
|
430
|
+
const result = await deleteSecureKeyAsync(
|
|
431
|
+
credentialKey("slack_channel", "user_token"),
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
if (result === "error" || result === "not-found") {
|
|
435
|
+
const hasBotToken = !!(await getSecureKeyAsync(
|
|
436
|
+
credentialKey("slack_channel", "bot_token"),
|
|
437
|
+
));
|
|
438
|
+
const hasAppToken = !!(await getSecureKeyAsync(
|
|
439
|
+
credentialKey("slack_channel", "app_token"),
|
|
440
|
+
));
|
|
441
|
+
const hasUserToken = !!(await getSecureKeyAsync(
|
|
442
|
+
credentialKey("slack_channel", "user_token"),
|
|
443
|
+
));
|
|
444
|
+
const conn = getConnectionByProvider("slack_channel");
|
|
445
|
+
return {
|
|
446
|
+
success: false,
|
|
447
|
+
hasBotToken,
|
|
448
|
+
hasAppToken,
|
|
449
|
+
hasUserToken,
|
|
450
|
+
connected:
|
|
451
|
+
!!(conn && conn.status === "active") && hasBotToken && hasAppToken,
|
|
452
|
+
error:
|
|
453
|
+
result === "not-found"
|
|
454
|
+
? "Slack user token not found in secure storage"
|
|
455
|
+
: "Failed to delete Slack user token from secure storage",
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
deleteCredentialMetadata("slack_channel", "user_token");
|
|
460
|
+
|
|
461
|
+
const hasBotToken = !!(await getSecureKeyAsync(
|
|
462
|
+
credentialKey("slack_channel", "bot_token"),
|
|
463
|
+
));
|
|
464
|
+
const hasAppToken = !!(await getSecureKeyAsync(
|
|
465
|
+
credentialKey("slack_channel", "app_token"),
|
|
466
|
+
));
|
|
467
|
+
const conn = getConnectionByProvider("slack_channel");
|
|
468
|
+
const { teamId, teamName, botUserId, botUsername } = getConfig().slack;
|
|
469
|
+
|
|
470
|
+
return {
|
|
471
|
+
success: true,
|
|
472
|
+
hasBotToken,
|
|
473
|
+
hasAppToken,
|
|
474
|
+
hasUserToken: false,
|
|
475
|
+
connected:
|
|
476
|
+
!!(conn && conn.status === "active") && hasBotToken && hasAppToken,
|
|
477
|
+
...(teamId ? { teamId } : {}),
|
|
478
|
+
...(teamName ? { teamName } : {}),
|
|
479
|
+
...(botUserId ? { botUserId } : {}),
|
|
480
|
+
...(botUsername ? { botUsername } : {}),
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
|
|
318
484
|
export async function clearSlackChannelConfig(): Promise<SlackChannelConfigResult> {
|
|
319
485
|
const r1 = await deleteSecureKeyAsync(
|
|
320
486
|
credentialKey("slack_channel", "bot_token"),
|
|
@@ -322,8 +488,11 @@ export async function clearSlackChannelConfig(): Promise<SlackChannelConfigResul
|
|
|
322
488
|
const r2 = await deleteSecureKeyAsync(
|
|
323
489
|
credentialKey("slack_channel", "app_token"),
|
|
324
490
|
);
|
|
491
|
+
const r3 = await deleteSecureKeyAsync(
|
|
492
|
+
credentialKey("slack_channel", "user_token"),
|
|
493
|
+
);
|
|
325
494
|
|
|
326
|
-
if (r1 === "error" || r2 === "error") {
|
|
495
|
+
if (r1 === "error" || r2 === "error" || r3 === "error") {
|
|
327
496
|
// Check each key individually so partial deletions report accurate status.
|
|
328
497
|
const hasBotToken = !!(await getSecureKeyAsync(
|
|
329
498
|
credentialKey("slack_channel", "bot_token"),
|
|
@@ -331,11 +500,15 @@ export async function clearSlackChannelConfig(): Promise<SlackChannelConfigResul
|
|
|
331
500
|
const hasAppToken = !!(await getSecureKeyAsync(
|
|
332
501
|
credentialKey("slack_channel", "app_token"),
|
|
333
502
|
));
|
|
503
|
+
const hasUserToken = !!(await getSecureKeyAsync(
|
|
504
|
+
credentialKey("slack_channel", "user_token"),
|
|
505
|
+
));
|
|
334
506
|
const conn = getConnectionByProvider("slack_channel");
|
|
335
507
|
return {
|
|
336
508
|
success: false,
|
|
337
509
|
hasBotToken,
|
|
338
510
|
hasAppToken,
|
|
511
|
+
hasUserToken,
|
|
339
512
|
connected:
|
|
340
513
|
!!(conn && conn.status === "active") && hasBotToken && hasAppToken,
|
|
341
514
|
error: "Failed to delete Slack channel credentials from secure storage",
|
|
@@ -344,6 +517,7 @@ export async function clearSlackChannelConfig(): Promise<SlackChannelConfigResul
|
|
|
344
517
|
|
|
345
518
|
deleteCredentialMetadata("slack_channel", "bot_token");
|
|
346
519
|
deleteCredentialMetadata("slack_channel", "app_token");
|
|
520
|
+
deleteCredentialMetadata("slack_channel", "user_token");
|
|
347
521
|
|
|
348
522
|
// Remove the oauth_connection row so getConnectionByProvider returns undefined.
|
|
349
523
|
removeManualTokenConnection("slack_channel");
|
|
@@ -360,6 +534,7 @@ export async function clearSlackChannelConfig(): Promise<SlackChannelConfigResul
|
|
|
360
534
|
success: true,
|
|
361
535
|
hasBotToken: false,
|
|
362
536
|
hasAppToken: false,
|
|
537
|
+
hasUserToken: false,
|
|
363
538
|
connected: false,
|
|
364
539
|
};
|
|
365
540
|
}
|
|
@@ -16,6 +16,7 @@ import * as pendingInteractions from "../../runtime/pending-interactions.js";
|
|
|
16
16
|
import { redactSecrets } from "../../security/secret-scanner.js";
|
|
17
17
|
import { getSubagentManager } from "../../subagent/index.js";
|
|
18
18
|
import { summarizeToolInput } from "../../tools/tool-input-summary.js";
|
|
19
|
+
import { createAbortReason } from "../../util/abort-reasons.js";
|
|
19
20
|
import { truncate } from "../../util/truncate.js";
|
|
20
21
|
import type { Conversation } from "../conversation.js";
|
|
21
22
|
import type {
|
|
@@ -147,12 +148,19 @@ export function handleConfirmationResponse(
|
|
|
147
148
|
// Route by requestId to the conversation that originated the prompt, not by
|
|
148
149
|
// the current conversation binding which may have changed since the
|
|
149
150
|
// request was issued (e.g. after a conversation switch).
|
|
151
|
+
// Normalize legacy decision: older clients may still send
|
|
152
|
+
// "always_allow_high_risk" via WebSocket for high-risk prompts.
|
|
153
|
+
const decision =
|
|
154
|
+
msg.decision === ("always_allow_high_risk" as typeof msg.decision)
|
|
155
|
+
? "always_allow"
|
|
156
|
+
: msg.decision;
|
|
157
|
+
|
|
150
158
|
for (const [conversationId, conversation] of ctx.conversations) {
|
|
151
159
|
if (conversation.hasPendingConfirmation(msg.requestId)) {
|
|
152
160
|
ctx.touchConversation(conversationId);
|
|
153
161
|
conversation.handleConfirmationResponse(
|
|
154
162
|
msg.requestId,
|
|
155
|
-
|
|
163
|
+
decision,
|
|
156
164
|
msg.selectedPattern,
|
|
157
165
|
msg.selectedScope,
|
|
158
166
|
undefined,
|
|
@@ -323,7 +331,9 @@ export function cancelGeneration(
|
|
|
323
331
|
return false;
|
|
324
332
|
}
|
|
325
333
|
ctx.touchConversation(conversationId);
|
|
326
|
-
conversation.abort(
|
|
334
|
+
conversation.abort(
|
|
335
|
+
createAbortReason("user_cancel", "cancelGeneration", conversationId),
|
|
336
|
+
);
|
|
327
337
|
// Also abort any child subagents spawned by this conversation.
|
|
328
338
|
// Omit sendToClient to suppress parent notifications — the parent is
|
|
329
339
|
// being cancelled, so enqueuing synthetic messages would trigger
|
|
@@ -432,7 +442,7 @@ export function handleUsageRequest(
|
|
|
432
442
|
totalInputTokens: conversation.totalInputTokens,
|
|
433
443
|
totalOutputTokens: conversation.totalOutputTokens,
|
|
434
444
|
estimatedCost: conversation.totalEstimatedCost,
|
|
435
|
-
model: config.
|
|
445
|
+
model: config.llm.default.model,
|
|
436
446
|
});
|
|
437
447
|
}
|
|
438
448
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { v4 as uuid } from "uuid";
|
|
2
2
|
|
|
3
3
|
import { getConfig } from "../../config/loader.js";
|
|
4
|
-
import type { Speed } from "../../config/schemas/
|
|
4
|
+
import type { LLMCallSite, Speed } from "../../config/schemas/llm.js";
|
|
5
5
|
import type { HeartbeatService } from "../../heartbeat/heartbeat-service.js";
|
|
6
6
|
import type { SecretPromptResult } from "../../permissions/secret-prompter.js";
|
|
7
|
+
import { isPlaceholderSentinelText } from "../../providers/anthropic/client.js";
|
|
7
8
|
import type { AuthContext } from "../../runtime/auth/types.js";
|
|
8
9
|
import type { DebouncerMap } from "../../util/debounce.js";
|
|
9
10
|
import { getLogger } from "../../util/logger.js";
|
|
@@ -81,6 +82,7 @@ export interface HistorySurface {
|
|
|
81
82
|
data: Record<string, unknown>;
|
|
82
83
|
actions?: Array<{ id: string; label: string; style?: string }>;
|
|
83
84
|
display?: string;
|
|
85
|
+
persistent?: boolean;
|
|
84
86
|
completed?: boolean;
|
|
85
87
|
completionSummary?: string;
|
|
86
88
|
}
|
|
@@ -100,6 +102,22 @@ export interface RenderedHistoryContent {
|
|
|
100
102
|
thinkingSegments: string[];
|
|
101
103
|
}
|
|
102
104
|
|
|
105
|
+
/**
|
|
106
|
+
* Slack-specific metadata extracted at the inbound HTTP boundary and threaded
|
|
107
|
+
* through to user-message persistence so the row can be tagged with a
|
|
108
|
+
* `slackMeta` envelope for the chronological renderer.
|
|
109
|
+
*/
|
|
110
|
+
export interface SlackInboundMessageMetadata {
|
|
111
|
+
/** Slack channel id (conversation external id) — recorded as `channelId`. */
|
|
112
|
+
channelId: string;
|
|
113
|
+
/** Slack `ts` for this message — required so persistence can record `channelTs`. */
|
|
114
|
+
channelTs: string;
|
|
115
|
+
/** Parent `thread_ts` when the message lives inside a thread; absent for top-level. */
|
|
116
|
+
threadTs?: string;
|
|
117
|
+
/** Resolved sender label (display name preferred, username fallback). */
|
|
118
|
+
displayName?: string;
|
|
119
|
+
}
|
|
120
|
+
|
|
103
121
|
/**
|
|
104
122
|
* Optional overrides for conversation creation (e.g. interview mode).
|
|
105
123
|
*/
|
|
@@ -126,6 +144,26 @@ export interface ConversationCreateOptions {
|
|
|
126
144
|
commandIntent?: { type: string; payload?: string; languageCode?: string };
|
|
127
145
|
/** Optional callback to receive real-time agent loop events (text deltas, tool starts, etc.). */
|
|
128
146
|
onEvent?: (msg: ServerMessage) => void;
|
|
147
|
+
/**
|
|
148
|
+
* Optional explicit model override (provider/model string) for this
|
|
149
|
+
* conversation's agent loop. Used by the auto-analyze loop to pin the
|
|
150
|
+
* analysis agent to a specific model.
|
|
151
|
+
*/
|
|
152
|
+
modelOverride?: string;
|
|
153
|
+
/**
|
|
154
|
+
* Optional LLM call-site identifier threaded through to the per-call
|
|
155
|
+
* provider config. Adapter callers (heartbeat, filing, schedule, etc.)
|
|
156
|
+
* pass their call-site here so the agent loop routes through
|
|
157
|
+
* `resolveCallSiteConfig` instead of the global default.
|
|
158
|
+
*/
|
|
159
|
+
callSite?: LLMCallSite;
|
|
160
|
+
/**
|
|
161
|
+
* Slack inbound metadata captured at the channel ingress boundary. When
|
|
162
|
+
* present (and the turn channel resolves to Slack), persistence writes a
|
|
163
|
+
* `slackMeta` sub-object into the message's `metadata` JSON for the
|
|
164
|
+
* chronological renderer to consume.
|
|
165
|
+
*/
|
|
166
|
+
slackInbound?: SlackInboundMessageMetadata;
|
|
129
167
|
}
|
|
130
168
|
|
|
131
169
|
/**
|
|
@@ -288,6 +326,7 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
|
|
|
288
326
|
: {},
|
|
289
327
|
actions: Array.isArray(block.actions) ? block.actions : undefined,
|
|
290
328
|
display: typeof block.display === "string" ? block.display : undefined,
|
|
329
|
+
persistent: block.persistent === true ? true : undefined,
|
|
291
330
|
completed: block.completed === true ? true : undefined,
|
|
292
331
|
completionSummary:
|
|
293
332
|
typeof block.completionSummary === "string"
|
|
@@ -307,6 +346,17 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
|
|
|
307
346
|
}
|
|
308
347
|
|
|
309
348
|
if (block.type === "text" && typeof block.text === "string") {
|
|
349
|
+
// Skip empty/whitespace-only text blocks. During streaming the client
|
|
350
|
+
// discards empty text deltas (guard !text.isEmpty), so including them
|
|
351
|
+
// here produces a contentOrder that differs from the live streaming
|
|
352
|
+
// path — e.g. empty segments between consecutive tool_use blocks that
|
|
353
|
+
// break tool-call grouping in the UI.
|
|
354
|
+
if (block.text.trim().length === 0) continue;
|
|
355
|
+
// Drop Anthropic provider placeholder sentinels. These are injected
|
|
356
|
+
// into outbound API requests to preserve role alternation and must
|
|
357
|
+
// never be rendered to users. Belt-and-suspenders with the persist-
|
|
358
|
+
// time filter in cleanAssistantContent and migration 222.
|
|
359
|
+
if (isPlaceholderSentinelText(block.text)) continue;
|
|
310
360
|
textParts.push(block.text);
|
|
311
361
|
ensureSegment();
|
|
312
362
|
currentSegmentParts.push(block.text);
|