@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
|
@@ -778,11 +778,50 @@ export function getRequestLogById(logId: string): LogRow | null {
|
|
|
778
778
|
);
|
|
779
779
|
}
|
|
780
780
|
|
|
781
|
+
/**
|
|
782
|
+
* Authoritative post-persist linkage: stamp `message_id` onto rows a flow
|
|
783
|
+
* inserted unlinked because its user-facing message persists afterwards
|
|
784
|
+
* (the /compact and summarize-up-to result cards). Dispatched through the
|
|
785
|
+
* IS-NULL-guarded {@link LlmRequestLogWriter.backfillMessageIdOnRecoveredLogs}
|
|
786
|
+
* so a concurrent inspector-recovery stamp is never overwritten. Non-fatal —
|
|
787
|
+
* an unlinked row degrades to time-window recovery, not data loss.
|
|
788
|
+
*/
|
|
789
|
+
export function linkRequestLogsToMessage(
|
|
790
|
+
logIds: string[],
|
|
791
|
+
messageId: string,
|
|
792
|
+
): void {
|
|
793
|
+
if (logIds.length === 0) {
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
796
|
+
try {
|
|
797
|
+
resolveLlmRequestLogWriter().backfillMessageIdOnRecoveredLogs(
|
|
798
|
+
logIds,
|
|
799
|
+
messageId,
|
|
800
|
+
);
|
|
801
|
+
} catch {
|
|
802
|
+
// non-fatal — the row stays unlinked and time-window recovery finds it
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
/**
|
|
807
|
+
* True when a log row was authored by the turn's own agent loop — a
|
|
808
|
+
* `mainAgent` row, or a legacy row from before call sites were stamped
|
|
809
|
+
* (`call_site` NULL). Companion rows a turn merely hosts (e.g.
|
|
810
|
+
* `compactionAgent`) don't count: a fork-local turn whose only rows are
|
|
811
|
+
* companions still needs the fork-source fallback to surface the turn's
|
|
812
|
+
* real calls.
|
|
813
|
+
*/
|
|
814
|
+
function isTurnAuthoredLog(row: LogRow): boolean {
|
|
815
|
+
return row.callSite == null || row.callSite === "mainAgent";
|
|
816
|
+
}
|
|
817
|
+
|
|
781
818
|
export function getRequestLogsByMessageId(messageId: string): LogRow[] {
|
|
782
819
|
// Resolve all assistant message IDs in the same turn so the inspector
|
|
783
820
|
// shows every LLM call from the entire agent turn, not just the queried message.
|
|
784
821
|
const turnMessageIds = getAssistantMessageIdsInTurn(messageId);
|
|
785
822
|
const turnLogs = selectLogsByMessageIds(turnMessageIds);
|
|
823
|
+
const seen = new Set(turnLogs.map((l) => l.id));
|
|
824
|
+
const merged = [...turnLogs];
|
|
786
825
|
|
|
787
826
|
// Recovery: find logs in the turn's time window that the message-ID-based
|
|
788
827
|
// query missed. Two categories:
|
|
@@ -805,65 +844,62 @@ export function getRequestLogsByMessageId(messageId: string): LogRow[] {
|
|
|
805
844
|
bounds.endTime,
|
|
806
845
|
);
|
|
807
846
|
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
847
|
+
for (const log of [...orphanedLogs, ...unlinkedLogs]) {
|
|
848
|
+
if (!seen.has(log.id)) {
|
|
849
|
+
merged.push(log);
|
|
850
|
+
seen.add(log.id);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
// Opportunistically backfill recovered unlinked logs so future queries
|
|
855
|
+
// hit the fast indexed-by-messageId path. Dispatched through the
|
|
856
|
+
// active write backend like every other table writer — INSERT-only
|
|
857
|
+
// backends no-op.
|
|
858
|
+
if (unlinkedLogs.length > 0 && turnMessageIds.length > 0) {
|
|
859
|
+
try {
|
|
860
|
+
const ids = unlinkedLogs.map((l) => l.id);
|
|
861
|
+
const targetMessageId = turnMessageIds[turnMessageIds.length - 1]!;
|
|
862
|
+
resolveLlmRequestLogWriter().backfillMessageIdOnRecoveredLogs(
|
|
863
|
+
ids,
|
|
864
|
+
targetMessageId,
|
|
865
|
+
);
|
|
866
|
+
} catch {
|
|
867
|
+
// non-fatal — the recovery already returned the right data
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
// Fork-source fallback: pre-fork turns keep their calls under the SOURCE
|
|
874
|
+
// conversation's message ids, so a fork-local turn with no turn-authored
|
|
875
|
+
// row resolves the source turn and merges its calls. Gating on "no
|
|
876
|
+
// turn-authored row" (not "no rows at all") keeps the fallback alive when
|
|
877
|
+
// a companion row — e.g. a summarize-up-to compaction call landing inside
|
|
878
|
+
// the turn's time window — was claimed by the recovery above; without it
|
|
879
|
+
// that companion would eclipse the turn's real calls.
|
|
880
|
+
if (message?.metadata && !merged.some(isTurnAuthoredLog)) {
|
|
881
|
+
try {
|
|
882
|
+
const parsed = messageMetadataSchema.safeParse(
|
|
883
|
+
JSON.parse(message.metadata),
|
|
884
|
+
);
|
|
885
|
+
const sourceMessageId =
|
|
886
|
+
parsed.success && typeof parsed.data.forkSourceMessageId === "string"
|
|
887
|
+
? parsed.data.forkSourceMessageId
|
|
888
|
+
: null;
|
|
889
|
+
if (sourceMessageId && sourceMessageId !== messageId) {
|
|
890
|
+
const sourceTurnIds = getAssistantMessageIdsInTurn(sourceMessageId);
|
|
891
|
+
for (const log of selectLogsByMessageIds(sourceTurnIds)) {
|
|
812
892
|
if (!seen.has(log.id)) {
|
|
813
893
|
merged.push(log);
|
|
814
894
|
seen.add(log.id);
|
|
815
895
|
}
|
|
816
896
|
}
|
|
817
|
-
merged.sort(
|
|
818
|
-
(a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id),
|
|
819
|
-
);
|
|
820
|
-
|
|
821
|
-
// Opportunistically backfill recovered unlinked logs so future queries
|
|
822
|
-
// hit the fast indexed-by-messageId path. Dispatched through the
|
|
823
|
-
// active write backend like every other table writer — INSERT-only
|
|
824
|
-
// backends no-op.
|
|
825
|
-
if (unlinkedLogs.length > 0 && turnMessageIds.length > 0) {
|
|
826
|
-
try {
|
|
827
|
-
const ids = unlinkedLogs.map((l) => l.id);
|
|
828
|
-
const targetMessageId = turnMessageIds[turnMessageIds.length - 1]!;
|
|
829
|
-
resolveLlmRequestLogWriter().backfillMessageIdOnRecoveredLogs(
|
|
830
|
-
ids,
|
|
831
|
-
targetMessageId,
|
|
832
|
-
);
|
|
833
|
-
} catch {
|
|
834
|
-
// non-fatal — the recovery already returned the right data
|
|
835
|
-
}
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
return merged;
|
|
839
897
|
}
|
|
898
|
+
} catch {
|
|
899
|
+
// malformed metadata — no fork source to resolve
|
|
840
900
|
}
|
|
841
901
|
}
|
|
842
902
|
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
}
|
|
846
|
-
|
|
847
|
-
// Fork-source fallback: if no logs found for the turn, check whether
|
|
848
|
-
// the queried message was forked from a source and resolve that source's turn.
|
|
849
|
-
if (!message?.metadata) {
|
|
850
|
-
return [];
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
try {
|
|
854
|
-
const parsed = messageMetadataSchema.safeParse(
|
|
855
|
-
JSON.parse(message.metadata),
|
|
856
|
-
);
|
|
857
|
-
const sourceMessageId =
|
|
858
|
-
parsed.success && typeof parsed.data.forkSourceMessageId === "string"
|
|
859
|
-
? parsed.data.forkSourceMessageId
|
|
860
|
-
: null;
|
|
861
|
-
if (!sourceMessageId || sourceMessageId === messageId) {
|
|
862
|
-
return [];
|
|
863
|
-
}
|
|
864
|
-
const sourceTurnIds = getAssistantMessageIdsInTurn(sourceMessageId);
|
|
865
|
-
return selectLogsByMessageIds(sourceTurnIds);
|
|
866
|
-
} catch {
|
|
867
|
-
return [];
|
|
868
|
-
}
|
|
903
|
+
merged.sort((a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id));
|
|
904
|
+
return merged;
|
|
869
905
|
}
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import type { Database } from "bun:sqlite";
|
|
2
2
|
|
|
3
3
|
import { getMemoryDbPath } from "../../util/memory-db-path.js";
|
|
4
|
+
import type { DrizzleDb } from "../db-connection.js";
|
|
4
5
|
import {
|
|
5
|
-
type DrizzleDb,
|
|
6
|
-
getMemorySqlite,
|
|
7
|
-
getSqliteFrom,
|
|
8
|
-
} from "../db-connection.js";
|
|
9
|
-
import {
|
|
10
|
-
drainStagedTable,
|
|
11
6
|
type RelocationSpec,
|
|
12
|
-
|
|
7
|
+
runMemoryTableRelocation,
|
|
13
8
|
} from "./helpers/relocation.js";
|
|
14
9
|
|
|
15
10
|
/**
|
|
@@ -94,35 +89,16 @@ function createIndexes(raw: Database) {
|
|
|
94
89
|
* The jobs store reads/writes the queue over the dedicated memory connection
|
|
95
90
|
* (see `getMemoryDb()`).
|
|
96
91
|
*
|
|
97
|
-
* Like the `llm_request_logs` move (migration 297) this is incremental: create
|
|
98
|
-
* the table (and indexes) on the memory connection, rename any populated
|
|
99
|
-
* `main.memory_jobs` aside to `memory_jobs__relocating`, then drain it in
|
|
100
|
-
* awaited batches (see `helpers/relocation.ts`) per {@link MEMORY_JOBS_RELOCATION}.
|
|
101
|
-
*
|
|
102
92
|
* Because the drain is awaited as part of this step, the pending/running jobs
|
|
103
93
|
* are in their new home before the memory jobs worker starts later in daemon
|
|
104
94
|
* startup — the worker never observes a transiently empty queue.
|
|
105
|
-
*
|
|
106
|
-
* Throws (rather than returning) if the memory database cannot be opened, so
|
|
107
|
-
* the runner records the step as failed instead of applied and retries it on a
|
|
108
|
-
* later boot — never renaming the source aside without a target to write to,
|
|
109
|
-
* and never marking the relocation done while it has not happened. The throw is
|
|
110
|
-
* caught per-step by the runner, so startup is not aborted.
|
|
111
95
|
*/
|
|
112
96
|
export async function migrateMoveMemoryJobsToMemoryDb(
|
|
113
97
|
database: DrizzleDb,
|
|
114
98
|
): Promise<void> {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
ensureMemoryJobsSchema(memoryRaw);
|
|
123
|
-
|
|
124
|
-
const raw = getSqliteFrom(database);
|
|
125
|
-
const needsDrain = stageTableForRelocation(raw, MEMORY_JOBS_RELOCATION.table);
|
|
126
|
-
|
|
127
|
-
if (needsDrain) await drainStagedTable(raw, MEMORY_JOBS_RELOCATION);
|
|
99
|
+
await runMemoryTableRelocation(
|
|
100
|
+
database,
|
|
101
|
+
MEMORY_JOBS_RELOCATION,
|
|
102
|
+
ensureMemoryJobsSchema,
|
|
103
|
+
);
|
|
128
104
|
}
|
|
@@ -9,8 +9,9 @@ const log = getLogger("migration-305");
|
|
|
9
9
|
* Drops the redundant contact ACL columns now owned by the gateway DB.
|
|
10
10
|
*
|
|
11
11
|
* Combo 11 Phase B: the gateway DB is the source of truth for contact ACL,
|
|
12
|
-
* making these assistant-DB columns redundant mirrors. Phase A
|
|
13
|
-
*
|
|
12
|
+
* making these assistant-DB columns redundant mirrors. Phase A drained the
|
|
13
|
+
* runtime reads; gateway data migrations m0006/m0008 still read them to seed a
|
|
14
|
+
* pre-cutover gateway, and checkpoint once they are gone.
|
|
14
15
|
*
|
|
15
16
|
* No DROP INDEX needed: the only contact_channels index
|
|
16
17
|
* (idx_contact_channels_type_ext_chat on (type, external_chat_id)) covers none
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import type { Database } from "bun:sqlite";
|
|
2
2
|
|
|
3
3
|
import { getMemoryDbPath } from "../../util/memory-db-path.js";
|
|
4
|
+
import type { DrizzleDb } from "../db-connection.js";
|
|
4
5
|
import {
|
|
5
|
-
type DrizzleDb,
|
|
6
|
-
getMemorySqlite,
|
|
7
|
-
getSqliteFrom,
|
|
8
|
-
} from "../db-connection.js";
|
|
9
|
-
import {
|
|
10
|
-
drainStagedTable,
|
|
11
6
|
type RelocationSpec,
|
|
12
|
-
|
|
7
|
+
runMemoryTableRelocation,
|
|
13
8
|
} from "./helpers/relocation.js";
|
|
14
9
|
|
|
15
10
|
/**
|
|
@@ -69,36 +64,15 @@ export function ensureInjectionEventsSchema(memoryRaw: Database): void {
|
|
|
69
64
|
* accessors in `plugins/defaults/memory/v2/injection-events.ts` read/write it
|
|
70
65
|
* over the dedicated memory connection (see `getMemoryDb()`).
|
|
71
66
|
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* `main.memory_v2_injection_events` aside to
|
|
75
|
-
* `memory_v2_injection_events__relocating`, then drain it in awaited batches
|
|
76
|
-
* (see `helpers/relocation.ts`) per {@link INJECTION_EVENTS_RELOCATION}. On a
|
|
77
|
-
* fresh install the main-side table created by migration 256 is empty, so
|
|
78
|
-
* staging just drops it.
|
|
79
|
-
*
|
|
80
|
-
* Throws (rather than returning) if the memory database cannot be opened, so
|
|
81
|
-
* the runner records the step as failed instead of applied and retries it on
|
|
82
|
-
* a later boot — never renaming the source aside without a target to write
|
|
83
|
-
* to. The throw is caught per-step by the runner, so startup is not aborted.
|
|
67
|
+
* On a fresh install the main-side table created by migration 256 is empty,
|
|
68
|
+
* so staging just drops it.
|
|
84
69
|
*/
|
|
85
70
|
export async function migrateMoveInjectionEventsToMemoryDb(
|
|
86
71
|
database: DrizzleDb,
|
|
87
72
|
): Promise<void> {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
ensureInjectionEventsSchema(memoryRaw);
|
|
96
|
-
|
|
97
|
-
const raw = getSqliteFrom(database);
|
|
98
|
-
const needsDrain = stageTableForRelocation(
|
|
99
|
-
raw,
|
|
100
|
-
INJECTION_EVENTS_RELOCATION.table,
|
|
73
|
+
await runMemoryTableRelocation(
|
|
74
|
+
database,
|
|
75
|
+
INJECTION_EVENTS_RELOCATION,
|
|
76
|
+
ensureInjectionEventsSchema,
|
|
101
77
|
);
|
|
102
|
-
|
|
103
|
-
if (needsDrain) await drainStagedTable(raw, INJECTION_EVENTS_RELOCATION);
|
|
104
78
|
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { Database } from "bun:sqlite";
|
|
2
|
+
|
|
3
|
+
import { getMemoryDbPath } from "../../util/memory-db-path.js";
|
|
4
|
+
import type { DrizzleDb } from "../db-connection.js";
|
|
5
|
+
import {
|
|
6
|
+
type RelocationSpec,
|
|
7
|
+
runMemoryTableRelocation,
|
|
8
|
+
} from "./helpers/relocation.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* How to drain `memory_v2_activation_logs` from `main` into the memory DB.
|
|
12
|
+
* Full copy — the concept-frequency aggregator scans the entire history, so
|
|
13
|
+
* every row is worth preserving.
|
|
14
|
+
*/
|
|
15
|
+
export const ACTIVATION_LOGS_RELOCATION: RelocationSpec = {
|
|
16
|
+
table: "memory_v2_activation_logs",
|
|
17
|
+
targetDbPath: getMemoryDbPath,
|
|
18
|
+
columns: [
|
|
19
|
+
"id",
|
|
20
|
+
"conversation_id",
|
|
21
|
+
"message_id",
|
|
22
|
+
"turn",
|
|
23
|
+
"mode",
|
|
24
|
+
"concepts_json",
|
|
25
|
+
"skills_json",
|
|
26
|
+
"config_json",
|
|
27
|
+
"created_at",
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const CREATE_TABLE = /*sql*/ `
|
|
32
|
+
CREATE TABLE IF NOT EXISTS memory_v2_activation_logs (
|
|
33
|
+
id TEXT PRIMARY KEY,
|
|
34
|
+
conversation_id TEXT NOT NULL,
|
|
35
|
+
message_id TEXT,
|
|
36
|
+
turn INTEGER NOT NULL,
|
|
37
|
+
mode TEXT NOT NULL,
|
|
38
|
+
concepts_json TEXT NOT NULL,
|
|
39
|
+
skills_json TEXT NOT NULL,
|
|
40
|
+
config_json TEXT NOT NULL,
|
|
41
|
+
created_at INTEGER NOT NULL
|
|
42
|
+
)
|
|
43
|
+
`;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Create the `memory_v2_activation_logs` table and its indexes (mirroring
|
|
47
|
+
* migration 234) on the memory connection. Idempotent (`IF NOT EXISTS`) — the
|
|
48
|
+
* dedicated connection itself performs no DDL on open, so this migration owns
|
|
49
|
+
* the schema. Exported so tests can stand up the memory-side schema without
|
|
50
|
+
* running the full drain.
|
|
51
|
+
*/
|
|
52
|
+
export function ensureActivationLogsSchema(memoryRaw: Database): void {
|
|
53
|
+
memoryRaw.exec(CREATE_TABLE);
|
|
54
|
+
memoryRaw.exec(/*sql*/ `
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_memory_v2_activation_logs_message_id
|
|
56
|
+
ON memory_v2_activation_logs (message_id)
|
|
57
|
+
`);
|
|
58
|
+
memoryRaw.exec(/*sql*/ `
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_memory_v2_activation_logs_conversation_id
|
|
60
|
+
ON memory_v2_activation_logs (conversation_id)
|
|
61
|
+
`);
|
|
62
|
+
memoryRaw.exec(/*sql*/ `
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_memory_v2_activation_logs_created_at
|
|
64
|
+
ON memory_v2_activation_logs (created_at)
|
|
65
|
+
`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Move `memory_v2_activation_logs` — the per-turn v2 activation telemetry log
|
|
70
|
+
* — into the dedicated memory database (`assistant-memory.db`), alongside
|
|
71
|
+
* `memory_jobs` (migration 298) and `memory_v2_injection_events` (migration
|
|
72
|
+
* 326). One row is appended per activation pass, so housing the table with
|
|
73
|
+
* the other high-churn memory state keeps the main DB and its WAL out of
|
|
74
|
+
* that write path; the accessors in
|
|
75
|
+
* `plugins/defaults/memory/memory-v2-activation-log-store.ts` read/write it
|
|
76
|
+
* over the dedicated memory connection.
|
|
77
|
+
*
|
|
78
|
+
* Registered with `dependsOn` on migrations 234 (creator) and 256 (whose
|
|
79
|
+
* backfill reads this table from `main`), so the move never outruns either
|
|
80
|
+
* on a database where they are still pending.
|
|
81
|
+
*/
|
|
82
|
+
export async function migrateMoveMemoryV2ActivationLogsToMemoryDb(
|
|
83
|
+
database: DrizzleDb,
|
|
84
|
+
): Promise<void> {
|
|
85
|
+
await runMemoryTableRelocation(
|
|
86
|
+
database,
|
|
87
|
+
ACTIVATION_LOGS_RELOCATION,
|
|
88
|
+
ensureActivationLogsSchema,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { Database } from "bun:sqlite";
|
|
2
|
+
|
|
3
|
+
import { getMemoryDbPath } from "../../util/memory-db-path.js";
|
|
4
|
+
import type { DrizzleDb } from "../db-connection.js";
|
|
5
|
+
import {
|
|
6
|
+
type RelocationSpec,
|
|
7
|
+
runMemoryTableRelocation,
|
|
8
|
+
} from "./helpers/relocation.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* How to drain `memory_recall_logs` from `main` into the memory DB. Full copy
|
|
12
|
+
* — the inspector reads arbitrary historical turns, so every row is worth
|
|
13
|
+
* preserving. `query_context` was added by migration 211, so a legacy source
|
|
14
|
+
* may lack the column; the drain NULL-fills it.
|
|
15
|
+
*/
|
|
16
|
+
export const RECALL_LOGS_RELOCATION: RelocationSpec = {
|
|
17
|
+
table: "memory_recall_logs",
|
|
18
|
+
targetDbPath: getMemoryDbPath,
|
|
19
|
+
columns: [
|
|
20
|
+
"id",
|
|
21
|
+
"conversation_id",
|
|
22
|
+
"message_id",
|
|
23
|
+
"enabled",
|
|
24
|
+
"degraded",
|
|
25
|
+
"provider",
|
|
26
|
+
"model",
|
|
27
|
+
"degradation_json",
|
|
28
|
+
"semantic_hits",
|
|
29
|
+
"merged_count",
|
|
30
|
+
"selected_count",
|
|
31
|
+
"tier1_count",
|
|
32
|
+
"tier2_count",
|
|
33
|
+
"hybrid_search_latency_ms",
|
|
34
|
+
"sparse_vector_used",
|
|
35
|
+
"injected_tokens",
|
|
36
|
+
"latency_ms",
|
|
37
|
+
"top_candidates_json",
|
|
38
|
+
"injected_text",
|
|
39
|
+
"reason",
|
|
40
|
+
"query_context",
|
|
41
|
+
"created_at",
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const CREATE_TABLE = /*sql*/ `
|
|
46
|
+
CREATE TABLE IF NOT EXISTS memory_recall_logs (
|
|
47
|
+
id TEXT PRIMARY KEY,
|
|
48
|
+
conversation_id TEXT NOT NULL,
|
|
49
|
+
message_id TEXT,
|
|
50
|
+
enabled INTEGER NOT NULL,
|
|
51
|
+
degraded INTEGER NOT NULL,
|
|
52
|
+
provider TEXT,
|
|
53
|
+
model TEXT,
|
|
54
|
+
degradation_json TEXT,
|
|
55
|
+
semantic_hits INTEGER NOT NULL,
|
|
56
|
+
merged_count INTEGER NOT NULL,
|
|
57
|
+
selected_count INTEGER NOT NULL,
|
|
58
|
+
tier1_count INTEGER NOT NULL,
|
|
59
|
+
tier2_count INTEGER NOT NULL,
|
|
60
|
+
hybrid_search_latency_ms INTEGER NOT NULL,
|
|
61
|
+
sparse_vector_used INTEGER NOT NULL,
|
|
62
|
+
injected_tokens INTEGER NOT NULL,
|
|
63
|
+
latency_ms INTEGER NOT NULL,
|
|
64
|
+
top_candidates_json TEXT NOT NULL,
|
|
65
|
+
injected_text TEXT,
|
|
66
|
+
reason TEXT,
|
|
67
|
+
query_context TEXT,
|
|
68
|
+
created_at INTEGER NOT NULL
|
|
69
|
+
)
|
|
70
|
+
`;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Create the `memory_recall_logs` table and its indexes (mirroring migration
|
|
74
|
+
* 194, with the `query_context` column from migration 211 built in) on the
|
|
75
|
+
* memory connection. Idempotent (`IF NOT EXISTS`) — the dedicated connection
|
|
76
|
+
* itself performs no DDL on open, so this migration owns the schema. Exported
|
|
77
|
+
* so tests can stand up the memory-side schema without running the full
|
|
78
|
+
* drain.
|
|
79
|
+
*/
|
|
80
|
+
export function ensureRecallLogsSchema(memoryRaw: Database): void {
|
|
81
|
+
memoryRaw.exec(CREATE_TABLE);
|
|
82
|
+
memoryRaw.exec(/*sql*/ `
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_memory_recall_logs_message_id
|
|
84
|
+
ON memory_recall_logs (message_id)
|
|
85
|
+
`);
|
|
86
|
+
memoryRaw.exec(/*sql*/ `
|
|
87
|
+
CREATE INDEX IF NOT EXISTS idx_memory_recall_logs_conversation_id
|
|
88
|
+
ON memory_recall_logs (conversation_id)
|
|
89
|
+
`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Move `memory_recall_logs` — the per-turn memory recall telemetry consumed
|
|
94
|
+
* by the inspector — into the dedicated memory database
|
|
95
|
+
* (`assistant-memory.db`), alongside the other relocated per-turn memory log
|
|
96
|
+
* tables. One row is appended per recall pass, so housing the table with the
|
|
97
|
+
* other high-churn memory state keeps the main DB and its WAL out of that
|
|
98
|
+
* write path; the accessors in
|
|
99
|
+
* `plugins/defaults/memory/memory-recall-log-store.ts` read/write it over the
|
|
100
|
+
* dedicated memory connection.
|
|
101
|
+
*
|
|
102
|
+
* Registered with `dependsOn` on migrations 194 (creator) and 211
|
|
103
|
+
* (`query_context` column), so the move never outruns either on a database
|
|
104
|
+
* where they are still pending.
|
|
105
|
+
*/
|
|
106
|
+
export async function migrateMoveMemoryRecallLogsToMemoryDb(
|
|
107
|
+
database: DrizzleDb,
|
|
108
|
+
): Promise<void> {
|
|
109
|
+
await runMemoryTableRelocation(
|
|
110
|
+
database,
|
|
111
|
+
RECALL_LOGS_RELOCATION,
|
|
112
|
+
ensureRecallLogsSchema,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Database } from "bun:sqlite";
|
|
2
|
+
|
|
3
|
+
import { getMemoryDbPath } from "../../util/memory-db-path.js";
|
|
4
|
+
import type { DrizzleDb } from "../db-connection.js";
|
|
5
|
+
import {
|
|
6
|
+
type RelocationSpec,
|
|
7
|
+
runMemoryTableRelocation,
|
|
8
|
+
} from "./helpers/relocation.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* How to drain `memory_v3_selections` from `main` into the memory DB. Every
|
|
12
|
+
* row is copied: the hot-set and learned-edge lanes score decayed selection
|
|
13
|
+
* frequency over the full log, so there is no age cutoff a purge could lean
|
|
14
|
+
* on. The column list covers migration 268's originals plus the nullable
|
|
15
|
+
* columns migration 283 added — a source staged before 283 ran simply
|
|
16
|
+
* NULL-fills them during the copy.
|
|
17
|
+
*/
|
|
18
|
+
export const MEMORY_V3_SELECTIONS_RELOCATION: RelocationSpec = {
|
|
19
|
+
table: "memory_v3_selections",
|
|
20
|
+
targetDbPath: getMemoryDbPath,
|
|
21
|
+
columns: [
|
|
22
|
+
"conversation_id",
|
|
23
|
+
"turn",
|
|
24
|
+
"slug",
|
|
25
|
+
"source",
|
|
26
|
+
"pinned",
|
|
27
|
+
"created_at",
|
|
28
|
+
"message_id",
|
|
29
|
+
"section_ordinal",
|
|
30
|
+
"section_title",
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Create the `memory_v3_selections` table and its indexes on the memory
|
|
36
|
+
* connection. Idempotent (`IF NOT EXISTS`) — the dedicated connection itself
|
|
37
|
+
* performs no DDL on open, so this migration owns the schema. Exported so
|
|
38
|
+
* tests can stand up the memory-side schema without running the full drain.
|
|
39
|
+
*/
|
|
40
|
+
export function ensureMemoryV3SelectionsSchema(memoryRaw: Database): void {
|
|
41
|
+
memoryRaw.exec(/*sql*/ `
|
|
42
|
+
CREATE TABLE IF NOT EXISTS memory_v3_selections (
|
|
43
|
+
conversation_id TEXT NOT NULL,
|
|
44
|
+
turn INTEGER NOT NULL,
|
|
45
|
+
slug TEXT NOT NULL,
|
|
46
|
+
source TEXT NOT NULL,
|
|
47
|
+
pinned INTEGER NOT NULL DEFAULT 0,
|
|
48
|
+
created_at INTEGER NOT NULL,
|
|
49
|
+
message_id TEXT,
|
|
50
|
+
section_ordinal INTEGER,
|
|
51
|
+
section_title TEXT,
|
|
52
|
+
PRIMARY KEY (conversation_id, turn, slug)
|
|
53
|
+
)
|
|
54
|
+
`);
|
|
55
|
+
memoryRaw.exec(/*sql*/ `
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_memory_v3_selections_conv
|
|
57
|
+
ON memory_v3_selections (conversation_id, turn DESC)
|
|
58
|
+
`);
|
|
59
|
+
memoryRaw.exec(/*sql*/ `
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_memory_v3_selections_message
|
|
61
|
+
ON memory_v3_selections (message_id)
|
|
62
|
+
`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Move `memory_v3_selections` — the per-turn v3 selection log feeding the
|
|
67
|
+
* hot-set, learned-edge, prune, and inspector readers — into the dedicated
|
|
68
|
+
* memory database (`assistant-memory.db`), alongside `memory_jobs` (298) and
|
|
69
|
+
* `memory_v2_injection_events` (326). The log gains rows on every v3 turn;
|
|
70
|
+
* housing it with the other high-churn memory state keeps the main DB and its
|
|
71
|
+
* WAL out of that write path.
|
|
72
|
+
*
|
|
73
|
+
* On a fresh install the main-side table created by migration 268 is empty,
|
|
74
|
+
* so staging just drops it.
|
|
75
|
+
*/
|
|
76
|
+
export async function migrateMoveMemoryV3SelectionsToMemoryDb(
|
|
77
|
+
database: DrizzleDb,
|
|
78
|
+
): Promise<void> {
|
|
79
|
+
await runMemoryTableRelocation(
|
|
80
|
+
database,
|
|
81
|
+
MEMORY_V3_SELECTIONS_RELOCATION,
|
|
82
|
+
ensureMemoryV3SelectionsSchema,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Database } from "bun:sqlite";
|
|
2
|
+
|
|
3
|
+
import { getMemoryDbPath } from "../../util/memory-db-path.js";
|
|
4
|
+
import type { DrizzleDb } from "../db-connection.js";
|
|
5
|
+
import {
|
|
6
|
+
type RelocationSpec,
|
|
7
|
+
runMemoryTableRelocation,
|
|
8
|
+
} from "./helpers/relocation.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* How to drain `activation_sessions` from `main` into the memory DB. Every
|
|
12
|
+
* row is copied: the table is one row per activation-rail conversation, read
|
|
13
|
+
* by the activation funnel for the conversation's whole lifetime.
|
|
14
|
+
*/
|
|
15
|
+
export const ACTIVATION_SESSIONS_RELOCATION: RelocationSpec = {
|
|
16
|
+
table: "activation_sessions",
|
|
17
|
+
targetDbPath: getMemoryDbPath,
|
|
18
|
+
columns: ["conversation_id", "created_at"],
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Create the `activation_sessions` table on the memory connection. Idempotent
|
|
23
|
+
* (`IF NOT EXISTS`) — the dedicated connection itself performs no DDL on open,
|
|
24
|
+
* so this migration owns the schema.
|
|
25
|
+
*/
|
|
26
|
+
function ensureActivationSessionsSchema(memoryRaw: Database): void {
|
|
27
|
+
memoryRaw.exec(/*sql*/ `
|
|
28
|
+
CREATE TABLE IF NOT EXISTS activation_sessions (
|
|
29
|
+
conversation_id TEXT PRIMARY KEY,
|
|
30
|
+
created_at INTEGER NOT NULL
|
|
31
|
+
)
|
|
32
|
+
`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Move `activation_sessions` — the per-conversation activation-rail marker
|
|
37
|
+
* behind the activation funnel telemetry — into the dedicated memory database
|
|
38
|
+
* (`assistant-memory.db`), joining the memory plugin's other relocated state
|
|
39
|
+
* so its store reads/writes ride the memory connection.
|
|
40
|
+
*
|
|
41
|
+
* On a fresh install the main-side table created by migration 274 is empty,
|
|
42
|
+
* so staging just drops it.
|
|
43
|
+
*/
|
|
44
|
+
export async function migrateMoveActivationSessionsToMemoryDb(
|
|
45
|
+
database: DrizzleDb,
|
|
46
|
+
): Promise<void> {
|
|
47
|
+
await runMemoryTableRelocation(
|
|
48
|
+
database,
|
|
49
|
+
ACTIVATION_SESSIONS_RELOCATION,
|
|
50
|
+
ensureActivationSessionsSchema,
|
|
51
|
+
);
|
|
52
|
+
}
|