@vellumai/assistant 0.10.9 → 0.10.10-dev.202607162206.d08e98e
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 +1 -1
- package/Dockerfile +8 -0
- package/docs/activation-funnel-telemetry.md +13 -7
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/openapi.yaml +530 -107
- package/package.json +1 -1
- package/scripts/generate-openapi.ts +8 -0
- package/src/__tests__/activation-early-marking.test.ts +6 -5
- package/src/__tests__/agent-loop-override-profile.test.ts +22 -25
- package/src/__tests__/agent-wake-override-profile.test.ts +21 -48
- package/src/__tests__/app-builder-tool-scripts.test.ts +0 -1
- package/src/__tests__/app-bundler.test.ts +4 -12
- package/src/__tests__/app-executors.test.ts +2 -49
- package/src/__tests__/app-routes-csp.test.ts +114 -146
- package/src/__tests__/auth-fallback-events-store.test.ts +8 -1
- package/src/__tests__/build-persisted-content.test.ts +96 -0
- package/src/__tests__/bundle-scanner.test.ts +27 -1
- package/src/__tests__/call-controller.test.ts +291 -0
- package/src/__tests__/call-site-routing-connection-auto-resolve.test.ts +165 -0
- package/src/__tests__/chat-credential-redaction.test.ts +1395 -0
- package/src/__tests__/chat-reveal-guard-priming.test.ts +791 -0
- package/src/__tests__/compaction.benchmark.test.ts +2 -1
- package/src/__tests__/compactor-image-manifest-trust.test.ts +50 -0
- package/src/__tests__/config-loader-backfill.test.ts +9 -4
- package/src/__tests__/config-schema-cmd.test.ts +10 -11
- package/src/__tests__/config-schema.test.ts +190 -257
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +208 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +5 -19
- package/src/__tests__/conversation-agent-loop.test.ts +22 -9
- package/src/__tests__/conversation-error.test.ts +31 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +110 -0
- package/src/__tests__/conversation-process-callsite.test.ts +12 -19
- package/src/__tests__/conversation-routes-slash-commands.test.ts +7 -21
- package/src/__tests__/conversation-summarize-route.test.ts +36 -44
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +7 -7
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +0 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -1
- package/src/__tests__/conversation-usage.test.ts +4 -12
- package/src/__tests__/credential-routes.test.ts +250 -0
- package/src/__tests__/credential-security-invariants.test.ts +3 -0
- package/src/__tests__/db-migration-rollback.test.ts +22 -0
- package/src/__tests__/empty-response-hook.test.ts +186 -1
- package/src/__tests__/external-plugin-loader.test.ts +11 -5
- package/src/__tests__/heartbeat-service.test.ts +0 -28
- package/src/__tests__/host-shell-tool.test.ts +2 -0
- package/src/__tests__/inactive-tool-error-messages.test.ts +2 -2
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +52 -8
- package/src/__tests__/internal-telemetry-routes.test.ts +23 -4
- package/src/__tests__/invite-routes-http.test.ts +12 -16
- package/src/__tests__/list-all-apps.test.ts +0 -4
- package/src/__tests__/llm-context-resolution.test.ts +32 -56
- package/src/__tests__/llm-request-log-turn-query.test.ts +109 -0
- package/src/__tests__/llm-resolver-override-or-default.test.ts +3 -52
- package/src/__tests__/llm-resolver.test.ts +342 -602
- package/src/__tests__/llm-schema.test.ts +79 -37
- package/src/__tests__/max-tokens-continue-hook.test.ts +19 -0
- package/src/__tests__/media-stream-output.test.ts +259 -3
- package/src/__tests__/media-stream-server-integration.test.ts +22 -1
- package/src/__tests__/media-stream-stt-session.test.ts +47 -0
- package/src/__tests__/memory-jobs-worker-cleanup-cadence.test.ts +33 -0
- package/src/__tests__/memory-recall-log-store.test.ts +47 -13
- package/src/__tests__/mock-gateway-ipc.ts +46 -1
- package/src/__tests__/mtime-cache.test.ts +61 -0
- package/src/__tests__/navigate-settings-tab.test.ts +2 -0
- package/src/__tests__/normalize-onboarding.test.ts +33 -0
- package/src/__tests__/onboarding-persona-write.test.ts +26 -0
- package/src/__tests__/plugin-api-resolve-credential.test.ts +140 -0
- package/src/__tests__/plugin-app-serve-routes.test.ts +166 -14
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +2 -0
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +38 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +27 -20
- package/src/__tests__/provider-connections-backfill.test.ts +138 -0
- package/src/__tests__/provider-platform-proxy-integration.test.ts +10 -31
- package/src/__tests__/provider-registry-ollama.test.ts +8 -18
- package/src/__tests__/provider-send-message-override-profile.test.ts +23 -23
- package/src/__tests__/provider-usage-tracking.test.ts +9 -19
- package/src/__tests__/prune-old-conversations-job.test.ts +12 -0
- package/src/__tests__/published-app-updater.test.ts +22 -16
- package/src/__tests__/registry.test.ts +5 -16
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +22 -23
- package/src/__tests__/retry-thinking-adaptive-only.test.ts +43 -48
- package/src/__tests__/retry-thinking-tool-choice.test.ts +57 -66
- package/src/__tests__/retry-verbosity-normalization.test.ts +24 -23
- package/src/__tests__/reveal-success-registry.test.ts +123 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +130 -0
- package/src/__tests__/secret-fixtures.ts +9 -0
- package/src/__tests__/server-history-render.test.ts +28 -0
- package/src/__tests__/skills.test.ts +9 -4
- package/src/__tests__/slack-share-routes.test.ts +0 -1
- package/src/__tests__/stt-stream-session.test.ts +6 -5
- package/src/__tests__/subagent-call-site-routing.test.ts +69 -95
- package/src/__tests__/subagent-disposal.test.ts +2 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +2 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +2 -0
- package/src/__tests__/subagent-manager-notify.test.ts +2 -0
- package/src/__tests__/subagent-role-registry.test.ts +37 -0
- package/src/__tests__/subagent-spawn-and-await.test.ts +1 -0
- package/src/__tests__/subagent-terminal-message.test.ts +50 -0
- package/src/__tests__/subagent-tool-gate-mode.test.ts +78 -5
- package/src/__tests__/surface-completion-nudge-hook.test.ts +19 -0
- package/src/__tests__/telemetry-routes.test.ts +99 -19
- package/src/__tests__/tool-audit.test.ts +34 -4
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-profiler.test.ts +72 -1
- package/src/__tests__/tool-result-spool.test.ts +49 -4
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +0 -1
- package/src/__tests__/ui-channel-variants.test.ts +108 -0
- package/src/__tests__/ui-shape-teaching.test.ts +255 -0
- package/src/__tests__/usage-attribution.test.ts +18 -41
- package/src/__tests__/user-plugin-loader.test.ts +4 -4
- package/src/__tests__/voice-config-update.test.ts +46 -0
- package/src/__tests__/voice-session-bridge.test.ts +216 -84
- package/src/__tests__/workspace-migration-131-drop-web-fetch-mode.test.ts +120 -0
- package/src/agent/loop.ts +4 -3
- package/src/api/events/open-conversation.test.ts +64 -0
- package/src/api/events/open-conversation.ts +33 -0
- package/src/api/index.ts +6 -0
- package/src/api/responses/conversation-message.ts +5 -0
- package/src/apps/app-store.ts +25 -35
- package/src/bundler/app-bundler.ts +34 -48
- package/src/bundler/app-compiler.ts +39 -4
- package/src/bundler/bundle-scanner.ts +13 -0
- package/src/bundler/manifest.ts +1 -1
- package/src/calls/__tests__/voice-session-bridge.test.ts +47 -0
- package/src/calls/call-constants.ts +5 -0
- package/src/calls/call-controller.ts +100 -32
- package/src/calls/call-transport.ts +9 -0
- package/src/calls/media-stream-output.ts +107 -4
- package/src/calls/media-stream-server.ts +29 -9
- package/src/calls/media-stream-stt-session.ts +7 -1
- package/src/calls/media-turn-detector.ts +11 -1
- package/src/calls/voice-session-bridge.ts +84 -63
- package/src/cli/commands/__tests__/inference-providers.test.ts +270 -33
- package/src/cli/commands/__tests__/notifications.test.ts +24 -3
- package/src/cli/commands/config.help.ts +6 -6
- package/src/cli/commands/credentials.help.ts +13 -0
- package/src/cli/commands/credentials.ts +6 -1
- package/src/cli/commands/email.help.ts +7 -0
- package/src/cli/commands/email.ts +35 -1
- package/src/cli/commands/inference-providers.ts +168 -107
- package/src/cli/commands/inference.help.ts +118 -46
- package/src/cli/commands/memory/index.help.ts +23 -0
- package/src/cli/commands/memory/nodes.ts +146 -0
- package/src/cli/commands/notifications.help.ts +10 -10
- package/src/cli/commands/oauth/connect-surface-guidance.test.ts +40 -0
- package/src/cli/commands/oauth/connect-surface-guidance.ts +54 -0
- package/src/cli/commands/oauth/connect.test.ts +126 -0
- package/src/cli/commands/oauth/connect.ts +29 -6
- package/src/cli/commands/oauth/index.help.ts +7 -1
- package/src/cli/commands/oauth/status.test.ts +69 -3
- package/src/cli/commands/oauth/status.ts +50 -12
- package/src/cli/commands/plugins.help.ts +13 -2
- package/src/cli/commands/plugins.ts +61 -7
- package/src/cli/commands/telemetry.help.ts +13 -0
- package/src/cli/commands/telemetry.ts +45 -5
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +8 -2
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +213 -9
- package/src/cli/lib/bundled-marketplace.json +93 -36
- package/src/cli/lib/inspect-plugin.ts +5 -1
- package/src/cli/lib/install-from-github.ts +68 -4
- package/src/cli/lib/plugin-catalog-local.ts +6 -2
- package/src/cli/lib/plugin-fingerprint.ts +3 -3
- package/src/cli/lib/upgrade-plugin.ts +236 -35
- package/src/config/__tests__/default-profile-catalog.test.ts +8 -12
- package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +137 -0
- package/src/config/__tests__/profile-materialization.test.ts +1 -88
- package/src/config/bundled-skills/AGENTS.md +3 -30
- package/src/config/bundled-skills/app-builder/SKILL.md +5 -3
- package/src/config/bundled-skills/app-builder/TOOLS.json +23 -0
- package/src/config/bundled-skills/app-builder/tools/app-open.ts +32 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +7 -7
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +1 -1
- package/src/config/bundled-skills/settings/TOOLS.json +3 -1
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +2 -0
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +18 -10
- package/src/config/bundled-skills/subagent/SKILL.md +2 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
- package/src/config/call-site-defaults.ts +3 -3
- package/src/config/feature-flag-registry.json +24 -39
- package/src/config/llm-resolver.ts +88 -475
- package/src/config/profile-materialization.ts +11 -11
- package/src/config/schema.ts +93 -127
- package/src/config/schemas/__tests__/live-voice.test.ts +24 -6
- package/src/config/schemas/__tests__/stt.test.ts +31 -3
- package/src/config/schemas/live-voice.ts +10 -4
- package/src/config/schemas/llm.ts +52 -15
- package/src/config/schemas/memory-lifecycle.ts +1 -1
- package/src/config/schemas/memory-retrospective.ts +8 -0
- package/src/config/schemas/memory-v2.ts +2 -2
- package/src/config/schemas/memory-v3.ts +1 -1
- package/src/config/schemas/services.ts +6 -3
- package/src/config/schemas/stt.ts +38 -21
- package/src/config/schemas/tts.ts +13 -18
- package/src/config/skills.ts +31 -21
- package/src/context/compactor.ts +44 -7
- package/src/context/post-turn-tool-result-truncation.ts +4 -2
- package/src/context/tool-result-spool.ts +26 -5
- package/src/conversations/__tests__/message-consolidation.test.ts +48 -0
- package/src/conversations/message-consolidation.ts +22 -2
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +5 -12
- package/src/daemon/app-source-watcher.ts +17 -23
- package/src/daemon/chat-credential-redaction.ts +1365 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +627 -34
- package/src/daemon/conversation-agent-loop.ts +71 -31
- package/src/daemon/conversation-error.ts +36 -14
- package/src/daemon/conversation-process.ts +22 -0
- package/src/daemon/conversation-store.ts +35 -0
- package/src/daemon/conversation-surfaces.ts +25 -25
- package/src/daemon/conversation-tool-setup.ts +33 -7
- package/src/daemon/conversation.ts +55 -5
- package/src/daemon/handlers/shared.ts +33 -2
- package/src/daemon/lifecycle.ts +4 -4
- package/src/daemon/message-types/conversations.ts +6 -17
- package/src/daemon/providers-setup.ts +8 -0
- package/src/daemon/tool-setup-types.ts +7 -1
- package/src/daemon/wake-conversation-ops.ts +10 -1
- package/src/hooks/types.ts +9 -0
- package/src/ipc/__tests__/email-ipc.test.ts +90 -0
- package/src/ipc/gateway-client.test.ts +59 -0
- package/src/ipc/gateway-client.ts +70 -27
- package/src/live-voice/__tests__/live-voice-events.test.ts +14 -2
- package/src/live-voice/__tests__/live-voice-integration.test.ts +116 -2
- package/src/live-voice/__tests__/live-voice-vad.test.ts +804 -13
- package/src/live-voice/__tests__/protocol.test.ts +122 -0
- package/src/live-voice/live-voice-session.ts +443 -40
- package/src/live-voice/protocol.ts +143 -1
- package/src/monitoring/__tests__/plugin-source-watch.test.ts +3 -1
- package/src/monitoring/plugin-source-watch.ts +3 -62
- package/src/notifications/README.md +1 -1
- package/src/permissions/checker.ts +8 -4
- package/src/persistence/__tests__/db-init-migrations-ok.test.ts +26 -0
- package/src/persistence/conversation-crud.ts +104 -2
- package/src/persistence/db-init.ts +14 -3
- package/src/persistence/job-handlers/cleanup.ts +15 -7
- package/src/persistence/llm-request-log-store.ts +88 -52
- package/src/persistence/migrations/298-move-memory-jobs-to-memory-db.ts +7 -31
- package/src/persistence/migrations/305-drop-contact-acl-columns.ts +3 -2
- package/src/persistence/migrations/326-move-injection-events-to-memory-db.ts +8 -34
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +90 -0
- package/src/persistence/migrations/337-move-memory-recall-logs-to-memory-db.ts +114 -0
- package/src/persistence/migrations/338-move-memory-v3-selections-to-memory-db.ts +84 -0
- package/src/persistence/migrations/339-move-activation-sessions-to-memory-db.ts +52 -0
- package/src/persistence/migrations/__tests__/run-migrations.test.ts +155 -0
- package/src/persistence/migrations/helpers/relocation.ts +44 -1
- package/src/persistence/migrations/run-migrations.ts +25 -1
- package/src/persistence/schema/infrastructure.ts +9 -0
- package/src/persistence/schema/memory-core.ts +3 -0
- package/src/persistence/schema/memory-injection.ts +2 -0
- package/src/persistence/steps.ts +36 -0
- package/src/platform/client.test.ts +1 -44
- package/src/platform/client.ts +10 -20
- package/src/platform/consent-cache.test.ts +89 -23
- package/src/platform/consent-cache.ts +71 -33
- package/src/plugin-api/constants.ts +12 -0
- package/src/plugin-api/conversation-turn.ts +37 -14
- package/src/plugin-api/index.ts +11 -1
- package/src/plugin-api/resolve-credential.ts +75 -0
- package/src/plugin-api/vision-support.test.ts +8 -19
- package/src/plugin-api/vision-support.ts +26 -17
- package/src/plugins/collect-source-versions.ts +77 -0
- package/src/plugins/defaults/compaction/compact.ts +6 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +18 -24
- package/src/plugins/defaults/empty-response/hooks/user-prompt-submit.ts +38 -0
- package/src/plugins/defaults/empty-response/refusal-quarantine.ts +99 -0
- package/src/plugins/defaults/image-fallback/__tests__/caption-cache-persistence.test.ts +7 -3
- package/src/plugins/defaults/index.ts +8 -1
- package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +4 -1
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +48 -6
- package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +28 -22
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +148 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +80 -8
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +202 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +64 -25
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +24 -11
- package/src/plugins/defaults/memory/__tests__/prompt-override.test.ts +70 -6
- package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +278 -0
- package/src/plugins/defaults/memory/activation-session-store.ts +27 -20
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +2 -9
- package/src/plugins/defaults/memory/context-search/sources/workspace.ts +1 -8
- package/src/plugins/defaults/memory/graph/retriever.test.ts +6 -6
- package/src/plugins/defaults/memory/graph/store.ts +114 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +36 -1
- package/src/plugins/defaults/memory/graph/tools.ts +47 -13
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +16 -35
- package/src/plugins/defaults/memory/jobs-worker.ts +10 -1
- package/src/plugins/defaults/memory/memory-db.ts +3 -2
- package/src/plugins/defaults/memory/memory-recall-log-store.ts +129 -66
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +8 -0
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +11 -122
- package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +216 -0
- package/src/plugins/defaults/memory/memory-v2-activation-log-store.ts +84 -46
- package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +42 -32
- package/src/plugins/defaults/memory/path-containment.ts +21 -0
- package/src/plugins/defaults/memory/prompt-override.ts +51 -13
- package/src/plugins/defaults/memory/tools.test.ts +34 -0
- package/src/plugins/defaults/memory/tools.ts +12 -2
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +19 -15
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +24 -19
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +19 -15
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +22 -2
- package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +5 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +59 -41
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +29 -25
- package/src/plugins/defaults/memory/v2/migration.ts +46 -16
- package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +4 -0
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +17 -15
- package/src/plugins/defaults/memory/v3/__tests__/gate.test.ts +24 -22
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +9 -5
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +277 -10
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +57 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +9 -7
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +38 -7
- package/src/plugins/defaults/memory/v3/hot-set.test.ts +36 -18
- package/src/plugins/defaults/memory/v3/hot-set.ts +12 -14
- package/src/plugins/defaults/memory/v3/learned-edges.test.ts +47 -27
- package/src/plugins/defaults/memory/v3/learned-edges.ts +12 -14
- package/src/plugins/defaults/memory/v3/orchestrate.ts +139 -22
- package/src/plugins/defaults/memory/v3/prune.test.ts +10 -3
- package/src/plugins/defaults/memory/v3/prune.ts +17 -11
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +23 -11
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +70 -53
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +9 -6
- package/src/plugins/external-plugin-loader.ts +15 -15
- package/src/plugins/mtime-cache.ts +47 -0
- package/src/plugins/pipeline.ts +9 -1
- package/src/plugins/plugin-execution-context.ts +44 -0
- package/src/plugins/plugin-tree-walk.ts +31 -24
- package/src/plugins/source-fingerprint.ts +3 -4
- package/src/prompts/normalize-onboarding.ts +12 -0
- package/src/prompts/persona-resolver.ts +8 -0
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +1 -1
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +6 -9
- package/src/providers/__tests__/registry-native-web-search.test.ts +4 -10
- package/src/providers/__tests__/retry-callsite.test.ts +235 -215
- package/src/providers/__tests__/satellite-connection-routing.test.ts +8 -16
- package/src/providers/atlascloud/client.ts +10 -49
- package/src/providers/baseten/client.ts +43 -0
- package/src/providers/call-site-routing.ts +26 -13
- package/src/providers/connection-resolution.ts +9 -11
- package/src/providers/fetch-provider-catalog.ts +4 -2
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +29 -4
- package/src/providers/inference/__tests__/connection-availability-keyless.test.ts +78 -0
- package/src/providers/inference/adapter-factory.ts +27 -6
- package/src/providers/inference/auth.ts +29 -1
- package/src/providers/inference/backfill.ts +61 -10
- package/src/providers/inference/connection-availability.ts +3 -2
- package/src/providers/inference/resolve-auth.ts +9 -1
- package/src/providers/model-catalog.ts +37 -0
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +24 -2
- package/src/providers/openai/api-key-validation.ts +70 -0
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +11 -4
- package/src/providers/vellum-model-routing.test.ts +26 -0
- package/src/providers/vellum-model-routing.ts +30 -0
- package/src/providers/voice-error-copy.ts +47 -0
- package/src/runtime/agent-wake.ts +40 -24
- package/src/runtime/for-chat-mint-registry.ts +118 -0
- package/src/runtime/reveal-nonce.ts +49 -0
- package/src/runtime/reveal-success-registry.ts +306 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +88 -3
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +161 -30
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +7 -0
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +15 -0
- package/src/runtime/routes/app-management-routes.ts +152 -45
- package/src/runtime/routes/app-routes.ts +16 -77
- package/src/runtime/routes/canned-message-complete.ts +16 -16
- package/src/runtime/routes/conversation-management-routes.ts +17 -14
- package/src/runtime/routes/conversation-query-routes.ts +54 -6
- package/src/runtime/routes/conversation-routes.ts +48 -2
- package/src/runtime/routes/credential-routes.ts +116 -3
- package/src/runtime/routes/email-routes.ts +17 -1
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +33 -5
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +6 -5
- package/src/runtime/routes/inference-provider-connection-routes.ts +77 -28
- package/src/runtime/routes/inference-send-routes.ts +1 -1
- package/src/runtime/routes/internal-telemetry-routes.ts +7 -6
- package/src/runtime/routes/plugins-routes.ts +37 -6
- package/src/runtime/routes/publish-routes.ts +15 -18
- package/src/runtime/routes/schedule-worker-routes.ts +9 -0
- package/src/runtime/routes/secret-routes.ts +10 -0
- package/src/runtime/routes/telemetry-routes.ts +149 -45
- package/src/schedule/__tests__/schedule-timezone.test.ts +101 -0
- package/src/schedule/__tests__/worker-watchdog.test.ts +209 -0
- package/src/schedule/schedule-store.ts +12 -1
- package/src/schedule/schedule-timezone.ts +63 -0
- package/src/schedule/scheduler.ts +100 -6
- package/src/schedule/worker-control.ts +19 -0
- package/src/security/auth-fallback-events-store.ts +7 -6
- package/src/security/secret-scanner.ts +26 -1
- package/src/services/published-app-updater.ts +6 -11
- package/src/stt/stt-stream-session.ts +36 -16
- package/src/subagent/manager.ts +34 -8
- package/src/telemetry/AGENTS.md +30 -1
- package/src/telemetry/__tests__/config-setting-snapshot.test.ts +18 -0
- package/src/telemetry/__tests__/outbox-test-harness.ts +5 -3
- package/src/telemetry/config-setting-snapshot.ts +44 -10
- package/src/telemetry/telemetry-event-sources.test.ts +124 -30
- package/src/telemetry/telemetry-event-sources.ts +137 -83
- package/src/telemetry/telemetry-events-outbox.test.ts +46 -1
- package/src/telemetry/telemetry-events-outbox.ts +60 -9
- package/src/telemetry/telemetry-wire-source.json +1 -1
- package/src/telemetry/telemetry-wire-validation.ts +39 -2
- package/src/telemetry/telemetry-wire.generated.ts +8 -0
- package/src/telemetry/tool-audit.ts +15 -9
- package/src/telemetry/tool-executed-events-store.test.ts +1 -1
- package/src/telemetry/turn-events-store.ts +20 -0
- package/src/telemetry/types.ts +45 -12
- package/src/telemetry/usage-telemetry-reporter.test.ts +294 -25
- package/src/telemetry/usage-telemetry-reporter.ts +117 -18
- package/src/telemetry/watchdog-direct-emit.test.ts +11 -3
- package/src/telemetry/watchdog-direct-emit.ts +11 -6
- package/src/tools/apps/executors.ts +11 -36
- package/src/tools/executor.ts +14 -1
- package/src/tools/host-terminal/host-shell.ts +6 -2
- package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +1 -1
- package/src/tools/network/__tests__/web-fetch-metadata.test.ts +25 -0
- package/src/tools/network/web-fetch.ts +6 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/subagent/spawn.ts +7 -11
- package/src/tools/terminal/shell.ts +5 -2
- package/src/tools/tool-manifest.ts +0 -2
- package/src/tools/tool-profiler.ts +37 -6
- package/src/tools/ui-surface/channel-variants.ts +101 -0
- package/src/tools/ui-surface/definitions.ts +23 -67
- package/src/tools/ui-surface/surface-shape-docs.ts +229 -0
- package/src/tts/__tests__/provider-adapters.test.ts +18 -0
- package/src/tts/provider-catalog.ts +2 -4
- package/src/tts/providers/deepgram-provider.ts +10 -1
- package/src/types/onboarding-context.ts +8 -0
- package/src/usage/attribution.ts +18 -112
- package/src/{config/bundled-skills/messaging/tools/gmail-mime-helpers.ts → util/mime-type.ts} +4 -1
- package/src/util/provider-error-patterns.ts +7 -1
- package/src/util/worker-process.ts +105 -0
- package/src/watcher/__tests__/telemetry.test.ts +17 -4
- package/src/watcher/telemetry.ts +5 -5
- package/src/workspace/migrations/131-drop-web-fetch-mode.ts +61 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/workspace/provider-commit-message-generator.ts +6 -4
- package/src/__tests__/app-open-proxy.test.ts +0 -67
- package/src/onboarding/onboarding-research-events-store.test.ts +0 -230
- package/src/onboarding/onboarding-research-events-store.ts +0 -104
- package/src/runtime/routes/assets/vellum-design-system.css +0 -2236
- package/src/tools/apps/definitions.ts +0 -73
- package/src/tools/apps/open-proxy.ts +0 -43
|
@@ -346,6 +346,161 @@ describe("runMigrationSteps — checkpointing", () => {
|
|
|
346
346
|
expect(result.skipped).toEqual([]);
|
|
347
347
|
});
|
|
348
348
|
|
|
349
|
+
test("defers a step whose dependency failed this boot, without checkpointing it", async () => {
|
|
350
|
+
/**
|
|
351
|
+
* A step must not run against the missing state a failed prerequisite was
|
|
352
|
+
* supposed to create. It is deferred — not run, not checkpointed — and
|
|
353
|
+
* reported in `deferred` so readiness gating can surface it.
|
|
354
|
+
*/
|
|
355
|
+
|
|
356
|
+
// GIVEN a failing creator step and a dependent step
|
|
357
|
+
const calls = { creator: 0, dependent: 0 };
|
|
358
|
+
const steps: MigrationStep[] = [
|
|
359
|
+
{
|
|
360
|
+
name: "creatorStep",
|
|
361
|
+
run: () => {
|
|
362
|
+
calls.creator++;
|
|
363
|
+
throw new Error("creator failed");
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
name: "dependentStep",
|
|
368
|
+
dependsOn: ["creatorStep"],
|
|
369
|
+
run: () => {
|
|
370
|
+
calls.dependent++;
|
|
371
|
+
},
|
|
372
|
+
},
|
|
373
|
+
];
|
|
374
|
+
const db = createTestDb();
|
|
375
|
+
|
|
376
|
+
// WHEN the runner executes
|
|
377
|
+
const result = await runMigrationSteps(db, steps);
|
|
378
|
+
|
|
379
|
+
// THEN the dependent step never ran and is reported deferred
|
|
380
|
+
expect(calls.dependent).toBe(0);
|
|
381
|
+
expect(result.failed).toEqual(["creatorStep"]);
|
|
382
|
+
expect(result.deferred).toEqual(["dependentStep"]);
|
|
383
|
+
|
|
384
|
+
// AND nothing was written to the ledger for the deferred step —
|
|
385
|
+
// no 'started' marker and no applied checkpoint
|
|
386
|
+
const rows = getSqliteFrom(db)
|
|
387
|
+
.query(
|
|
388
|
+
`SELECT 1 FROM memory_checkpoints WHERE key = 'step:dependentStep'`,
|
|
389
|
+
)
|
|
390
|
+
.all();
|
|
391
|
+
expect(rows).toEqual([]);
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
test("a deferred step runs on the next boot once its dependency succeeds", async () => {
|
|
395
|
+
/**
|
|
396
|
+
* Deferral is a retry mechanism, not a permanent skip: once the
|
|
397
|
+
* prerequisite is applied on a later boot, the deferred step runs.
|
|
398
|
+
*/
|
|
399
|
+
|
|
400
|
+
// GIVEN a creator that fails on its first run and a dependent step
|
|
401
|
+
const calls = { creator: 0, dependent: 0 };
|
|
402
|
+
const steps: MigrationStep[] = [
|
|
403
|
+
{
|
|
404
|
+
name: "creatorStep",
|
|
405
|
+
run: () => {
|
|
406
|
+
calls.creator++;
|
|
407
|
+
if (calls.creator === 1) {
|
|
408
|
+
throw new Error("transient failure");
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
name: "dependentStep",
|
|
414
|
+
dependsOn: ["creatorStep"],
|
|
415
|
+
run: () => {
|
|
416
|
+
calls.dependent++;
|
|
417
|
+
},
|
|
418
|
+
},
|
|
419
|
+
];
|
|
420
|
+
const db = createTestDb();
|
|
421
|
+
|
|
422
|
+
// WHEN the first boot defers the dependent step
|
|
423
|
+
const first = await runMigrationSteps(db, steps);
|
|
424
|
+
expect(first.deferred).toEqual(["dependentStep"]);
|
|
425
|
+
|
|
426
|
+
// AND the next boot retries
|
|
427
|
+
const second = await runMigrationSteps(db, steps);
|
|
428
|
+
|
|
429
|
+
// THEN both steps run and nothing is deferred or failed
|
|
430
|
+
expect(calls).toEqual({ creator: 2, dependent: 1 });
|
|
431
|
+
expect(second.applied).toEqual(["creatorStep", "dependentStep"]);
|
|
432
|
+
expect(second.deferred).toEqual([]);
|
|
433
|
+
expect(second.failed).toEqual([]);
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
test("a step depending on an earlier same-boot step runs without deferral", async () => {
|
|
437
|
+
/**
|
|
438
|
+
* The runner adds each success to the in-memory applied set, so a
|
|
439
|
+
* dependency satisfied earlier in the same boot does not defer the
|
|
440
|
+
* dependent step — creator and dependent can ship in one release.
|
|
441
|
+
*/
|
|
442
|
+
|
|
443
|
+
// GIVEN a creator and a dependent, both pending
|
|
444
|
+
const order: string[] = [];
|
|
445
|
+
const steps: MigrationStep[] = [
|
|
446
|
+
{
|
|
447
|
+
name: "creatorStep",
|
|
448
|
+
run: () => {
|
|
449
|
+
order.push("creator");
|
|
450
|
+
},
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
name: "dependentStep",
|
|
454
|
+
dependsOn: ["creatorStep"],
|
|
455
|
+
run: () => {
|
|
456
|
+
order.push("dependent");
|
|
457
|
+
},
|
|
458
|
+
},
|
|
459
|
+
];
|
|
460
|
+
const db = createTestDb();
|
|
461
|
+
|
|
462
|
+
// WHEN the runner executes both in one boot
|
|
463
|
+
const result = await runMigrationSteps(db, steps);
|
|
464
|
+
|
|
465
|
+
// THEN they run in order with no deferral
|
|
466
|
+
expect(order).toEqual(["creator", "dependent"]);
|
|
467
|
+
expect(result.applied).toEqual(["creatorStep", "dependentStep"]);
|
|
468
|
+
expect(result.deferred).toEqual([]);
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
test("a step whose dependency is already checkpointed runs normally", async () => {
|
|
472
|
+
/**
|
|
473
|
+
* A dependency applied on a prior boot satisfies dependsOn through the
|
|
474
|
+
* checkpoint ledger, so the dependent step runs even though the creator
|
|
475
|
+
* was skipped this boot.
|
|
476
|
+
*/
|
|
477
|
+
|
|
478
|
+
// GIVEN a database where the creator step was applied on a prior boot
|
|
479
|
+
const creator: MigrationStep = {
|
|
480
|
+
name: "creatorStep",
|
|
481
|
+
run: () => {
|
|
482
|
+
// no-op
|
|
483
|
+
},
|
|
484
|
+
};
|
|
485
|
+
const db = createTestDb();
|
|
486
|
+
await runMigrationSteps(db, [creator]);
|
|
487
|
+
|
|
488
|
+
// WHEN a dependent step ships in a later release
|
|
489
|
+
const dependent: MigrationStep = {
|
|
490
|
+
name: "dependentStep",
|
|
491
|
+
dependsOn: ["creatorStep"],
|
|
492
|
+
run: () => {
|
|
493
|
+
// no-op
|
|
494
|
+
},
|
|
495
|
+
};
|
|
496
|
+
const result = await runMigrationSteps(db, [creator, dependent]);
|
|
497
|
+
|
|
498
|
+
// THEN the dependent step runs while the creator is skipped
|
|
499
|
+
expect(result.skipped).toEqual(["creatorStep"]);
|
|
500
|
+
expect(result.applied).toEqual(["dependentStep"]);
|
|
501
|
+
expect(result.deferred).toEqual([]);
|
|
502
|
+
});
|
|
503
|
+
|
|
349
504
|
test("writes 'started' marker before running each step", async () => {
|
|
350
505
|
const db = createTestDb();
|
|
351
506
|
const raw = getSqliteFrom(db);
|
|
@@ -6,6 +6,11 @@ import {
|
|
|
6
6
|
parseChangesFromStdout,
|
|
7
7
|
runAsyncSqlite,
|
|
8
8
|
} from "../../db-async-query.js";
|
|
9
|
+
import {
|
|
10
|
+
type DrizzleDb,
|
|
11
|
+
getMemorySqlite,
|
|
12
|
+
getSqliteFrom,
|
|
13
|
+
} from "../../db-connection.js";
|
|
9
14
|
|
|
10
15
|
const log = getLogger("memory-db");
|
|
11
16
|
|
|
@@ -145,7 +150,9 @@ export async function drainStagedTable(
|
|
|
145
150
|
const staging = `${table}${RELOCATING_SUFFIX}`;
|
|
146
151
|
|
|
147
152
|
// Nothing to do once the staging table is gone (drain finished previously).
|
|
148
|
-
if (!tableExistsInMain(raw, staging))
|
|
153
|
+
if (!tableExistsInMain(raw, staging)) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
149
156
|
|
|
150
157
|
// Build a select list from the staging table's actual columns: apply any
|
|
151
158
|
// per-column transform, copy a present column verbatim, NULL-fill an absent
|
|
@@ -228,3 +235,39 @@ export async function drainStagedTable(
|
|
|
228
235
|
}
|
|
229
236
|
log.info({ table }, "relocation: complete — staging dropped");
|
|
230
237
|
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Run one memory-table relocation end to end: ensure the table's schema on the
|
|
241
|
+
* memory connection, stage `main.<table>` aside via
|
|
242
|
+
* {@link stageTableForRelocation}, then drain the staged rows into the memory
|
|
243
|
+
* DB in awaited batches via {@link drainStagedTable} per the spec. Because the
|
|
244
|
+
* drain is awaited as part of the migration step, later startup work observes
|
|
245
|
+
* the finished move.
|
|
246
|
+
*
|
|
247
|
+
* Throws (rather than returning) if the memory database cannot be opened, so
|
|
248
|
+
* the runner records the step as failed instead of applied and retries it on a
|
|
249
|
+
* later boot — never renaming the source aside without a target to write to,
|
|
250
|
+
* and never marking the relocation done while it has not happened. The throw
|
|
251
|
+
* is caught per-step by the runner, so startup is not aborted.
|
|
252
|
+
*/
|
|
253
|
+
export async function runMemoryTableRelocation(
|
|
254
|
+
database: DrizzleDb,
|
|
255
|
+
spec: RelocationSpec,
|
|
256
|
+
ensureSchema: (memoryRaw: Database) => void,
|
|
257
|
+
): Promise<void> {
|
|
258
|
+
const memoryRaw = getMemorySqlite();
|
|
259
|
+
if (!memoryRaw) {
|
|
260
|
+
throw new Error(
|
|
261
|
+
`memory database unavailable — deferring ${spec.table} relocation`,
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
ensureSchema(memoryRaw);
|
|
266
|
+
|
|
267
|
+
const raw = getSqliteFrom(database);
|
|
268
|
+
const needsDrain = stageTableForRelocation(raw, spec.table);
|
|
269
|
+
|
|
270
|
+
if (needsDrain) {
|
|
271
|
+
await drainStagedTable(raw, spec);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
@@ -109,6 +109,8 @@ export interface MigrationRunResult {
|
|
|
109
109
|
failed: string[];
|
|
110
110
|
/** Steps skipped because a prior run already applied them. */
|
|
111
111
|
skipped: string[];
|
|
112
|
+
/** Steps not run because a declared dependsOn prerequisite is not applied. */
|
|
113
|
+
deferred: string[];
|
|
112
114
|
}
|
|
113
115
|
|
|
114
116
|
/**
|
|
@@ -213,6 +215,11 @@ export function recoverCrashedMigrations(database: DrizzleDb): string[] {
|
|
|
213
215
|
* Individual step failures are caught and logged so one broken migration does
|
|
214
216
|
* not prevent independent later ones from succeeding; a failed step is not
|
|
215
217
|
* checkpointed and is retried on the next boot.
|
|
218
|
+
*
|
|
219
|
+
* A step whose declared `dependsOn` prerequisites are not all applied — because
|
|
220
|
+
* a dependency failed this boot or was never run — is deferred rather than
|
|
221
|
+
* executed against missing state. A deferred step writes nothing to the ledger,
|
|
222
|
+
* so it retries on the next boot once its prerequisites have been applied.
|
|
216
223
|
*/
|
|
217
224
|
export async function runMigrationSteps(
|
|
218
225
|
database: DrizzleDb,
|
|
@@ -242,6 +249,7 @@ export async function runMigrationSteps(
|
|
|
242
249
|
const failed: string[] = [];
|
|
243
250
|
const skipped: string[] = [];
|
|
244
251
|
const ran: string[] = [];
|
|
252
|
+
const deferred: string[] = [];
|
|
245
253
|
|
|
246
254
|
const totalSteps = steps.length;
|
|
247
255
|
for (const [index, step] of steps.entries()) {
|
|
@@ -257,6 +265,19 @@ export async function runMigrationSteps(
|
|
|
257
265
|
continue;
|
|
258
266
|
}
|
|
259
267
|
|
|
268
|
+
// Defer a step whose prerequisites are not applied rather than run it
|
|
269
|
+
// against missing state. Nothing is written to the ledger — no 'started'
|
|
270
|
+
// marker, no checkpoint — so the step retries on the next boot.
|
|
271
|
+
const missing = (obj.dependsOn ?? []).filter((dep) => !applied.has(dep));
|
|
272
|
+
if (missing.length > 0) {
|
|
273
|
+
deferred.push(name);
|
|
274
|
+
log.warn(
|
|
275
|
+
{ migration: name, missing, step: stepNumber, totalSteps },
|
|
276
|
+
`Deferring migration "${name}" — prerequisites not applied: ${missing.join(", ")}`,
|
|
277
|
+
);
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
|
|
260
281
|
try {
|
|
261
282
|
if (checkpointable) {
|
|
262
283
|
markStarted.run(`${STEP_CHECKPOINT_PREFIX}${name}`, Date.now());
|
|
@@ -276,6 +297,9 @@ export async function runMigrationSteps(
|
|
|
276
297
|
if (checkpointable) {
|
|
277
298
|
markApplied.run(`${STEP_CHECKPOINT_PREFIX}${name}`, Date.now());
|
|
278
299
|
ran.push(name);
|
|
300
|
+
// Record the success in the in-memory set too, so a later step in this
|
|
301
|
+
// same boot can depend on it without being deferred.
|
|
302
|
+
applied.add(name);
|
|
279
303
|
}
|
|
280
304
|
} catch (err) {
|
|
281
305
|
// Leave the 'started' marker in place (if one was written) —
|
|
@@ -289,7 +313,7 @@ export async function runMigrationSteps(
|
|
|
289
313
|
}
|
|
290
314
|
}
|
|
291
315
|
|
|
292
|
-
return { applied: ran, failed, skipped };
|
|
316
|
+
return { applied: ran, failed, skipped, deferred };
|
|
293
317
|
}
|
|
294
318
|
|
|
295
319
|
/**
|
|
@@ -170,6 +170,10 @@ export const llmRequestLogs = sqliteTable(
|
|
|
170
170
|
],
|
|
171
171
|
);
|
|
172
172
|
|
|
173
|
+
// Per-turn diagnostics for memory recall, recording hit counts, latency,
|
|
174
|
+
// and the injected text. Lives in the dedicated memory database
|
|
175
|
+
// (`assistant-memory.db`), not main — access it via the memory connection
|
|
176
|
+
// (`getMemoryDb()` / `getMemorySqlite()`).
|
|
173
177
|
export const memoryRecallLogs = sqliteTable(
|
|
174
178
|
"memory_recall_logs",
|
|
175
179
|
{
|
|
@@ -202,6 +206,9 @@ export const memoryRecallLogs = sqliteTable(
|
|
|
202
206
|
],
|
|
203
207
|
);
|
|
204
208
|
|
|
209
|
+
// Per-turn log of memory-v2 concept/skill activations. Lives in the
|
|
210
|
+
// dedicated memory database (`assistant-memory.db`), not main — access it
|
|
211
|
+
// via the memory connection (`getMemoryDb()` / `getMemorySqlite()`).
|
|
205
212
|
export const memoryV2ActivationLogs = sqliteTable(
|
|
206
213
|
"memory_v2_activation_logs",
|
|
207
214
|
{
|
|
@@ -277,6 +284,8 @@ export const llmUsageEvents = sqliteTable(
|
|
|
277
284
|
// One row per conversation started on the activation-rail bootstrap template.
|
|
278
285
|
// Lets the activation funnel telemetry scope its events to activation
|
|
279
286
|
// conversations without inspecting the bootstrap template at emit time.
|
|
287
|
+
// Lives in the dedicated memory database (`assistant-memory.db`), not main —
|
|
288
|
+
// access it via the memory connection (`getMemoryDb()` / `getMemorySqlite()`).
|
|
280
289
|
export const activationSessions = sqliteTable("activation_sessions", {
|
|
281
290
|
conversationId: text("conversation_id").primaryKey(),
|
|
282
291
|
createdAt: integer("created_at").notNull(),
|
|
@@ -72,6 +72,9 @@ export const memoryEmbeddings = sqliteTable(
|
|
|
72
72
|
],
|
|
73
73
|
);
|
|
74
74
|
|
|
75
|
+
// Background job queue for the memory plugin. Lives in the dedicated memory
|
|
76
|
+
// database (`assistant-memory.db`), not main — access it via the memory
|
|
77
|
+
// connection (`getMemoryDb()` / `getMemorySqlite()`).
|
|
75
78
|
export const memoryJobs = sqliteTable("memory_jobs", {
|
|
76
79
|
id: text("id").primaryKey(),
|
|
77
80
|
type: text("type").notNull(),
|
|
@@ -44,6 +44,8 @@ export const memoryV3EverInjected = sqliteTable(
|
|
|
44
44
|
);
|
|
45
45
|
|
|
46
46
|
// Per-turn log of which memory-v3 cards were selected, with lane attribution.
|
|
47
|
+
// Lives in the dedicated memory database (`assistant-memory.db`), not main —
|
|
48
|
+
// access it via the memory connection (`getMemoryDb()` / `getMemorySqlite()`).
|
|
47
49
|
export const memoryV3Selections = sqliteTable(
|
|
48
50
|
"memory_v3_selections",
|
|
49
51
|
{
|
package/src/persistence/steps.ts
CHANGED
|
@@ -443,6 +443,10 @@ import { migrateMoveSkillLoadedEventsToTelemetryDb } from "./migrations/332-move
|
|
|
443
443
|
import { migrateCreateTelemetryEventsTable } from "./migrations/333-create-telemetry-events-table.js";
|
|
444
444
|
import { migrateBackfillTelemetryEventsOutbox } from "./migrations/334-backfill-telemetry-events-outbox.js";
|
|
445
445
|
import { migrateCollapseMemoryEmbedBacklog } from "./migrations/335-collapse-memory-embed-backlog.js";
|
|
446
|
+
import { migrateMoveMemoryV2ActivationLogsToMemoryDb } from "./migrations/336-move-memory-v2-activation-logs-to-memory-db.js";
|
|
447
|
+
import { migrateMoveMemoryRecallLogsToMemoryDb } from "./migrations/337-move-memory-recall-logs-to-memory-db.js";
|
|
448
|
+
import { migrateMoveMemoryV3SelectionsToMemoryDb } from "./migrations/338-move-memory-v3-selections-to-memory-db.js";
|
|
449
|
+
import { migrateMoveActivationSessionsToMemoryDb } from "./migrations/339-move-activation-sessions-to-memory-db.js";
|
|
446
450
|
import type { MigrationStep } from "./migrations/run-migrations.js";
|
|
447
451
|
|
|
448
452
|
export const migrationSteps: MigrationStep[] = [
|
|
@@ -1357,4 +1361,36 @@ export const migrationSteps: MigrationStep[] = [
|
|
|
1357
1361
|
migrateCreateTelemetryEventsTable,
|
|
1358
1362
|
migrateBackfillTelemetryEventsOutbox,
|
|
1359
1363
|
migrateCollapseMemoryEmbedBacklog,
|
|
1364
|
+
{
|
|
1365
|
+
name: "migrateMoveMemoryV2ActivationLogsToMemoryDb",
|
|
1366
|
+
run: migrateMoveMemoryV2ActivationLogsToMemoryDb,
|
|
1367
|
+
// 256's backfill reads memory_v2_activation_logs from main, so the move
|
|
1368
|
+
// must not run on a database where 256 is still pending.
|
|
1369
|
+
dependsOn: [
|
|
1370
|
+
"migrateMemoryV2ActivationLogs",
|
|
1371
|
+
"migrateMemoryV2InjectionEvents",
|
|
1372
|
+
],
|
|
1373
|
+
},
|
|
1374
|
+
{
|
|
1375
|
+
name: "migrateMoveMemoryRecallLogsToMemoryDb",
|
|
1376
|
+
run: migrateMoveMemoryRecallLogsToMemoryDb,
|
|
1377
|
+
dependsOn: [
|
|
1378
|
+
"migrateCreateMemoryRecallLogs",
|
|
1379
|
+
"migrateMemoryRecallLogsQueryContext",
|
|
1380
|
+
"migrateDeletePrivateConversations",
|
|
1381
|
+
],
|
|
1382
|
+
},
|
|
1383
|
+
{
|
|
1384
|
+
name: "migrateMoveMemoryV3SelectionsToMemoryDb",
|
|
1385
|
+
run: migrateMoveMemoryV3SelectionsToMemoryDb,
|
|
1386
|
+
dependsOn: [
|
|
1387
|
+
"migrateAddMemoryV3Selections",
|
|
1388
|
+
"migrateMemoryV3SelectionsMessageIdAndSections",
|
|
1389
|
+
],
|
|
1390
|
+
},
|
|
1391
|
+
{
|
|
1392
|
+
name: "migrateMoveActivationSessionsToMemoryDb",
|
|
1393
|
+
run: migrateMoveActivationSessionsToMemoryDb,
|
|
1394
|
+
dependsOn: ["createActivationSessionsTable"],
|
|
1395
|
+
},
|
|
1360
1396
|
];
|
|
@@ -287,34 +287,13 @@ describe("VellumPlatformClient", () => {
|
|
|
287
287
|
});
|
|
288
288
|
});
|
|
289
289
|
|
|
290
|
-
test("
|
|
290
|
+
test("explicit false is an opt-out", async () => {
|
|
291
291
|
globalThis.fetch = mock(
|
|
292
292
|
async () =>
|
|
293
293
|
new Response(
|
|
294
294
|
JSON.stringify({
|
|
295
295
|
share_analytics: false,
|
|
296
|
-
share_analytics_chosen: false,
|
|
297
|
-
share_diagnostics: true,
|
|
298
|
-
share_diagnostics_accepted_version: "2026-06-18",
|
|
299
|
-
}),
|
|
300
|
-
{ status: 200 },
|
|
301
|
-
),
|
|
302
|
-
) as unknown as typeof globalThis.fetch;
|
|
303
|
-
|
|
304
|
-
const client = await VellumPlatformClient.create();
|
|
305
|
-
const consent = await client!.getOwnerConsent();
|
|
306
|
-
expect(consent!.shareAnalytics).toBe(true);
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
test("explicit false with share_analytics_chosen=true stays an opt-out", async () => {
|
|
310
|
-
globalThis.fetch = mock(
|
|
311
|
-
async () =>
|
|
312
|
-
new Response(
|
|
313
|
-
JSON.stringify({
|
|
314
|
-
share_analytics: false,
|
|
315
|
-
share_analytics_chosen: true,
|
|
316
296
|
share_diagnostics: false,
|
|
317
|
-
share_diagnostics_chosen: true,
|
|
318
297
|
share_diagnostics_accepted_version: "2026-06-18",
|
|
319
298
|
}),
|
|
320
299
|
{ status: 200 },
|
|
@@ -330,28 +309,6 @@ describe("VellumPlatformClient", () => {
|
|
|
330
309
|
});
|
|
331
310
|
});
|
|
332
311
|
|
|
333
|
-
test("false without a *_chosen field (older platform) stays authoritative", async () => {
|
|
334
|
-
globalThis.fetch = mock(
|
|
335
|
-
async () =>
|
|
336
|
-
new Response(
|
|
337
|
-
JSON.stringify({
|
|
338
|
-
share_analytics: false,
|
|
339
|
-
share_diagnostics: false,
|
|
340
|
-
share_diagnostics_accepted_version: "",
|
|
341
|
-
}),
|
|
342
|
-
{ status: 200 },
|
|
343
|
-
),
|
|
344
|
-
) as unknown as typeof globalThis.fetch;
|
|
345
|
-
|
|
346
|
-
const client = await VellumPlatformClient.create();
|
|
347
|
-
const consent = await client!.getOwnerConsent();
|
|
348
|
-
expect(consent).toEqual({
|
|
349
|
-
shareAnalytics: false,
|
|
350
|
-
shareDiagnostics: false,
|
|
351
|
-
shareDiagnosticsAcceptedVersion: "",
|
|
352
|
-
});
|
|
353
|
-
});
|
|
354
|
-
|
|
355
312
|
test("null share_diagnostics (owner never chose) maps to true with the version gate still closed", async () => {
|
|
356
313
|
globalThis.fetch = mock(
|
|
357
314
|
async () =>
|
package/src/platform/client.ts
CHANGED
|
@@ -18,11 +18,9 @@ let _missingPrereqsWarned = false;
|
|
|
18
18
|
|
|
19
19
|
export interface OwnerConsent {
|
|
20
20
|
/**
|
|
21
|
-
* Telemetry is opt-out:
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* coercing a never-chose null to a strict boolean, not a real opt-out, so
|
|
25
|
-
* it also maps to `true`.
|
|
21
|
+
* Telemetry is opt-out: the owner-consent endpoint returns effective
|
|
22
|
+
* values (a never-chose null is served as consented), so an explicit
|
|
23
|
+
* `false` is the only thing that disables sharing.
|
|
26
24
|
*/
|
|
27
25
|
shareAnalytics: boolean;
|
|
28
26
|
/** Same opt-out semantics as {@link shareAnalytics}. */
|
|
@@ -132,10 +130,11 @@ export class VellumPlatformClient {
|
|
|
132
130
|
/**
|
|
133
131
|
* Fetch the platform owner's telemetry consent for this assistant.
|
|
134
132
|
*
|
|
133
|
+
* The endpoint returns effective consent values (a never-chose null is
|
|
134
|
+
* served as consented); an explicit `false` is the only disable.
|
|
135
|
+
*
|
|
135
136
|
* Returns `null` whenever the consent is unknown — missing assistant id,
|
|
136
|
-
* any non-2xx response
|
|
137
|
-
* malformed body, or a network error. Callers treat `null` as default-off.
|
|
138
|
-
* Never throws.
|
|
137
|
+
* any non-2xx response, a malformed body, or a network error. Never throws.
|
|
139
138
|
*/
|
|
140
139
|
async getOwnerConsent(): Promise<OwnerConsent | null> {
|
|
141
140
|
if (!this.assistantId) {
|
|
@@ -156,9 +155,7 @@ export class VellumPlatformClient {
|
|
|
156
155
|
|
|
157
156
|
const body = (await res.json()) as {
|
|
158
157
|
share_analytics?: unknown;
|
|
159
|
-
share_analytics_chosen?: unknown;
|
|
160
158
|
share_diagnostics?: unknown;
|
|
161
|
-
share_diagnostics_chosen?: unknown;
|
|
162
159
|
share_diagnostics_accepted_version?: unknown;
|
|
163
160
|
};
|
|
164
161
|
if (
|
|
@@ -172,16 +169,9 @@ export class VellumPlatformClient {
|
|
|
172
169
|
}
|
|
173
170
|
|
|
174
171
|
return {
|
|
175
|
-
// Opt-out: anything but an explicit false enables sharing.
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
// (older platform) leaves false authoritative.
|
|
179
|
-
shareAnalytics:
|
|
180
|
-
body.share_analytics !== false ||
|
|
181
|
-
body.share_analytics_chosen === false,
|
|
182
|
-
shareDiagnostics:
|
|
183
|
-
body.share_diagnostics !== false ||
|
|
184
|
-
body.share_diagnostics_chosen === false,
|
|
172
|
+
// Opt-out: anything but an explicit false enables sharing.
|
|
173
|
+
shareAnalytics: body.share_analytics !== false,
|
|
174
|
+
shareDiagnostics: body.share_diagnostics !== false,
|
|
185
175
|
// Back-compat: an older platform that doesn't return this field yields
|
|
186
176
|
// "" → fails the trace-collection version gate → fail-closed (no trace).
|
|
187
177
|
shareDiagnosticsAcceptedVersion:
|