@vellumai/assistant 0.10.2-dev.202606250318.5e7cfb0 → 0.10.2
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/bun.lock +0 -20
- package/docs/workspace-tools.md +33 -42
- package/eslint-rules/cli-no-daemon-internals.js +0 -6
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +0 -31
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +0 -44
- package/node_modules/@vellumai/gateway-client/src/index.ts +0 -14
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +0 -17
- package/node_modules/@vellumai/service-contracts/package.json +0 -1
- package/node_modules/@vellumai/service-contracts/src/index.ts +0 -1
- package/openapi.yaml +0 -155
- package/package.json +1 -4
- package/scripts/test.sh +15 -36
- package/src/__tests__/actor-token-service.test.ts +14 -36
- package/src/__tests__/agent-loop-override-profile.test.ts +0 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +0 -2
- package/src/__tests__/annotate-activity-metadata.test.ts +0 -2
- package/src/__tests__/annotate-risk-options.test.ts +0 -2
- package/src/__tests__/approval-cascade.test.ts +0 -2
- package/src/__tests__/assistant-attachments.test.ts +0 -42
- package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
- package/src/__tests__/btw-routes.test.ts +0 -2
- package/src/__tests__/build-persisted-content.test.ts +0 -2
- package/src/__tests__/call-controller.test.ts +0 -19
- package/src/__tests__/channel-guardian.test.ts +58 -94
- package/src/__tests__/channel-reply-delivery.test.ts +0 -2
- package/src/__tests__/compaction-events.test.ts +0 -2
- package/src/__tests__/compaction.benchmark.test.ts +0 -2
- package/src/__tests__/compactor-call-site-logging.test.ts +0 -2
- package/src/__tests__/compactor-low-watermark-cut.test.ts +0 -2
- package/src/__tests__/compactor-preserved-tail-count.test.ts +0 -2
- package/src/__tests__/compactor-summary-call-truncation.test.ts +0 -2
- package/src/__tests__/compactor-web-search-strip.test.ts +0 -2
- package/src/__tests__/config-loader-backfill.test.ts +10 -123
- package/src/__tests__/config-schema.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -31
- package/src/__tests__/contacts-relay-reads.test.ts +15 -13
- package/src/__tests__/conversation-abort-tool-results.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop.test.ts +0 -134
- package/src/__tests__/conversation-analysis-routes.test.ts +0 -2
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +0 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -2
- package/src/__tests__/conversation-history-web-search.test.ts +0 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +0 -2
- package/src/__tests__/conversation-load-history-stripped.test.ts +0 -2
- package/src/__tests__/conversation-pairing.test.ts +0 -2
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +0 -2
- package/src/__tests__/conversation-process-callsite.test.ts +0 -2
- package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -2
- package/src/__tests__/conversation-queue.test.ts +0 -91
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -14
- package/src/__tests__/conversation-routes-slash-commands.test.ts +0 -14
- package/src/__tests__/conversation-slash-queue.test.ts +0 -2
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -2
- package/src/__tests__/conversation-speed-override.test.ts +0 -2
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -29
- package/src/__tests__/conversation-title-service.test.ts +0 -2
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -47
- package/src/__tests__/conversation-usage.test.ts +0 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -2
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -2
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -2
- package/src/__tests__/credential-security-invariants.test.ts +1 -1
- package/src/__tests__/db-migration-rollback.test.ts +171 -205
- package/src/__tests__/db-test-helpers.ts +4 -5
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -4
- package/src/__tests__/disk-pressure-guard.test.ts +0 -41
- package/src/__tests__/dm-persistence.test.ts +0 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +5 -10
- package/src/__tests__/events-dev-bypass-actor.test.ts +1 -7
- package/src/__tests__/exploration-drift-hook.test.ts +2 -3
- package/src/__tests__/filing-service.test.ts +0 -2
- package/src/__tests__/guardian-binding-drift-heal.test.ts +10 -75
- package/src/__tests__/guardian-dispatch.test.ts +1 -95
- package/src/__tests__/guardian-outbound-http.test.ts +0 -13
- package/src/__tests__/heartbeat-disk-pressure.test.ts +0 -2
- package/src/__tests__/heartbeat-service.test.ts +0 -2
- package/src/__tests__/helpers/channel-test-adapter.ts +7 -1
- package/src/__tests__/host-app-control-routes.test.ts +30 -24
- package/src/__tests__/host-bash-routes.test.ts +41 -31
- package/src/__tests__/host-browser-routes.test.ts +32 -26
- package/src/__tests__/host-cu-routes-targeted.test.ts +33 -25
- package/src/__tests__/host-file-routes-targeted.test.ts +52 -40
- package/src/__tests__/host-transfer-routes-targeted.test.ts +43 -31
- package/src/__tests__/http-user-message-parity.test.ts +8 -290
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -28
- package/src/__tests__/inbound-slack-persistence.test.ts +0 -2
- package/src/__tests__/invite-redemption-service.test.ts +0 -198
- package/src/__tests__/llm-context-normalization.test.ts +0 -105
- package/src/__tests__/llm-request-log-error-payload.test.ts +9 -71
- package/src/__tests__/llm-usage-store.test.ts +0 -25
- package/src/__tests__/mcp-health-check.test.ts +1 -2
- package/src/__tests__/media-stream-server-integration.test.ts +0 -127
- package/src/__tests__/memory-retrieval-hook.test.ts +0 -2
- package/src/__tests__/messaging-send-tool.test.ts +0 -2
- package/src/__tests__/migration-import-from-url.test.ts +2 -2
- package/src/__tests__/mtime-cache.test.ts +5 -146
- package/src/__tests__/native-web-search.test.ts +0 -2
- package/src/__tests__/non-member-access-request.test.ts +17 -189
- package/src/__tests__/notification-broadcaster.test.ts +0 -4
- package/src/__tests__/notification-decision-recipient-context.test.ts +32 -33
- package/src/__tests__/notification-deep-link.test.ts +0 -6
- package/src/__tests__/notification-guardian-path.test.ts +0 -19
- package/src/__tests__/openai-provider.test.ts +12 -22
- package/src/__tests__/openai-responses-provider.test.ts +2 -12
- package/src/__tests__/outbound-slack-persistence.test.ts +0 -2
- package/src/__tests__/pending-interactions-resolved-event.test.ts +4 -7
- package/src/__tests__/persistence-secret-redaction.test.ts +0 -2
- package/src/__tests__/plugin-bootstrap.test.ts +73 -3
- package/src/__tests__/plugin-route-contribution.test.ts +17 -4
- package/src/__tests__/plugin-tool-contribution.test.ts +18 -3
- package/src/__tests__/plugin-types.test.ts +2 -0
- package/src/__tests__/process-message-background-slack.test.ts +0 -2
- package/src/__tests__/process-message-display-content.test.ts +0 -2
- package/src/__tests__/provider-error-scenarios.test.ts +4 -5
- package/src/__tests__/provider-usage-tracking.test.ts +0 -39
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +0 -2
- package/src/__tests__/registry.test.ts +1 -4
- package/src/__tests__/relay-server.test.ts +25 -694
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -0
- package/src/__tests__/secret-ingress-http.test.ts +0 -14
- package/src/__tests__/send-endpoint-busy.test.ts +8 -30
- package/src/__tests__/skills.test.ts +0 -44
- package/src/__tests__/slack-inbound-verification.test.ts +2 -47
- package/src/__tests__/stt-hints.test.ts +13 -44
- package/src/__tests__/subagent-detail.test.ts +0 -27
- package/src/__tests__/subagent-disposal.test.ts +0 -65
- package/src/__tests__/subagent-notify-parent.test.ts +0 -2
- package/src/__tests__/subagent-role-registry.test.ts +2 -7
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +0 -2
- package/src/__tests__/subagent-tools.test.ts +0 -2
- package/src/__tests__/suggestion-routes.test.ts +0 -2
- package/src/__tests__/title-generate-hook.test.ts +0 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -2
- package/src/__tests__/tool-executor.test.ts +11 -16
- package/src/__tests__/tool-preview-lifecycle.test.ts +0 -2
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +0 -2
- package/src/__tests__/tool-start-timestamp.test.ts +0 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +10 -10
- package/src/__tests__/twilio-routes.test.ts +0 -96
- package/src/__tests__/ui-file-upload-surface.test.ts +0 -86
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
- package/src/__tests__/voice-invite-redemption.test.ts +0 -33
- package/src/__tests__/web-search-backend-failure.test.ts +0 -2
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +35 -14
- package/src/__tests__/workspace-tool-loader.test.ts +2 -195
- package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
- package/src/agent/loop.ts +0 -56
- package/src/api/index.ts +1 -19
- package/src/api/responses/llm-request-log-entry.ts +0 -29
- package/src/api/responses/subagent-detail.ts +0 -17
- package/src/api/surfaces.ts +3 -39
- package/src/approvals/guardian-request-resolvers.ts +11 -1
- package/src/calls/__tests__/relay-setup-router.test.ts +4 -262
- package/src/calls/call-domain.ts +3 -3
- package/src/calls/guardian-dispatch.ts +8 -10
- package/src/calls/inbound-trust-reader.ts +1 -17
- package/src/calls/media-stream-server.ts +0 -21
- package/src/calls/relay-server.ts +50 -167
- package/src/calls/relay-setup-router.ts +7 -37
- package/src/calls/relay-verification.ts +4 -4
- package/src/calls/stt-hints.ts +12 -9
- package/src/calls/twilio-routes.ts +4 -14
- package/src/channels/types.ts +20 -10
- package/src/cli/commands/__tests__/cache.test.ts +1 -8
- package/src/cli/commands/cache.ts +181 -194
- package/src/cli/commands/db/__tests__/repair.test.ts +5 -6
- package/src/cli/commands/db/status.ts +1 -37
- package/src/cli/commands/mcp.ts +218 -252
- package/src/cli/commands/memory/index.ts +0 -2
- package/src/cli/commands/plugins.ts +3 -75
- package/src/cli/lib/__tests__/install-from-github.test.ts +0 -102
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +1 -160
- package/src/cli/lib/list-installed-plugins.ts +1 -179
- package/src/config/__tests__/sync-gated-profiles.test.ts +3 -11
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +17 -27
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +3 -13
- package/src/config/bundled-skills/subagent/SKILL.md +1 -1
- package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
- package/src/config/feature-flag-registry.json +13 -5
- package/src/config/loader.ts +5 -38
- package/src/config/schemas/__tests__/memory-v3.test.ts +0 -1
- package/src/config/schemas/memory-lifecycle.ts +0 -12
- package/src/config/schemas/memory-v3.ts +0 -7
- package/src/config/schemas/memory.ts +0 -4
- package/src/config/schemas/timeouts.ts +0 -8
- package/src/config/seed-inference-profiles.ts +11 -21
- package/src/config/skills.ts +5 -27
- package/src/config/sync-gated-profiles.ts +13 -12
- package/src/contacts/contacts-write.ts +0 -3
- package/src/daemon/assistant-attachments.ts +4 -27
- package/src/daemon/conversation-agent-loop.ts +0 -28
- package/src/daemon/conversation-process.ts +16 -35
- package/src/daemon/conversation-surfaces.ts +38 -111
- package/src/daemon/conversation-tool-setup.ts +16 -50
- package/src/daemon/conversation.ts +1 -13
- package/src/daemon/disk-pressure-guard.ts +2 -12
- package/src/daemon/event-loop-watchdog.ts +1 -28
- package/src/daemon/external-plugins-bootstrap.ts +34 -4
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -25
- package/src/daemon/handlers/config-a2a.ts +14 -6
- package/src/daemon/handlers/config-channels.ts +22 -78
- package/src/daemon/handlers/conversations.ts +0 -77
- package/src/daemon/lifecycle.ts +0 -4
- package/src/daemon/mcp-reload-service.ts +0 -10
- package/src/daemon/memory-v2-startup.test.ts +0 -72
- package/src/daemon/memory-v2-startup.ts +19 -87
- package/src/daemon/message-types/conversations.ts +0 -2
- package/src/daemon/message-types/surfaces.ts +12 -12
- package/src/daemon/server.ts +4 -0
- package/src/daemon/shutdown-handlers.ts +0 -20
- package/src/daemon/tool-setup-types.ts +0 -9
- package/src/daemon/workspace-tools-watcher.ts +328 -0
- package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
- package/src/ipc/assistant-server.ts +2 -2
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
- package/src/mcp/client.ts +1 -15
- package/src/mcp/mcp-auth-orchestrator.ts +1 -6
- package/src/mcp/mcp-oauth-provider.ts +8 -19
- package/src/memory/__tests__/memory-retrospective-job.test.ts +0 -8
- package/src/memory/conversation-crud.ts +0 -38
- package/src/memory/db-connection.ts +3 -22
- package/src/memory/db-init.ts +502 -36
- package/src/memory/db-singleton.ts +4 -6
- package/src/memory/jobs-worker.ts +0 -58
- package/src/memory/llm-request-log-store.ts +1 -26
- package/src/memory/llm-usage-store.ts +20 -48
- package/src/memory/memory-retrospective-job.ts +8 -9
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +56 -130
- package/src/memory/migrations/__tests__/run-migrations.test.ts +2 -2
- package/src/memory/migrations/registry.ts +573 -0
- package/src/memory/migrations/run-migrations.ts +6 -90
- package/src/memory/migrations/validate-migration-state.ts +66 -101
- package/src/memory/schema/conversations.ts +0 -9
- package/src/memory/schema/infrastructure.ts +0 -20
- package/src/memory/v2/__tests__/cli-command-store.test.ts +0 -25
- package/src/memory/v2/__tests__/skill-store.test.ts +0 -80
- package/src/memory/v2/cli-command-store.ts +38 -75
- package/src/memory/v2/prompts/consolidation.ts +82 -13
- package/src/memory/v2/prompts/router.ts +93 -21
- package/src/memory/v2/skill-store.ts +31 -68
- package/src/notifications/__tests__/broadcaster.test.ts +8 -16
- package/src/notifications/__tests__/decision-engine.test.ts +9 -78
- package/src/notifications/broadcaster.ts +1 -8
- package/src/notifications/decision-engine.ts +7 -15
- package/src/notifications/destination-resolver.ts +24 -68
- package/src/notifications/emit-signal.ts +14 -39
- package/src/permissions/question-prompter.test.ts +1 -1
- package/src/permissions/question-prompter.ts +4 -7
- package/src/plugin-api/index.ts +6 -6
- package/src/plugin-api/types.ts +5 -3
- package/src/plugin-api/vision-support.test.ts +4 -28
- package/src/plugin-api/vision-support.ts +31 -66
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +0 -161
- package/src/plugins/defaults/advisor/consult.ts +6 -110
- package/src/plugins/defaults/advisor/steering.ts +2 -14
- package/src/plugins/defaults/advisor/tools/advisor.ts +5 -32
- package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +1 -2
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +7 -47
- package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +11 -10
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +20 -12
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +11 -42
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +3 -33
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +4 -48
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +8 -4
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +15 -43
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +2 -11
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +13 -77
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +11 -12
- package/src/plugins/mtime-cache.ts +291 -76
- package/src/plugins/pipeline.ts +13 -111
- package/src/plugins/types.ts +2 -0
- package/src/providers/anthropic/client.ts +0 -5
- package/src/providers/call-site-routing.ts +0 -4
- package/src/providers/model-catalog.ts +0 -16
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/chat-completions-provider.ts +83 -37
- package/src/providers/openai/responses-provider.ts +46 -50
- package/src/providers/openrouter/client.ts +0 -5
- package/src/providers/provider-send-message.ts +0 -4
- package/src/providers/ratelimit.ts +0 -4
- package/src/providers/retry.ts +0 -4
- package/src/providers/types.ts +0 -9
- package/src/providers/usage-tracking.ts +0 -4
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +3 -335
- package/src/runtime/access-request-helper.ts +39 -19
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +2 -9
- package/src/runtime/auth/require-bound-guardian.ts +11 -21
- package/src/runtime/channel-verification-service.ts +31 -56
- package/src/runtime/confirmation-request-guardian-bridge.ts +3 -3
- package/src/runtime/guardian-vellum-migration.ts +7 -66
- package/src/runtime/invite-redemption-service.ts +187 -198
- package/src/runtime/local-actor-identity.ts +11 -76
- package/src/runtime/pending-interactions.ts +1 -11
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +5 -56
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +0 -187
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -13
- package/src/runtime/routes/channel-verification-routes.ts +3 -3
- package/src/runtime/routes/contact-routes.ts +32 -8
- package/src/runtime/routes/conversation-cli-routes.ts +5 -4
- package/src/runtime/routes/conversation-list-routes.ts +7 -4
- package/src/runtime/routes/conversation-query-routes.ts +0 -72
- package/src/runtime/routes/conversation-routes.ts +85 -84
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -3
- package/src/runtime/routes/guardian-action-routes.ts +5 -4
- package/src/runtime/routes/host-app-control-routes.ts +4 -5
- package/src/runtime/routes/host-bash-routes.ts +4 -5
- package/src/runtime/routes/host-browser-routes.ts +11 -9
- package/src/runtime/routes/host-cu-routes.ts +4 -5
- package/src/runtime/routes/host-file-routes.ts +4 -5
- package/src/runtime/routes/host-transfer-routes.ts +6 -6
- package/src/runtime/routes/http-adapter.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +2 -3
- package/src/runtime/routes/inbound-message-handler.ts +5 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +5 -97
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +49 -61
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -16
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +7 -7
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +8 -21
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +3 -14
- package/src/runtime/routes/index.ts +0 -2
- package/src/runtime/routes/llm-context-normalization.ts +0 -83
- package/src/runtime/routes/mcp-auth-routes.ts +19 -171
- package/src/runtime/routes/migration-rollback-routes.ts +3 -4
- package/src/runtime/routes/migration-routes.ts +1 -4
- package/src/runtime/routes/subagents-routes.ts +0 -5
- package/src/runtime/routes/surface-action-routes.ts +56 -42
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -1
- package/src/runtime/services/conversation-serializer.ts +9 -7
- package/src/runtime/tool-grant-request-helper.ts +3 -3
- package/src/runtime/trust-verdict-consumer.ts +9 -85
- package/src/runtime/verification-outbound-actions.ts +18 -18
- package/src/signals/user-message.ts +0 -16
- package/src/subagent/manager.ts +0 -9
- package/src/subagent/types.ts +3 -3
- package/src/telemetry/types.ts +1 -34
- package/src/telemetry/usage-telemetry-reporter.test.ts +2 -3
- package/src/telemetry/usage-telemetry-reporter.ts +3 -87
- package/src/tools/ask-question/ask-question-tool.test.ts +0 -29
- package/src/tools/ask-question/ask-question-tool.ts +0 -13
- package/src/tools/executor.ts +4 -4
- package/src/tools/registry.ts +0 -18
- package/src/tools/shared/filesystem/path-policy.ts +5 -12
- package/src/tools/tool-approval-handler.ts +1 -1
- package/src/tools/tool-defaults.ts +2 -9
- package/src/tools/tool-manifest.ts +0 -3
- package/src/tools/types.ts +2 -17
- package/src/tools/workspace-tools/loader.ts +244 -348
- package/src/util/errors.ts +1 -26
- package/src/util/platform.ts +0 -5
- package/src/workflows/library.test.ts +0 -140
- package/src/workflows/library.ts +28 -82
- package/src/workspace/migrations/017-seed-persona-dirs.ts +34 -3
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +24 -3
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +66 -14
- package/src/workspace/migrations/registry.ts +0 -2
- package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +0 -91
- package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +0 -48
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +0 -28
- package/node_modules/@vellumai/service-contracts/src/channels.ts +0 -41
- package/src/__tests__/code-search-tool.test.ts +0 -585
- package/src/__tests__/guardian-expiry-notifier.test.ts +0 -282
- package/src/__tests__/mcp-config-secret-boundary.test.ts +0 -390
- package/src/__tests__/plugin-pipeline.test.ts +0 -96
- package/src/__tests__/sse-actor-principal-guardian-source.test.ts +0 -102
- package/src/__tests__/steer-on-enqueue-question.test.ts +0 -181
- package/src/__tests__/workspace-migration-111-prune-seeded-callsite-defaults.test.ts +0 -208
- package/src/agent/loop-exclusive-tool.test.ts +0 -150
- package/src/api/constants/sse-replay.ts +0 -41
- package/src/api/events/conversation-notice.ts +0 -26
- package/src/approvals/guardian-channel-delivery.ts +0 -30
- package/src/approvals/guardian-expiry-notifier.ts +0 -148
- package/src/cli/commands/memory/__tests__/worker.test.ts +0 -302
- package/src/cli/commands/memory/worker.ts +0 -175
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +0 -143
- package/src/config/prune-seeded-callsite-defaults.ts +0 -110
- package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +0 -129
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +0 -312
- package/src/contacts/__tests__/member-write-relay.test.ts +0 -202
- package/src/contacts/guardian-delivery-reader.ts +0 -223
- package/src/contacts/member-write-relay.ts +0 -189
- package/src/daemon/conversation-notices.ts +0 -60
- package/src/daemon/handlers/__tests__/config-channels.test.ts +0 -225
- package/src/hooks/hook-loader.ts +0 -341
- package/src/mcp/mcp-header-store.ts +0 -134
- package/src/memory/__tests__/301-create-watchdog-events.test.ts +0 -110
- package/src/memory/__tests__/prompt-override.test.ts +0 -192
- package/src/memory/__tests__/watchdog-events-store.test.ts +0 -161
- package/src/memory/migrations/300-add-processing-started-at.ts +0 -30
- package/src/memory/migrations/301-create-watchdog-events.ts +0 -45
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +0 -224
- package/src/memory/prompt-override.ts +0 -129
- package/src/memory/steps.ts +0 -573
- package/src/memory/watchdog-events-store.ts +0 -87
- package/src/memory/worker-control.ts +0 -118
- package/src/memory/worker-process.ts +0 -72
- package/src/notifications/__tests__/connected-channels.test.ts +0 -114
- package/src/notifications/__tests__/destination-resolver.test.ts +0 -256
- package/src/onboarding/checkin-event.test.ts +0 -222
- package/src/onboarding/checkin-event.ts +0 -321
- package/src/onboarding/schedule-checkin.ts +0 -190
- package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +0 -106
- package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +0 -60
- package/src/plugins/defaults/advisor/context-pack.ts +0 -288
- package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +0 -146
- package/src/plugins/surface-import.ts +0 -121
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +0 -321
- package/src/providers/openai/api-error-normalization.ts +0 -270
- package/src/runtime/__tests__/channel-verification-service.test.ts +0 -133
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +0 -181
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +0 -66
- package/src/runtime/__tests__/local-principal-trust.test.ts +0 -164
- package/src/runtime/anchored-guardian.test.ts +0 -156
- package/src/runtime/anchored-guardian.ts +0 -135
- package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +0 -99
- package/src/runtime/local-principal-trust.ts +0 -52
- package/src/runtime/routes/__tests__/contact-routes.test.ts +0 -212
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -93
- package/src/runtime/routes/onboarding-checkin-routes.ts +0 -86
- package/src/tools/filesystem/search.ts +0 -543
- package/src/util/telemetry-db-path.ts +0 -24
- package/src/workspace/migrations/111-prune-seeded-callsite-defaults.ts +0 -134
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
import { createHash } from "node:crypto";
|
|
14
14
|
import { Database } from "bun:sqlite";
|
|
15
|
-
import { describe, expect, test } from "bun:test";
|
|
15
|
+
import { afterEach, describe, expect, test } from "bun:test";
|
|
16
16
|
|
|
17
17
|
import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
18
18
|
|
|
@@ -69,16 +69,16 @@ import { migrateRenameThreadStartersCheckpointsDown } from "../memory/migrations
|
|
|
69
69
|
import { migrateBackfillAudioAttachmentMimeTypesDown } from "../memory/migrations/191-backfill-audio-attachment-mime-types.js";
|
|
70
70
|
import { migrateLlmUsageAttribution } from "../memory/migrations/235-llm-usage-attribution.js";
|
|
71
71
|
import {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
} from "../memory/migrations/run-migrations.js";
|
|
75
|
-
import {
|
|
72
|
+
MIGRATION_REGISTRY,
|
|
73
|
+
type MigrationRegistryEntry,
|
|
76
74
|
type MigrationValidationResult,
|
|
75
|
+
} from "../memory/migrations/registry.js";
|
|
76
|
+
import { runMigrationSteps } from "../memory/migrations/run-migrations.js";
|
|
77
|
+
import {
|
|
77
78
|
rollbackMemoryMigration,
|
|
78
79
|
validateMigrationState,
|
|
79
80
|
} from "../memory/migrations/validate-migration-state.js";
|
|
80
81
|
import * as schema from "../memory/schema.js";
|
|
81
|
-
import { migrationSteps } from "../memory/steps.js";
|
|
82
82
|
|
|
83
83
|
// ---------------------------------------------------------------------------
|
|
84
84
|
// Helpers
|
|
@@ -547,7 +547,7 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
|
|
|
547
547
|
// structured diagnostic data. Assert directly on the returned result rather
|
|
548
548
|
// than re-deriving the crashed list from the raw DB — this verifies the
|
|
549
549
|
// function itself detects the crash, not just that the data is present.
|
|
550
|
-
const result: MigrationValidationResult = validateMigrationState(db
|
|
550
|
+
const result: MigrationValidationResult = validateMigrationState(db);
|
|
551
551
|
expect(result.crashed).toContain("step:migrateJobDeferrals");
|
|
552
552
|
expect(result.crashed).not.toContain(
|
|
553
553
|
"step:migrateMemoryEntityRelationDedup",
|
|
@@ -575,24 +575,22 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
|
|
|
575
575
|
|
|
576
576
|
// validateMigrationState throws an IntegrityError on dependency violations
|
|
577
577
|
// to block daemon startup with an inconsistent schema.
|
|
578
|
-
expect(() => validateMigrationState(db
|
|
578
|
+
expect(() => validateMigrationState(db)).toThrow(
|
|
579
579
|
"Migration dependency violations detected",
|
|
580
580
|
);
|
|
581
|
-
expect(() => validateMigrationState(db
|
|
582
|
-
"
|
|
581
|
+
expect(() => validateMigrationState(db)).toThrow(
|
|
582
|
+
"migration_memory_items_fingerprint_scope_unique_v1",
|
|
583
583
|
);
|
|
584
584
|
|
|
585
|
-
// Sanity-check: confirm the
|
|
586
|
-
//
|
|
587
|
-
const
|
|
588
|
-
(
|
|
585
|
+
// Sanity-check: confirm the registry also declares this dependency, so the
|
|
586
|
+
// violation detection is grounded in real schema intent.
|
|
587
|
+
const saltedEntry = MIGRATION_REGISTRY.find(
|
|
588
|
+
(e) => e.key === "migration_memory_items_scope_salted_fingerprints_v1",
|
|
589
|
+
);
|
|
590
|
+
expect(saltedEntry).toBeTruthy();
|
|
591
|
+
expect(saltedEntry!.dependsOn).toContain(
|
|
592
|
+
"migration_memory_items_fingerprint_scope_unique_v1",
|
|
589
593
|
);
|
|
590
|
-
expect(saltedStep).toBeTruthy();
|
|
591
|
-
if (saltedStep && typeof saltedStep !== "function") {
|
|
592
|
-
expect(saltedStep.dependsOn).toContain(
|
|
593
|
-
"migrateMemoryItemsFingerprintScopeUnique",
|
|
594
|
-
);
|
|
595
|
-
}
|
|
596
594
|
});
|
|
597
595
|
|
|
598
596
|
test("validateMigrationState: no checkpoints table is handled gracefully", () => {
|
|
@@ -601,7 +599,7 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
|
|
|
601
599
|
const db = createTestDb();
|
|
602
600
|
// Deliberately do NOT create memory_checkpoints.
|
|
603
601
|
|
|
604
|
-
expect(() => validateMigrationState(db
|
|
602
|
+
expect(() => validateMigrationState(db)).not.toThrow();
|
|
605
603
|
});
|
|
606
604
|
|
|
607
605
|
test("migrateMemoryItemsFingerprintScopeUnique: old schema with UNIQUE on fingerprint is migrated", () => {
|
|
@@ -861,40 +859,26 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
|
|
|
861
859
|
}
|
|
862
860
|
});
|
|
863
861
|
|
|
864
|
-
test("
|
|
865
|
-
//
|
|
866
|
-
//
|
|
867
|
-
//
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
if (!step.rollback) continue;
|
|
873
|
-
for (const entry of step.rollback) {
|
|
874
|
-
rollbackVersions.push(entry.version);
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
rollbackVersions.sort((a, b) => a - b);
|
|
878
|
-
for (let i = 1; i < rollbackVersions.length; i++) {
|
|
879
|
-
const prev = rollbackVersions[i - 1];
|
|
880
|
-
const curr = rollbackVersions[i];
|
|
881
|
-
expect(curr).toBeGreaterThan(prev);
|
|
862
|
+
test("MIGRATION_REGISTRY: version numbers are strictly monotonically increasing", () => {
|
|
863
|
+
// Registry ordering invariant: each entry's version must be strictly greater
|
|
864
|
+
// than the previous one. A violation here would mean the ordering guarantees
|
|
865
|
+
// documented in the migration comments cannot be relied upon.
|
|
866
|
+
for (let i = 1; i < MIGRATION_REGISTRY.length; i++) {
|
|
867
|
+
const prev = MIGRATION_REGISTRY[i - 1];
|
|
868
|
+
const curr = MIGRATION_REGISTRY[i];
|
|
869
|
+
expect(curr.version).toBeGreaterThan(prev.version);
|
|
882
870
|
}
|
|
883
871
|
});
|
|
884
872
|
|
|
885
|
-
test("
|
|
886
|
-
// Schema drift guard: if a migration declares a dependency on a
|
|
887
|
-
//
|
|
888
|
-
//
|
|
889
|
-
|
|
890
|
-
const
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
if (typeof step === "function") continue;
|
|
895
|
-
if (!step.dependsOn) continue;
|
|
896
|
-
for (const dep of step.dependsOn) {
|
|
897
|
-
expect(allNames.has(dep)).toBe(true);
|
|
873
|
+
test("MIGRATION_REGISTRY: all dependsOn references point to existing registry keys", () => {
|
|
874
|
+
// Schema drift guard: if a migration declares a dependency on a key that
|
|
875
|
+
// doesn't exist in the registry, the dependency check in validateMigrationState
|
|
876
|
+
// can never be satisfied. This test ensures all declared dependencies are valid.
|
|
877
|
+
const allKeys = new Set(MIGRATION_REGISTRY.map((e) => e.key));
|
|
878
|
+
for (const entry of MIGRATION_REGISTRY) {
|
|
879
|
+
if (!entry.dependsOn) continue;
|
|
880
|
+
for (const dep of entry.dependsOn) {
|
|
881
|
+
expect(allKeys.has(dep)).toBe(true);
|
|
898
882
|
}
|
|
899
883
|
}
|
|
900
884
|
});
|
|
@@ -954,7 +938,26 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
|
|
|
954
938
|
// ---------------------------------------------------------------------------
|
|
955
939
|
|
|
956
940
|
describe("rollbackMemoryMigration", () => {
|
|
941
|
+
// Track test entries pushed onto MIGRATION_REGISTRY so we can restore after
|
|
942
|
+
// each test. This avoids polluting the real registry across test runs.
|
|
943
|
+
let registrySnapshot: MigrationRegistryEntry[];
|
|
944
|
+
|
|
945
|
+
function saveRegistry() {
|
|
946
|
+
registrySnapshot = [...MIGRATION_REGISTRY];
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
function restoreRegistry() {
|
|
950
|
+
MIGRATION_REGISTRY.length = 0;
|
|
951
|
+
MIGRATION_REGISTRY.push(...registrySnapshot);
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
afterEach(() => {
|
|
955
|
+
restoreRegistry();
|
|
956
|
+
});
|
|
957
|
+
|
|
957
958
|
test("rolls back checkpoint-tracked migrations in reverse version order", () => {
|
|
959
|
+
saveRegistry();
|
|
960
|
+
|
|
958
961
|
const db = createTestDb();
|
|
959
962
|
const raw = getRaw(db);
|
|
960
963
|
bootstrapCheckpointsTable(raw);
|
|
@@ -965,58 +968,47 @@ describe("rollbackMemoryMigration", () => {
|
|
|
965
968
|
const now = Date.now();
|
|
966
969
|
|
|
967
970
|
// Use very high version numbers to avoid colliding with real registry entries.
|
|
968
|
-
const
|
|
971
|
+
const testEntries: MigrationRegistryEntry[] = [
|
|
969
972
|
{
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
downCalls.push("test_rollback_v1000");
|
|
978
|
-
},
|
|
979
|
-
},
|
|
980
|
-
],
|
|
973
|
+
key: "test_rollback_v1000",
|
|
974
|
+
stepName: "test_rollback_v1000",
|
|
975
|
+
version: 1000,
|
|
976
|
+
description: "test migration v1000",
|
|
977
|
+
down: () => {
|
|
978
|
+
downCalls.push("test_rollback_v1000");
|
|
979
|
+
},
|
|
981
980
|
},
|
|
982
981
|
{
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
downCalls.push("test_rollback_v1001");
|
|
991
|
-
},
|
|
992
|
-
},
|
|
993
|
-
],
|
|
982
|
+
key: "test_rollback_v1001",
|
|
983
|
+
stepName: "test_rollback_v1001",
|
|
984
|
+
version: 1001,
|
|
985
|
+
description: "test migration v1001",
|
|
986
|
+
down: () => {
|
|
987
|
+
downCalls.push("test_rollback_v1001");
|
|
988
|
+
},
|
|
994
989
|
},
|
|
995
990
|
{
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
downCalls.push("test_rollback_v1002");
|
|
1004
|
-
},
|
|
1005
|
-
},
|
|
1006
|
-
],
|
|
991
|
+
key: "test_rollback_v1002",
|
|
992
|
+
stepName: "test_rollback_v1002",
|
|
993
|
+
version: 1002,
|
|
994
|
+
description: "test migration v1002",
|
|
995
|
+
down: () => {
|
|
996
|
+
downCalls.push("test_rollback_v1002");
|
|
997
|
+
},
|
|
1007
998
|
},
|
|
1008
999
|
];
|
|
1009
1000
|
|
|
1001
|
+
MIGRATION_REGISTRY.push(...testEntries);
|
|
1002
|
+
|
|
1010
1003
|
// Simulate all three migrations as completed via their step checkpoints.
|
|
1011
|
-
for (const entry of
|
|
1012
|
-
if (typeof entry === "function") continue;
|
|
1004
|
+
for (const entry of testEntries) {
|
|
1013
1005
|
raw.exec(
|
|
1014
|
-
`INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:${entry.
|
|
1006
|
+
`INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:${entry.stepName}', '1', ${now})`,
|
|
1015
1007
|
);
|
|
1016
1008
|
}
|
|
1017
1009
|
|
|
1018
1010
|
// Roll back to version 1000 — should roll back v1002 and v1001 (version > 1000).
|
|
1019
|
-
const rolledBack = rollbackMemoryMigration(db, 1000
|
|
1011
|
+
const rolledBack = rollbackMemoryMigration(db, 1000);
|
|
1020
1012
|
|
|
1021
1013
|
// Verify returned keys.
|
|
1022
1014
|
expect(rolledBack).toEqual(["test_rollback_v1002", "test_rollback_v1001"]);
|
|
@@ -1056,6 +1048,8 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1056
1048
|
* must clear the step checkpoint too, otherwise the next upgrade skips the
|
|
1057
1049
|
* step and never restores the rolled-back schema.
|
|
1058
1050
|
*/
|
|
1051
|
+
saveRegistry();
|
|
1052
|
+
|
|
1059
1053
|
const db = createTestDb();
|
|
1060
1054
|
const raw = getRaw(db);
|
|
1061
1055
|
bootstrapCheckpointsTable(raw);
|
|
@@ -1069,7 +1063,7 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1069
1063
|
|
|
1070
1064
|
// GIVEN a registry-backed migration whose forward body is a named step that
|
|
1071
1065
|
// creates a table. The step runner records `step:<functionName>` after a
|
|
1072
|
-
// successful run; the
|
|
1066
|
+
// successful run; the registry entry's stepName maps to that key so rollback
|
|
1073
1067
|
// can find and clear it.
|
|
1074
1068
|
function migrateTestStepRollback(database: DrizzleDb): void {
|
|
1075
1069
|
getSqliteFrom(database).exec(
|
|
@@ -1077,25 +1071,18 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1077
1071
|
);
|
|
1078
1072
|
}
|
|
1079
1073
|
|
|
1080
|
-
//
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
down: (database) => {
|
|
1091
|
-
getSqliteFrom(database).exec(
|
|
1092
|
-
`DROP TABLE IF EXISTS test_step_rollback_data`,
|
|
1093
|
-
);
|
|
1094
|
-
},
|
|
1095
|
-
},
|
|
1096
|
-
],
|
|
1074
|
+
// AND the migration is registered with a down() that drops that table.
|
|
1075
|
+
MIGRATION_REGISTRY.push({
|
|
1076
|
+
key: "test_step_rollback_v4000",
|
|
1077
|
+
stepName: "migrateTestStepRollback",
|
|
1078
|
+
version: 4000,
|
|
1079
|
+
description: "test step rollback",
|
|
1080
|
+
down: (database) => {
|
|
1081
|
+
getSqliteFrom(database).exec(
|
|
1082
|
+
`DROP TABLE IF EXISTS test_step_rollback_data`,
|
|
1083
|
+
);
|
|
1097
1084
|
},
|
|
1098
|
-
|
|
1085
|
+
});
|
|
1099
1086
|
|
|
1100
1087
|
// AND the step has run once through the runner, recording the step checkpoint.
|
|
1101
1088
|
await runMigrationSteps(db, [migrateTestStepRollback]);
|
|
@@ -1109,7 +1096,7 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1109
1096
|
).toBeTruthy();
|
|
1110
1097
|
|
|
1111
1098
|
// AND the migration has since been rolled back below its version.
|
|
1112
|
-
rollbackMemoryMigration(db, 3999
|
|
1099
|
+
rollbackMemoryMigration(db, 3999);
|
|
1113
1100
|
expect(hasTable()).toBe(false);
|
|
1114
1101
|
|
|
1115
1102
|
// WHEN the runner executes the forward steps again on a later upgrade.
|
|
@@ -1120,6 +1107,8 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1120
1107
|
});
|
|
1121
1108
|
|
|
1122
1109
|
test("handles transaction failure in down() — rolls back and preserves checkpoint", () => {
|
|
1110
|
+
saveRegistry();
|
|
1111
|
+
|
|
1123
1112
|
const db = createTestDb();
|
|
1124
1113
|
const raw = getRaw(db);
|
|
1125
1114
|
bootstrapCheckpointsTable(raw);
|
|
@@ -1137,27 +1126,21 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1137
1126
|
`INSERT INTO test_rollback_data (id, value) VALUES ('row-1', 'original')`,
|
|
1138
1127
|
);
|
|
1139
1128
|
|
|
1140
|
-
//
|
|
1141
|
-
//
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
sqlite.exec(
|
|
1154
|
-
`UPDATE test_rollback_data SET value = 'rolled-back' WHERE id = 'row-1'`,
|
|
1155
|
-
);
|
|
1156
|
-
},
|
|
1157
|
-
},
|
|
1158
|
-
],
|
|
1129
|
+
// Register a migration whose down() modifies test_rollback_data,
|
|
1130
|
+
// but a trigger will force the modification to fail.
|
|
1131
|
+
MIGRATION_REGISTRY.push({
|
|
1132
|
+
key: "test_fail_down_v3000",
|
|
1133
|
+
stepName: "test_fail_down_v3000",
|
|
1134
|
+
version: 3000,
|
|
1135
|
+
description: "test migration with failing down()",
|
|
1136
|
+
down: (database) => {
|
|
1137
|
+
const sqlite = getSqliteFrom(database);
|
|
1138
|
+
// This UPDATE will trigger our failure trigger.
|
|
1139
|
+
sqlite.exec(
|
|
1140
|
+
`UPDATE test_rollback_data SET value = 'rolled-back' WHERE id = 'row-1'`,
|
|
1141
|
+
);
|
|
1159
1142
|
},
|
|
1160
|
-
|
|
1143
|
+
});
|
|
1161
1144
|
|
|
1162
1145
|
// Mark as completed (via step checkpoint).
|
|
1163
1146
|
raw.exec(
|
|
@@ -1175,7 +1158,7 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1175
1158
|
// Rollback should throw because down() fails.
|
|
1176
1159
|
let threw = false;
|
|
1177
1160
|
try {
|
|
1178
|
-
rollbackMemoryMigration(db, 2999
|
|
1161
|
+
rollbackMemoryMigration(db, 2999);
|
|
1179
1162
|
} catch {
|
|
1180
1163
|
threw = true;
|
|
1181
1164
|
}
|
|
@@ -1204,6 +1187,8 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1204
1187
|
});
|
|
1205
1188
|
|
|
1206
1189
|
test("down() with its own BEGIN/COMMIT succeeds without nested-transaction errors", () => {
|
|
1190
|
+
saveRegistry();
|
|
1191
|
+
|
|
1207
1192
|
const db = createTestDb();
|
|
1208
1193
|
const raw = getRaw(db);
|
|
1209
1194
|
bootstrapCheckpointsTable(raw);
|
|
@@ -1221,30 +1206,23 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1221
1206
|
`INSERT INTO test_self_txn_data (id, value) VALUES ('row-1', 'migrated')`,
|
|
1222
1207
|
);
|
|
1223
1208
|
|
|
1224
|
-
//
|
|
1225
|
-
// find it in the steps list. The down() manages its own transaction —
|
|
1209
|
+
// Register a migration whose down() manages its own transaction —
|
|
1226
1210
|
// this previously caused nested-transaction errors when rollbackMemoryMigration
|
|
1227
1211
|
// wrapped every down() call in BEGIN/COMMIT.
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
`UPDATE test_self_txn_data SET value = 'original' WHERE id = 'row-1'`,
|
|
1241
|
-
);
|
|
1242
|
-
sqlite.exec("COMMIT");
|
|
1243
|
-
},
|
|
1244
|
-
},
|
|
1245
|
-
],
|
|
1212
|
+
MIGRATION_REGISTRY.push({
|
|
1213
|
+
key: "test_self_txn_down_v3500",
|
|
1214
|
+
stepName: "test_self_txn_down_v3500",
|
|
1215
|
+
version: 3500,
|
|
1216
|
+
description: "test migration with self-transactional down()",
|
|
1217
|
+
down: (database) => {
|
|
1218
|
+
const sqlite = getSqliteFrom(database);
|
|
1219
|
+
sqlite.exec("BEGIN");
|
|
1220
|
+
sqlite.exec(
|
|
1221
|
+
`UPDATE test_self_txn_data SET value = 'original' WHERE id = 'row-1'`,
|
|
1222
|
+
);
|
|
1223
|
+
sqlite.exec("COMMIT");
|
|
1246
1224
|
},
|
|
1247
|
-
|
|
1225
|
+
});
|
|
1248
1226
|
|
|
1249
1227
|
// Mark as completed (via step checkpoint).
|
|
1250
1228
|
raw.exec(
|
|
@@ -1252,7 +1230,7 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1252
1230
|
);
|
|
1253
1231
|
|
|
1254
1232
|
// This should succeed — no nested transaction error.
|
|
1255
|
-
const rolledBack = rollbackMemoryMigration(db, 3499
|
|
1233
|
+
const rolledBack = rollbackMemoryMigration(db, 3499);
|
|
1256
1234
|
|
|
1257
1235
|
expect(rolledBack).toEqual(["test_self_txn_down_v3500"]);
|
|
1258
1236
|
|
|
@@ -1273,43 +1251,37 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1273
1251
|
});
|
|
1274
1252
|
|
|
1275
1253
|
test("no-op when already at target version", () => {
|
|
1254
|
+
saveRegistry();
|
|
1255
|
+
|
|
1276
1256
|
const db = createTestDb();
|
|
1277
1257
|
const raw = getRaw(db);
|
|
1278
1258
|
bootstrapCheckpointsTable(raw);
|
|
1279
1259
|
|
|
1280
1260
|
const now = Date.now();
|
|
1281
1261
|
|
|
1282
|
-
//
|
|
1262
|
+
// Register entries with down functions — they should NOT be called.
|
|
1283
1263
|
const downCalls: string[] = [];
|
|
1284
1264
|
|
|
1285
|
-
|
|
1265
|
+
MIGRATION_REGISTRY.push(
|
|
1286
1266
|
{
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
downCalls.push("test_noop_v4000");
|
|
1295
|
-
},
|
|
1296
|
-
},
|
|
1297
|
-
],
|
|
1267
|
+
key: "test_noop_v4000",
|
|
1268
|
+
stepName: "test_noop_v4000",
|
|
1269
|
+
version: 4000,
|
|
1270
|
+
description: "test noop v4000",
|
|
1271
|
+
down: () => {
|
|
1272
|
+
downCalls.push("test_noop_v4000");
|
|
1273
|
+
},
|
|
1298
1274
|
},
|
|
1299
1275
|
{
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
downCalls.push("test_noop_v4001");
|
|
1308
|
-
},
|
|
1309
|
-
},
|
|
1310
|
-
],
|
|
1276
|
+
key: "test_noop_v4001",
|
|
1277
|
+
stepName: "test_noop_v4001",
|
|
1278
|
+
version: 4001,
|
|
1279
|
+
description: "test noop v4001",
|
|
1280
|
+
down: () => {
|
|
1281
|
+
downCalls.push("test_noop_v4001");
|
|
1282
|
+
},
|
|
1311
1283
|
},
|
|
1312
|
-
|
|
1284
|
+
);
|
|
1313
1285
|
|
|
1314
1286
|
// Mark both as completed (via step checkpoints).
|
|
1315
1287
|
raw.exec(
|
|
@@ -1320,7 +1292,7 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1320
1292
|
);
|
|
1321
1293
|
|
|
1322
1294
|
// Roll back to version >= latest applied migration — should be a no-op.
|
|
1323
|
-
const rolledBack = rollbackMemoryMigration(db, 4001
|
|
1295
|
+
const rolledBack = rollbackMemoryMigration(db, 4001);
|
|
1324
1296
|
|
|
1325
1297
|
expect(rolledBack).toEqual([]);
|
|
1326
1298
|
expect(downCalls).toEqual([]);
|
|
@@ -1340,12 +1312,14 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1340
1312
|
expect(cp4001!.value).toBe("1");
|
|
1341
1313
|
|
|
1342
1314
|
// Also verify with a target version greater than the latest.
|
|
1343
|
-
const rolledBack2 = rollbackMemoryMigration(db, 9999
|
|
1315
|
+
const rolledBack2 = rollbackMemoryMigration(db, 9999);
|
|
1344
1316
|
expect(rolledBack2).toEqual([]);
|
|
1345
1317
|
expect(downCalls).toEqual([]);
|
|
1346
1318
|
});
|
|
1347
1319
|
|
|
1348
1320
|
test("respects dependency ordering on rollback (children rolled back before parents)", () => {
|
|
1321
|
+
saveRegistry();
|
|
1322
|
+
|
|
1349
1323
|
const db = createTestDb();
|
|
1350
1324
|
const raw = getRaw(db);
|
|
1351
1325
|
bootstrapCheckpointsTable(raw);
|
|
@@ -1358,35 +1332,27 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1358
1332
|
// Since the child has a higher version number, rolling back in reverse
|
|
1359
1333
|
// version order means the child (v5001) is rolled back BEFORE the parent
|
|
1360
1334
|
// (v5000), which is the correct dependency-safe ordering.
|
|
1361
|
-
|
|
1335
|
+
MIGRATION_REGISTRY.push(
|
|
1362
1336
|
{
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
downCalls.push("test_parent_v5000");
|
|
1371
|
-
},
|
|
1372
|
-
},
|
|
1373
|
-
],
|
|
1337
|
+
key: "test_parent_v5000",
|
|
1338
|
+
stepName: "test_parent_v5000",
|
|
1339
|
+
version: 5000,
|
|
1340
|
+
description: "test parent migration",
|
|
1341
|
+
down: () => {
|
|
1342
|
+
downCalls.push("test_parent_v5000");
|
|
1343
|
+
},
|
|
1374
1344
|
},
|
|
1375
1345
|
{
|
|
1376
|
-
|
|
1377
|
-
|
|
1346
|
+
key: "test_child_v5001",
|
|
1347
|
+
stepName: "test_child_v5001",
|
|
1348
|
+
version: 5001,
|
|
1378
1349
|
dependsOn: ["test_parent_v5000"],
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
down: () => {
|
|
1384
|
-
downCalls.push("test_child_v5001");
|
|
1385
|
-
},
|
|
1386
|
-
},
|
|
1387
|
-
],
|
|
1350
|
+
description: "test child migration depending on parent",
|
|
1351
|
+
down: () => {
|
|
1352
|
+
downCalls.push("test_child_v5001");
|
|
1353
|
+
},
|
|
1388
1354
|
},
|
|
1389
|
-
|
|
1355
|
+
);
|
|
1390
1356
|
|
|
1391
1357
|
// Both are completed (via step checkpoints).
|
|
1392
1358
|
raw.exec(
|
|
@@ -1397,7 +1363,7 @@ describe("rollbackMemoryMigration", () => {
|
|
|
1397
1363
|
);
|
|
1398
1364
|
|
|
1399
1365
|
// Roll back to version 4999 — both should be rolled back, child first.
|
|
1400
|
-
const rolledBack = rollbackMemoryMigration(db, 4999
|
|
1366
|
+
const rolledBack = rollbackMemoryMigration(db, 4999);
|
|
1401
1367
|
|
|
1402
1368
|
expect(rolledBack).toEqual(["test_child_v5001", "test_parent_v5000"]);
|
|
1403
1369
|
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
// Mirrors `src/memory/db-singleton.ts`. Duplicated by design — see the
|
|
24
24
|
// "No source-module imports" section above.
|
|
25
|
-
type DbSlotKey = "main" | "logs" | "memory"
|
|
25
|
+
type DbSlotKey = "main" | "logs" | "memory";
|
|
26
26
|
|
|
27
27
|
type DbSlot = {
|
|
28
28
|
db: unknown;
|
|
@@ -46,13 +46,12 @@ function dbSlots(): DbSlots {
|
|
|
46
46
|
main: emptySlot(),
|
|
47
47
|
logs: emptySlot(),
|
|
48
48
|
memory: emptySlot(),
|
|
49
|
-
telemetry: emptySlot(),
|
|
50
49
|
});
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
/**
|
|
54
|
-
* Close every active DB connection (main, logs, memory
|
|
55
|
-
*
|
|
53
|
+
* Close every active DB connection (main, logs, memory) and drop the
|
|
54
|
+
* singletons.
|
|
56
55
|
*
|
|
57
56
|
* Used by tests that nuke or replace a DB file mid-run — without this
|
|
58
57
|
* reset, subsequent `getDb()`/`getLogsDb()`/`getMemoryDb()` calls return a
|
|
@@ -61,7 +60,7 @@ function dbSlots(): DbSlots {
|
|
|
61
60
|
*/
|
|
62
61
|
export function resetDbForTesting(): void {
|
|
63
62
|
const slots = dbSlots();
|
|
64
|
-
for (const key of ["main", "logs", "memory"
|
|
63
|
+
for (const key of ["main", "logs", "memory"] as const) {
|
|
65
64
|
const s = slots[key];
|
|
66
65
|
if (s.closer) {
|
|
67
66
|
try {
|
|
@@ -173,11 +173,9 @@ describe("TwiML parameter propagation", () => {
|
|
|
173
173
|
// ---------------------------------------------------------------------------
|
|
174
174
|
|
|
175
175
|
describe("Call session mode metadata", () => {
|
|
176
|
-
// Cold DB init runs every migration; give it headroom over Bun's 5s default
|
|
177
|
-
// hook timeout so a loaded CI runner doesn't trip it.
|
|
178
176
|
beforeEach(async () => {
|
|
179
177
|
await initializeDb();
|
|
180
|
-
}
|
|
178
|
+
});
|
|
181
179
|
|
|
182
180
|
test("createCallSession persists callMode and verificationSessionId", async () => {
|
|
183
181
|
// Dynamic import to avoid circular dependency issues
|
|
@@ -239,7 +237,7 @@ describe("Call session mode metadata", () => {
|
|
|
239
237
|
describe("Verification control messages are deterministic (guard)", () => {
|
|
240
238
|
beforeEach(async () => {
|
|
241
239
|
await initializeDb();
|
|
242
|
-
}
|
|
240
|
+
});
|
|
243
241
|
|
|
244
242
|
test("handleChannelInbound does not call processMessage for /start gv_<token> bootstrap commands", async () => {
|
|
245
243
|
const { createHash, randomBytes } = await import("node:crypto");
|