@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
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
-
|
|
3
|
-
import { runHook } from "../plugins/pipeline.js";
|
|
4
|
-
import {
|
|
5
|
-
registerPlugin,
|
|
6
|
-
resetPluginRegistryForTests,
|
|
7
|
-
} from "../plugins/registry.js";
|
|
8
|
-
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
resetPluginRegistryForTests();
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
describe("plugin pipeline", () => {
|
|
14
|
-
test("logs and skips failed hooks while preserving threaded mutations", async () => {
|
|
15
|
-
registerPlugin({
|
|
16
|
-
manifest: {
|
|
17
|
-
name: "test-first-hook",
|
|
18
|
-
version: "1.0.0",
|
|
19
|
-
},
|
|
20
|
-
hooks: {
|
|
21
|
-
"user-prompt-submit": async () => ({
|
|
22
|
-
value: 1,
|
|
23
|
-
}),
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
registerPlugin({
|
|
27
|
-
manifest: {
|
|
28
|
-
name: "test-throwing-hook",
|
|
29
|
-
version: "1.0.0",
|
|
30
|
-
},
|
|
31
|
-
hooks: {
|
|
32
|
-
"user-prompt-submit": async () => {
|
|
33
|
-
throw new Error("hook failed");
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
});
|
|
37
|
-
registerPlugin({
|
|
38
|
-
manifest: {
|
|
39
|
-
name: "test-final-hook",
|
|
40
|
-
version: "1.0.0",
|
|
41
|
-
},
|
|
42
|
-
hooks: {
|
|
43
|
-
"user-prompt-submit": async (ctx: { value: number }) => ({
|
|
44
|
-
value: ctx.value + 1,
|
|
45
|
-
}),
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
const result = await runHook("user-prompt-submit", { value: 0 });
|
|
50
|
-
|
|
51
|
-
expect(result).toEqual({ value: 2 });
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
test("discards in-place mutations from a failed hook", async () => {
|
|
55
|
-
registerPlugin({
|
|
56
|
-
manifest: {
|
|
57
|
-
name: "test-first-hook",
|
|
58
|
-
version: "1.0.0",
|
|
59
|
-
},
|
|
60
|
-
hooks: {
|
|
61
|
-
"user-prompt-submit": async (ctx: { items: string[] }) => {
|
|
62
|
-
ctx.items.push("first");
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
registerPlugin({
|
|
67
|
-
manifest: {
|
|
68
|
-
name: "test-throwing-hook",
|
|
69
|
-
version: "1.0.0",
|
|
70
|
-
},
|
|
71
|
-
hooks: {
|
|
72
|
-
"user-prompt-submit": async (ctx: { items: string[] }) => {
|
|
73
|
-
ctx.items.push("failed");
|
|
74
|
-
throw new Error("hook failed");
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
registerPlugin({
|
|
79
|
-
manifest: {
|
|
80
|
-
name: "test-final-hook",
|
|
81
|
-
version: "1.0.0",
|
|
82
|
-
},
|
|
83
|
-
hooks: {
|
|
84
|
-
"user-prompt-submit": async (ctx: { items: string[] }) => {
|
|
85
|
-
ctx.items.push("final");
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
const result = await runHook<{ items: string[] }>("user-prompt-submit", {
|
|
91
|
-
items: [],
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
expect(result.items).toEqual(["first", "final"]);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression: the SSE subscribe path must resolve the actor principal from the
|
|
3
|
-
* SAME guardian source as the send/result routes.
|
|
4
|
-
*
|
|
5
|
-
* The send/result routes resolve the actor principal via the async,
|
|
6
|
-
* gateway-first `findLocalGuardianPrincipalId`. The SSE eager-subscribe path
|
|
7
|
-
* cannot await and uses the sync `findLocalGuardianPrincipalIdFromStore`. When
|
|
8
|
-
* the gateway binding is canonical but the local contact row is stale/missing
|
|
9
|
-
* (after a guardian reset or gateway-owned binding update), the sync path must
|
|
10
|
-
* still land on the gateway principal — otherwise the event hub registers the
|
|
11
|
-
* SSE client under a DIFFERENT principal than the turn/result paths use, and
|
|
12
|
-
* targeted result submissions 403.
|
|
13
|
-
*
|
|
14
|
-
* These tests pin the invariant by priming the gateway-delivery cache with a
|
|
15
|
-
* principal that differs from the stale local store and asserting both
|
|
16
|
-
* resolvers agree; and that a cold cache falls back to the local store.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
20
|
-
|
|
21
|
-
import type { GuardianDelivery } from "@vellumai/gateway-client";
|
|
22
|
-
|
|
23
|
-
// ── Controllable IPC mock (drives the gateway-delivery cache) ────────────────
|
|
24
|
-
|
|
25
|
-
let ipcGuardians: GuardianDelivery[] = [];
|
|
26
|
-
|
|
27
|
-
mock.module("../ipc/gateway-client.js", () => ({
|
|
28
|
-
ipcCall: async () => ({ guardians: ipcGuardians }),
|
|
29
|
-
ipcCallPersistent: async () => undefined,
|
|
30
|
-
resetPersistentClient: () => {},
|
|
31
|
-
}));
|
|
32
|
-
|
|
33
|
-
// ── Local store mock (the stale fallback source) ─────────────────────────────
|
|
34
|
-
|
|
35
|
-
let storePrincipalId: string | undefined;
|
|
36
|
-
|
|
37
|
-
mock.module("../contacts/contact-store.js", () => ({
|
|
38
|
-
findGuardianForChannel: (channelType: string) =>
|
|
39
|
-
storePrincipalId && channelType === "vellum"
|
|
40
|
-
? { contact: { principalId: storePrincipalId }, channel: {} }
|
|
41
|
-
: null,
|
|
42
|
-
}));
|
|
43
|
-
|
|
44
|
-
import {
|
|
45
|
-
__resetGuardianDeliveryCacheForTest,
|
|
46
|
-
getGuardianDelivery,
|
|
47
|
-
} from "../contacts/guardian-delivery-reader.js";
|
|
48
|
-
import {
|
|
49
|
-
findLocalGuardianPrincipalId,
|
|
50
|
-
findLocalGuardianPrincipalIdFromStore,
|
|
51
|
-
} from "../runtime/local-actor-identity.js";
|
|
52
|
-
|
|
53
|
-
const gatewayVellumGuardian: GuardianDelivery = {
|
|
54
|
-
channelType: "vellum",
|
|
55
|
-
contactId: "contact-gw",
|
|
56
|
-
principalId: "guardian-from-gateway",
|
|
57
|
-
address: "vellum:self",
|
|
58
|
-
status: "active",
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
describe("SSE actor principal resolves from the same guardian source as send/result routes", () => {
|
|
62
|
-
beforeEach(() => {
|
|
63
|
-
__resetGuardianDeliveryCacheForTest();
|
|
64
|
-
ipcGuardians = [];
|
|
65
|
-
storePrincipalId = undefined;
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test("warm gateway cache: sync (SSE) and async (send/result) resolve the SAME principal despite a stale local store", async () => {
|
|
69
|
-
// Gateway binding is canonical; local store row is stale (different id).
|
|
70
|
-
ipcGuardians = [gatewayVellumGuardian];
|
|
71
|
-
storePrincipalId = "guardian-stale-local";
|
|
72
|
-
|
|
73
|
-
// Prime the cache the way the async hot paths do.
|
|
74
|
-
const asyncPrincipalId = await findLocalGuardianPrincipalId();
|
|
75
|
-
expect(asyncPrincipalId).toBe("guardian-from-gateway");
|
|
76
|
-
|
|
77
|
-
// SSE's sync resolver reads the same cached gateway snapshot, NOT the
|
|
78
|
-
// stale store — so the principals match and host-proxy targeting works.
|
|
79
|
-
expect(findLocalGuardianPrincipalIdFromStore()).toBe(asyncPrincipalId);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test("cold cache: sync resolver falls back to the local store as before", () => {
|
|
83
|
-
// Nothing primed the cache; only the local store has a binding.
|
|
84
|
-
storePrincipalId = "guardian-stale-local";
|
|
85
|
-
|
|
86
|
-
expect(findLocalGuardianPrincipalIdFromStore()).toBe("guardian-stale-local");
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
test("cold cache with no store binding: sync resolver returns undefined", () => {
|
|
90
|
-
expect(findLocalGuardianPrincipalIdFromStore()).toBeUndefined();
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
test("warm gateway cache primes via the vellum-filtered read the async path uses", async () => {
|
|
94
|
-
ipcGuardians = [gatewayVellumGuardian];
|
|
95
|
-
|
|
96
|
-
// The async path filters by channelType vellum; the sync peek must read
|
|
97
|
-
// the same cache key, not the unfiltered "ALL" entry.
|
|
98
|
-
await getGuardianDelivery({ channelTypes: ["vellum"] });
|
|
99
|
-
|
|
100
|
-
expect(findLocalGuardianPrincipalIdFromStore()).toBe("guardian-from-gateway");
|
|
101
|
-
});
|
|
102
|
-
});
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Enqueue-steer contract: when a chat message is enqueued while an
|
|
3
|
-
* `ask_question` prompt is open for the same conversation, the user has chosen
|
|
4
|
-
* to move on rather than answer it. `steerOnEnqueuedMessageIfQuestionParked`
|
|
5
|
-
* steers to that message — aborting the parked turn (which settles the open
|
|
6
|
-
* question via its turn-abort signal) and draining the message — instead of
|
|
7
|
-
* stranding it behind a prompt no one will answer.
|
|
8
|
-
*
|
|
9
|
-
* Only `kind: "question"` interactions trigger the steer; pending confirmations
|
|
10
|
-
* are handled separately by the enqueue path's auto-deny.
|
|
11
|
-
*/
|
|
12
|
-
import { afterEach, describe, expect, test } from "bun:test";
|
|
13
|
-
|
|
14
|
-
import type { Conversation } from "../daemon/conversation.js";
|
|
15
|
-
import {
|
|
16
|
-
deleteConversation,
|
|
17
|
-
setConversation,
|
|
18
|
-
} from "../daemon/conversation-registry.js";
|
|
19
|
-
import {
|
|
20
|
-
steerOnEnqueuedMessageIfQuestionParked,
|
|
21
|
-
supersedePendingInteractionsOnEnqueue,
|
|
22
|
-
} from "../daemon/handlers/conversations.js";
|
|
23
|
-
import * as pendingInteractions from "../runtime/pending-interactions.js";
|
|
24
|
-
|
|
25
|
-
interface ParkedTurn {
|
|
26
|
-
abortCount: () => number;
|
|
27
|
-
fake: { pendingSteerRepair: boolean };
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Register a fake conversation whose in-flight turn is parked. The fake exposes
|
|
32
|
-
* just the surface `steerToMessage` touches: a processing flag, a queue whose
|
|
33
|
-
* head can be promoted, an abort controller that records aborts, and the
|
|
34
|
-
* confirmation-deny hook.
|
|
35
|
-
*/
|
|
36
|
-
function registerParkedTurn(id: string): ParkedTurn {
|
|
37
|
-
let abortCount = 0;
|
|
38
|
-
const fake = {
|
|
39
|
-
isProcessing: () => true,
|
|
40
|
-
queue: {
|
|
41
|
-
promoteToHead: (requestId: string) => ({ requestId }),
|
|
42
|
-
},
|
|
43
|
-
pendingSteerRepair: false,
|
|
44
|
-
abortController: {
|
|
45
|
-
abort: () => {
|
|
46
|
-
abortCount += 1;
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
hasAnyPendingConfirmation: () => false,
|
|
50
|
-
denyAllPendingConfirmations: () => {},
|
|
51
|
-
};
|
|
52
|
-
setConversation(id, fake as unknown as Conversation);
|
|
53
|
-
return { abortCount: () => abortCount, fake };
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const registeredRequestIds: string[] = [];
|
|
57
|
-
function registerInteraction(
|
|
58
|
-
conversationId: string,
|
|
59
|
-
kind: "question" | "confirmation",
|
|
60
|
-
): void {
|
|
61
|
-
const requestId = `pending-${kind}-${conversationId}`;
|
|
62
|
-
pendingInteractions.register(requestId, { conversationId, kind });
|
|
63
|
-
registeredRequestIds.push(requestId);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const QUESTION_CONV = "steer-enqueue-question";
|
|
67
|
-
const CONFIRMATION_CONV = "steer-enqueue-confirmation";
|
|
68
|
-
const NONE_CONV = "steer-enqueue-none";
|
|
69
|
-
|
|
70
|
-
describe("steerOnEnqueuedMessageIfQuestionParked", () => {
|
|
71
|
-
afterEach(() => {
|
|
72
|
-
for (const id of registeredRequestIds) {
|
|
73
|
-
pendingInteractions.resolve(id, "cancelled");
|
|
74
|
-
}
|
|
75
|
-
registeredRequestIds.length = 0;
|
|
76
|
-
deleteConversation(QUESTION_CONV);
|
|
77
|
-
deleteConversation(CONFIRMATION_CONV);
|
|
78
|
-
deleteConversation(NONE_CONV);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test("steers to the enqueued message when an ask_question is parked", () => {
|
|
82
|
-
const conv = registerParkedTurn(QUESTION_CONV);
|
|
83
|
-
registerInteraction(QUESTION_CONV, "question");
|
|
84
|
-
|
|
85
|
-
const steered = steerOnEnqueuedMessageIfQuestionParked(
|
|
86
|
-
QUESTION_CONV,
|
|
87
|
-
"msg-1",
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
// The parked turn is aborted (which settles the open question) and marked
|
|
91
|
-
// for tool-result repair so the drain path can pick up the new message.
|
|
92
|
-
expect(steered).toBe(true);
|
|
93
|
-
expect(conv.abortCount()).toBe(1);
|
|
94
|
-
expect(conv.fake.pendingSteerRepair).toBe(true);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
test("steers for a parked question even when a confirmation is also pending", () => {
|
|
98
|
-
// A single model response can open an ask_question and a confirmation
|
|
99
|
-
// concurrently (tools run via Promise.all), so both interactions can be
|
|
100
|
-
// registered at once. The steer must still fire for the question — the
|
|
101
|
-
// enqueue path runs it before the confirmation auto-deny clears entries.
|
|
102
|
-
const conv = registerParkedTurn(QUESTION_CONV);
|
|
103
|
-
registerInteraction(QUESTION_CONV, "confirmation");
|
|
104
|
-
registerInteraction(QUESTION_CONV, "question");
|
|
105
|
-
|
|
106
|
-
const steered = steerOnEnqueuedMessageIfQuestionParked(
|
|
107
|
-
QUESTION_CONV,
|
|
108
|
-
"msg-1",
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
expect(steered).toBe(true);
|
|
112
|
-
expect(conv.abortCount()).toBe(1);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
test("does not steer for a pending confirmation (not a question)", () => {
|
|
116
|
-
const conv = registerParkedTurn(CONFIRMATION_CONV);
|
|
117
|
-
registerInteraction(CONFIRMATION_CONV, "confirmation");
|
|
118
|
-
|
|
119
|
-
const steered = steerOnEnqueuedMessageIfQuestionParked(
|
|
120
|
-
CONFIRMATION_CONV,
|
|
121
|
-
"msg-1",
|
|
122
|
-
);
|
|
123
|
-
|
|
124
|
-
expect(steered).toBe(false);
|
|
125
|
-
expect(conv.abortCount()).toBe(0);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
test("does not steer when no prompt is parked", () => {
|
|
129
|
-
const conv = registerParkedTurn(NONE_CONV);
|
|
130
|
-
|
|
131
|
-
const steered = steerOnEnqueuedMessageIfQuestionParked(NONE_CONV, "msg-1");
|
|
132
|
-
|
|
133
|
-
expect(steered).toBe(false);
|
|
134
|
-
expect(conv.abortCount()).toBe(0);
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
test("supersedePendingInteractionsOnEnqueue steers a parked question", () => {
|
|
138
|
-
// The centralized routine is invoked by both the HTTP send handler and the
|
|
139
|
-
// CLI signal path. With no pending confirmation it steers a parked question
|
|
140
|
-
// — the behavior the CLI signal path previously lacked.
|
|
141
|
-
const conv = registerParkedTurn(QUESTION_CONV);
|
|
142
|
-
registerInteraction(QUESTION_CONV, "question");
|
|
143
|
-
|
|
144
|
-
supersedePendingInteractionsOnEnqueue(QUESTION_CONV, "msg-1");
|
|
145
|
-
|
|
146
|
-
expect(conv.abortCount()).toBe(1);
|
|
147
|
-
expect(conv.fake.pendingSteerRepair).toBe(true);
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
describe("removeByConversation preserves question interactions", () => {
|
|
152
|
-
// The enqueue path's confirmation auto-deny calls removeByConversation before
|
|
153
|
-
// the steer runs. Questions must survive it — they are settled instead by the
|
|
154
|
-
// steer's turn abort — or, when an ask_question and a confirmation are pending
|
|
155
|
-
// concurrently, the queued message would strand behind a question whose entry
|
|
156
|
-
// was cleared (and whose Promise was never settled) before the steer fired.
|
|
157
|
-
const CONV = "remove-by-conv-preserve-question";
|
|
158
|
-
const ids: string[] = [];
|
|
159
|
-
function register(kind: "question" | "confirmation"): void {
|
|
160
|
-
const requestId = `rbc-${kind}`;
|
|
161
|
-
pendingInteractions.register(requestId, { conversationId: CONV, kind });
|
|
162
|
-
ids.push(requestId);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
afterEach(() => {
|
|
166
|
-
for (const id of ids) pendingInteractions.resolve(id, "cancelled");
|
|
167
|
-
ids.length = 0;
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
test("removes confirmations but leaves questions registered", () => {
|
|
171
|
-
register("confirmation");
|
|
172
|
-
register("question");
|
|
173
|
-
|
|
174
|
-
pendingInteractions.removeByConversation(CONV);
|
|
175
|
-
|
|
176
|
-
const remaining = pendingInteractions
|
|
177
|
-
.getByConversation(CONV)
|
|
178
|
-
.map((interaction) => interaction.kind);
|
|
179
|
-
expect(remaining).toEqual(["question"]);
|
|
180
|
-
});
|
|
181
|
-
});
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
existsSync,
|
|
3
|
-
mkdirSync,
|
|
4
|
-
readFileSync,
|
|
5
|
-
rmSync,
|
|
6
|
-
writeFileSync,
|
|
7
|
-
} from "node:fs";
|
|
8
|
-
import { tmpdir } from "node:os";
|
|
9
|
-
import { join } from "node:path";
|
|
10
|
-
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
11
|
-
|
|
12
|
-
import { pruneSeededCallsiteDefaultsMigration } from "../workspace/migrations/111-prune-seeded-callsite-defaults.js";
|
|
13
|
-
import { WORKSPACE_MIGRATIONS } from "../workspace/migrations/registry.js";
|
|
14
|
-
|
|
15
|
-
let workspaceDir: string;
|
|
16
|
-
let previousOverlayPath: string | undefined;
|
|
17
|
-
|
|
18
|
-
function writeConfig(data: Record<string, unknown>): void {
|
|
19
|
-
writeFileSync(
|
|
20
|
-
join(workspaceDir, "config.json"),
|
|
21
|
-
JSON.stringify(data, null, 2) + "\n",
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function readConfig(): Record<string, unknown> {
|
|
26
|
-
return JSON.parse(readFileSync(join(workspaceDir, "config.json"), "utf-8"));
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function readLlm(): Record<string, unknown> | undefined {
|
|
30
|
-
return readConfig().llm as Record<string, unknown> | undefined;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function latencySeed(): Record<string, unknown> {
|
|
34
|
-
return {
|
|
35
|
-
model: "claude-haiku-4-5-20251001",
|
|
36
|
-
effort: "low",
|
|
37
|
-
thinking: { enabled: false },
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function fullSeededCallSites(): Record<string, Record<string, unknown>> {
|
|
42
|
-
return {
|
|
43
|
-
guardianQuestionCopy: latencySeed(),
|
|
44
|
-
interactionClassifier: latencySeed(),
|
|
45
|
-
skillCategoryInference: latencySeed(),
|
|
46
|
-
inviteInstructionGenerator: latencySeed(),
|
|
47
|
-
notificationDecision: latencySeed(),
|
|
48
|
-
preferenceExtraction: latencySeed(),
|
|
49
|
-
commitMessage: {
|
|
50
|
-
model: "claude-haiku-4-5-20251001",
|
|
51
|
-
maxTokens: 120,
|
|
52
|
-
temperature: 0.2,
|
|
53
|
-
effort: "low",
|
|
54
|
-
thinking: { enabled: false },
|
|
55
|
-
},
|
|
56
|
-
conversationStarters: latencySeed(),
|
|
57
|
-
conversationSummarization: {
|
|
58
|
-
model: "claude-opus-4-7",
|
|
59
|
-
effort: "low",
|
|
60
|
-
thinking: { enabled: false },
|
|
61
|
-
},
|
|
62
|
-
recall: {
|
|
63
|
-
profile: "cost-optimized",
|
|
64
|
-
maxTokens: 4096,
|
|
65
|
-
effort: "low",
|
|
66
|
-
thinking: { enabled: false, streamThinking: false },
|
|
67
|
-
temperature: 0,
|
|
68
|
-
disableCache: true,
|
|
69
|
-
},
|
|
70
|
-
heartbeatAgent: {
|
|
71
|
-
profile: "cost-optimized",
|
|
72
|
-
maxTokens: 2048,
|
|
73
|
-
effort: "low",
|
|
74
|
-
temperature: 0,
|
|
75
|
-
thinking: { enabled: false, streamThinking: false },
|
|
76
|
-
contextWindow: { maxInputTokens: 16000 },
|
|
77
|
-
},
|
|
78
|
-
replySuggestion: {
|
|
79
|
-
model: "claude-haiku-4-5-20251001",
|
|
80
|
-
effort: "low",
|
|
81
|
-
thinking: { enabled: false },
|
|
82
|
-
disableCache: true,
|
|
83
|
-
},
|
|
84
|
-
memoryRouter: {
|
|
85
|
-
profile: "cost-optimized",
|
|
86
|
-
contextWindow: { maxInputTokens: 1_000_000 },
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
beforeEach(() => {
|
|
92
|
-
workspaceDir = join(
|
|
93
|
-
tmpdir(),
|
|
94
|
-
`vellum-migration-111-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
95
|
-
);
|
|
96
|
-
mkdirSync(workspaceDir, { recursive: true });
|
|
97
|
-
previousOverlayPath = process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH;
|
|
98
|
-
delete process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH;
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
afterEach(() => {
|
|
102
|
-
if (previousOverlayPath === undefined) {
|
|
103
|
-
delete process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH;
|
|
104
|
-
} else {
|
|
105
|
-
process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH = previousOverlayPath;
|
|
106
|
-
}
|
|
107
|
-
if (existsSync(workspaceDir)) {
|
|
108
|
-
rmSync(workspaceDir, { recursive: true, force: true });
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
describe("111-prune-seeded-callsite-defaults migration", () => {
|
|
113
|
-
test("is registered last", () => {
|
|
114
|
-
expect(WORKSPACE_MIGRATIONS.at(-1)).toBe(
|
|
115
|
-
pruneSeededCallsiteDefaultsMigration,
|
|
116
|
-
);
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
test("no-op when config.json does not exist", () => {
|
|
120
|
-
pruneSeededCallsiteDefaultsMigration.run(workspaceDir);
|
|
121
|
-
expect(existsSync(join(workspaceDir, "config.json"))).toBe(false);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
test("gracefully handles invalid JSON", () => {
|
|
125
|
-
writeFileSync(join(workspaceDir, "config.json"), "not-valid-json");
|
|
126
|
-
pruneSeededCallsiteDefaultsMigration.run(workspaceDir);
|
|
127
|
-
expect(readFileSync(join(workspaceDir, "config.json"), "utf-8")).toBe(
|
|
128
|
-
"not-valid-json",
|
|
129
|
-
);
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
test("removes exact system-owned call-site default materializations", () => {
|
|
133
|
-
writeConfig({
|
|
134
|
-
llm: {
|
|
135
|
-
activeProfile: "balanced",
|
|
136
|
-
advisorProfile: "frontier",
|
|
137
|
-
callSites: fullSeededCallSites(),
|
|
138
|
-
},
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
pruneSeededCallsiteDefaultsMigration.run(workspaceDir);
|
|
142
|
-
|
|
143
|
-
expect(readLlm()?.activeProfile).toBe("balanced");
|
|
144
|
-
expect(readLlm()?.advisorProfile).toBe("frontier");
|
|
145
|
-
expect(readLlm()?.callSites).toBeUndefined();
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
test("preserves user-customized call-site entries", () => {
|
|
149
|
-
writeConfig({
|
|
150
|
-
llm: {
|
|
151
|
-
callSites: {
|
|
152
|
-
...fullSeededCallSites(),
|
|
153
|
-
commitMessage: {
|
|
154
|
-
model: "claude-haiku-4-5-20251001",
|
|
155
|
-
maxTokens: 256,
|
|
156
|
-
temperature: 0.2,
|
|
157
|
-
effort: "low",
|
|
158
|
-
thinking: { enabled: false },
|
|
159
|
-
},
|
|
160
|
-
recall: {
|
|
161
|
-
profile: "cost-optimized",
|
|
162
|
-
maxTokens: 4096,
|
|
163
|
-
effort: "low",
|
|
164
|
-
thinking: { enabled: false, streamThinking: false },
|
|
165
|
-
temperature: 0,
|
|
166
|
-
disableCache: false,
|
|
167
|
-
},
|
|
168
|
-
customSite: { profile: "frontier" },
|
|
169
|
-
},
|
|
170
|
-
},
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
pruneSeededCallsiteDefaultsMigration.run(workspaceDir);
|
|
174
|
-
|
|
175
|
-
const callSites = readLlm()?.callSites as Record<
|
|
176
|
-
string,
|
|
177
|
-
Record<string, unknown>
|
|
178
|
-
>;
|
|
179
|
-
expect(Object.keys(callSites).sort()).toEqual([
|
|
180
|
-
"commitMessage",
|
|
181
|
-
"customSite",
|
|
182
|
-
"recall",
|
|
183
|
-
]);
|
|
184
|
-
expect(callSites.commitMessage?.maxTokens).toBe(256);
|
|
185
|
-
expect(callSites.recall?.disableCache).toBe(false);
|
|
186
|
-
expect(callSites.customSite).toEqual({ profile: "frontier" });
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
test("platform-style config keeps gateway settings while pruning seeded call sites", () => {
|
|
190
|
-
writeConfig({
|
|
191
|
-
gateway: {
|
|
192
|
-
unmappedPolicy: "default",
|
|
193
|
-
defaultAssistantId: "self",
|
|
194
|
-
},
|
|
195
|
-
llm: {
|
|
196
|
-
callSites: fullSeededCallSites(),
|
|
197
|
-
},
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
pruneSeededCallsiteDefaultsMigration.run(workspaceDir);
|
|
201
|
-
|
|
202
|
-
expect(readConfig().gateway).toEqual({
|
|
203
|
-
unmappedPolicy: "default",
|
|
204
|
-
defaultAssistantId: "self",
|
|
205
|
-
});
|
|
206
|
-
expect(readLlm()?.callSites).toBeUndefined();
|
|
207
|
-
});
|
|
208
|
-
});
|