@vellumai/assistant 0.6.3 → 0.6.4
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/ARCHITECTURE.md +273 -10
- package/Dockerfile +2 -3
- package/bun.lock +5 -13
- package/docs/backup-troubleshooting.md +52 -0
- package/docs/browser-use-architecture-phase2.md +174 -0
- package/docs/stt-provider-onboarding.md +120 -0
- package/knip.json +12 -2
- package/node_modules/@vellumai/ces-contracts/bun.lock +8 -6
- package/node_modules/@vellumai/ces-contracts/package.json +3 -3
- package/openapi.yaml +982 -72
- package/package.json +4 -6
- package/scripts/generate-openapi.ts +0 -1
- package/scripts/test.sh +73 -18
- package/src/__tests__/agent-image-optimize.test.ts +28 -0
- package/src/__tests__/agent-loop.test.ts +123 -0
- package/src/__tests__/anthropic-provider.test.ts +263 -10
- 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 +11 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
- package/src/__tests__/browser-skill-endstate.test.ts +31 -7
- package/src/__tests__/btw-routes.test.ts +7 -0
- package/src/__tests__/call-controller.test.ts +581 -20
- package/src/__tests__/catalog-files.test.ts +138 -0
- 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__/checker.test.ts +157 -10
- package/src/__tests__/clawhub-files.test.ts +347 -0
- package/src/__tests__/commit-message-enrichment-service.test.ts +36 -19
- package/src/__tests__/config-analysis.test.ts +100 -0
- package/src/__tests__/config-schema.test.ts +1013 -66
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
- package/src/__tests__/config-watcher.test.ts +43 -8
- package/src/__tests__/contact-store-user-file.test.ts +512 -0
- package/src/__tests__/contacts-write.test.ts +197 -0
- package/src/__tests__/context-window-manager.test.ts +88 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop.test.ts +98 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +135 -0
- package/src/__tests__/conversation-error.test.ts +70 -0
- package/src/__tests__/conversation-history-web-search.test.ts +11 -4
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -1
- package/src/__tests__/conversation-launcher-skill-regression.test.ts +51 -0
- package/src/__tests__/conversation-list-source.test.ts +145 -0
- package/src/__tests__/conversation-pre-run-repair.test.ts +2 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
- package/src/__tests__/conversation-queue.test.ts +901 -60
- package/src/__tests__/conversation-routes-disk-view.test.ts +270 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +55 -0
- package/src/__tests__/conversation-skill-tools.test.ts +7 -4
- package/src/__tests__/conversation-slash-commands.test.ts +33 -0
- package/src/__tests__/conversation-slash-queue.test.ts +89 -18
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +226 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
- package/src/__tests__/credential-health-service.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +5 -3
- package/src/__tests__/credential-vault-unit.test.ts +379 -3
- package/src/__tests__/credentials-cli.test.ts +40 -16
- package/src/__tests__/cross-provider-web-search.test.ts +146 -35
- package/src/__tests__/deterministic-verification-control-plane.test.ts +10 -1
- package/src/__tests__/device-id.test.ts +112 -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__/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__/extension-id-sync-guard.test.ts +75 -8
- 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 -0
- package/src/__tests__/get-skill-detail-audit.test.ts +325 -0
- package/src/__tests__/gmail-archive-fallback.test.ts +193 -0
- package/src/__tests__/gmail-archive-gate.test.ts +246 -0
- package/src/__tests__/gmail-preferences.test.ts +117 -0
- package/src/__tests__/headless-browser-interactions.test.ts +43 -0
- 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 +70 -17
- 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__/identity-intro-cache.test.ts +40 -10
- package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
- package/src/__tests__/llm-context-normalization.test.ts +488 -0
- package/src/__tests__/llm-context-route-provider.test.ts +86 -5
- package/src/__tests__/llm-usage-store.test.ts +363 -0
- 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__/migration-export-http.test.ts +6 -6
- package/src/__tests__/migration-import-commit-http.test.ts +8 -6
- 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 +2 -2
- 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 +85 -0
- package/src/__tests__/oauth2-gateway-transport.test.ts +249 -6
- package/src/__tests__/onboarding-template-contract.test.ts +6 -13
- package/src/__tests__/openai-provider.test.ts +176 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +184 -0
- package/src/__tests__/openai-responses-provider.test.ts +1105 -0
- package/src/__tests__/openrouter-token-estimation.test.ts +100 -0
- package/src/__tests__/outlook-unsubscribe.test.ts +31 -2
- package/src/__tests__/persona-resolver.test.ts +251 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +4 -0
- 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 +174 -0
- package/src/__tests__/qdrant-manager.test.ts +29 -8
- 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 +423 -5
- package/src/__tests__/search-skills-unified.test.ts +118 -0
- package/src/__tests__/secret-scanner-executor.test.ts +4 -0
- package/src/__tests__/secure-keys.test.ts +107 -0
- package/src/__tests__/send-endpoint-busy.test.ts +5 -1
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +49 -0
- package/src/__tests__/settings-routes.test.ts +201 -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 +5 -2
- package/src/__tests__/skillssh-files.test.ts +446 -0
- package/src/__tests__/slack-block-formatting.test.ts +110 -0
- package/src/__tests__/slack-channel-config.test.ts +564 -1
- package/src/__tests__/stt-catalog-parity.test.ts +282 -0
- package/src/__tests__/stt-stream-session.test.ts +535 -0
- package/src/__tests__/system-prompt.test.ts +112 -26
- package/src/__tests__/telephony-stt-routing.test.ts +329 -0
- package/src/__tests__/terminal-tools.test.ts +18 -7
- package/src/__tests__/test-preload.ts +18 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +4 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +9 -5
- package/src/__tests__/tool-executor-shell-integration.test.ts +4 -0
- package/src/__tests__/tool-executor.test.ts +33 -24
- package/src/__tests__/tool-result-truncation.test.ts +36 -0
- package/src/__tests__/trust-store.test.ts +7 -1
- 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-format.test.ts +59 -0
- package/src/__tests__/update-bulletin.test.ts +206 -5
- 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 +4 -0
- package/src/__tests__/voice-config-update.test.ts +403 -0
- package/src/__tests__/voice-quality.test.ts +434 -19
- 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-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-policy.test.ts +2 -0
- package/src/agent/image-optimize.ts +24 -12
- package/src/agent/loop.ts +43 -3
- 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/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/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 +8 -1
- package/src/channels/types.ts +16 -0
- package/src/cli/__tests__/run-assistant-command.ts +11 -1
- package/src/cli/commands/__tests__/backup.test.ts +1165 -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 +22 -4
- package/src/cli/commands/__tests__/email-register.test.ts +4 -4
- package/src/cli/commands/__tests__/email-send.test.ts +37 -4
- 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/backup.ts +993 -0
- package/src/cli/commands/conversations.ts +77 -0
- package/src/cli/commands/credentials.ts +0 -1
- package/src/cli/commands/domain.ts +210 -0
- package/src/cli/commands/email.ts +255 -3
- 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 -9
- package/src/cli/commands/platform/__tests__/connect.test.ts +6 -0
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +6 -0
- package/src/cli/program.ts +30 -4
- 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/browser/SKILL.md +30 -5
- package/src/config/bundled-skills/browser/TOOLS.json +123 -0
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-status.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +17 -0
- package/src/config/bundled-skills/contacts/SKILL.md +2 -2
- package/src/config/bundled-skills/gmail/SKILL.md +53 -7
- package/src/config/bundled-skills/gmail/TOOLS.json +33 -3
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +116 -9
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +138 -11
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +59 -0
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +82 -0
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +113 -17
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +2 -2
- 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/tools/extract-keyframes.ts +0 -10
- package/src/config/bundled-skills/messaging/SKILL.md +3 -3
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +2 -2
- package/src/config/bundled-skills/outlook/SKILL.md +2 -2
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +2 -2
- package/src/config/bundled-skills/phone-calls/SKILL.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +27 -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/slack/SKILL.md +1 -0
- 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 +8 -0
- package/src/config/env-registry.ts +24 -0
- package/src/config/env.ts +34 -10
- package/src/config/feature-flag-registry.json +46 -14
- package/src/config/loader.ts +26 -12
- package/src/config/schema.ts +35 -10
- package/src/config/schemas/__tests__/stt.test.ts +43 -0
- package/src/config/schemas/analysis.ts +51 -0
- package/src/config/schemas/backup.ts +72 -0
- package/src/config/schemas/calls.ts +1 -26
- package/src/config/schemas/elevenlabs.ts +0 -59
- package/src/config/schemas/filing.ts +47 -7
- package/src/config/schemas/heartbeat.ts +27 -5
- package/src/config/schemas/host-browser.ts +47 -1
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/memory-lifecycle.ts +14 -2
- package/src/config/schemas/services.ts +44 -0
- package/src/config/schemas/stt.ts +59 -0
- package/src/config/schemas/tts.ts +230 -0
- package/src/config/schemas/updates.ts +14 -0
- package/src/config/skills.ts +4 -0
- 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/post-turn-tool-result-truncation.ts +3 -2
- package/src/context/tool-result-truncation.ts +2 -1
- package/src/context/window-manager.ts +45 -12
- package/src/credential-execution/executable-discovery.ts +12 -2
- package/src/credential-execution/process-manager.ts +33 -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/config-watcher.ts +99 -5
- package/src/daemon/conversation-agent-loop-handlers.ts +6 -0
- package/src/daemon/conversation-agent-loop.ts +101 -24
- package/src/daemon/conversation-error.ts +11 -0
- package/src/daemon/conversation-history.ts +40 -6
- package/src/daemon/conversation-launch.ts +220 -0
- package/src/daemon/conversation-lifecycle.ts +59 -9
- package/src/daemon/conversation-messaging.ts +37 -3
- package/src/daemon/conversation-notifiers.ts +5 -0
- package/src/daemon/conversation-process.ts +581 -19
- package/src/daemon/conversation-queue-manager.ts +24 -0
- package/src/daemon/conversation-runtime-assembly.ts +11 -1
- package/src/daemon/conversation-slash.ts +36 -0
- package/src/daemon/conversation-surfaces.ts +94 -4
- package/src/daemon/conversation-tool-setup.ts +25 -0
- package/src/daemon/conversation-usage.ts +7 -4
- package/src/daemon/conversation.ts +86 -28
- package/src/daemon/handlers/config-slack-channel.ts +269 -94
- package/src/daemon/handlers/conversations.ts +4 -1
- package/src/daemon/handlers/shared.ts +22 -0
- package/src/daemon/handlers/skills.ts +321 -77
- package/src/daemon/host-browser-proxy.ts +2 -1
- package/src/daemon/lifecycle.ts +122 -25
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/conversations.ts +34 -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 +14 -0
- 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/server.ts +347 -2
- package/src/daemon/shutdown-handlers.ts +32 -4
- package/src/daemon/shutdown-registry.ts +40 -0
- package/src/daemon/tool-side-effects.ts +9 -0
- package/src/email/html-renderer.ts +76 -0
- package/src/heartbeat/heartbeat-service.ts +93 -7
- 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 +194 -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 +398 -0
- package/src/home/assistant-feed-authoring.ts +124 -0
- package/src/home/emit-feed-event.ts +158 -0
- package/src/home/feed-scheduler.ts +247 -0
- package/src/home/feed-types.ts +181 -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 +384 -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__/cli-ipc.test.ts +200 -0
- package/src/ipc/cli-client.ts +151 -0
- package/src/ipc/cli-server.ts +234 -0
- package/src/ipc/gateway-client.ts +180 -0
- package/src/ipc/routes/index.ts +5 -0
- package/src/ipc/routes/wake-conversation.ts +19 -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 +232 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +196 -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 +73 -0
- package/src/memory/conversation-crud.ts +99 -0
- package/src/memory/conversation-disk-view.ts +7 -0
- package/src/memory/conversation-group-migration.ts +34 -2
- package/src/memory/conversation-queries.ts +6 -5
- package/src/memory/db-init.ts +6 -0
- package/src/memory/db-maintenance.ts +108 -0
- package/src/memory/db.ts +1 -0
- package/src/memory/graph/conversation-graph-memory.ts +15 -0
- package/src/memory/graph/extraction.test.ts +23 -0
- package/src/memory/graph/extraction.ts +8 -0
- package/src/memory/graph/retriever.ts +27 -18
- package/src/memory/graph/scoring.test.ts +186 -0
- package/src/memory/graph/scoring.ts +31 -1
- package/src/memory/graph/tools.ts +1 -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 +16 -10
- package/src/memory/jobs-store.ts +64 -4
- package/src/memory/jobs-worker.ts +22 -9
- package/src/memory/llm-usage-store.ts +92 -56
- 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/index.ts +6 -0
- package/src/memory/migrations/registry.ts +8 -0
- 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/usage-buckets.ts +396 -0
- package/src/messaging/providers/gmail/client.ts +57 -6
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +282 -0
- package/src/messaging/providers/slack/adapter.ts +143 -38
- package/src/messaging/providers/slack/client.ts +16 -0
- package/src/messaging/providers/slack/types.ts +4 -0
- package/src/notifications/decision-engine.ts +3 -3
- 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 +9 -0
- package/src/oauth/platform-connection.test.ts +98 -0
- package/src/oauth/platform-connection.ts +52 -31
- package/src/oauth/seed-providers.ts +7 -0
- package/src/permissions/checker.ts +16 -6
- package/src/permissions/defaults.ts +49 -1
- package/src/permissions/trust-store.ts +3 -3
- package/src/permissions/workspace-policy.ts +3 -0
- package/src/platform/client.test.ts +10 -0
- package/src/platform/sync-identity.ts +129 -0
- package/src/prompts/persona-resolver.ts +126 -2
- package/src/prompts/system-prompt.ts +59 -18
- package/src/prompts/templates/BOOTSTRAP.md +5 -5
- package/src/prompts/templates/SOUL.md +3 -1
- package/src/prompts/templates/UPDATES.md +12 -0
- package/src/prompts/templates/channels/slack.md +20 -0
- package/src/prompts/update-bulletin-format.ts +26 -9
- package/src/prompts/update-bulletin.ts +34 -23
- package/src/prompts/user-reference.ts +20 -17
- package/src/providers/__tests__/provider-secret-catalog.test.ts +42 -0
- package/src/providers/anthropic/client.ts +157 -61
- package/src/providers/fireworks/client.ts +2 -2
- package/src/providers/gemini/client.ts +9 -1
- package/src/providers/model-catalog.ts +6 -0
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/ollama/client.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +474 -0
- package/src/providers/openai/client.ts +25 -440
- package/src/providers/openai/responses-provider.ts +502 -0
- package/src/providers/openrouter/client.ts +101 -4
- package/src/providers/provider-secret-catalog.ts +139 -0
- package/src/providers/registry.ts +2 -2
- package/src/providers/retry.ts +14 -3
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +251 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +828 -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 +306 -0
- package/src/providers/speech-to-text/resolve.ts +386 -6
- package/src/providers/types.ts +9 -0
- package/src/runtime/AGENTS.md +43 -1
- package/src/runtime/__tests__/agent-wake.test.ts +831 -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 +512 -0
- package/src/runtime/auth/__tests__/route-policy.test.ts +40 -0
- package/src/runtime/auth/route-policy.ts +30 -5
- package/src/runtime/auth/token-service.ts +56 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- 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/chrome-extension-registry.ts +38 -2
- package/src/runtime/http-server.ts +395 -10
- package/src/runtime/http-types.ts +6 -2
- 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/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 +34 -0
- 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 +507 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +208 -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/attachment-routes.test.ts +9 -3
- package/src/runtime/routes/attachment-routes.ts +216 -17
- 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 +8 -6
- 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 +115 -0
- package/src/runtime/routes/conversation-routes.ts +367 -146
- package/src/runtime/routes/filing-routes.ts +93 -0
- package/src/runtime/routes/home-feed-routes.ts +334 -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-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 +11 -3
- package/src/runtime/routes/integrations/slack/share.ts +45 -7
- package/src/runtime/routes/llm-context-normalization.ts +303 -0
- package/src/runtime/routes/memory-item-routes.test.ts +3 -2
- package/src/runtime/routes/migration-routes.ts +40 -5
- package/src/runtime/routes/settings-routes.ts +22 -5
- 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/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.ts +8 -1
- package/src/runtime/runtime-mode.ts +33 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +444 -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 +344 -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 +49 -0
- package/src/runtime/slack-block-formatting.ts +437 -10
- package/src/schedule/scheduler.ts +50 -0
- package/src/security/oauth2.ts +26 -4
- package/src/security/secure-keys.ts +25 -2
- package/src/security/token-manager.ts +8 -0
- package/src/sequence/engine.ts +23 -0
- package/src/sequence/types.ts +1 -1
- package/src/skills/catalog-files.ts +64 -2
- 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-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 +392 -0
- package/src/stt/__tests__/types.test.ts +89 -0
- package/src/stt/daemon-batch-transcriber.ts +195 -0
- package/src/stt/stt-stream-session.ts +499 -0
- package/src/stt/types.ts +330 -0
- package/src/stt/wav-encoder.test.ts +373 -0
- package/src/stt/wav-encoder.ts +175 -0
- package/src/subagent/manager.ts +38 -14
- package/src/tools/browser/__tests__/browser-mode.test.ts +119 -0
- package/src/tools/browser/__tests__/browser-status.test.ts +123 -0
- package/src/tools/browser/browser-execution.ts +1163 -23
- 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 +183 -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/vault.ts +35 -6
- package/src/tools/network/web-fetch.ts +5 -2
- package/src/tools/network/web-search.ts +5 -2
- package/src/tools/shared/shell-output.ts +3 -1
- package/src/tools/side-effects.ts +2 -0
- package/src/tools/skills/sandbox-runner.ts +3 -2
- package/src/tools/terminal/safe-env.ts +10 -2
- package/src/tools/terminal/shell.ts +15 -4
- package/src/tools/tool-manifest.ts +21 -0
- package/src/tools/types.ts +17 -0
- package/src/tools/ui-surface/definitions.ts +6 -1
- package/src/tts/__tests__/provider-adapters.test.ts +834 -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 +201 -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 +42 -0
- package/src/tts/providers/register-builtins.ts +130 -0
- package/src/tts/synthesize-text.ts +110 -0
- package/src/tts/tts-config-resolver.ts +78 -0
- package/src/tts/types.ts +153 -0
- package/src/types/onboarding-context.ts +7 -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/platform.ts +54 -10
- package/src/util/pricing.ts +66 -3
- 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 +23 -0
- package/src/watcher/watcher-store.ts +31 -0
- 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/registry.ts +16 -0
- 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/cli/commands/browser-relay.ts +0 -466
- 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/USER.md +0 -13
- package/src/providers/speech-to-text/types.ts +0 -17
- package/src/runtime/routes/browser-cdp-routes.ts +0 -229
|
@@ -9,6 +9,20 @@ export {
|
|
|
9
9
|
createExtensionCdpClient,
|
|
10
10
|
ExtensionCdpClient,
|
|
11
11
|
} from "./extension-cdp-client.js";
|
|
12
|
-
export {
|
|
12
|
+
export {
|
|
13
|
+
buildCandidateList,
|
|
14
|
+
buildChainedClient,
|
|
15
|
+
buildPinnedCandidateList,
|
|
16
|
+
getCdpClient,
|
|
17
|
+
type GetCdpClientOptions,
|
|
18
|
+
} from "./factory.js";
|
|
13
19
|
export { createLocalCdpClient, LocalCdpClient } from "./local-cdp-client.js";
|
|
14
|
-
export type {
|
|
20
|
+
export type {
|
|
21
|
+
AttemptDiagnostic,
|
|
22
|
+
AttemptStage,
|
|
23
|
+
BackendCandidate,
|
|
24
|
+
BrowserMode,
|
|
25
|
+
CdpClient,
|
|
26
|
+
CdpClientKind,
|
|
27
|
+
ScopedCdpClient,
|
|
28
|
+
} from "./types.js";
|
|
@@ -41,6 +41,51 @@ export interface CdpClient {
|
|
|
41
41
|
*/
|
|
42
42
|
export type CdpClientKind = "local" | "extension" | "cdp-inspect";
|
|
43
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Backend mode preference for the CDP factory. Controls which
|
|
46
|
+
* transport is selected:
|
|
47
|
+
*
|
|
48
|
+
* - `"auto"` — default, existing priority-ordered fallback
|
|
49
|
+
* (extension → cdp-inspect → local).
|
|
50
|
+
* - `"extension"` — pin to the chrome-extension backend. Fails
|
|
51
|
+
* immediately if the host browser proxy is unavailable.
|
|
52
|
+
* - `"cdp-inspect"` — pin to the cdp-inspect backend. Fails
|
|
53
|
+
* immediately if cdp-inspect cannot connect.
|
|
54
|
+
* - `"local"` — pin to the local Playwright backend. No fallback.
|
|
55
|
+
*/
|
|
56
|
+
export type BrowserMode = "auto" | "extension" | "cdp-inspect" | "local";
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Stage at which a candidate attempt ended. Used in
|
|
60
|
+
* {@link AttemptDiagnostic} to indicate how far the attempt progressed.
|
|
61
|
+
*/
|
|
62
|
+
export type AttemptStage =
|
|
63
|
+
| "candidate_selection" // failed before construction (precondition not met)
|
|
64
|
+
| "construction" // create() threw
|
|
65
|
+
| "send" // manager.send() threw or returned an error envelope
|
|
66
|
+
| "success"; // command completed successfully
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Structured diagnostic for a single candidate attempt during the
|
|
70
|
+
* factory's failover walk. Collected into an array and attached to
|
|
71
|
+
* thrown {@link CdpError} instances so higher layers can render
|
|
72
|
+
* detailed failure information in user-facing tool errors.
|
|
73
|
+
*/
|
|
74
|
+
export interface AttemptDiagnostic {
|
|
75
|
+
/** Which backend kind was attempted. */
|
|
76
|
+
readonly candidateKind: CdpClientKind;
|
|
77
|
+
/** Why this candidate was included (from {@link BackendCandidate.reason}). */
|
|
78
|
+
readonly inclusionReason: string;
|
|
79
|
+
/** How far the attempt progressed before it ended. */
|
|
80
|
+
readonly stage: AttemptStage;
|
|
81
|
+
/** Error code from the CdpError, if the attempt failed. */
|
|
82
|
+
readonly errorCode?: string;
|
|
83
|
+
/** Error message from the CdpError, if the attempt failed. */
|
|
84
|
+
readonly errorMessage?: string;
|
|
85
|
+
/** Discovery-level error code extracted from the underlying error, if any. */
|
|
86
|
+
readonly discoveryCode?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
44
89
|
/**
|
|
45
90
|
* Concrete CdpClient instance returned by the factory. Carries the
|
|
46
91
|
* backend `kind` for transport-aware branches in tool code.
|
|
@@ -50,3 +95,26 @@ export interface ScopedCdpClient extends CdpClient {
|
|
|
50
95
|
/** Stable conversation id this client is bound to. */
|
|
51
96
|
readonly conversationId: string;
|
|
52
97
|
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* A deferred backend candidate used by the chained factory. Each
|
|
101
|
+
* candidate carries a `kind` label and a `create` thunk that
|
|
102
|
+
* materialises the underlying {@link CdpClient} + {@link BrowserBackend}
|
|
103
|
+
* on demand. The factory only calls `create()` when the candidate is
|
|
104
|
+
* actually selected (either as the primary or as a failover target),
|
|
105
|
+
* so backends that are never reached pay zero setup cost.
|
|
106
|
+
*/
|
|
107
|
+
export interface BackendCandidate {
|
|
108
|
+
readonly kind: CdpClientKind;
|
|
109
|
+
/** Human-readable reason this candidate was included. */
|
|
110
|
+
readonly reason: string;
|
|
111
|
+
/**
|
|
112
|
+
* Materialise the backend. Called at most once — the factory caches
|
|
113
|
+
* the result after the first successful CDP command so subsequent
|
|
114
|
+
* commands reuse the same backend (sticky semantics).
|
|
115
|
+
*/
|
|
116
|
+
create(): {
|
|
117
|
+
client: CdpClient;
|
|
118
|
+
backend: import("../../../browser-session/types.js").BrowserBackend;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getConfig } from "../../config/loader.js";
|
|
2
2
|
import {
|
|
3
|
+
clearSlackUserToken,
|
|
3
4
|
setSlackChannelConfig,
|
|
4
5
|
type SlackChannelConfigResult,
|
|
5
6
|
} from "../../daemon/handlers/config-slack-channel.js";
|
|
@@ -37,20 +38,26 @@ const log = getLogger("credential-vault");
|
|
|
37
38
|
function isSlackChannelCredential(
|
|
38
39
|
service: string,
|
|
39
40
|
field: string,
|
|
40
|
-
): field is "bot_token" | "app_token" {
|
|
41
|
+
): field is "bot_token" | "app_token" | "user_token" {
|
|
41
42
|
return (
|
|
42
43
|
service === "slack_channel" &&
|
|
43
|
-
(field === "bot_token" ||
|
|
44
|
+
(field === "bot_token" ||
|
|
45
|
+
field === "app_token" ||
|
|
46
|
+
field === "user_token")
|
|
44
47
|
);
|
|
45
48
|
}
|
|
46
49
|
|
|
47
50
|
async function storeSlackChannelCredential(
|
|
48
|
-
field: "bot_token" | "app_token",
|
|
51
|
+
field: "bot_token" | "app_token" | "user_token",
|
|
49
52
|
value: string,
|
|
50
53
|
): Promise<SlackChannelConfigResult> {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
if (field === "bot_token") {
|
|
55
|
+
return setSlackChannelConfig(value, undefined);
|
|
56
|
+
}
|
|
57
|
+
if (field === "app_token") {
|
|
58
|
+
return setSlackChannelConfig(undefined, value);
|
|
59
|
+
}
|
|
60
|
+
return setSlackChannelConfig(undefined, undefined, value);
|
|
54
61
|
}
|
|
55
62
|
|
|
56
63
|
function formatSlackChannelStatus(result: SlackChannelConfigResult): string {
|
|
@@ -457,6 +464,28 @@ class CredentialStoreTool implements Tool {
|
|
|
457
464
|
};
|
|
458
465
|
}
|
|
459
466
|
|
|
467
|
+
// Surgical delete for the Slack user_token: it grants read-only access
|
|
468
|
+
// to channels the bot isn't a member of, but the Socket Mode connection
|
|
469
|
+
// is powered by the bot + app tokens. Tearing down the oauth_connection
|
|
470
|
+
// row when only user_token is removed would flap the integration's
|
|
471
|
+
// connected state until the next sync. Keep bot+app teardown behavior
|
|
472
|
+
// unchanged — those tokens are what the connection depends on.
|
|
473
|
+
if (service === "slack_channel" && field === "user_token") {
|
|
474
|
+
const slackResult = await clearSlackUserToken();
|
|
475
|
+
if (!slackResult.success) {
|
|
476
|
+
return {
|
|
477
|
+
content: `Error: ${
|
|
478
|
+
slackResult.error ?? "failed to delete Slack user token"
|
|
479
|
+
}`,
|
|
480
|
+
isError: true,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
return {
|
|
484
|
+
content: `Deleted credential for ${service}/${field}.`,
|
|
485
|
+
isError: false,
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
|
|
460
489
|
const key = credentialKey(service, field);
|
|
461
490
|
const result = await deleteSecureKeyAsync(key);
|
|
462
491
|
if (result === "error") {
|
|
@@ -8,6 +8,7 @@ import { Readable } from "node:stream";
|
|
|
8
8
|
import { RiskLevel } from "../../permissions/types.js";
|
|
9
9
|
import type { ToolDefinition } from "../../providers/types.js";
|
|
10
10
|
import { getLogger } from "../../util/logger.js";
|
|
11
|
+
import { safeStringSlice } from "../../util/unicode.js";
|
|
11
12
|
import { registerTool } from "../registry.js";
|
|
12
13
|
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
13
14
|
import {
|
|
@@ -357,11 +358,13 @@ function extractHtmlMetadata(html: string): {
|
|
|
357
358
|
// regex backtracking on large HTML documents.
|
|
358
359
|
// Strip <script> blocks first so that a literal "</head>" inside a script
|
|
359
360
|
// doesn't cause a false match that truncates the search region prematurely.
|
|
360
|
-
const candidate = html
|
|
361
|
+
const candidate = safeStringSlice(html, 0, 200_000);
|
|
361
362
|
const stripped = candidate.replace(/<script[\s>][\s\S]*?<\/script>/gi, "");
|
|
362
363
|
const headEnd = stripped.search(/<\/head[\s>]/i);
|
|
363
364
|
const searchRegion =
|
|
364
|
-
headEnd >= 0
|
|
365
|
+
headEnd >= 0
|
|
366
|
+
? safeStringSlice(stripped, 0, headEnd + 10)
|
|
367
|
+
: safeStringSlice(stripped, 0, 50_000);
|
|
365
368
|
|
|
366
369
|
const title = extractFirstMatch(
|
|
367
370
|
searchRegion,
|
|
@@ -61,6 +61,9 @@ async function getApiKey(
|
|
|
61
61
|
return (await getProviderKeyAsync("perplexity")) ?? undefined;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
const CITATION_INSTRUCTION =
|
|
65
|
+
"\n\nWhen presenting these results, cite sources as inline markdown hyperlinks next to the claims they support (e.g., 'according to [Source Title](url)'). Do not list references separately at the end.";
|
|
66
|
+
|
|
64
67
|
function formatBraveResults(
|
|
65
68
|
results: BraveSearchResult[],
|
|
66
69
|
query: string,
|
|
@@ -89,7 +92,7 @@ function formatBraveResults(
|
|
|
89
92
|
lines.push("");
|
|
90
93
|
}
|
|
91
94
|
|
|
92
|
-
return lines.join("\n");
|
|
95
|
+
return lines.join("\n") + CITATION_INSTRUCTION;
|
|
93
96
|
}
|
|
94
97
|
|
|
95
98
|
function formatPerplexityResults(
|
|
@@ -111,7 +114,7 @@ function formatPerplexityResults(
|
|
|
111
114
|
}
|
|
112
115
|
}
|
|
113
116
|
|
|
114
|
-
return lines.join("\n");
|
|
117
|
+
return lines.join("\n") + CITATION_INSTRUCTION;
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
async function executeBraveSearch(
|
|
@@ -3,6 +3,8 @@ import { unlinkSync, writeFileSync } from "node:fs";
|
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
|
|
6
|
+
import { safeStringSlice } from "../../util/unicode.js";
|
|
7
|
+
|
|
6
8
|
export const MAX_OUTPUT_LENGTH = 20_000;
|
|
7
9
|
|
|
8
10
|
/** Tracks temp files created for truncated shell output so they can be cleaned up on shutdown. */
|
|
@@ -63,7 +65,7 @@ export function formatShellOutput(
|
|
|
63
65
|
}
|
|
64
66
|
const fileAttr = fullOutputPath ? ` file="${fullOutputPath}"` : "";
|
|
65
67
|
const msg = `<output_truncated limit="20K"${fileAttr} />`;
|
|
66
|
-
output = output
|
|
68
|
+
output = safeStringSlice(output, 0, MAX_OUTPUT_LENGTH) + `\n${msg}`;
|
|
67
69
|
statusParts.push(msg);
|
|
68
70
|
}
|
|
69
71
|
|
|
@@ -4,6 +4,7 @@ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
|
4
4
|
import { join, resolve } from "node:path";
|
|
5
5
|
|
|
6
6
|
import { computeSkillVersionHash } from "../../skills/version-hash.js";
|
|
7
|
+
import { safeStringSlice } from "../../util/unicode.js";
|
|
7
8
|
import { buildSanitizedEnv } from "../terminal/safe-env.js";
|
|
8
9
|
import { wrapCommand } from "../terminal/sandbox.js";
|
|
9
10
|
import type { ToolContext, ToolExecutionResult } from "../types.js";
|
|
@@ -218,7 +219,7 @@ function spawnRunner(
|
|
|
218
219
|
if (code !== 0) {
|
|
219
220
|
const truncatedStderr =
|
|
220
221
|
stderr.length > MAX_OUTPUT_CHARS
|
|
221
|
-
? stderr
|
|
222
|
+
? safeStringSlice(stderr, 0, MAX_OUTPUT_CHARS) + "\n[stderr truncated]"
|
|
222
223
|
: stderr;
|
|
223
224
|
resolve({
|
|
224
225
|
content: `Skill tool script "${executorPath}" exited with code ${code}:\n${truncatedStderr}`,
|
|
@@ -229,7 +230,7 @@ function spawnRunner(
|
|
|
229
230
|
|
|
230
231
|
const truncatedStdout =
|
|
231
232
|
stdout.length > MAX_OUTPUT_CHARS
|
|
232
|
-
? stdout
|
|
233
|
+
? safeStringSlice(stdout, 0, MAX_OUTPUT_CHARS) + "\n[stdout truncated]"
|
|
233
234
|
: stdout;
|
|
234
235
|
resolve({ content: truncatedStdout, isError: false });
|
|
235
236
|
});
|
|
@@ -28,10 +28,13 @@ export const SAFE_ENV_VARS = [
|
|
|
28
28
|
"GPG_TTY",
|
|
29
29
|
"GNUPGHOME",
|
|
30
30
|
"VELLUM_DEV",
|
|
31
|
+
"VELLUM_DEBUG",
|
|
32
|
+
"VELLUM_ENVIRONMENT",
|
|
31
33
|
"VELLUM_WORKSPACE_DIR",
|
|
32
34
|
"CES_BOOTSTRAP_SOCKET_DIR",
|
|
33
35
|
"GATEWAY_INTERNAL_URL",
|
|
34
36
|
"VELLUM_PLATFORM_URL",
|
|
37
|
+
"VELLUM_ASSISTANT_PLATFORM_URL",
|
|
35
38
|
"VELLUM_DOCS_BASE_URL",
|
|
36
39
|
"CES_CREDENTIAL_URL",
|
|
37
40
|
"CES_MANAGED_MODE",
|
|
@@ -45,6 +48,8 @@ export const SAFE_ENV_VARS = [
|
|
|
45
48
|
"VELLUM_PROFILER_MIN_FREE_MB",
|
|
46
49
|
"VELLUM_MEMORY_LIMIT",
|
|
47
50
|
"VELLUM_CPU_LIMIT",
|
|
51
|
+
"VELLUM_BACKUP_DIR",
|
|
52
|
+
"VELLUM_BACKUP_KEY_PATH",
|
|
48
53
|
] as const;
|
|
49
54
|
|
|
50
55
|
/**
|
|
@@ -76,7 +81,10 @@ export function buildSanitizedEnv(): Record<string, string> {
|
|
|
76
81
|
env.VELLUM_WORKSPACE_DIR = getWorkspaceDir();
|
|
77
82
|
// Ensure UTF-8 locale so multi-byte characters (em dashes, curly quotes,
|
|
78
83
|
// arrows, etc.) survive piping through tools like pbcopy without corruption.
|
|
79
|
-
|
|
80
|
-
|
|
84
|
+
// macOS (Darwin) does not provide C.UTF-8, so use en_US.UTF-8 there.
|
|
85
|
+
const utf8Locale =
|
|
86
|
+
process.platform === "darwin" ? "en_US.UTF-8" : "C.UTF-8";
|
|
87
|
+
if (!env.LANG) env.LANG = utf8Locale;
|
|
88
|
+
if (!env.LC_ALL) env.LC_ALL = utf8Locale;
|
|
81
89
|
return env;
|
|
82
90
|
}
|
|
@@ -9,7 +9,11 @@ import type { ToolDefinition } from "../../providers/types.js";
|
|
|
9
9
|
import { isUntrustedTrustClass } from "../../runtime/actor-trust-resolver.js";
|
|
10
10
|
import { redactSecrets } from "../../security/secret-scanner.js";
|
|
11
11
|
import { getLogger } from "../../util/logger.js";
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
getDataDir,
|
|
14
|
+
getProtectedDir,
|
|
15
|
+
getWorkspaceDir,
|
|
16
|
+
} from "../../util/platform.js";
|
|
13
17
|
import { resolveCredentialRef } from "../credentials/resolve.js";
|
|
14
18
|
import {
|
|
15
19
|
getOrStartSession,
|
|
@@ -46,9 +50,16 @@ function buildCredentialRefTrace(
|
|
|
46
50
|
* - CES managed-mode data root (CES_DATA_DIR, or /ces-data when CES_MANAGED_MODE is set)
|
|
47
51
|
*/
|
|
48
52
|
function buildCesProtectedPaths(): string[] {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
53
|
+
// Block both the legacy global protected dir and the current per-instance
|
|
54
|
+
// protected dir so the sandbox read-block works in both single-instance
|
|
55
|
+
// and multi-instance setups. In the default case (no BASE_DATA_DIR) the
|
|
56
|
+
// two entries collapse via the Set dedupe.
|
|
57
|
+
const protectedDirs = process.env.GATEWAY_SECURITY_DIR
|
|
58
|
+
? [process.env.GATEWAY_SECURITY_DIR]
|
|
59
|
+
: Array.from(
|
|
60
|
+
new Set([join(homedir(), ".vellum", "protected"), getProtectedDir()]),
|
|
61
|
+
);
|
|
62
|
+
const paths = [...protectedDirs, join(getWorkspaceDir(), "data", "db")];
|
|
52
63
|
|
|
53
64
|
// CES bootstrap socket directory - block access to the Unix socket that
|
|
54
65
|
// accepts RPC commands from the assistant process.
|
|
@@ -29,6 +29,24 @@ import { requestSystemPermissionTool } from "./system/request-permission.js";
|
|
|
29
29
|
import { shellTool } from "./terminal/shell.js";
|
|
30
30
|
import type { Tool } from "./types.js";
|
|
31
31
|
|
|
32
|
+
// ── External tool registry ───────────────────────────────────────────
|
|
33
|
+
// Skills register their tools here at initialization time so the tool
|
|
34
|
+
// manifest can include them without importing from `../skills/`.
|
|
35
|
+
const externalTools: Tool[] = [];
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Register tools provided by an external skill. Called during skill
|
|
39
|
+
* initialization.
|
|
40
|
+
*/
|
|
41
|
+
export function registerExternalTools(tools: Tool[]): void {
|
|
42
|
+
externalTools.push(...tools);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Return all externally registered tools. */
|
|
46
|
+
export function getExternalTools(): Tool[] {
|
|
47
|
+
return [...externalTools];
|
|
48
|
+
}
|
|
49
|
+
|
|
32
50
|
// ── Eager side-effect modules ───────────────────────────────────────
|
|
33
51
|
// These static imports trigger top-level `registerTool()` side effects on
|
|
34
52
|
// first evaluation. The named imports above serve double duty: they give us
|
|
@@ -91,6 +109,9 @@ export const explicitTools: Tool[] = [
|
|
|
91
109
|
recallTool,
|
|
92
110
|
credentialStoreTool,
|
|
93
111
|
notifyParentTool,
|
|
112
|
+
// Meet tools are registered via registerExternalTools() during skill
|
|
113
|
+
// initialization — the assistant never imports directly from skills/.
|
|
114
|
+
...getExternalTools(),
|
|
94
115
|
];
|
|
95
116
|
|
|
96
117
|
// ── CES tools (feature-flag gated) ──────────────────────────────────
|
package/src/tools/types.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ApprovalRequired } from "@vellumai/ces-contracts";
|
|
2
2
|
|
|
3
|
+
import type { InterfaceId } from "../channels/types.js";
|
|
3
4
|
import type { CesClient } from "../credential-execution/client.js";
|
|
4
5
|
import type { SecretPromptResult } from "../permissions/secret-prompter.js";
|
|
5
6
|
import type {
|
|
@@ -162,6 +163,14 @@ export interface ToolContext {
|
|
|
162
163
|
callSessionId?: string;
|
|
163
164
|
/** True when the tool invocation was triggered by a user clicking a surface action button (not a regular message). */
|
|
164
165
|
triggeredBySurfaceAction?: boolean;
|
|
166
|
+
/**
|
|
167
|
+
* True when the invocation is inside a scheduled task run whose
|
|
168
|
+
* `required_tools` array pre-authorized this tool at task-creation time.
|
|
169
|
+
* Tools that normally require a surface-action click (e.g. bulk archive,
|
|
170
|
+
* unsubscribe) may treat this as equivalent consent, since the user
|
|
171
|
+
* already reviewed the tool list when the task was saved.
|
|
172
|
+
*/
|
|
173
|
+
batchAuthorizedByTask?: boolean;
|
|
165
174
|
/** External user ID of the requester (non-guardian actor). Used for scoped grant consumption. */
|
|
166
175
|
requesterExternalUserId?: string;
|
|
167
176
|
/** Chat ID of the requester (non-guardian actor). Used for tool grant request escalation notifications. */
|
|
@@ -184,6 +193,14 @@ export interface ToolContext {
|
|
|
184
193
|
isPlatformHosted?: boolean;
|
|
185
194
|
/** CES RPC client for credential execution operations. When present, the executor can bridge CES approval flows. */
|
|
186
195
|
cesClient?: CesClient;
|
|
196
|
+
/**
|
|
197
|
+
* The interface ID of the connected client driving the current turn (e.g.
|
|
198
|
+
* "macos", "chrome-extension"). Browser backend policy uses this to decide
|
|
199
|
+
* transport preference — for example, macOS-originated turns prefer the
|
|
200
|
+
* user's real Chrome session via the paired extension before falling back
|
|
201
|
+
* to cdp-inspect or local Playwright.
|
|
202
|
+
*/
|
|
203
|
+
transportInterface?: InterfaceId;
|
|
187
204
|
}
|
|
188
205
|
|
|
189
206
|
export interface DiffInfo {
|
|
@@ -31,7 +31,7 @@ export const uiShowTool: Tool = {
|
|
|
31
31
|
"Show structured data or UI to the user. For long-form writing use the document skill; for interactive apps use the app-builder skill.\n\n" +
|
|
32
32
|
"Surface types (data shapes):\n" +
|
|
33
33
|
'- card: { title, subtitle?, body, metadata?: [{ label, value }], template?, templateData? }. Templates: "weather_forecast" (native weather widget), "task_progress" (live step tracker - update via ui_update on data.templateData; shape: { title, status: "in_progress"|"completed"|"failed", steps: [{ label, status: "pending"|"in_progress"|"completed"|"failed", detail? }] })\n' +
|
|
34
|
-
'- table: { columns: [{ id, label
|
|
34
|
+
'- table: { columns: [{ id, label }], rows: [{ id, cells: Record<id, string | { text, icon?, iconColor?: "success"|"warning"|"error"|"muted" }>, selectable?, selected? }], selectionMode?: "none"|"single"|"multiple", caption? }\n' +
|
|
35
35
|
'- form: { description?, fields: [{ id, type: "text"|"textarea"|"select"|"toggle"|"number"|"password", label, placeholder?, required?, defaultValue?, options?: [{ label, value }] }], submitLabel? }. Multi-page: { pages: [{ id, title, description?, fields }], pageLabels?: { next?, back?, submit? }, submitLabel? }\n' +
|
|
36
36
|
'- list: { items: [{ id, title, subtitle?, icon?, selected? }], selectionMode: "single"|"multiple"|"none" }\n' +
|
|
37
37
|
"- confirmation: { message, detail?, confirmLabel?, confirmedLabel?, cancelLabel?, destructive? }\n" +
|
|
@@ -98,6 +98,11 @@ export const uiShowTool: Tool = {
|
|
|
98
98
|
description:
|
|
99
99
|
"Whether to block until the user interacts with an action. Defaults to true when actions are provided.",
|
|
100
100
|
},
|
|
101
|
+
persistent: {
|
|
102
|
+
type: "boolean",
|
|
103
|
+
description:
|
|
104
|
+
"When true, clicking an action does not dismiss the surface — the card stays visible and only the clicked action is marked as spent. Use for launcher or menu-style cards where the user may click multiple buttons. Defaults to false.",
|
|
105
|
+
},
|
|
101
106
|
},
|
|
102
107
|
required: ["surface_type", "data"],
|
|
103
108
|
},
|