@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
|
@@ -135,11 +135,11 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
135
135
|
mockOnConversationCreatedCallbacks.length = 0;
|
|
136
136
|
});
|
|
137
137
|
|
|
138
|
-
test("emits guardian.question for trusted-contact sessions",
|
|
138
|
+
test("emits guardian.question for trusted-contact sessions", () => {
|
|
139
139
|
const canonicalRequest = makeCanonicalRequest();
|
|
140
140
|
const trustContext = makeTrustedContactContext();
|
|
141
141
|
|
|
142
|
-
const result =
|
|
142
|
+
const result = bridgeConfirmationRequestToGuardian({
|
|
143
143
|
canonicalRequest,
|
|
144
144
|
trustContext,
|
|
145
145
|
conversationId: "conv-1",
|
|
@@ -160,7 +160,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
160
160
|
expect(payload.requesterIdentifier).toBe("@requester");
|
|
161
161
|
});
|
|
162
162
|
|
|
163
|
-
test("skips guardian actor sessions (self-approve)",
|
|
163
|
+
test("skips guardian actor sessions (self-approve)", () => {
|
|
164
164
|
const canonicalRequest = makeCanonicalRequest();
|
|
165
165
|
const trustContext: TrustContext = {
|
|
166
166
|
sourceChannel: "telegram",
|
|
@@ -168,7 +168,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
168
168
|
guardianExternalUserId: "guardian-1",
|
|
169
169
|
};
|
|
170
170
|
|
|
171
|
-
const result =
|
|
171
|
+
const result = bridgeConfirmationRequestToGuardian({
|
|
172
172
|
canonicalRequest,
|
|
173
173
|
trustContext,
|
|
174
174
|
conversationId: "conv-1",
|
|
@@ -182,14 +182,14 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
182
182
|
expect(emittedSignals).toHaveLength(0);
|
|
183
183
|
});
|
|
184
184
|
|
|
185
|
-
test("skips unknown actor sessions",
|
|
185
|
+
test("skips unknown actor sessions", () => {
|
|
186
186
|
const canonicalRequest = makeCanonicalRequest();
|
|
187
187
|
const trustContext: TrustContext = {
|
|
188
188
|
sourceChannel: "telegram",
|
|
189
189
|
trustClass: "unknown",
|
|
190
190
|
};
|
|
191
191
|
|
|
192
|
-
const result =
|
|
192
|
+
const result = bridgeConfirmationRequestToGuardian({
|
|
193
193
|
canonicalRequest,
|
|
194
194
|
trustContext,
|
|
195
195
|
conversationId: "conv-1",
|
|
@@ -203,13 +203,13 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
203
203
|
expect(emittedSignals).toHaveLength(0);
|
|
204
204
|
});
|
|
205
205
|
|
|
206
|
-
test("skips when guardian identity is missing",
|
|
206
|
+
test("skips when guardian identity is missing", () => {
|
|
207
207
|
const canonicalRequest = makeCanonicalRequest();
|
|
208
208
|
const trustContext = makeTrustedContactContext({
|
|
209
209
|
guardianExternalUserId: undefined,
|
|
210
210
|
});
|
|
211
211
|
|
|
212
|
-
const result =
|
|
212
|
+
const result = bridgeConfirmationRequestToGuardian({
|
|
213
213
|
canonicalRequest,
|
|
214
214
|
trustContext,
|
|
215
215
|
conversationId: "conv-1",
|
|
@@ -223,13 +223,13 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
223
223
|
expect(emittedSignals).toHaveLength(0);
|
|
224
224
|
});
|
|
225
225
|
|
|
226
|
-
test("skips when no guardian binding exists for channel",
|
|
226
|
+
test("skips when no guardian binding exists for channel", () => {
|
|
227
227
|
const canonicalRequest = makeCanonicalRequest({ sourceChannel: "phone" });
|
|
228
228
|
const trustContext = makeTrustedContactContext({
|
|
229
229
|
sourceChannel: "phone",
|
|
230
230
|
});
|
|
231
231
|
|
|
232
|
-
const result =
|
|
232
|
+
const result = bridgeConfirmationRequestToGuardian({
|
|
233
233
|
canonicalRequest,
|
|
234
234
|
trustContext,
|
|
235
235
|
conversationId: "conv-1",
|
|
@@ -243,11 +243,11 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
243
243
|
expect(emittedSignals).toHaveLength(0);
|
|
244
244
|
});
|
|
245
245
|
|
|
246
|
-
test("sets correct attention hints for urgency",
|
|
246
|
+
test("sets correct attention hints for urgency", () => {
|
|
247
247
|
const canonicalRequest = makeCanonicalRequest();
|
|
248
248
|
const trustContext = makeTrustedContactContext();
|
|
249
249
|
|
|
250
|
-
|
|
250
|
+
bridgeConfirmationRequestToGuardian({
|
|
251
251
|
canonicalRequest,
|
|
252
252
|
trustContext,
|
|
253
253
|
conversationId: "conv-1",
|
|
@@ -261,11 +261,11 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
261
261
|
expect(hints.visibleInSourceNow).toBe(false);
|
|
262
262
|
});
|
|
263
263
|
|
|
264
|
-
test("uses dedupe key scoped to canonical request ID",
|
|
264
|
+
test("uses dedupe key scoped to canonical request ID", () => {
|
|
265
265
|
const canonicalRequest = makeCanonicalRequest();
|
|
266
266
|
const trustContext = makeTrustedContactContext();
|
|
267
267
|
|
|
268
|
-
|
|
268
|
+
bridgeConfirmationRequestToGuardian({
|
|
269
269
|
canonicalRequest,
|
|
270
270
|
trustContext,
|
|
271
271
|
conversationId: "conv-1",
|
|
@@ -277,11 +277,11 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
277
277
|
);
|
|
278
278
|
});
|
|
279
279
|
|
|
280
|
-
test("creates vellum delivery row via onConversationCreated callback",
|
|
280
|
+
test("creates vellum delivery row via onConversationCreated callback", () => {
|
|
281
281
|
const canonicalRequest = makeCanonicalRequest();
|
|
282
282
|
const trustContext = makeTrustedContactContext();
|
|
283
283
|
|
|
284
|
-
|
|
284
|
+
bridgeConfirmationRequestToGuardian({
|
|
285
285
|
canonicalRequest,
|
|
286
286
|
trustContext,
|
|
287
287
|
conversationId: "conv-1",
|
|
@@ -298,20 +298,18 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
298
298
|
});
|
|
299
299
|
|
|
300
300
|
const deliveries = listCanonicalGuardianDeliveries(canonicalRequest.id);
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
)
|
|
304
|
-
expect(vellumDelivery).toBeDefined();
|
|
305
|
-
expect(vellumDelivery?.destinationConversationId).toBe(
|
|
301
|
+
expect(deliveries).toHaveLength(1);
|
|
302
|
+
expect(deliveries[0].destinationChannel).toBe("vellum");
|
|
303
|
+
expect(deliveries[0].destinationConversationId).toBe(
|
|
306
304
|
"guardian-conversation-1",
|
|
307
305
|
);
|
|
308
306
|
});
|
|
309
307
|
|
|
310
|
-
test("uses custom assistantId when provided",
|
|
308
|
+
test("uses custom assistantId when provided", () => {
|
|
311
309
|
const canonicalRequest = makeCanonicalRequest();
|
|
312
310
|
const trustContext = makeTrustedContactContext();
|
|
313
311
|
|
|
314
|
-
|
|
312
|
+
bridgeConfirmationRequestToGuardian({
|
|
315
313
|
canonicalRequest,
|
|
316
314
|
trustContext,
|
|
317
315
|
conversationId: "conv-1",
|
|
@@ -326,13 +324,13 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
326
324
|
expect(emittedSignals).toHaveLength(0);
|
|
327
325
|
});
|
|
328
326
|
|
|
329
|
-
test("does not pass assistantId to notification signal",
|
|
327
|
+
test("does not pass assistantId to notification signal", () => {
|
|
330
328
|
const canonicalRequest = makeCanonicalRequest();
|
|
331
329
|
const trustContext = makeTrustedContactContext();
|
|
332
330
|
|
|
333
331
|
// assistantId is used internally for guardian binding lookup but is no
|
|
334
332
|
// longer forwarded to the notification signal after the assistantId removal refactor.
|
|
335
|
-
|
|
333
|
+
bridgeConfirmationRequestToGuardian({
|
|
336
334
|
canonicalRequest,
|
|
337
335
|
trustContext,
|
|
338
336
|
conversationId: "conv-1",
|
|
@@ -342,13 +340,13 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
342
340
|
expect(emittedSignals[0].assistantId).toBeUndefined();
|
|
343
341
|
});
|
|
344
342
|
|
|
345
|
-
test("includes requesterChatId as null when not provided",
|
|
343
|
+
test("includes requesterChatId as null when not provided", () => {
|
|
346
344
|
const canonicalRequest = makeCanonicalRequest();
|
|
347
345
|
const trustContext = makeTrustedContactContext({
|
|
348
346
|
requesterChatId: undefined,
|
|
349
347
|
});
|
|
350
348
|
|
|
351
|
-
|
|
349
|
+
bridgeConfirmationRequestToGuardian({
|
|
352
350
|
canonicalRequest,
|
|
353
351
|
trustContext,
|
|
354
352
|
conversationId: "conv-1",
|
|
@@ -359,7 +357,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
359
357
|
expect(payload.requesterChatId).toBeNull();
|
|
360
358
|
});
|
|
361
359
|
|
|
362
|
-
test("skips when binding guardian identity does not match canonical request guardian",
|
|
360
|
+
test("skips when binding guardian identity does not match canonical request guardian", () => {
|
|
363
361
|
// Create a canonical request where guardianExternalUserId differs from the
|
|
364
362
|
// binding's guardianExternalUserId ('guardian-1' in the mock).
|
|
365
363
|
const canonicalRequest = makeCanonicalRequest({
|
|
@@ -367,7 +365,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
367
365
|
});
|
|
368
366
|
const trustContext = makeTrustedContactContext();
|
|
369
367
|
|
|
370
|
-
const result =
|
|
368
|
+
const result = bridgeConfirmationRequestToGuardian({
|
|
371
369
|
canonicalRequest,
|
|
372
370
|
trustContext,
|
|
373
371
|
conversationId: "conv-1",
|
|
@@ -381,7 +379,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
381
379
|
expect(emittedSignals).toHaveLength(0);
|
|
382
380
|
});
|
|
383
381
|
|
|
384
|
-
test("does not skip when canonical request guardian identity is null",
|
|
382
|
+
test("does not skip when canonical request guardian identity is null", () => {
|
|
385
383
|
// When guardianExternalUserId is null on the canonical request (e.g. desktop
|
|
386
384
|
// flow), the identity check should be skipped and the bridge should proceed.
|
|
387
385
|
const canonicalRequest = makeCanonicalRequest({
|
|
@@ -389,7 +387,7 @@ describe("bridgeConfirmationRequestToGuardian", () => {
|
|
|
389
387
|
});
|
|
390
388
|
const trustContext = makeTrustedContactContext();
|
|
391
389
|
|
|
392
|
-
const result =
|
|
390
|
+
const result = bridgeConfirmationRequestToGuardian({
|
|
393
391
|
canonicalRequest,
|
|
394
392
|
trustContext,
|
|
395
393
|
conversationId: "conv-1",
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* handleListContacts (non-search) and handleGetContact relay to the gateway
|
|
5
5
|
* via `ipcCallPersistent`. On the happy path they serve gateway-sourced data
|
|
6
|
-
* and do NOT read the assistant DB. On IPC failure they
|
|
7
|
-
*
|
|
8
|
-
* surfaces a clean gateway not-found as a 404.
|
|
6
|
+
* and do NOT read the assistant DB. On IPC failure they fall back to the
|
|
7
|
+
* assistant-DB read and log a warning. getContact still 404s for unknown ids.
|
|
9
8
|
*/
|
|
10
9
|
|
|
11
10
|
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
@@ -214,15 +213,16 @@ describe("handleListContacts relay", () => {
|
|
|
214
213
|
expect(result.contacts[0].displayName).toBe("Your Guardian");
|
|
215
214
|
});
|
|
216
215
|
|
|
217
|
-
test("
|
|
216
|
+
test("falls back to the assistant DB on IPC failure", async () => {
|
|
218
217
|
ipcStub = () => {
|
|
219
218
|
throw new Error("gateway down");
|
|
220
219
|
};
|
|
221
220
|
|
|
222
|
-
await
|
|
221
|
+
const result = await handleListContacts({});
|
|
223
222
|
|
|
224
223
|
expect(ipcCalls.map((c) => c.method)).toEqual(["contacts_list_rich"]);
|
|
225
|
-
expect(localCalls).
|
|
224
|
+
expect(localCalls).toContain("listContacts");
|
|
225
|
+
expect(result.contacts[0].id).toBe("local-1");
|
|
226
226
|
});
|
|
227
227
|
|
|
228
228
|
test("search params stay daemon-native and log the boundary note", async () => {
|
|
@@ -384,24 +384,26 @@ describe("handleGetContact relay", () => {
|
|
|
384
384
|
expect(localCalls).toEqual([]);
|
|
385
385
|
});
|
|
386
386
|
|
|
387
|
-
test("
|
|
387
|
+
test("falls back to the assistant DB on IPC transport failure", async () => {
|
|
388
388
|
ipcStub = () => {
|
|
389
389
|
throw new Error("gateway down");
|
|
390
390
|
};
|
|
391
391
|
|
|
392
|
-
await
|
|
392
|
+
const result = await handleGetContact("gw-1");
|
|
393
393
|
|
|
394
394
|
expect(ipcCalls.map((c) => c.method)).toEqual(["contacts_get_rich"]);
|
|
395
|
-
expect(localCalls).
|
|
395
|
+
expect(localCalls).toContain("getContact");
|
|
396
|
+
expect(result.contact.id).toBe("gw-1");
|
|
396
397
|
});
|
|
397
398
|
|
|
398
|
-
test("
|
|
399
|
-
ipcStub = () =>
|
|
399
|
+
test("fallback path still 404s for unknown ids", async () => {
|
|
400
|
+
ipcStub = () => {
|
|
401
|
+
throw new Error("gateway down");
|
|
402
|
+
};
|
|
400
403
|
|
|
401
404
|
await expect(handleGetContact("missing")).rejects.toThrow(
|
|
402
405
|
'Contact "missing" not found',
|
|
403
406
|
);
|
|
404
|
-
expect(
|
|
405
|
-
expect(localCalls).toEqual([]);
|
|
407
|
+
expect(localCalls).toContain("getContact");
|
|
406
408
|
});
|
|
407
409
|
});
|
|
@@ -112,8 +112,6 @@ let reservedRowContent: Map<string, string> = new Map();
|
|
|
112
112
|
let reserveCounter = 0;
|
|
113
113
|
|
|
114
114
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
115
|
-
setConversationProcessingStartedAt: () => {},
|
|
116
|
-
isConversationProcessing: () => false,
|
|
117
115
|
setConversationOriginChannelIfUnset: () => {},
|
|
118
116
|
updateConversationContextWindow: () => {},
|
|
119
117
|
deleteMessageById: () => {},
|
|
@@ -87,8 +87,6 @@ mock.module("../daemon/disk-pressure-guard.js", () => ({
|
|
|
87
87
|
}));
|
|
88
88
|
|
|
89
89
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
90
|
-
setConversationProcessingStartedAt: () => {},
|
|
91
|
-
isConversationProcessing: () => false,
|
|
92
90
|
getConversation: () => ({
|
|
93
91
|
id: "conv-123",
|
|
94
92
|
conversationType: "background",
|
|
@@ -147,8 +147,6 @@ let mockConversationRow: {
|
|
|
147
147
|
};
|
|
148
148
|
|
|
149
149
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
150
|
-
setConversationProcessingStartedAt: () => {},
|
|
151
|
-
isConversationProcessing: () => false,
|
|
152
150
|
setConversationOriginChannelIfUnset: () => {},
|
|
153
151
|
setConversationHistoryStrippedAt: () => {},
|
|
154
152
|
updateConversationUsage: () => {},
|
|
@@ -257,8 +257,6 @@ mock.module("../plugins/defaults/compaction/overflow-policy.js", () => ({
|
|
|
257
257
|
}));
|
|
258
258
|
|
|
259
259
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
260
|
-
setConversationProcessingStartedAt: () => {},
|
|
261
|
-
isConversationProcessing: () => false,
|
|
262
260
|
setConversationOriginChannelIfUnset: () => {},
|
|
263
261
|
setConversationHistoryStrippedAt: () => {},
|
|
264
262
|
updateConversationUsage: () => {},
|
|
@@ -10,14 +10,8 @@ import {
|
|
|
10
10
|
} from "bun:test";
|
|
11
11
|
|
|
12
12
|
import type { LoopToolExecutor } from "../agent/loop.js";
|
|
13
|
-
import {
|
|
14
|
-
queueConversationNotice,
|
|
15
|
-
resetConversationNoticesForTests,
|
|
16
|
-
} from "../daemon/conversation-notices.js";
|
|
17
13
|
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
18
|
-
import type { UserPromptSubmitContext } from "../plugin-api/types.js";
|
|
19
14
|
import { resetPluginRegistryAndRegisterDefaults } from "../plugins/defaults/index.js";
|
|
20
|
-
import { registerPlugin } from "../plugins/registry.js";
|
|
21
15
|
import type { Message, Provider, ToolDefinition } from "../providers/types.js";
|
|
22
16
|
import { ContextOverflowError } from "../providers/types.js";
|
|
23
17
|
|
|
@@ -279,8 +273,6 @@ const deleteMessageByIdMock = mock(() => ({
|
|
|
279
273
|
const reserveMessageMock = mock(async () => ({ id: "msg-reserve" }));
|
|
280
274
|
const updateMessageContentMock = mock(() => {});
|
|
281
275
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
282
|
-
setConversationProcessingStartedAt: () => {},
|
|
283
|
-
isConversationProcessing: () => false,
|
|
284
276
|
setConversationOriginChannelIfUnset: () => {},
|
|
285
277
|
updateConversationUsage: () => {},
|
|
286
278
|
updateMessageMetadata: updateMessageMetadataMock,
|
|
@@ -708,7 +700,6 @@ function makeCtx(
|
|
|
708
700
|
mockConversationRow?.slackContextCompactionWatermarkTs ?? null,
|
|
709
701
|
lastNotifiedInferenceProfile:
|
|
710
702
|
mockConversationRow?.lastNotifiedInferenceProfile ?? null,
|
|
711
|
-
processingStartedAt: mockConversationRow?.processingStartedAt ?? null,
|
|
712
703
|
|
|
713
704
|
memoryPolicy: { scopeId: "default", includeDefaultFallback: true },
|
|
714
705
|
|
|
@@ -873,14 +864,7 @@ beforeEach(() => {
|
|
|
873
864
|
indexMessageNowMock.mockClear();
|
|
874
865
|
projectAssistantMessageMock.mockClear();
|
|
875
866
|
publishSyncInvalidationMock.mockClear();
|
|
876
|
-
resolveAssistantAttachmentsMock.mockClear();
|
|
877
|
-
resolveAssistantAttachmentsMock.mockImplementation(async () => ({
|
|
878
|
-
assistantAttachments: [],
|
|
879
|
-
emittedAttachments: [],
|
|
880
|
-
directiveWarnings: [],
|
|
881
|
-
}));
|
|
882
867
|
mockMessageById = null;
|
|
883
|
-
resetConversationNoticesForTests();
|
|
884
868
|
// The compaction pipeline runs through the plugin registry; reset and
|
|
885
869
|
// re-register every default so it dispatches to middleware backed by the
|
|
886
870
|
// mocked collaborators these tests install (`syncMessageToDisk`, etc.)
|
|
@@ -889,120 +873,6 @@ beforeEach(() => {
|
|
|
889
873
|
});
|
|
890
874
|
|
|
891
875
|
describe("session-agent-loop", () => {
|
|
892
|
-
describe("user-prompt-submit hook failures", () => {
|
|
893
|
-
test("logs and continues with prior hook mutations", async () => {
|
|
894
|
-
registerPlugin({
|
|
895
|
-
manifest: {
|
|
896
|
-
name: "test-user-prompt-rewrite",
|
|
897
|
-
version: "1.0.0",
|
|
898
|
-
},
|
|
899
|
-
hooks: {
|
|
900
|
-
"user-prompt-submit": async (_ctx: UserPromptSubmitContext) => ({
|
|
901
|
-
latestMessages: [
|
|
902
|
-
{
|
|
903
|
-
role: "user" as const,
|
|
904
|
-
content: [{ type: "text" as const, text: "rewritten prompt" }],
|
|
905
|
-
},
|
|
906
|
-
],
|
|
907
|
-
}),
|
|
908
|
-
},
|
|
909
|
-
});
|
|
910
|
-
registerPlugin({
|
|
911
|
-
manifest: {
|
|
912
|
-
name: "test-user-prompt-throw",
|
|
913
|
-
version: "1.0.0",
|
|
914
|
-
},
|
|
915
|
-
hooks: {
|
|
916
|
-
"user-prompt-submit": async () => {
|
|
917
|
-
throw new Error("simulated hook failure");
|
|
918
|
-
},
|
|
919
|
-
},
|
|
920
|
-
});
|
|
921
|
-
|
|
922
|
-
const events: ServerMessage[] = [];
|
|
923
|
-
const ctx = makeCtx({ providerResponses: [textResponse("ok")] });
|
|
924
|
-
const runSpy = spyOn(ctx.agentLoop, "run");
|
|
925
|
-
|
|
926
|
-
await runAgentLoopImpl(ctx, "hello", "msg-1", (msg) => events.push(msg));
|
|
927
|
-
|
|
928
|
-
expect(runSpy).toHaveBeenCalledTimes(1);
|
|
929
|
-
const call = runSpy.mock.calls[0]?.[0] as
|
|
930
|
-
| { messages: Message[] }
|
|
931
|
-
| undefined;
|
|
932
|
-
expect(call?.messages[0]?.content).toEqual([
|
|
933
|
-
{ type: "text", text: "rewritten prompt" },
|
|
934
|
-
]);
|
|
935
|
-
expect(
|
|
936
|
-
events.find((event) => event.type === "conversation_error"),
|
|
937
|
-
).toBeUndefined();
|
|
938
|
-
expect(
|
|
939
|
-
events.find((event) => event.type === "message_complete"),
|
|
940
|
-
).toBeDefined();
|
|
941
|
-
});
|
|
942
|
-
});
|
|
943
|
-
|
|
944
|
-
describe("conversation notices", () => {
|
|
945
|
-
test("emits queued billing notices after a successful turn", async () => {
|
|
946
|
-
const events: ServerMessage[] = [];
|
|
947
|
-
const ctx = makeCtx({ providerResponses: [textResponse("ok")] });
|
|
948
|
-
queueConversationNotice(ctx.conversationId, "memory-v3-test", {
|
|
949
|
-
source: "memory_v3",
|
|
950
|
-
code: "PROVIDER_BILLING",
|
|
951
|
-
userMessage: "You've run out of credits.",
|
|
952
|
-
errorCategory: "credits_exhausted",
|
|
953
|
-
});
|
|
954
|
-
|
|
955
|
-
await runAgentLoopImpl(ctx, "hello", "msg-1", (msg) => events.push(msg));
|
|
956
|
-
|
|
957
|
-
expect(
|
|
958
|
-
events.find((event) => event.type === "conversation_error"),
|
|
959
|
-
).toBeUndefined();
|
|
960
|
-
const messageCompleteIndex = events.findIndex(
|
|
961
|
-
(event) => event.type === "message_complete",
|
|
962
|
-
);
|
|
963
|
-
const conversationNoticeIndex = events.findIndex(
|
|
964
|
-
(event) => event.type === "conversation_notice",
|
|
965
|
-
);
|
|
966
|
-
|
|
967
|
-
expect(messageCompleteIndex).toBeGreaterThanOrEqual(0);
|
|
968
|
-
expect(conversationNoticeIndex).toBeGreaterThan(messageCompleteIndex);
|
|
969
|
-
expect(events[conversationNoticeIndex]).toEqual({
|
|
970
|
-
type: "conversation_notice",
|
|
971
|
-
conversationId: "test-conv",
|
|
972
|
-
source: "memory_v3",
|
|
973
|
-
code: "PROVIDER_BILLING",
|
|
974
|
-
userMessage: "You've run out of credits.",
|
|
975
|
-
errorCategory: "credits_exhausted",
|
|
976
|
-
});
|
|
977
|
-
});
|
|
978
|
-
|
|
979
|
-
test("clears queued notices when post-loop success work fails", async () => {
|
|
980
|
-
resolveAssistantAttachmentsMock.mockImplementation(async () => {
|
|
981
|
-
throw new Error("attachment resolution failed");
|
|
982
|
-
});
|
|
983
|
-
const events: ServerMessage[] = [];
|
|
984
|
-
const ctx = makeCtx({ providerResponses: [textResponse("ok")] });
|
|
985
|
-
queueConversationNotice(ctx.conversationId, "memory-v3-test", {
|
|
986
|
-
source: "memory_v3",
|
|
987
|
-
code: "PROVIDER_BILLING",
|
|
988
|
-
userMessage: "You've run out of credits.",
|
|
989
|
-
errorCategory: "credits_exhausted",
|
|
990
|
-
});
|
|
991
|
-
|
|
992
|
-
await runAgentLoopImpl(ctx, "hello", "msg-1", (msg) => events.push(msg));
|
|
993
|
-
|
|
994
|
-
expect(
|
|
995
|
-
events.find((event) => event.type === "conversation_notice"),
|
|
996
|
-
).toBeUndefined();
|
|
997
|
-
expect(
|
|
998
|
-
events.find((event) => event.type === "message_complete"),
|
|
999
|
-
).toBeUndefined();
|
|
1000
|
-
expect(
|
|
1001
|
-
events.find((event) => event.type === "conversation_error"),
|
|
1002
|
-
).toBeDefined();
|
|
1003
|
-
});
|
|
1004
|
-
});
|
|
1005
|
-
|
|
1006
876
|
describe("timezone turn context", () => {
|
|
1007
877
|
test("passes ctx.clientTimezone and ui.detectedTimezone into timezone resolution", async () => {
|
|
1008
878
|
mockUiConfig = {
|
|
@@ -1835,10 +1705,6 @@ describe("session-agent-loop", () => {
|
|
|
1835
1705
|
expect(ctx.abortController).toBeNull();
|
|
1836
1706
|
expect(ctx.currentRequestId).toBeUndefined();
|
|
1837
1707
|
expect(ctx.commandIntent).toBeUndefined();
|
|
1838
|
-
// Turn-scoped interactivity is stamped during the run and must be cleared
|
|
1839
|
-
// so paths that bypass this loop (e.g. opportunity wakes) don't inherit a
|
|
1840
|
-
// stale value instead of falling back to live client state.
|
|
1841
|
-
expect(ctx.currentTurnIsNonInteractive).toBeUndefined();
|
|
1842
1708
|
});
|
|
1843
1709
|
|
|
1844
1710
|
test("clears state and surfaces a processing error when the provider call fails", async () => {
|
|
@@ -22,8 +22,6 @@ mock.module("../memory/conversation-key-store.js", () => ({
|
|
|
22
22
|
}));
|
|
23
23
|
|
|
24
24
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
25
|
-
setConversationProcessingStartedAt: () => {},
|
|
26
|
-
isConversationProcessing: () => false,
|
|
27
25
|
getConversation: mockGetConversation,
|
|
28
26
|
getMessages: mockGetMessages,
|
|
29
27
|
createConversation: mockCreateConversation,
|
|
@@ -76,8 +76,6 @@ mock.module("../security/secret-allowlist.js", () => ({
|
|
|
76
76
|
}));
|
|
77
77
|
|
|
78
78
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
79
|
-
setConversationProcessingStartedAt: () => {},
|
|
80
|
-
isConversationProcessing: () => false,
|
|
81
79
|
updateConversationContextWindow: () => {},
|
|
82
80
|
deleteMessageById: () => {},
|
|
83
81
|
updateConversationTitle: () => {},
|
|
@@ -112,8 +112,6 @@ mock.module("../security/secret-allowlist.js", () => ({
|
|
|
112
112
|
}));
|
|
113
113
|
|
|
114
114
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
115
|
-
setConversationProcessingStartedAt: () => {},
|
|
116
|
-
isConversationProcessing: () => false,
|
|
117
115
|
setConversationOriginChannelIfUnset: () => {},
|
|
118
116
|
updateConversationContextWindow: () => {},
|
|
119
117
|
deleteMessageById: () => {},
|
|
@@ -36,8 +36,6 @@ let deletedMessageIds: string[] = [];
|
|
|
36
36
|
let updatedMessages: Array<{ id: string; content: string }> = [];
|
|
37
37
|
|
|
38
38
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
39
|
-
setConversationProcessingStartedAt: () => {},
|
|
40
|
-
isConversationProcessing: () => false,
|
|
41
39
|
getMessages: (conversationId: string) =>
|
|
42
40
|
dbMessages.filter((m) => m.conversationId === conversationId),
|
|
43
41
|
deleteMessageById: (messageId: string) => {
|
|
@@ -74,8 +74,6 @@ let mockConversation: Record<string, unknown> | null = null;
|
|
|
74
74
|
let nextMockMessageId = 1;
|
|
75
75
|
|
|
76
76
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
77
|
-
setConversationProcessingStartedAt: () => {},
|
|
78
|
-
isConversationProcessing: () => false,
|
|
79
77
|
updateConversationContextWindow: () => {},
|
|
80
78
|
deleteMessageById: () => {},
|
|
81
79
|
updateConversationTitle: () => {},
|
|
@@ -70,8 +70,6 @@ let mockDbMessages: Array<{
|
|
|
70
70
|
let mockConversation: Record<string, unknown> | null = null;
|
|
71
71
|
|
|
72
72
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
73
|
-
setConversationProcessingStartedAt: () => {},
|
|
74
|
-
isConversationProcessing: () => false,
|
|
75
73
|
updateConversationContextWindow: () => {},
|
|
76
74
|
deleteMessageById: () => {},
|
|
77
75
|
updateConversationTitle: () => {},
|
|
@@ -51,8 +51,6 @@ const getConversationMock = mock((id: string) => {
|
|
|
51
51
|
});
|
|
52
52
|
|
|
53
53
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
54
|
-
setConversationProcessingStartedAt: () => {},
|
|
55
|
-
isConversationProcessing: () => false,
|
|
56
54
|
setConversationOriginChannelIfUnset: () => {},
|
|
57
55
|
updateConversationContextWindow: () => {},
|
|
58
56
|
deleteMessageById: () => {},
|
|
@@ -46,8 +46,6 @@ mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
|
46
46
|
}));
|
|
47
47
|
|
|
48
48
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
49
|
-
setConversationProcessingStartedAt: () => {},
|
|
50
|
-
isConversationProcessing: () => false,
|
|
51
49
|
setConversationOriginChannelIfUnset: () => {},
|
|
52
50
|
setConversationOriginInterfaceIfUnset: () => {},
|
|
53
51
|
provenanceFromTrustContext: () => ({
|
|
@@ -157,8 +157,6 @@ let mockDbMessages: Array<{ id: string; role: string; content: string }> = [];
|
|
|
157
157
|
let mockConversation: Record<string, unknown> | null = null;
|
|
158
158
|
|
|
159
159
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
160
|
-
setConversationProcessingStartedAt: () => {},
|
|
161
|
-
isConversationProcessing: () => false,
|
|
162
160
|
setConversationOriginChannelIfUnset: () => {},
|
|
163
161
|
setConversationOriginInterfaceIfUnset: () => {},
|
|
164
162
|
updateConversationContextWindow: () => {},
|
|
@@ -98,8 +98,6 @@ mock.module("../security/secret-allowlist.js", () => ({
|
|
|
98
98
|
}));
|
|
99
99
|
|
|
100
100
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
101
|
-
setConversationProcessingStartedAt: () => {},
|
|
102
|
-
isConversationProcessing: () => false,
|
|
103
101
|
setConversationOriginChannelIfUnset: () => {},
|
|
104
102
|
deleteMessageById: () => {},
|
|
105
103
|
getMessages: () => [],
|