@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
|
@@ -83,42 +83,6 @@ mock.module("../ipc/gateway-client.js", () => ({
|
|
|
83
83
|
}),
|
|
84
84
|
}));
|
|
85
85
|
|
|
86
|
-
// Guardian-delivery reader mock — the inbound challenge guard reads guardian
|
|
87
|
-
// existence from the gateway. Derive the list from the local binding state so
|
|
88
|
-
// the gateway-backed presence guard mirrors the DB the rest of the test sets up.
|
|
89
|
-
const resolveGuardianList = async (input?: { channelTypes?: string[] }) => {
|
|
90
|
-
const { findGuardianForChannel } = await import(
|
|
91
|
-
"../contacts/contact-store.js"
|
|
92
|
-
);
|
|
93
|
-
const channels = input?.channelTypes ?? [];
|
|
94
|
-
return channels
|
|
95
|
-
.map((channelType) => {
|
|
96
|
-
const found = findGuardianForChannel(channelType);
|
|
97
|
-
if (!found) return null;
|
|
98
|
-
return {
|
|
99
|
-
channelType,
|
|
100
|
-
contactId: found.contact.id,
|
|
101
|
-
principalId: found.contact.principalId ?? null,
|
|
102
|
-
displayName: found.contact.displayName ?? null,
|
|
103
|
-
address: found.channel.address,
|
|
104
|
-
externalChatId: found.channel.externalChatId ?? null,
|
|
105
|
-
status: "active",
|
|
106
|
-
verifiedAt: found.channel.verifiedAt ?? null,
|
|
107
|
-
};
|
|
108
|
-
})
|
|
109
|
-
.filter((g) => g !== null);
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
mock.module("../contacts/guardian-delivery-reader.js", () => ({
|
|
113
|
-
getGuardianDelivery: resolveGuardianList,
|
|
114
|
-
getGuardianDeliveryFresh: resolveGuardianList,
|
|
115
|
-
guardianForChannel: (
|
|
116
|
-
list: Array<{ channelType: string; status: string }>,
|
|
117
|
-
channelType: string,
|
|
118
|
-
) =>
|
|
119
|
-
list.find((g) => g.channelType === channelType && g.status === "active"),
|
|
120
|
-
}));
|
|
121
|
-
|
|
122
86
|
import { handleChannelVerificationSession } from "../daemon/handlers/config-channels.js";
|
|
123
87
|
import type {
|
|
124
88
|
ChannelVerificationSessionRequest,
|
|
@@ -355,12 +319,12 @@ describe("guardian service challenge validation", () => {
|
|
|
355
319
|
}
|
|
356
320
|
});
|
|
357
321
|
|
|
358
|
-
test("validateAndConsumeVerification does not create a guardian binding (caller responsibility)",
|
|
322
|
+
test("validateAndConsumeVerification does not create a guardian binding (caller responsibility)", () => {
|
|
359
323
|
const { secret } = createInboundVerificationSession("telegram");
|
|
360
324
|
|
|
361
325
|
validateAndConsumeVerification("telegram", secret, "user-42", "chat-42");
|
|
362
326
|
|
|
363
|
-
const binding =
|
|
327
|
+
const binding = getGuardianBinding("asst-1", "telegram");
|
|
364
328
|
expect(binding).toBeNull();
|
|
365
329
|
});
|
|
366
330
|
|
|
@@ -432,7 +396,7 @@ describe("guardian service challenge validation", () => {
|
|
|
432
396
|
expect(result2.success).toBe(false);
|
|
433
397
|
});
|
|
434
398
|
|
|
435
|
-
test("validateAndConsumeVerification succeeds with voice channel",
|
|
399
|
+
test("validateAndConsumeVerification succeeds with voice channel", () => {
|
|
436
400
|
const { secret } = createInboundVerificationSession("phone");
|
|
437
401
|
|
|
438
402
|
const result = validateAndConsumeVerification(
|
|
@@ -449,7 +413,7 @@ describe("guardian service challenge validation", () => {
|
|
|
449
413
|
|
|
450
414
|
// validateAndConsumeVerification no longer creates bindings — that is
|
|
451
415
|
// now handled by the gateway's verification intercepts.
|
|
452
|
-
const binding =
|
|
416
|
+
const binding = getGuardianBinding("asst-1", "phone");
|
|
453
417
|
expect(binding).toBeNull();
|
|
454
418
|
});
|
|
455
419
|
|
|
@@ -485,7 +449,7 @@ describe("guardian service challenge validation", () => {
|
|
|
485
449
|
expect(telegramResult.success).toBe(true);
|
|
486
450
|
});
|
|
487
451
|
|
|
488
|
-
test("validateAndConsumeVerification succeeds even with existing binding (conflict check is caller responsibility)",
|
|
452
|
+
test("validateAndConsumeVerification succeeds even with existing binding (conflict check is caller responsibility)", () => {
|
|
489
453
|
// Create initial guardian binding
|
|
490
454
|
createGuardianBinding({
|
|
491
455
|
channel: "telegram",
|
|
@@ -494,7 +458,7 @@ describe("guardian service challenge validation", () => {
|
|
|
494
458
|
guardianDeliveryChatId: "old-chat",
|
|
495
459
|
});
|
|
496
460
|
|
|
497
|
-
const oldBinding =
|
|
461
|
+
const oldBinding = getGuardianBinding("asst-1", "telegram");
|
|
498
462
|
expect(oldBinding).not.toBeNull();
|
|
499
463
|
expect(oldBinding!.guardianExternalUserId).toBe("old-user");
|
|
500
464
|
|
|
@@ -509,7 +473,7 @@ describe("guardian service challenge validation", () => {
|
|
|
509
473
|
// Challenge validation succeeds — the caller decides how to handle binding conflicts
|
|
510
474
|
expect(result.success).toBe(true);
|
|
511
475
|
|
|
512
|
-
const binding =
|
|
476
|
+
const binding = getGuardianBinding("asst-1", "telegram");
|
|
513
477
|
expect(binding).not.toBeNull();
|
|
514
478
|
expect(binding!.guardianExternalUserId).toBe("old-user");
|
|
515
479
|
});
|
|
@@ -524,7 +488,7 @@ describe("guardian identity check", () => {
|
|
|
524
488
|
resetTables();
|
|
525
489
|
});
|
|
526
490
|
|
|
527
|
-
test("isGuardian returns true for matching user",
|
|
491
|
+
test("isGuardian returns true for matching user", () => {
|
|
528
492
|
createGuardianBinding({
|
|
529
493
|
channel: "telegram",
|
|
530
494
|
guardianExternalUserId: "user-42",
|
|
@@ -532,10 +496,10 @@ describe("guardian identity check", () => {
|
|
|
532
496
|
guardianDeliveryChatId: "chat-42",
|
|
533
497
|
});
|
|
534
498
|
|
|
535
|
-
expect(
|
|
499
|
+
expect(isGuardian("asst-1", "telegram", "user-42")).toBe(true);
|
|
536
500
|
});
|
|
537
501
|
|
|
538
|
-
test("isGuardian returns false for non-matching user",
|
|
502
|
+
test("isGuardian returns false for non-matching user", () => {
|
|
539
503
|
createGuardianBinding({
|
|
540
504
|
channel: "telegram",
|
|
541
505
|
guardianExternalUserId: "user-42",
|
|
@@ -543,14 +507,14 @@ describe("guardian identity check", () => {
|
|
|
543
507
|
guardianDeliveryChatId: "chat-42",
|
|
544
508
|
});
|
|
545
509
|
|
|
546
|
-
expect(
|
|
510
|
+
expect(isGuardian("asst-1", "telegram", "user-99")).toBe(false);
|
|
547
511
|
});
|
|
548
512
|
|
|
549
|
-
test("isGuardian returns false when no binding exists",
|
|
550
|
-
expect(
|
|
513
|
+
test("isGuardian returns false when no binding exists", () => {
|
|
514
|
+
expect(isGuardian("asst-1", "telegram", "user-42")).toBe(false);
|
|
551
515
|
});
|
|
552
516
|
|
|
553
|
-
test("isGuardian returns false after binding is revoked",
|
|
517
|
+
test("isGuardian returns false after binding is revoked", () => {
|
|
554
518
|
createGuardianBinding({
|
|
555
519
|
channel: "telegram",
|
|
556
520
|
guardianExternalUserId: "user-42",
|
|
@@ -560,10 +524,10 @@ describe("guardian identity check", () => {
|
|
|
560
524
|
|
|
561
525
|
serviceRevokeBinding("asst-1", "telegram");
|
|
562
526
|
|
|
563
|
-
expect(
|
|
527
|
+
expect(isGuardian("asst-1", "telegram", "user-42")).toBe(false);
|
|
564
528
|
});
|
|
565
529
|
|
|
566
|
-
test("getGuardianBinding returns the active binding",
|
|
530
|
+
test("getGuardianBinding returns the active binding", () => {
|
|
567
531
|
createGuardianBinding({
|
|
568
532
|
channel: "telegram",
|
|
569
533
|
guardianExternalUserId: "user-42",
|
|
@@ -571,17 +535,17 @@ describe("guardian identity check", () => {
|
|
|
571
535
|
guardianDeliveryChatId: "chat-42",
|
|
572
536
|
});
|
|
573
537
|
|
|
574
|
-
const binding =
|
|
538
|
+
const binding = getGuardianBinding("asst-1", "telegram");
|
|
575
539
|
expect(binding).not.toBeNull();
|
|
576
540
|
expect(binding!.guardianExternalUserId).toBe("user-42");
|
|
577
541
|
});
|
|
578
542
|
|
|
579
|
-
test("getGuardianBinding returns null when no binding exists",
|
|
580
|
-
const binding =
|
|
543
|
+
test("getGuardianBinding returns null when no binding exists", () => {
|
|
544
|
+
const binding = getGuardianBinding("asst-1", "telegram");
|
|
581
545
|
expect(binding).toBeNull();
|
|
582
546
|
});
|
|
583
547
|
|
|
584
|
-
test("isGuardian works for voice channel",
|
|
548
|
+
test("isGuardian works for voice channel", () => {
|
|
585
549
|
createGuardianBinding({
|
|
586
550
|
channel: "phone",
|
|
587
551
|
guardianExternalUserId: "phone-user-1",
|
|
@@ -589,13 +553,13 @@ describe("guardian identity check", () => {
|
|
|
589
553
|
guardianDeliveryChatId: "voice-chat-1",
|
|
590
554
|
});
|
|
591
555
|
|
|
592
|
-
expect(
|
|
593
|
-
expect(
|
|
556
|
+
expect(isGuardian("asst-1", "phone", "phone-user-1")).toBe(true);
|
|
557
|
+
expect(isGuardian("asst-1", "phone", "phone-user-2")).toBe(false);
|
|
594
558
|
// Telegram guardian should not match voice channel
|
|
595
|
-
expect(
|
|
559
|
+
expect(isGuardian("asst-1", "telegram", "phone-user-1")).toBe(false);
|
|
596
560
|
});
|
|
597
561
|
|
|
598
|
-
test("serviceRevokeBinding revokes the active binding",
|
|
562
|
+
test("serviceRevokeBinding revokes the active binding", () => {
|
|
599
563
|
createGuardianBinding({
|
|
600
564
|
channel: "telegram",
|
|
601
565
|
guardianExternalUserId: "user-42",
|
|
@@ -605,7 +569,7 @@ describe("guardian identity check", () => {
|
|
|
605
569
|
|
|
606
570
|
const result = serviceRevokeBinding("asst-1", "telegram");
|
|
607
571
|
expect(result).toBe(true);
|
|
608
|
-
expect(
|
|
572
|
+
expect(getGuardianBinding("asst-1", "telegram")).toBeNull();
|
|
609
573
|
});
|
|
610
574
|
});
|
|
611
575
|
|
|
@@ -896,7 +860,7 @@ describe("channel-scoped guardian resolution", () => {
|
|
|
896
860
|
resetTables();
|
|
897
861
|
});
|
|
898
862
|
|
|
899
|
-
test("isGuardian resolves independently per channel",
|
|
863
|
+
test("isGuardian resolves independently per channel", () => {
|
|
900
864
|
// Create guardian binding on telegram
|
|
901
865
|
createGuardianBinding({
|
|
902
866
|
channel: "telegram",
|
|
@@ -913,15 +877,15 @@ describe("channel-scoped guardian resolution", () => {
|
|
|
913
877
|
});
|
|
914
878
|
|
|
915
879
|
// user-alpha is guardian for telegram but not voice
|
|
916
|
-
expect(
|
|
917
|
-
expect(
|
|
880
|
+
expect(isGuardian("self", "telegram", "user-alpha")).toBe(true);
|
|
881
|
+
expect(isGuardian("self", "phone", "user-alpha")).toBe(false);
|
|
918
882
|
|
|
919
883
|
// user-beta is guardian for voice but not telegram
|
|
920
|
-
expect(
|
|
921
|
-
expect(
|
|
884
|
+
expect(isGuardian("self", "phone", "user-beta")).toBe(true);
|
|
885
|
+
expect(isGuardian("self", "telegram", "user-beta")).toBe(false);
|
|
922
886
|
});
|
|
923
887
|
|
|
924
|
-
test("getGuardianBinding returns different bindings for different channels",
|
|
888
|
+
test("getGuardianBinding returns different bindings for different channels", () => {
|
|
925
889
|
createGuardianBinding({
|
|
926
890
|
channel: "telegram",
|
|
927
891
|
guardianExternalUserId: "user-alpha",
|
|
@@ -935,8 +899,8 @@ describe("channel-scoped guardian resolution", () => {
|
|
|
935
899
|
guardianDeliveryChatId: "chat-beta",
|
|
936
900
|
});
|
|
937
901
|
|
|
938
|
-
const bindingTelegram =
|
|
939
|
-
const bindingVoice =
|
|
902
|
+
const bindingTelegram = getGuardianBinding("self", "telegram");
|
|
903
|
+
const bindingVoice = getGuardianBinding("self", "phone");
|
|
940
904
|
|
|
941
905
|
expect(bindingTelegram).not.toBeNull();
|
|
942
906
|
expect(bindingVoice).not.toBeNull();
|
|
@@ -944,7 +908,7 @@ describe("channel-scoped guardian resolution", () => {
|
|
|
944
908
|
expect(bindingVoice!.guardianExternalUserId).toBe("user-beta");
|
|
945
909
|
});
|
|
946
910
|
|
|
947
|
-
test("revoking binding for one channel does not affect another",
|
|
911
|
+
test("revoking binding for one channel does not affect another", () => {
|
|
948
912
|
createGuardianBinding({
|
|
949
913
|
channel: "telegram",
|
|
950
914
|
guardianExternalUserId: "user-alpha",
|
|
@@ -960,11 +924,11 @@ describe("channel-scoped guardian resolution", () => {
|
|
|
960
924
|
|
|
961
925
|
serviceRevokeBinding("self", "telegram");
|
|
962
926
|
|
|
963
|
-
expect(
|
|
964
|
-
expect(
|
|
927
|
+
expect(getGuardianBinding("self", "telegram")).toBeNull();
|
|
928
|
+
expect(getGuardianBinding("self", "phone")).not.toBeNull();
|
|
965
929
|
});
|
|
966
930
|
|
|
967
|
-
test("validateAndConsumeVerification scoped to channel",
|
|
931
|
+
test("validateAndConsumeVerification scoped to channel", () => {
|
|
968
932
|
// Create challenge on telegram
|
|
969
933
|
const { secret: secretTelegram } =
|
|
970
934
|
createInboundVerificationSession("telegram");
|
|
@@ -997,8 +961,8 @@ describe("channel-scoped guardian resolution", () => {
|
|
|
997
961
|
);
|
|
998
962
|
expect(resultVoice.success).toBe(true);
|
|
999
963
|
|
|
1000
|
-
const bindingTelegram =
|
|
1001
|
-
const bindingVoice =
|
|
964
|
+
const bindingTelegram = getGuardianBinding("self", "telegram");
|
|
965
|
+
const bindingVoice = getGuardianBinding("self", "phone");
|
|
1002
966
|
expect(bindingTelegram).toBeNull();
|
|
1003
967
|
expect(bindingVoice).toBeNull();
|
|
1004
968
|
});
|
|
@@ -1313,7 +1277,7 @@ describe("voice guardian challenge validation", () => {
|
|
|
1313
1277
|
}
|
|
1314
1278
|
});
|
|
1315
1279
|
|
|
1316
|
-
test("validateAndConsumeVerification does not create a guardian binding for voice (caller responsibility)",
|
|
1280
|
+
test("validateAndConsumeVerification does not create a guardian binding for voice (caller responsibility)", () => {
|
|
1317
1281
|
const { secret } = createInboundVerificationSession("phone");
|
|
1318
1282
|
|
|
1319
1283
|
validateAndConsumeVerification(
|
|
@@ -1323,7 +1287,7 @@ describe("voice guardian challenge validation", () => {
|
|
|
1323
1287
|
"voice-chat-1",
|
|
1324
1288
|
);
|
|
1325
1289
|
|
|
1326
|
-
const binding =
|
|
1290
|
+
const binding = getGuardianBinding("asst-1", "phone");
|
|
1327
1291
|
expect(binding).toBeNull();
|
|
1328
1292
|
});
|
|
1329
1293
|
|
|
@@ -1397,7 +1361,7 @@ describe("voice guardian challenge validation", () => {
|
|
|
1397
1361
|
expect(result2.success).toBe(false);
|
|
1398
1362
|
});
|
|
1399
1363
|
|
|
1400
|
-
test("validateAndConsumeVerification succeeds even with existing voice binding (conflict check is caller responsibility)",
|
|
1364
|
+
test("validateAndConsumeVerification succeeds even with existing voice binding (conflict check is caller responsibility)", () => {
|
|
1401
1365
|
createGuardianBinding({
|
|
1402
1366
|
channel: "phone",
|
|
1403
1367
|
guardianExternalUserId: "old-voice-user",
|
|
@@ -1405,7 +1369,7 @@ describe("voice guardian challenge validation", () => {
|
|
|
1405
1369
|
guardianDeliveryChatId: "old-voice-chat",
|
|
1406
1370
|
});
|
|
1407
1371
|
|
|
1408
|
-
const oldBinding =
|
|
1372
|
+
const oldBinding = getGuardianBinding("asst-1", "phone");
|
|
1409
1373
|
expect(oldBinding).not.toBeNull();
|
|
1410
1374
|
expect(oldBinding!.guardianExternalUserId).toBe("old-voice-user");
|
|
1411
1375
|
|
|
@@ -1421,7 +1385,7 @@ describe("voice guardian challenge validation", () => {
|
|
|
1421
1385
|
expect(result.success).toBe(true);
|
|
1422
1386
|
|
|
1423
1387
|
// The original binding is untouched (no side effects)
|
|
1424
|
-
const binding =
|
|
1388
|
+
const binding = getGuardianBinding("asst-1", "phone");
|
|
1425
1389
|
expect(binding).not.toBeNull();
|
|
1426
1390
|
expect(binding!.guardianExternalUserId).toBe("old-voice-user");
|
|
1427
1391
|
});
|
|
@@ -1436,7 +1400,7 @@ describe("voice guardian identity and revocation", () => {
|
|
|
1436
1400
|
resetTables();
|
|
1437
1401
|
});
|
|
1438
1402
|
|
|
1439
|
-
test("isGuardian works for voice channel",
|
|
1403
|
+
test("isGuardian works for voice channel", () => {
|
|
1440
1404
|
createGuardianBinding({
|
|
1441
1405
|
channel: "phone",
|
|
1442
1406
|
guardianExternalUserId: "voice-user-1",
|
|
@@ -1444,13 +1408,13 @@ describe("voice guardian identity and revocation", () => {
|
|
|
1444
1408
|
guardianDeliveryChatId: "voice-chat-1",
|
|
1445
1409
|
});
|
|
1446
1410
|
|
|
1447
|
-
expect(
|
|
1448
|
-
expect(
|
|
1411
|
+
expect(isGuardian("asst-1", "phone", "voice-user-1")).toBe(true);
|
|
1412
|
+
expect(isGuardian("asst-1", "phone", "voice-user-2")).toBe(false);
|
|
1449
1413
|
// Voice guardian should not match telegram channel
|
|
1450
|
-
expect(
|
|
1414
|
+
expect(isGuardian("asst-1", "telegram", "voice-user-1")).toBe(false);
|
|
1451
1415
|
});
|
|
1452
1416
|
|
|
1453
|
-
test("getGuardianBinding returns voice binding",
|
|
1417
|
+
test("getGuardianBinding returns voice binding", () => {
|
|
1454
1418
|
createGuardianBinding({
|
|
1455
1419
|
channel: "phone",
|
|
1456
1420
|
guardianExternalUserId: "voice-user-1",
|
|
@@ -1458,13 +1422,13 @@ describe("voice guardian identity and revocation", () => {
|
|
|
1458
1422
|
guardianDeliveryChatId: "voice-chat-1",
|
|
1459
1423
|
});
|
|
1460
1424
|
|
|
1461
|
-
const binding =
|
|
1425
|
+
const binding = getGuardianBinding("asst-1", "phone");
|
|
1462
1426
|
expect(binding).not.toBeNull();
|
|
1463
1427
|
expect(binding!.channel).toBe("phone");
|
|
1464
1428
|
expect(binding!.guardianExternalUserId).toBe("voice-user-1");
|
|
1465
1429
|
});
|
|
1466
1430
|
|
|
1467
|
-
test("revokeBinding clears active voice guardian binding",
|
|
1431
|
+
test("revokeBinding clears active voice guardian binding", () => {
|
|
1468
1432
|
createGuardianBinding({
|
|
1469
1433
|
channel: "phone",
|
|
1470
1434
|
guardianExternalUserId: "voice-user-1",
|
|
@@ -1474,10 +1438,10 @@ describe("voice guardian identity and revocation", () => {
|
|
|
1474
1438
|
|
|
1475
1439
|
const result = serviceRevokeBinding("asst-1", "phone");
|
|
1476
1440
|
expect(result).toBe(true);
|
|
1477
|
-
expect(
|
|
1441
|
+
expect(getGuardianBinding("asst-1", "phone")).toBeNull();
|
|
1478
1442
|
});
|
|
1479
1443
|
|
|
1480
|
-
test("revokeBinding for voice does not affect telegram binding",
|
|
1444
|
+
test("revokeBinding for voice does not affect telegram binding", () => {
|
|
1481
1445
|
createGuardianBinding({
|
|
1482
1446
|
channel: "phone",
|
|
1483
1447
|
guardianExternalUserId: "voice-user-1",
|
|
@@ -1493,8 +1457,8 @@ describe("voice guardian identity and revocation", () => {
|
|
|
1493
1457
|
|
|
1494
1458
|
serviceRevokeBinding("asst-1", "phone");
|
|
1495
1459
|
|
|
1496
|
-
expect(
|
|
1497
|
-
expect(
|
|
1460
|
+
expect(getGuardianBinding("asst-1", "phone")).toBeNull();
|
|
1461
|
+
expect(getGuardianBinding("asst-1", "telegram")).not.toBeNull();
|
|
1498
1462
|
});
|
|
1499
1463
|
});
|
|
1500
1464
|
|
|
@@ -1752,7 +1716,7 @@ describe("HTTP handler voice guardian verification", () => {
|
|
|
1752
1716
|
expect(resp!.bound).toBe(false);
|
|
1753
1717
|
|
|
1754
1718
|
// Verify binding is actually revoked
|
|
1755
|
-
expect(
|
|
1719
|
+
expect(getGuardianBinding("self", "phone")).toBeNull();
|
|
1756
1720
|
});
|
|
1757
1721
|
|
|
1758
1722
|
test("revoke for voice does not affect telegram binding", async () => {
|
|
@@ -1778,8 +1742,8 @@ describe("HTTP handler voice guardian verification", () => {
|
|
|
1778
1742
|
|
|
1779
1743
|
await handleChannelVerificationSession(msg);
|
|
1780
1744
|
|
|
1781
|
-
expect(
|
|
1782
|
-
expect(
|
|
1745
|
+
expect(getGuardianBinding("self", "phone")).toBeNull();
|
|
1746
|
+
expect(getGuardianBinding("self", "telegram")).not.toBeNull();
|
|
1783
1747
|
});
|
|
1784
1748
|
});
|
|
1785
1749
|
|
|
@@ -81,8 +81,6 @@ mock.module("../runtime/gateway-client.js", () => ({
|
|
|
81
81
|
}));
|
|
82
82
|
|
|
83
83
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
84
|
-
setConversationProcessingStartedAt: () => {},
|
|
85
|
-
isConversationProcessing: () => false,
|
|
86
84
|
setConversationOriginChannelIfUnset: () => {},
|
|
87
85
|
updateConversationContextWindow: () => {},
|
|
88
86
|
deleteMessageById: () => {},
|
|
@@ -125,8 +125,6 @@ mock.module("../security/secret-allowlist.js", () => ({
|
|
|
125
125
|
}));
|
|
126
126
|
|
|
127
127
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
128
|
-
setConversationProcessingStartedAt: () => {},
|
|
129
|
-
isConversationProcessing: () => false,
|
|
130
128
|
setConversationOriginChannelIfUnset: () => {},
|
|
131
129
|
updateConversationContextWindow: () => {},
|
|
132
130
|
setConversationHistoryStrippedAt: () => {},
|
|
@@ -17,8 +17,6 @@ mock.module("../util/logger.js", () => ({
|
|
|
17
17
|
// The compactor reads the conversation's image attachments from the DB to
|
|
18
18
|
// build its manifest; with no images these return empty.
|
|
19
19
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
20
|
-
setConversationProcessingStartedAt: () => {},
|
|
21
|
-
isConversationProcessing: () => false,
|
|
22
20
|
getMessages: () => [],
|
|
23
21
|
}));
|
|
24
22
|
mock.module("../memory/attachments-store.js", () => ({
|
|
@@ -30,8 +30,6 @@ mock.module("../util/logger.js", () => ({
|
|
|
30
30
|
}));
|
|
31
31
|
|
|
32
32
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
33
|
-
setConversationProcessingStartedAt: () => {},
|
|
34
|
-
isConversationProcessing: () => false,
|
|
35
33
|
getMessages: () => [],
|
|
36
34
|
reserveMessage: mock(async () => ({ id: "msg-reserve" })),
|
|
37
35
|
}));
|
|
@@ -22,8 +22,6 @@ mock.module("../util/logger.js", () => ({
|
|
|
22
22
|
}));
|
|
23
23
|
|
|
24
24
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
25
|
-
setConversationProcessingStartedAt: () => {},
|
|
26
|
-
isConversationProcessing: () => false,
|
|
27
25
|
getMessages: () => [],
|
|
28
26
|
reserveMessage: mock(async () => ({ id: "msg-reserve" })),
|
|
29
27
|
}));
|
|
@@ -22,8 +22,6 @@ mock.module("../util/logger.js", () => ({
|
|
|
22
22
|
}));
|
|
23
23
|
|
|
24
24
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
25
|
-
setConversationProcessingStartedAt: () => {},
|
|
26
|
-
isConversationProcessing: () => false,
|
|
27
25
|
getMessages: () => [],
|
|
28
26
|
reserveMessage: mock(async () => ({ id: "msg-reserve" })),
|
|
29
27
|
}));
|
|
@@ -98,64 +98,6 @@ function writeConfig(obj: unknown): void {
|
|
|
98
98
|
writeFileSync(CONFIG_PATH, JSON.stringify(obj, null, 2) + "\n");
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
function latencySeed(): Record<string, unknown> {
|
|
102
|
-
return {
|
|
103
|
-
model: "claude-haiku-4-5-20251001",
|
|
104
|
-
effort: "low",
|
|
105
|
-
thinking: { enabled: false },
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function fullSeededCallSites(): Record<string, Record<string, unknown>> {
|
|
110
|
-
return {
|
|
111
|
-
guardianQuestionCopy: latencySeed(),
|
|
112
|
-
interactionClassifier: latencySeed(),
|
|
113
|
-
skillCategoryInference: latencySeed(),
|
|
114
|
-
inviteInstructionGenerator: latencySeed(),
|
|
115
|
-
notificationDecision: latencySeed(),
|
|
116
|
-
preferenceExtraction: latencySeed(),
|
|
117
|
-
commitMessage: {
|
|
118
|
-
model: "claude-haiku-4-5-20251001",
|
|
119
|
-
maxTokens: 120,
|
|
120
|
-
temperature: 0.2,
|
|
121
|
-
effort: "low",
|
|
122
|
-
thinking: { enabled: false },
|
|
123
|
-
},
|
|
124
|
-
conversationStarters: latencySeed(),
|
|
125
|
-
conversationSummarization: {
|
|
126
|
-
model: "claude-opus-4-7",
|
|
127
|
-
effort: "low",
|
|
128
|
-
thinking: { enabled: false },
|
|
129
|
-
},
|
|
130
|
-
recall: {
|
|
131
|
-
profile: "cost-optimized",
|
|
132
|
-
maxTokens: 4096,
|
|
133
|
-
effort: "low",
|
|
134
|
-
thinking: { enabled: false, streamThinking: false },
|
|
135
|
-
temperature: 0,
|
|
136
|
-
disableCache: true,
|
|
137
|
-
},
|
|
138
|
-
heartbeatAgent: {
|
|
139
|
-
profile: "cost-optimized",
|
|
140
|
-
maxTokens: 2048,
|
|
141
|
-
effort: "low",
|
|
142
|
-
temperature: 0,
|
|
143
|
-
thinking: { enabled: false, streamThinking: false },
|
|
144
|
-
contextWindow: { maxInputTokens: 16000 },
|
|
145
|
-
},
|
|
146
|
-
replySuggestion: {
|
|
147
|
-
model: "claude-haiku-4-5-20251001",
|
|
148
|
-
effort: "low",
|
|
149
|
-
thinking: { enabled: false },
|
|
150
|
-
disableCache: true,
|
|
151
|
-
},
|
|
152
|
-
memoryRouter: {
|
|
153
|
-
profile: "cost-optimized",
|
|
154
|
-
contextWindow: { maxInputTokens: 1_000_000 },
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
|
|
159
101
|
function mergeDefaultConfigAndSeedInferenceProfiles(db?: DrizzleDb): void {
|
|
160
102
|
const defaultConfigMerge = mergeDefaultWorkspaceConfig();
|
|
161
103
|
seedInferenceProfiles({
|
|
@@ -430,56 +372,6 @@ describe("loadConfig startup behavior", () => {
|
|
|
430
372
|
expect(config.memory.v2.bm25_b).toBe(0.4);
|
|
431
373
|
});
|
|
432
374
|
|
|
433
|
-
test("default workspace config merge prunes exact seeded call-site defaults", () => {
|
|
434
|
-
const seededCallSites = fullSeededCallSites();
|
|
435
|
-
const overlayPath = join(WORKSPACE_DIR, "hatch-overlay.json");
|
|
436
|
-
writeFileSync(
|
|
437
|
-
overlayPath,
|
|
438
|
-
JSON.stringify(
|
|
439
|
-
{
|
|
440
|
-
gateway: {
|
|
441
|
-
unmappedPolicy: "default",
|
|
442
|
-
defaultAssistantId: "self",
|
|
443
|
-
},
|
|
444
|
-
llm: {
|
|
445
|
-
activeProfile: "balanced",
|
|
446
|
-
advisorProfile: "frontier",
|
|
447
|
-
callSites: {
|
|
448
|
-
...seededCallSites,
|
|
449
|
-
recall: {
|
|
450
|
-
...seededCallSites.recall,
|
|
451
|
-
disableCache: false,
|
|
452
|
-
},
|
|
453
|
-
customSite: { profile: "frontier" },
|
|
454
|
-
},
|
|
455
|
-
},
|
|
456
|
-
},
|
|
457
|
-
null,
|
|
458
|
-
2,
|
|
459
|
-
) + "\n",
|
|
460
|
-
);
|
|
461
|
-
process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH = overlayPath;
|
|
462
|
-
|
|
463
|
-
const result = mergeDefaultWorkspaceConfig();
|
|
464
|
-
const raw = JSON.parse(readFileSync(CONFIG_PATH, "utf-8")) as Record<
|
|
465
|
-
string,
|
|
466
|
-
Record<string, unknown>
|
|
467
|
-
>;
|
|
468
|
-
const llm = raw.llm as Record<string, unknown>;
|
|
469
|
-
const callSites = llm.callSites as Record<string, Record<string, unknown>>;
|
|
470
|
-
|
|
471
|
-
expect(result.hadOverlay).toBe(true);
|
|
472
|
-
expect(raw.gateway).toEqual({
|
|
473
|
-
unmappedPolicy: "default",
|
|
474
|
-
defaultAssistantId: "self",
|
|
475
|
-
});
|
|
476
|
-
expect(llm.activeProfile).toBe("balanced");
|
|
477
|
-
expect(llm.advisorProfile).toBe("frontier");
|
|
478
|
-
expect(Object.keys(callSites).sort()).toEqual(["customSite", "recall"]);
|
|
479
|
-
expect(callSites.recall?.disableCache).toBe(false);
|
|
480
|
-
expect(callSites.customSite).toEqual({ profile: "frontier" });
|
|
481
|
-
});
|
|
482
|
-
|
|
483
375
|
test("reloads cached config when config.json is updated externally", () => {
|
|
484
376
|
// Models a CLI subprocess writing twilio.accountSid while the assistant
|
|
485
377
|
// process already has an effective config cached in memory.
|
|
@@ -853,11 +745,7 @@ describe("loadConfig startup behavior", () => {
|
|
|
853
745
|
);
|
|
854
746
|
expect(raw.llm.profiles.frontier.provider).toBe("anthropic");
|
|
855
747
|
expect(raw.llm.profiles.frontier.model).toBe("claude-opus-4-8");
|
|
856
|
-
|
|
857
|
-
expect(raw.llm.profiles["cost-optimized"].provider).toBe("fireworks");
|
|
858
|
-
expect(raw.llm.profiles["cost-optimized"].model).toBe(
|
|
859
|
-
"accounts/fireworks/models/deepseek-v4-flash",
|
|
860
|
-
);
|
|
748
|
+
expect(raw.llm.profiles["cost-optimized"].provider).toBe("anthropic");
|
|
861
749
|
});
|
|
862
750
|
|
|
863
751
|
test("off-platform managed profiles are overwritten on every boot", () => {
|
|
@@ -1703,8 +1591,8 @@ describe("seedInferenceProfiles BYOK-mode managed profile labels", () => {
|
|
|
1703
1591
|
// ---------------------------------------------------------------------------
|
|
1704
1592
|
// Tests: OS Beta flag-gated managed profile. The template is defined but
|
|
1705
1593
|
// intentionally NOT part of MANAGED_PROFILE_TEMPLATES, so seedInferenceProfiles
|
|
1706
|
-
// must never create it.
|
|
1707
|
-
//
|
|
1594
|
+
// must never create it. A later PR reconciles it in/out based on the `os-beta`
|
|
1595
|
+
// feature flag.
|
|
1708
1596
|
// ---------------------------------------------------------------------------
|
|
1709
1597
|
|
|
1710
1598
|
describe("OS Beta managed profile template", () => {
|
|
@@ -1751,21 +1639,20 @@ describe("OS Beta managed profile template", () => {
|
|
|
1751
1639
|
expect(MANAGED_PROFILE_NAMES.has("os-beta")).toBe(true);
|
|
1752
1640
|
});
|
|
1753
1641
|
|
|
1754
|
-
test("materializeProfile
|
|
1642
|
+
test("materializeProfile honors the explicit OS Beta model", () => {
|
|
1755
1643
|
const entry = materializeProfile(
|
|
1756
1644
|
OS_BETA_PROFILE_TEMPLATE,
|
|
1757
|
-
"
|
|
1758
|
-
"
|
|
1645
|
+
"fireworks",
|
|
1646
|
+
"fireworks-managed",
|
|
1759
1647
|
);
|
|
1760
1648
|
|
|
1761
|
-
expect(entry.model).toBe("
|
|
1762
|
-
expect(entry.provider_connection).toBe("
|
|
1763
|
-
expect(entry.provider).toBe("
|
|
1649
|
+
expect(entry.model).toBe("accounts/fireworks/models/glm-5p2");
|
|
1650
|
+
expect(entry.provider_connection).toBe("fireworks-managed");
|
|
1651
|
+
expect(entry.provider).toBe("fireworks");
|
|
1764
1652
|
expect(entry.label).toBe("OS Beta");
|
|
1765
1653
|
expect(entry.source).toBe("managed");
|
|
1766
1654
|
expect(entry.maxTokens).toBe(32000);
|
|
1767
|
-
expect(entry.effort).toBe("
|
|
1655
|
+
expect(entry.effort).toBe("high");
|
|
1768
1656
|
expect(entry.thinking?.enabled).toBe(true);
|
|
1769
|
-
expect(entry.topP).toBe(0.95);
|
|
1770
1657
|
});
|
|
1771
1658
|
});
|
|
@@ -120,7 +120,6 @@ describe("AssistantConfigSchema", () => {
|
|
|
120
120
|
shellDefaultTimeoutSec: 120,
|
|
121
121
|
shellMaxTimeoutSec: 600,
|
|
122
122
|
permissionTimeoutSec: 300,
|
|
123
|
-
questionResponseTimeoutSec: 1800,
|
|
124
123
|
toolExecutionTimeoutSec: 120,
|
|
125
124
|
providerStreamTimeoutSec: 1800,
|
|
126
125
|
backgroundTurnTimeoutSec: 1800,
|