@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
|
@@ -155,7 +155,7 @@ describe("pendingInteractions.resolve emits interaction_resolved", () => {
|
|
|
155
155
|
});
|
|
156
156
|
|
|
157
157
|
describe("removeByConversation emits interaction_resolved per entry", () => {
|
|
158
|
-
test("emits superseded for every
|
|
158
|
+
test("emits superseded for every non-host interaction in the conversation", () => {
|
|
159
159
|
pendingInteractions.register("conf-1", {
|
|
160
160
|
conversationId: "conv-x",
|
|
161
161
|
kind: "confirmation",
|
|
@@ -182,16 +182,13 @@ describe("removeByConversation emits interaction_resolved per entry", () => {
|
|
|
182
182
|
const events = publishedMessages.filter(
|
|
183
183
|
(m) => m.type === "interaction_resolved",
|
|
184
184
|
) as Extract<ServerMessage, { type: "interaction_resolved" }>[];
|
|
185
|
-
expect(events).toHaveLength(
|
|
185
|
+
expect(events).toHaveLength(3);
|
|
186
186
|
expect(events.every((e) => e.state === "superseded")).toBe(true);
|
|
187
187
|
const requestIds = new Set(events.map((e) => e.requestId));
|
|
188
|
-
expect(requestIds).toEqual(new Set(["conf-1", "secret-1"]));
|
|
188
|
+
expect(requestIds).toEqual(new Set(["conf-1", "secret-1", "question-1"]));
|
|
189
189
|
|
|
190
|
-
// host_bash
|
|
191
|
-
// either. host proxies are settled by their result POST; questions by the
|
|
192
|
-
// enqueue steer's turn abort (see removeByConversation's skip list).
|
|
190
|
+
// host_bash entries survive auto-deny — no event for them.
|
|
193
191
|
expect(pendingInteractions.get("host-bash-1")).toBeDefined();
|
|
194
|
-
expect(pendingInteractions.get("question-1")).toBeDefined();
|
|
195
192
|
// Unrelated conversation is untouched.
|
|
196
193
|
expect(pendingInteractions.get("conf-other")).toBeDefined();
|
|
197
194
|
});
|
|
@@ -48,8 +48,6 @@ interface AddMessageCall {
|
|
|
48
48
|
}
|
|
49
49
|
const addMessageCalls: AddMessageCall[] = [];
|
|
50
50
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
51
|
-
setConversationProcessingStartedAt: () => {},
|
|
52
|
-
isConversationProcessing: () => false,
|
|
53
51
|
addMessage: (
|
|
54
52
|
conversationId: string,
|
|
55
53
|
role: string,
|
|
@@ -4,19 +4,32 @@
|
|
|
4
4
|
* Covers:
|
|
5
5
|
* - A noop `init()` fires with a valid `PluginInitContext` that exposes every
|
|
6
6
|
* documented field.
|
|
7
|
+
* - `requiresCredential` entries are resolved through the credential store
|
|
8
|
+
* helper and arrive in `ctx.credentials`.
|
|
7
9
|
* - Version-mismatch registration fails with an error that names the plugin
|
|
8
10
|
* (the registry enforces this at `registerPlugin` time, so bootstrap never
|
|
9
11
|
* sees the malformed plugin).
|
|
10
12
|
* - Shutdown hook walks plugins in reverse registration order.
|
|
11
13
|
*
|
|
12
|
-
* `
|
|
14
|
+
* Uses `mock.module` to stub `security/secure-keys.js` so credential
|
|
15
|
+
* resolution doesn't hit the real backend. `resetPluginRegistryForTests()`
|
|
16
|
+
* isolates registry state between cases.
|
|
13
17
|
*/
|
|
14
18
|
|
|
15
19
|
import { existsSync } from "node:fs";
|
|
16
20
|
import { rm } from "node:fs/promises";
|
|
17
21
|
import { tmpdir } from "node:os";
|
|
18
22
|
import { join } from "node:path";
|
|
19
|
-
import { beforeEach, describe, expect, test } from "bun:test";
|
|
23
|
+
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
24
|
+
|
|
25
|
+
// Mock credential store before importing the bootstrap module so the
|
|
26
|
+
// module-under-test captures the stubbed binding.
|
|
27
|
+
const getSecureKeyAsyncMock = mock(
|
|
28
|
+
async (_account: string): Promise<string | undefined> => undefined,
|
|
29
|
+
);
|
|
30
|
+
mock.module("../security/secure-keys.js", () => ({
|
|
31
|
+
getSecureKeyAsync: getSecureKeyAsyncMock,
|
|
32
|
+
}));
|
|
20
33
|
|
|
21
34
|
import { clearFeatureFlagOverridesCache } from "../config/assistant-feature-flags.js";
|
|
22
35
|
import { bootstrapPlugins } from "../daemon/external-plugins-bootstrap.js";
|
|
@@ -55,6 +68,7 @@ function buildPlugin(
|
|
|
55
68
|
onShutdown?: () => Promise<void>;
|
|
56
69
|
} = {},
|
|
57
70
|
options: {
|
|
71
|
+
requiresCredential?: string[];
|
|
58
72
|
requiresFlag?: string[];
|
|
59
73
|
} = {},
|
|
60
74
|
): Plugin {
|
|
@@ -80,6 +94,9 @@ function buildPlugin(
|
|
|
80
94
|
manifest: {
|
|
81
95
|
name,
|
|
82
96
|
version: "0.0.1",
|
|
97
|
+
...(options.requiresCredential
|
|
98
|
+
? { requiresCredential: options.requiresCredential }
|
|
99
|
+
: {}),
|
|
83
100
|
...(options.requiresFlag ? { requiresFlag: options.requiresFlag } : {}),
|
|
84
101
|
},
|
|
85
102
|
...rest,
|
|
@@ -90,6 +107,8 @@ function buildPlugin(
|
|
|
90
107
|
describe("plugin bootstrap", () => {
|
|
91
108
|
beforeEach(async () => {
|
|
92
109
|
resetPluginRegistryForTests();
|
|
110
|
+
getSecureKeyAsyncMock.mockReset();
|
|
111
|
+
getSecureKeyAsyncMock.mockImplementation(async () => undefined);
|
|
93
112
|
// Reset feature-flag cache so tests start from a known state. Individual
|
|
94
113
|
// tests that exercise `requiresFlag` use `setOverridesForTesting(...)`
|
|
95
114
|
// to install their own overrides.
|
|
@@ -114,6 +133,7 @@ describe("plugin bootstrap", () => {
|
|
|
114
133
|
|
|
115
134
|
// Every documented field must be present on the context passed to init.
|
|
116
135
|
expect(ctx.config).toBeUndefined(); // no `plugins.alpha` block in fake config
|
|
136
|
+
expect(ctx.credentials).toEqual({});
|
|
117
137
|
expect(ctx.logger).toBeDefined();
|
|
118
138
|
expect(typeof (ctx.logger as { info: unknown }).info).toBe("function");
|
|
119
139
|
// Storage dir lives under getWorkspaceDir()/plugins-data/<name> and must have
|
|
@@ -125,6 +145,52 @@ describe("plugin bootstrap", () => {
|
|
|
125
145
|
expect(ctx.assistantVersion).toBe(APP_VERSION);
|
|
126
146
|
});
|
|
127
147
|
|
|
148
|
+
test("credential resolution: init receives the resolved value under credentials[key]", async () => {
|
|
149
|
+
getSecureKeyAsyncMock.mockImplementation(async (account: string) => {
|
|
150
|
+
if (account === "some-key") return "super-secret-value";
|
|
151
|
+
return undefined;
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
let received: PluginInitContext | undefined;
|
|
155
|
+
const plugin = buildPlugin(
|
|
156
|
+
"credentialed",
|
|
157
|
+
{
|
|
158
|
+
async init(ctx) {
|
|
159
|
+
received = ctx;
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
{ requiresCredential: ["some-key"] },
|
|
163
|
+
);
|
|
164
|
+
registerPlugin(plugin);
|
|
165
|
+
|
|
166
|
+
await bootstrapPlugins();
|
|
167
|
+
|
|
168
|
+
expect(getSecureKeyAsyncMock).toHaveBeenCalledTimes(1);
|
|
169
|
+
expect(getSecureKeyAsyncMock).toHaveBeenCalledWith("some-key");
|
|
170
|
+
expect(received?.credentials).toEqual({ "some-key": "super-secret-value" });
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test("credential resolution: a plugin whose required credential is missing is skipped, not fatal", async () => {
|
|
174
|
+
// GIVEN a plugin that requires a credential the store cannot resolve
|
|
175
|
+
getSecureKeyAsyncMock.mockImplementation(async () => undefined);
|
|
176
|
+
registerPlugin(
|
|
177
|
+
buildPlugin(
|
|
178
|
+
"missing-cred",
|
|
179
|
+
{ async init() {} },
|
|
180
|
+
{ requiresCredential: ["absent-key"] },
|
|
181
|
+
),
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
// WHEN bootstrap runs
|
|
185
|
+
// THEN it completes without throwing — the unresolvable credential is
|
|
186
|
+
// contained to that plugin (same per-plugin isolation as an init throw)
|
|
187
|
+
await bootstrapPlugins();
|
|
188
|
+
|
|
189
|
+
// AND the plugin is dropped from the registry
|
|
190
|
+
const names = getRegisteredPlugins().map((p) => p.manifest.name);
|
|
191
|
+
expect(names).not.toContain("missing-cred");
|
|
192
|
+
});
|
|
193
|
+
|
|
128
194
|
test("version mismatch: external plugin loader rejects when peerDependency unsatisfied", async () => {
|
|
129
195
|
// Host-compat negotiation lives in the external-plugin loader against
|
|
130
196
|
// `peerDependencies["@vellumai/plugin-api"]`. The registry no longer
|
|
@@ -489,7 +555,11 @@ describe("plugin bootstrap", () => {
|
|
|
489
555
|
registerPlugin(plugin);
|
|
490
556
|
|
|
491
557
|
// Create the .disabled sentinel in the workspace plugins dir.
|
|
492
|
-
const sentinelDir = join(
|
|
558
|
+
const sentinelDir = join(
|
|
559
|
+
TEST_WORKSPACE_DIR,
|
|
560
|
+
"plugins",
|
|
561
|
+
"sentinel-off",
|
|
562
|
+
);
|
|
493
563
|
const { mkdir, writeFile } = await import("node:fs/promises");
|
|
494
564
|
await mkdir(sentinelDir, { recursive: true });
|
|
495
565
|
await writeFile(join(sentinelDir, ".disabled"), "");
|
|
@@ -22,15 +22,26 @@
|
|
|
22
22
|
* each plugin's shutdown only removes its own route — the other plugin's
|
|
23
23
|
* route stays live until its own teardown runs.
|
|
24
24
|
*
|
|
25
|
-
* `
|
|
26
|
-
*
|
|
27
|
-
*
|
|
25
|
+
* Uses `mock.module` to stub credential resolution — bootstrap otherwise
|
|
26
|
+
* tries to hit the real secure-key backend. `resetPluginRegistryForTests()`
|
|
27
|
+
* isolates plugin-registry state and `resetSkillRoutesForTests()` isolates
|
|
28
|
+
* skill-route-registry state between cases.
|
|
28
29
|
*/
|
|
29
30
|
|
|
30
31
|
import { rm } from "node:fs/promises";
|
|
31
32
|
import { tmpdir } from "node:os";
|
|
32
33
|
import { join } from "node:path";
|
|
33
|
-
import { beforeEach, describe, expect, test } from "bun:test";
|
|
34
|
+
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
35
|
+
|
|
36
|
+
// Stub the credential store before importing bootstrap so the module binds to
|
|
37
|
+
// the mock. Plugins in these tests don't declare `requiresCredential`, but
|
|
38
|
+
// the mock keeps the test hermetic regardless of what the backend would do.
|
|
39
|
+
const getSecureKeyAsyncMock = mock(
|
|
40
|
+
async (_account: string): Promise<string | undefined> => undefined,
|
|
41
|
+
);
|
|
42
|
+
mock.module("../security/secure-keys.js", () => ({
|
|
43
|
+
getSecureKeyAsync: getSecureKeyAsyncMock,
|
|
44
|
+
}));
|
|
34
45
|
|
|
35
46
|
import { bootstrapPlugins } from "../daemon/external-plugins-bootstrap.js";
|
|
36
47
|
import { runShutdownHooks } from "../daemon/shutdown-registry.js";
|
|
@@ -102,6 +113,8 @@ describe("plugin route contributions", () => {
|
|
|
102
113
|
beforeEach(async () => {
|
|
103
114
|
resetPluginRegistryForTests();
|
|
104
115
|
resetSkillRoutesForTests();
|
|
116
|
+
getSecureKeyAsyncMock.mockReset();
|
|
117
|
+
getSecureKeyAsyncMock.mockImplementation(async () => undefined);
|
|
105
118
|
await rm(TEST_WORKSPACE_DIR, { recursive: true, force: true });
|
|
106
119
|
});
|
|
107
120
|
|
|
@@ -16,9 +16,11 @@
|
|
|
16
16
|
* - Direct `registerPluginTools` / `unregisterPluginTools` semantics,
|
|
17
17
|
* including the plugin-scoped ref count.
|
|
18
18
|
*
|
|
19
|
-
* `
|
|
20
|
-
*
|
|
21
|
-
*
|
|
19
|
+
* Uses `mock.module` to stub the credential store so bootstrap doesn't hit
|
|
20
|
+
* the real backend. `resetPluginRegistryForTests()` and
|
|
21
|
+
* `__clearRegistryForTesting()` isolate registry state between cases so
|
|
22
|
+
* this file can run alongside other plugin/tool-registry tests without
|
|
23
|
+
* cross-contamination.
|
|
22
24
|
*/
|
|
23
25
|
|
|
24
26
|
import { rm } from "node:fs/promises";
|
|
@@ -26,6 +28,17 @@ import { tmpdir } from "node:os";
|
|
|
26
28
|
import { join } from "node:path";
|
|
27
29
|
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
28
30
|
|
|
31
|
+
// Mock the credential store before importing the bootstrap so the module
|
|
32
|
+
// under test captures the stubbed binding. Bootstrap only calls this for
|
|
33
|
+
// plugins that declare `requiresCredential`; the tests in this file don't,
|
|
34
|
+
// so the stub simply returns undefined.
|
|
35
|
+
const getSecureKeyAsyncMock = mock(
|
|
36
|
+
async (_account: string): Promise<string | undefined> => undefined,
|
|
37
|
+
);
|
|
38
|
+
mock.module("../security/secure-keys.js", () => ({
|
|
39
|
+
getSecureKeyAsync: getSecureKeyAsyncMock,
|
|
40
|
+
}));
|
|
41
|
+
|
|
29
42
|
import { bootstrapPlugins } from "../daemon/external-plugins-bootstrap.js";
|
|
30
43
|
import { runShutdownHooks } from "../daemon/shutdown-registry.js";
|
|
31
44
|
import { RiskLevel } from "../permissions/types.js";
|
|
@@ -121,6 +134,8 @@ describe("plugin tool contributions", () => {
|
|
|
121
134
|
// assertions about which tools are present. We don't need any of the
|
|
122
135
|
// eager/host tools for these tests.
|
|
123
136
|
__clearRegistryForTesting();
|
|
137
|
+
getSecureKeyAsyncMock.mockReset();
|
|
138
|
+
getSecureKeyAsyncMock.mockImplementation(async () => undefined);
|
|
124
139
|
await rm(TEST_WORKSPACE_DIR, { recursive: true, force: true });
|
|
125
140
|
});
|
|
126
141
|
|
|
@@ -38,6 +38,7 @@ describe("plugin core types", () => {
|
|
|
38
38
|
const manifest: PluginManifest = {
|
|
39
39
|
name: "sample-plugin",
|
|
40
40
|
version: "0.1.0",
|
|
41
|
+
requiresCredential: ["SAMPLE_API_KEY"],
|
|
41
42
|
requiresFlag: ["sample-feature"],
|
|
42
43
|
config: { parse: (input: unknown) => input },
|
|
43
44
|
};
|
|
@@ -60,6 +61,7 @@ describe("plugin core types", () => {
|
|
|
60
61
|
async init(ctx: PluginInitContext) {
|
|
61
62
|
// Touch every field so refactors that rename any of them break here.
|
|
62
63
|
void ctx.config;
|
|
64
|
+
void ctx.credentials;
|
|
63
65
|
void ctx.logger;
|
|
64
66
|
void ctx.pluginStorageDir;
|
|
65
67
|
void ctx.assistantVersion;
|
|
@@ -19,8 +19,6 @@ mock.module("../memory/canonical-guardian-store.js", () => ({
|
|
|
19
19
|
}));
|
|
20
20
|
|
|
21
21
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
22
|
-
setConversationProcessingStartedAt: () => {},
|
|
23
|
-
isConversationProcessing: () => false,
|
|
24
22
|
addMessage: async () => ({ id: "message-id" }),
|
|
25
23
|
getConversation: () => null,
|
|
26
24
|
provenanceFromTrustContext: () => ({}),
|
|
@@ -37,8 +37,6 @@ mock.module("../memory/attachments-store.js", () => ({
|
|
|
37
37
|
}));
|
|
38
38
|
|
|
39
39
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
40
|
-
setConversationProcessingStartedAt: () => {},
|
|
41
|
-
isConversationProcessing: () => false,
|
|
42
40
|
addMessage: async (
|
|
43
41
|
conversationId: string,
|
|
44
42
|
role: string,
|
|
@@ -837,10 +837,9 @@ describe("RetryProvider — streaming response handling", () => {
|
|
|
837
837
|
|
|
838
838
|
test("does NOT retry OpenAI/Gemini-shaped 'Request was aborted' (no inner-timeout rewrite at those catch-sites)", async () => {
|
|
839
839
|
// The OpenAI chat-completions, OpenAI responses, and Gemini catch-sites
|
|
840
|
-
// format their errors as `"<Provider> API error (
|
|
841
|
-
// was aborted."` (the
|
|
842
|
-
//
|
|
843
|
-
// parenthetical) and — unlike the Anthropic
|
|
840
|
+
// format their errors as `"<Provider> API error (undefined): Request
|
|
841
|
+
// was aborted."` (note the `(undefined)` parenthetical that the
|
|
842
|
+
// Anthropic catch-site intentionally omits) and — unlike the Anthropic
|
|
844
843
|
// catch-site — they do NOT rewrite their inner-streamTimeoutMs
|
|
845
844
|
// deadline failures. A provider-agnostic transport-abort predicate
|
|
846
845
|
// would burn three retries on what is by construction a deterministic
|
|
@@ -849,7 +848,7 @@ describe("RetryProvider — streaming response handling", () => {
|
|
|
849
848
|
// wasted retry budget for non-Anthropic providers until their
|
|
850
849
|
// catch-sites grow the same `innerTimeoutFired` distinction.
|
|
851
850
|
const openaiAbortError = new ProviderError(
|
|
852
|
-
"OpenAI API error (
|
|
851
|
+
"OpenAI API error (undefined): Request was aborted.",
|
|
853
852
|
"openai",
|
|
854
853
|
undefined,
|
|
855
854
|
);
|
|
@@ -200,42 +200,3 @@ describe("UsageTrackingProvider", () => {
|
|
|
200
200
|
});
|
|
201
201
|
});
|
|
202
202
|
});
|
|
203
|
-
|
|
204
|
-
describe("native web-search capability survives the wrapper chain", () => {
|
|
205
|
-
function leaf(supports: boolean | undefined): Provider {
|
|
206
|
-
return {
|
|
207
|
-
name: "anthropic",
|
|
208
|
-
...(supports === undefined ? {} : { supportsNativeWebSearch: supports }),
|
|
209
|
-
async sendMessage(): Promise<ProviderResponse> {
|
|
210
|
-
return {
|
|
211
|
-
content: [{ type: "text", text: "" }],
|
|
212
|
-
model: "m",
|
|
213
|
-
usage: { inputTokens: 0, outputTokens: 0 },
|
|
214
|
-
stopReason: "end_turn",
|
|
215
|
-
};
|
|
216
|
-
},
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
test("UsageTrackingProvider forwards supportsNativeWebSearch", () => {
|
|
221
|
-
expect(new UsageTrackingProvider(leaf(true)).supportsNativeWebSearch).toBe(
|
|
222
|
-
true,
|
|
223
|
-
);
|
|
224
|
-
expect(new UsageTrackingProvider(leaf(false)).supportsNativeWebSearch).toBe(
|
|
225
|
-
false,
|
|
226
|
-
);
|
|
227
|
-
expect(
|
|
228
|
-
new UsageTrackingProvider(leaf(undefined)).supportsNativeWebSearch,
|
|
229
|
-
).toBeUndefined();
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
test("CallSiteConfiguredProvider forwards it through a nested wrapper", () => {
|
|
233
|
-
// The exact chain getConfiguredProvider returns: CallSiteConfigured →
|
|
234
|
-
// UsageTracking → leaf. The advisor consult reads the flag off the top.
|
|
235
|
-
const wrapped = new CallSiteConfiguredProvider(
|
|
236
|
-
new UsageTrackingProvider(leaf(true)),
|
|
237
|
-
"advisor",
|
|
238
|
-
);
|
|
239
|
-
expect(wrapped.supportsNativeWebSearch).toBe(true);
|
|
240
|
-
});
|
|
241
|
-
});
|
|
@@ -23,8 +23,6 @@ let dbMessages: Array<{
|
|
|
23
23
|
}> = [];
|
|
24
24
|
|
|
25
25
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
26
|
-
setConversationProcessingStartedAt: () => {},
|
|
27
|
-
isConversationProcessing: () => false,
|
|
28
26
|
getMessages: (conversationId: string) =>
|
|
29
27
|
dbMessages.filter((m) => m.conversationId === conversationId),
|
|
30
28
|
deleteMessageById: (messageId: string) => {
|
|
@@ -36,9 +36,6 @@ function makeFakeTool(name: string): Tool {
|
|
|
36
36
|
category: "test",
|
|
37
37
|
defaultRiskLevel: RiskLevel.Low,
|
|
38
38
|
executionTarget: "sandbox",
|
|
39
|
-
// Match the finalized shape the registry stores, so identity comparisons
|
|
40
|
-
// (`getTool(name)` toEqual coreTool) hold after registration fills defaults.
|
|
41
|
-
exclusive: false,
|
|
42
39
|
input_schema: { type: "object", properties: {}, required: [] },
|
|
43
40
|
async execute(
|
|
44
41
|
_input: Record<string, unknown>,
|
|
@@ -111,7 +108,7 @@ describe("tool registry dynamic-tools tools", () => {
|
|
|
111
108
|
|
|
112
109
|
describe("tool manifest", () => {
|
|
113
110
|
test("eager module tool names list contains expected count", () => {
|
|
114
|
-
expect(eagerModuleToolNames.length).toBe(
|
|
111
|
+
expect(eagerModuleToolNames.length).toBe(11);
|
|
115
112
|
});
|
|
116
113
|
|
|
117
114
|
test("explicit tools list includes memory tools", () => {
|