@vellumai/assistant 0.6.4 → 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 +32 -36
- package/Dockerfile +12 -0
- package/README.md +3 -4
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +1 -20
- package/docs/architecture/security.md +16 -16
- package/docs/error-handling.md +111 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- 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 +123 -11
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- 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 +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- 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__/browser-fill-credential.test.ts +1 -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 +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +27 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +428 -501
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- 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 +11 -28
- 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 +427 -114
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +530 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +30 -16
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +61 -17
- package/src/__tests__/conversation-agent-loop.test.ts +412 -82
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +30 -9
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +6 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +36 -0
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +30 -16
- package/src/__tests__/conversation-process-callsite.test.ts +306 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -16
- package/src/__tests__/conversation-queue.test.ts +41 -26
- package/src/__tests__/conversation-routes-disk-view.test.ts +29 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2735 -55
- package/src/__tests__/conversation-runtime-workspace.test.ts +12 -12
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +34 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +30 -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 +1 -1
- 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 +43 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +44 -16
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-security-invariants.test.ts +3 -0
- 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 +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- 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__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -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 +26 -7
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/intent-routing.test.ts +1 -40
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +684 -0
- package/src/__tests__/model-intents.test.ts +9 -83
- 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-store.test.ts +10 -7
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -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 +13 -13
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/pricing.test.ts +50 -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__/reaction-persistence.test.ts +560 -0
- package/src/__tests__/relay-server.test.ts +1 -1
- 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__/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 +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -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 +22 -35
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- 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 +2 -2
- package/src/__tests__/tool-executor.test.ts +60 -94
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- 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-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 +11 -11
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +1 -13
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +209 -17
- 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/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/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/commands/__tests__/attachment.test.ts +438 -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__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- 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/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 +14 -1
- package/src/cli/commands/email.ts +234 -194
- 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/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -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 +23 -4
- package/src/cli.ts +0 -37
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +23 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +8 -1
- 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/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -175
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +30 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +318 -0
- 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 +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +53 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skills.ts +2 -2
- 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/prompts/compact.md +12 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/window-manager.ts +229 -25
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- 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 +0 -1
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +79 -12
- package/src/daemon/conversation-agent-loop.ts +462 -80
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-lifecycle.ts +30 -6
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-process.ts +10 -4
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +760 -29
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +10 -5
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +118 -30
- 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/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +2 -2
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +76 -14
- package/src/daemon/message-types/conversations.ts +14 -0
- package/src/daemon/message-types/messages.ts +9 -1
- 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 +117 -9
- package/src/daemon/tool-side-effects.ts +0 -9
- package/src/daemon/watch-handler.ts +4 -4
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/heartbeat-service.ts +76 -28
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +4 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +56 -2
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- 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__/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 +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +4 -4
- 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 +17 -1
- 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/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +100 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +103 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-title-service.ts +7 -4
- package/src/memory/db-init.ts +2 -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 +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +173 -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 +230 -48
- 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/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- 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 +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/index.ts +1 -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/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -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/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/oauth/oauth-store.ts +1 -0
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/seed-providers.ts +4 -2
- 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 +217 -708
- package/src/permissions/command-registry.test.ts +535 -0
- package/src/permissions/command-registry.ts +825 -0
- package/src/permissions/defaults.ts +26 -78
- 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 +161 -62
- 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 -16
- package/src/platform/client.ts +19 -1
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- 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__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +501 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +76 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- 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 +93 -3
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -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 +52 -1
- package/src/runtime/http-types.ts +23 -1
- 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-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/vbundle-importer.ts +154 -9
- 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/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- 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/avatar-routes.ts +20 -4
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +133 -27
- 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/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- 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/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/migration-routes.ts +720 -124
- package/src/runtime/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +28 -6
- package/src/schedule/scheduler.ts +8 -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 +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +26 -7
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +45 -2
- package/src/tools/browser/browser-execution.ts +65 -38
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- 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 +20 -10
- package/src/tools/network/web-search.ts +19 -4
- 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/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +12 -3
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +2 -2
- package/src/util/pricing.ts +15 -5
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- 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 +16 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- 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 -279
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- 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-detach.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-status.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 -49
- 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 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- 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 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- 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 -347
- 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 -108
- 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/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- 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 -139
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Seed latency-optimized call-site defaults for background LLM tasks.
|
|
8
|
+
*
|
|
9
|
+
* Migration 038 consolidated scattered LLM config keys but only wrote
|
|
10
|
+
* per-call-site entries when the legacy config had *explicit* overrides.
|
|
11
|
+
* Call sites that relied on runtime `modelIntent: "latency-optimized"`
|
|
12
|
+
* (guardian copy, classifier, notifications, etc.) were left without
|
|
13
|
+
* entries, causing them to fall through to `llm.default` (opus with max
|
|
14
|
+
* effort) — a significant cost and latency regression.
|
|
15
|
+
*
|
|
16
|
+
* Seeds the missing entries with the appropriate fast model for the
|
|
17
|
+
* workspace's configured provider. Runs in two modes:
|
|
18
|
+
*
|
|
19
|
+
* 1. **Existing workspace** (config.json present): read provider from
|
|
20
|
+
* `llm.default.provider`, merge seeds into `llm.callSites` without
|
|
21
|
+
* overwriting any user-defined overrides.
|
|
22
|
+
* 2. **Fresh install** (config.json absent): write a minimal starter
|
|
23
|
+
* config with just the callSite seeds, using the default provider
|
|
24
|
+
* (anthropic — same as the schema default). `loadConfig()` runs
|
|
25
|
+
* after migrations and backfills the remaining schema defaults via
|
|
26
|
+
* `deepMergeMissing`, which preserves our seeded callSites.
|
|
27
|
+
*
|
|
28
|
+
* Without the fresh-install branch, new users permanently fall through
|
|
29
|
+
* to `llm.default` (opus + max effort) because `LLMSchema.callSites`
|
|
30
|
+
* defaults to `{}` and nothing else seeds the latency-optimized entries.
|
|
31
|
+
*
|
|
32
|
+
* **Provider gating.** `mergeDefaultWorkspaceConfig()` applies
|
|
33
|
+
* `VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH` *after* migrations run, so a
|
|
34
|
+
* platform-provided override that sets `llm.default.provider = openai`
|
|
35
|
+
* (or any non-Anthropic provider) without also setting `llm.callSites`
|
|
36
|
+
* would otherwise leave the workspace with OpenAI as the default but
|
|
37
|
+
* Anthropic model IDs in the seeded call sites — guaranteed
|
|
38
|
+
* invalid-model errors. Skip seeding when:
|
|
39
|
+
* - `VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH` is set (defer to that
|
|
40
|
+
* config to own the call-site seeds), or
|
|
41
|
+
* - `llm.default.provider` is explicitly set to a non-Anthropic value.
|
|
42
|
+
*/
|
|
43
|
+
export const seedLatencyCallSiteDefaultsMigration: WorkspaceMigration = {
|
|
44
|
+
id: "040-seed-latency-callsite-defaults",
|
|
45
|
+
description:
|
|
46
|
+
"Seed latency-optimized call-site defaults for background LLM tasks",
|
|
47
|
+
run(workspaceDir: string): void {
|
|
48
|
+
// If a platform default-config overlay is in play, it runs after
|
|
49
|
+
// migrations and is the authoritative source for both provider and
|
|
50
|
+
// call-site seeds. Skip to avoid mismatched provider/model pairs.
|
|
51
|
+
if (process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH) return;
|
|
52
|
+
|
|
53
|
+
const configPath = join(workspaceDir, "config.json");
|
|
54
|
+
const configExisted = existsSync(configPath);
|
|
55
|
+
|
|
56
|
+
let config: Record<string, unknown> = {};
|
|
57
|
+
if (configExisted) {
|
|
58
|
+
try {
|
|
59
|
+
const raw = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
60
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return;
|
|
61
|
+
config = raw as Record<string, unknown>;
|
|
62
|
+
} catch {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const llm = readObject(config.llm) ?? {};
|
|
68
|
+
const defaultBlock = readObject(llm.default);
|
|
69
|
+
|
|
70
|
+
// Only seed when the resolved provider is Anthropic. If the user has
|
|
71
|
+
// explicitly configured a different provider, skip — their config
|
|
72
|
+
// (or the provider's own defaults) should own the call-site seeds.
|
|
73
|
+
const explicitProvider = readString(defaultBlock?.provider);
|
|
74
|
+
if (explicitProvider !== undefined && explicitProvider !== "anthropic") {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const provider = explicitProvider ?? "anthropic";
|
|
78
|
+
const fastModel = resolveLatencyModel(provider);
|
|
79
|
+
if (fastModel === undefined) return;
|
|
80
|
+
|
|
81
|
+
const callSites = readObject(llm.callSites) ?? {};
|
|
82
|
+
|
|
83
|
+
const LATENCY_SITES = [
|
|
84
|
+
"guardianQuestionCopy",
|
|
85
|
+
"watchCommentary",
|
|
86
|
+
"interactionClassifier",
|
|
87
|
+
"skillCategoryInference",
|
|
88
|
+
"inviteInstructionGenerator",
|
|
89
|
+
"notificationDecision",
|
|
90
|
+
"preferenceExtraction",
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
let changed = false;
|
|
94
|
+
|
|
95
|
+
for (const site of LATENCY_SITES) {
|
|
96
|
+
if (readObject(callSites[site]) !== null) continue;
|
|
97
|
+
callSites[site] = {
|
|
98
|
+
model: fastModel,
|
|
99
|
+
effort: "low",
|
|
100
|
+
thinking: { enabled: false },
|
|
101
|
+
};
|
|
102
|
+
changed = true;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (readObject(callSites.commitMessage) === null) {
|
|
106
|
+
callSites.commitMessage = {
|
|
107
|
+
model: fastModel,
|
|
108
|
+
maxTokens: 120,
|
|
109
|
+
temperature: 0.2,
|
|
110
|
+
effort: "low",
|
|
111
|
+
thinking: { enabled: false },
|
|
112
|
+
};
|
|
113
|
+
changed = true;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (!changed) return;
|
|
117
|
+
|
|
118
|
+
llm.callSites = callSites;
|
|
119
|
+
config.llm = llm;
|
|
120
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
121
|
+
},
|
|
122
|
+
down(_workspaceDir: string): void {
|
|
123
|
+
// Forward-only: removing the seeded defaults would reintroduce the
|
|
124
|
+
// cost/latency regression this migration fixes.
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
// Helpers — self-contained per workspace migrations AGENTS.md
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
|
|
132
|
+
const PROVIDER_LATENCY_MODELS: Record<string, string> = {
|
|
133
|
+
anthropic: "claude-haiku-4-5-20251001",
|
|
134
|
+
openai: "gpt-5.4-nano",
|
|
135
|
+
gemini: "gemini-3-flash",
|
|
136
|
+
ollama: "llama3.2",
|
|
137
|
+
fireworks: "accounts/fireworks/models/kimi-k2p5",
|
|
138
|
+
openrouter: "anthropic/claude-haiku-4.5",
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
function resolveLatencyModel(provider: string): string | undefined {
|
|
142
|
+
return PROVIDER_LATENCY_MODELS[provider];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function readObject(value: unknown): Record<string, unknown> | null {
|
|
146
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
return value as Record<string, unknown>;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function readString(value: unknown): string | undefined {
|
|
153
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
154
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { rawGet, rawRun } from "../../memory/raw-query.js";
|
|
2
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
3
|
+
|
|
4
|
+
const GMAIL_SETTINGS_BASIC_SCOPE =
|
|
5
|
+
"https://www.googleapis.com/auth/gmail.settings.basic";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Backfill the `gmail.settings.basic` scope for existing Google provider rows.
|
|
9
|
+
*
|
|
10
|
+
* The scope was added to PROVIDER_SEED_DATA in #25970, but `seedProviders()`
|
|
11
|
+
* intentionally preserves `defaultScopes` on conflict (the `onConflictDoUpdate`
|
|
12
|
+
* in `oauth-store.ts` omits `defaultScopes` and `scopePolicy`). Any workspace
|
|
13
|
+
* that already had a `google` provider row never picked up the new scope.
|
|
14
|
+
*
|
|
15
|
+
* This migration reads the current `defaultScopes` JSON array for the `google`
|
|
16
|
+
* provider and appends the scope if it is not already present.
|
|
17
|
+
*/
|
|
18
|
+
export const backfillGoogleGmailSettingsScopeMigration: WorkspaceMigration = {
|
|
19
|
+
id: "041-backfill-google-gmail-settings-scope",
|
|
20
|
+
description:
|
|
21
|
+
"Backfill gmail.settings.basic scope for existing Google provider rows",
|
|
22
|
+
run(_workspaceDir: string): void {
|
|
23
|
+
let row: { defaultScopes: string } | null;
|
|
24
|
+
try {
|
|
25
|
+
row = rawGet<{ defaultScopes: string }>(
|
|
26
|
+
`SELECT defaultScopes FROM oauth_providers WHERE provider = 'google'`,
|
|
27
|
+
);
|
|
28
|
+
} catch {
|
|
29
|
+
// DB not initialized yet — nothing to backfill.
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (!row) return; // No google provider row — seed will create it fresh.
|
|
34
|
+
|
|
35
|
+
let scopes: string[];
|
|
36
|
+
try {
|
|
37
|
+
const parsed = JSON.parse(row.defaultScopes);
|
|
38
|
+
scopes = Array.isArray(parsed) ? parsed : [];
|
|
39
|
+
} catch {
|
|
40
|
+
scopes = [];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (scopes.includes(GMAIL_SETTINGS_BASIC_SCOPE)) return; // Already present.
|
|
44
|
+
|
|
45
|
+
scopes.push(GMAIL_SETTINGS_BASIC_SCOPE);
|
|
46
|
+
|
|
47
|
+
rawRun(
|
|
48
|
+
`UPDATE oauth_providers SET defaultScopes = ?, updatedAt = ? WHERE provider = 'google'`,
|
|
49
|
+
JSON.stringify(scopes),
|
|
50
|
+
new Date().toISOString(),
|
|
51
|
+
);
|
|
52
|
+
},
|
|
53
|
+
down(_workspaceDir: string): void {
|
|
54
|
+
// Forward-only: removing the scope would break Gmail settings functionality
|
|
55
|
+
// for users who have already started using it.
|
|
56
|
+
},
|
|
57
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { Database } from "bun:sqlite";
|
|
4
|
+
|
|
5
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
6
|
+
|
|
7
|
+
const GMAIL_SETTINGS_BASIC_SCOPE =
|
|
8
|
+
"https://www.googleapis.com/auth/gmail.settings.basic";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Re-run the gmail.settings.basic scope backfill with correct SQLite column names.
|
|
12
|
+
*
|
|
13
|
+
* Migration 041 used Drizzle property names (`defaultScopes`, `provider`,
|
|
14
|
+
* `updatedAt`) instead of the actual SQLite column names (`default_scopes`,
|
|
15
|
+
* `provider_key`, `updated_at`). The SQL silently failed because the catch
|
|
16
|
+
* block swallowed the error, and the migration was marked complete without
|
|
17
|
+
* actually backfilling the scope.
|
|
18
|
+
*
|
|
19
|
+
* This migration performs the same backfill with the correct column names.
|
|
20
|
+
*/
|
|
21
|
+
export const fixBackfillGoogleGmailSettingsScopeMigration: WorkspaceMigration =
|
|
22
|
+
{
|
|
23
|
+
id: "042-fix-backfill-google-gmail-settings-scope",
|
|
24
|
+
description:
|
|
25
|
+
"Re-run gmail.settings.basic scope backfill with correct SQLite column names",
|
|
26
|
+
run(workspaceDir: string): void {
|
|
27
|
+
const dbPath = join(workspaceDir, "data", "db", "assistant.db");
|
|
28
|
+
if (!existsSync(dbPath)) return; // DB not created yet — nothing to backfill.
|
|
29
|
+
|
|
30
|
+
let db: Database;
|
|
31
|
+
try {
|
|
32
|
+
db = new Database(dbPath);
|
|
33
|
+
} catch {
|
|
34
|
+
// Cannot open DB — nothing to backfill.
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const row = db
|
|
40
|
+
.query(
|
|
41
|
+
`SELECT default_scopes FROM oauth_providers WHERE provider_key = 'google'`,
|
|
42
|
+
)
|
|
43
|
+
.get() as { default_scopes: string } | null;
|
|
44
|
+
|
|
45
|
+
if (!row) return; // No google provider row — seed will create it fresh.
|
|
46
|
+
|
|
47
|
+
let scopes: string[];
|
|
48
|
+
try {
|
|
49
|
+
const parsed = JSON.parse(row.default_scopes);
|
|
50
|
+
scopes = Array.isArray(parsed) ? parsed : [];
|
|
51
|
+
} catch {
|
|
52
|
+
scopes = [];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (scopes.includes(GMAIL_SETTINGS_BASIC_SCOPE)) return; // Already present.
|
|
56
|
+
|
|
57
|
+
scopes.push(GMAIL_SETTINGS_BASIC_SCOPE);
|
|
58
|
+
|
|
59
|
+
db.query(
|
|
60
|
+
`UPDATE oauth_providers SET default_scopes = ?, updated_at = ? WHERE provider_key = 'google'`,
|
|
61
|
+
).run(JSON.stringify(scopes), Date.now());
|
|
62
|
+
} finally {
|
|
63
|
+
db.close();
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
down(_workspaceDir: string): void {
|
|
67
|
+
// Forward-only: removing the scope would break Gmail settings functionality
|
|
68
|
+
// for users who have already started using it.
|
|
69
|
+
},
|
|
70
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import {
|
|
2
|
+
appendFileSync,
|
|
3
|
+
existsSync,
|
|
4
|
+
readFileSync,
|
|
5
|
+
writeFileSync,
|
|
6
|
+
} from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
|
|
9
|
+
import { getLogger } from "../../util/logger.js";
|
|
10
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
11
|
+
|
|
12
|
+
const log = getLogger("workspace-migration-043-release-notes-latex-rendering");
|
|
13
|
+
|
|
14
|
+
const MIGRATION_ID = "043-release-notes-latex-rendering";
|
|
15
|
+
const MARKER = `<!-- release-note-id:${MIGRATION_ID} -->`;
|
|
16
|
+
|
|
17
|
+
const RELEASE_NOTE = `${MARKER}
|
|
18
|
+
## LaTeX math rendering in chat
|
|
19
|
+
|
|
20
|
+
I can now render LaTeX block-math expressions in the macOS chat. Content wrapped in \`$$...$$\` is typeset instead of shown as raw monospace text. Inline \`$...$\` math is planned as a follow-up.
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Release-notes migration for LaTeX block-math rendering in the macOS chat.
|
|
25
|
+
*
|
|
26
|
+
* Per AGENTS.md § Release Update Hygiene, user-facing changes ship notes via a
|
|
27
|
+
* workspace migration that appends to `<workspace>/UPDATES.md`. The in-file
|
|
28
|
+
* HTML marker guards against duplicate appends if the runner re-executes this
|
|
29
|
+
* migration after a mid-run crash (between `appendFileSync` and the runner's
|
|
30
|
+
* checkpoint promotion to `applied`), which the runner's own checkpoint state
|
|
31
|
+
* does not cover on its own.
|
|
32
|
+
*/
|
|
33
|
+
export const releaseNotesLatexRenderingMigration: WorkspaceMigration = {
|
|
34
|
+
id: MIGRATION_ID,
|
|
35
|
+
description:
|
|
36
|
+
"Append release notes for LaTeX block-math rendering to UPDATES.md",
|
|
37
|
+
|
|
38
|
+
run(workspaceDir: string): void {
|
|
39
|
+
const updatesPath = join(workspaceDir, "UPDATES.md");
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
if (existsSync(updatesPath)) {
|
|
43
|
+
const existing = readFileSync(updatesPath, "utf-8");
|
|
44
|
+
if (existing.includes(MARKER)) {
|
|
45
|
+
// Marker already present — a prior run of this migration appended
|
|
46
|
+
// the note. Short-circuit to keep the migration idempotent across
|
|
47
|
+
// the narrow crash window between append and runner checkpoint.
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Ensure separation from prior content.
|
|
51
|
+
const needsLeadingNewline = !existing.endsWith("\n\n");
|
|
52
|
+
const prefix = existing.endsWith("\n") ? "\n" : "\n\n";
|
|
53
|
+
appendFileSync(
|
|
54
|
+
updatesPath,
|
|
55
|
+
needsLeadingNewline ? `${prefix}${RELEASE_NOTE}` : RELEASE_NOTE,
|
|
56
|
+
"utf-8",
|
|
57
|
+
);
|
|
58
|
+
} else {
|
|
59
|
+
writeFileSync(updatesPath, RELEASE_NOTE, "utf-8");
|
|
60
|
+
}
|
|
61
|
+
log.info({ path: updatesPath }, "Appended LaTeX rendering release note");
|
|
62
|
+
} catch (err) {
|
|
63
|
+
log.warn(
|
|
64
|
+
{ err, path: updatesPath },
|
|
65
|
+
"Failed to append LaTeX rendering release note to UPDATES.md",
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
down(_workspaceDir: string): void {
|
|
71
|
+
// Forward-only: UPDATES.md is a user-facing bulletin the assistant
|
|
72
|
+
// processes and deletes on its own. Attempting to reverse a note that may
|
|
73
|
+
// have already been read/deleted would risk surprising user-visible state.
|
|
74
|
+
},
|
|
75
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Bump stale `timeouts.providerStreamTimeoutSec: 300` to 1800.
|
|
8
|
+
*
|
|
9
|
+
* The schema default was raised from 300s (5 min) to 1800s (30 min) in
|
|
10
|
+
* PR #22702, but users whose workspace config was written before that change
|
|
11
|
+
* still carry an explicit 300 that overrides the new default, causing streams
|
|
12
|
+
* to abort after 5 minutes with "Anthropic stream timed out after 300s".
|
|
13
|
+
*/
|
|
14
|
+
export const bumpStaleProviderStreamTimeoutMigration: WorkspaceMigration = {
|
|
15
|
+
id: "044-bump-stale-provider-stream-timeout",
|
|
16
|
+
description:
|
|
17
|
+
"Bump legacy timeouts.providerStreamTimeoutSec: 300 to 1800 to match the current schema default",
|
|
18
|
+
run(workspaceDir: string): void {
|
|
19
|
+
const configPath = join(workspaceDir, "config.json");
|
|
20
|
+
if (!existsSync(configPath)) return;
|
|
21
|
+
|
|
22
|
+
let config: Record<string, unknown>;
|
|
23
|
+
try {
|
|
24
|
+
const raw = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
25
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return;
|
|
26
|
+
config = raw as Record<string, unknown>;
|
|
27
|
+
} catch {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const timeouts = config.timeouts;
|
|
32
|
+
if (!timeouts || typeof timeouts !== "object" || Array.isArray(timeouts))
|
|
33
|
+
return;
|
|
34
|
+
const timeoutsObj = timeouts as Record<string, unknown>;
|
|
35
|
+
|
|
36
|
+
if (timeoutsObj.providerStreamTimeoutSec !== 300) return;
|
|
37
|
+
|
|
38
|
+
timeoutsObj.providerStreamTimeoutSec = 1800;
|
|
39
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
40
|
+
},
|
|
41
|
+
down(_workspaceDir: string): void {
|
|
42
|
+
// Forward-only: the runner marks migrations as applied even when `run()`
|
|
43
|
+
// was a no-op (e.g. workspaces that already had 1800 from the new schema
|
|
44
|
+
// default, or that never had the key at all). A `down()` that blindly
|
|
45
|
+
// rewrote 1800 → 300 would silently downgrade those workspaces and
|
|
46
|
+
// resurrect the "stream timed out after 300s" bug this migration fixes.
|
|
47
|
+
// We can't distinguish "this migration set 1800" from "the value was
|
|
48
|
+
// always 1800" without an extra state marker, so we treat the bump as
|
|
49
|
+
// irreversible. Users who genuinely want 300s can set it in config.
|
|
50
|
+
},
|
|
51
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import {
|
|
2
|
+
appendFileSync,
|
|
3
|
+
existsSync,
|
|
4
|
+
readFileSync,
|
|
5
|
+
writeFileSync,
|
|
6
|
+
} from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
|
|
9
|
+
import { getLogger } from "../../util/logger.js";
|
|
10
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
11
|
+
|
|
12
|
+
const log = getLogger("workspace-migration-045-release-notes-meet-avatar");
|
|
13
|
+
|
|
14
|
+
const MIGRATION_ID = "045-release-notes-meet-avatar";
|
|
15
|
+
const MARKER = `<!-- release-note-id:${MIGRATION_ID} -->`;
|
|
16
|
+
|
|
17
|
+
const RELEASE_NOTE = `${MARKER}
|
|
18
|
+
## Meet video avatar with lip-sync (v1)
|
|
19
|
+
|
|
20
|
+
I can now appear as a video avatar during Google Meet calls, with lip-sync
|
|
21
|
+
driven by my TTS output. v1 uses the TalkingHead.js renderer running inside
|
|
22
|
+
the meet-bot container; hosted renderers (Simli, HeyGen) and GPU sidecars
|
|
23
|
+
(SadTalker, MuseTalk) are additive follow-ups and are not yet available.
|
|
24
|
+
|
|
25
|
+
### One-time setup (required before enabling)
|
|
26
|
+
|
|
27
|
+
The repo currently ships a placeholder \`default-avatar.glb\` at
|
|
28
|
+
\`skills/meet-join/meet-controller-ext/avatar/default-avatar.glb\` that is
|
|
29
|
+
**0 bytes** — the avatar will fail fast at enable time until you replace
|
|
30
|
+
it with a real Ready Player Me model. Export a \`.glb\` from Ready Player Me
|
|
31
|
+
and drop it at that path before turning the feature on.
|
|
32
|
+
|
|
33
|
+
### Host setup (Linux only)
|
|
34
|
+
|
|
35
|
+
The avatar publishes frames to a virtual camera via \`v4l2loopback\`. On
|
|
36
|
+
the Linux host that runs the assistant:
|
|
37
|
+
|
|
38
|
+
\`\`\`bash
|
|
39
|
+
sudo apt-get install v4l2loopback-dkms
|
|
40
|
+
sudo modprobe v4l2loopback video_nr=10 card_label="VellumAvatar" exclusive_caps=1
|
|
41
|
+
\`\`\`
|
|
42
|
+
|
|
43
|
+
macOS bare-metal is **not supported** for the avatar in v1 — the virtual
|
|
44
|
+
camera stack is Linux-specific.
|
|
45
|
+
|
|
46
|
+
### Enabling the avatar
|
|
47
|
+
|
|
48
|
+
In your Meet service config, set:
|
|
49
|
+
|
|
50
|
+
\`\`\`json
|
|
51
|
+
{
|
|
52
|
+
"services": {
|
|
53
|
+
"meet": {
|
|
54
|
+
"avatar": { "enabled": true, "renderer": "talking-head" }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
\`\`\`
|
|
59
|
+
|
|
60
|
+
**Docker mode:** additionally export \`VELLUM_MEET_AVATAR=1\` in the CLI
|
|
61
|
+
environment **before** spawning the instance, so the CLI bind-mounts
|
|
62
|
+
\`/dev/video10\` into the assistant container. Without this, the inner
|
|
63
|
+
\`dockerd\` has no device to pass through to the meet-bot.
|
|
64
|
+
|
|
65
|
+
### New tools
|
|
66
|
+
|
|
67
|
+
Two new assistant tools are available (feature-flag gated on \`meet\`):
|
|
68
|
+
|
|
69
|
+
- \`meet_enable_avatar\` — turn the avatar on for a meeting.
|
|
70
|
+
- \`meet_disable_avatar\` — turn the avatar off for a meeting.
|
|
71
|
+
|
|
72
|
+
Ask me to enable or disable my avatar in a Meet and I'll call these for you.
|
|
73
|
+
`;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Release-notes migration for the Meet video avatar feature (Phase 4).
|
|
77
|
+
*
|
|
78
|
+
* Per AGENTS.md § Release Update Hygiene, user-facing changes ship notes via a
|
|
79
|
+
* workspace migration that appends to `<workspace>/UPDATES.md`. The in-file
|
|
80
|
+
* HTML marker guards against duplicate appends if the runner re-executes this
|
|
81
|
+
* migration after a mid-run crash (between `appendFileSync` and the runner's
|
|
82
|
+
* checkpoint promotion to `applied`), which the runner's own checkpoint state
|
|
83
|
+
* does not cover on its own.
|
|
84
|
+
*/
|
|
85
|
+
export const releaseNotesMeetAvatarMigration: WorkspaceMigration = {
|
|
86
|
+
id: MIGRATION_ID,
|
|
87
|
+
description:
|
|
88
|
+
"Append release notes for Meet video avatar with lip-sync to UPDATES.md",
|
|
89
|
+
|
|
90
|
+
run(workspaceDir: string): void {
|
|
91
|
+
const updatesPath = join(workspaceDir, "UPDATES.md");
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
if (existsSync(updatesPath)) {
|
|
95
|
+
const existing = readFileSync(updatesPath, "utf-8");
|
|
96
|
+
if (existing.includes(MARKER)) {
|
|
97
|
+
// Marker already present — a prior run of this migration appended
|
|
98
|
+
// the note. Short-circuit to keep the migration idempotent across
|
|
99
|
+
// the narrow crash window between append and runner checkpoint.
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// Ensure separation from prior content.
|
|
103
|
+
const needsLeadingNewline = !existing.endsWith("\n\n");
|
|
104
|
+
const prefix = existing.endsWith("\n") ? "\n" : "\n\n";
|
|
105
|
+
appendFileSync(
|
|
106
|
+
updatesPath,
|
|
107
|
+
needsLeadingNewline ? `${prefix}${RELEASE_NOTE}` : RELEASE_NOTE,
|
|
108
|
+
"utf-8",
|
|
109
|
+
);
|
|
110
|
+
} else {
|
|
111
|
+
writeFileSync(updatesPath, RELEASE_NOTE, "utf-8");
|
|
112
|
+
}
|
|
113
|
+
log.info(
|
|
114
|
+
{ path: updatesPath },
|
|
115
|
+
"Appended Meet video avatar release note",
|
|
116
|
+
);
|
|
117
|
+
} catch (err) {
|
|
118
|
+
log.warn(
|
|
119
|
+
{ err, path: updatesPath },
|
|
120
|
+
"Failed to append Meet video avatar release note to UPDATES.md",
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
down(_workspaceDir: string): void {
|
|
126
|
+
// Forward-only: UPDATES.md is a user-facing bulletin the assistant
|
|
127
|
+
// processes and deletes on its own. Attempting to reverse a note that may
|
|
128
|
+
// have already been read/deleted would risk surprising user-visible state.
|
|
129
|
+
},
|
|
130
|
+
};
|
|
@@ -6,6 +6,6 @@ Each migration file must be **fully self-contained**. All helper functions, cons
|
|
|
6
6
|
|
|
7
7
|
- **No external exports.** Migration files must not export anything other than the single `WorkspaceMigration` object. Other code must never import from a migration file.
|
|
8
8
|
- **Duplicate rather than share.** If two migrations need the same helper, duplicate it in both files. Migrations are write-once code — they run once per assistant and are never modified after release. Duplication is preferable to coupling.
|
|
9
|
-
- **Allowed imports:** `./types.js` (for the `WorkspaceMigration` interface)
|
|
9
|
+
- **Allowed imports:** `./types.js` (for the `WorkspaceMigration` interface), `../../util/logger.js` (for structured logging), and Node/Bun runtime built-ins (`node:fs`, `node:path`, `node:crypto`, `bun:sqlite`, etc.). All other dependencies — both project-internal modules and third-party npm packages — must be inlined. Do not import from shared modules like `../../memory/` or `../../config/`, and do not add npm dependencies.
|
|
10
10
|
- **Graceful on all platforms.** Migrations run on macOS, Linux, and in Docker. Platform-specific operations must no-op gracefully on unsupported platforms — never throw.
|
|
11
11
|
- **Idempotent.** Migrations must be safe to re-run if interrupted. The runner checkpoints state as `"started"` before execution and `"completed"` after, so a crash mid-migration triggers a re-run on next startup.
|
|
@@ -35,6 +35,14 @@ import { removeCallsVoiceTranscriptionProviderMigration } from "./034-remove-cal
|
|
|
35
35
|
import { seedSlackChannelPersonaMigration } from "./035-seed-slack-channel-persona.js";
|
|
36
36
|
import { updatePkbIndexBarMigration } from "./036-update-pkb-index-bar.js";
|
|
37
37
|
import { createMeetsDirMigration } from "./037-create-meets-dir.js";
|
|
38
|
+
import { unifyLlmCallSiteConfigsMigration } from "./038-unify-llm-callsite-configs.js";
|
|
39
|
+
import { dropLegacyLlmKeysMigration } from "./039-drop-legacy-llm-keys.js";
|
|
40
|
+
import { seedLatencyCallSiteDefaultsMigration } from "./040-seed-latency-callsite-defaults.js";
|
|
41
|
+
import { backfillGoogleGmailSettingsScopeMigration } from "./041-backfill-google-gmail-settings-scope.js";
|
|
42
|
+
import { fixBackfillGoogleGmailSettingsScopeMigration } from "./042-fix-backfill-google-gmail-settings-scope.js";
|
|
43
|
+
import { releaseNotesLatexRenderingMigration } from "./043-release-notes-latex-rendering.js";
|
|
44
|
+
import { bumpStaleProviderStreamTimeoutMigration } from "./044-bump-stale-provider-stream-timeout.js";
|
|
45
|
+
import { releaseNotesMeetAvatarMigration } from "./045-release-notes-meet-avatar.js";
|
|
38
46
|
import { migrateToWorkspaceVolumeMigration } from "./migrate-to-workspace-volume.js";
|
|
39
47
|
import type { WorkspaceMigration } from "./types.js";
|
|
40
48
|
|
|
@@ -81,4 +89,12 @@ export const WORKSPACE_MIGRATIONS: WorkspaceMigration[] = [
|
|
|
81
89
|
seedSlackChannelPersonaMigration,
|
|
82
90
|
updatePkbIndexBarMigration,
|
|
83
91
|
createMeetsDirMigration,
|
|
92
|
+
unifyLlmCallSiteConfigsMigration,
|
|
93
|
+
dropLegacyLlmKeysMigration,
|
|
94
|
+
seedLatencyCallSiteDefaultsMigration,
|
|
95
|
+
backfillGoogleGmailSettingsScopeMigration,
|
|
96
|
+
fixBackfillGoogleGmailSettingsScopeMigration,
|
|
97
|
+
releaseNotesLatexRenderingMigration,
|
|
98
|
+
bumpStaleProviderStreamTimeoutMigration,
|
|
99
|
+
releaseNotesMeetAvatarMigration,
|
|
84
100
|
];
|