@vellumai/assistant 0.8.4 → 0.8.5
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/ARCHITECTURE.md +2 -2
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/knip.json +2 -1
- package/openapi.yaml +809 -11
- package/package.json +1 -1
- package/src/__tests__/anthropic-provider.test.ts +34 -37
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
- package/src/__tests__/audit-log-rotation.test.ts +70 -16
- package/src/__tests__/background-workers-disk-pressure.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +2 -3
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-guardian.test.ts +3 -3
- package/src/__tests__/checker.test.ts +6 -15
- package/src/__tests__/compaction-events.test.ts +1 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
- package/src/__tests__/computer-use-tools.test.ts +2 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +197 -2
- package/src/__tests__/conversation-agent-loop.test.ts +163 -122
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +31 -0
- package/src/__tests__/conversation-fork-crud.test.ts +178 -15
- package/src/__tests__/conversation-lifecycle.test.ts +52 -11
- package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +13 -13
- package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
- package/src/__tests__/conversation-skill-tools.test.ts +2 -5
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-sync-tags.test.ts +99 -32
- package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/credential-vault-unit.test.ts +2 -2
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/gateway-flag-listener.test.ts +237 -0
- package/src/__tests__/gemini-provider.test.ts +78 -0
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +7 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +4 -0
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +77 -9
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/mcp-abort-signal.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/model-intents.test.ts +2 -4
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +46 -0
- package/src/__tests__/openai-responses-provider.test.ts +114 -12
- package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -2
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +2 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/registry.test.ts +2 -8
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags.test.ts +2 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
- package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/subagent-notify-parent.test.ts +1 -1
- package/src/__tests__/suggestion-routes.test.ts +1 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +145 -131
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
- package/src/__tests__/tool-executor.test.ts +9 -62
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/workspace-git-service.test.ts +6 -5
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +1 -1
- package/src/agent/loop.ts +8 -0
- package/src/api/README.md +5 -0
- package/src/api/index.ts +4 -0
- package/src/api/package.json +10 -0
- package/src/background-wake/background-wake-routes.test.ts +233 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +176 -1
- package/src/cli/commands/memory-v3-render.ts +344 -0
- package/src/cli/commands/memory-v3.ts +316 -0
- package/src/cli/program.ts +2 -0
- package/src/config/assistant-feature-flags.ts +21 -9
- package/src/config/bundled-skills/document-editor/SKILL.md +11 -2
- package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +7 -6
- package/src/config/feature-flag-registry.json +16 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +213 -1
- package/src/config/schemas/call-site-catalog.ts +21 -7
- package/src/config/schemas/llm.ts +12 -1
- package/src/config/schemas/memory-v2.ts +246 -0
- package/src/config/schemas/memory.ts +2 -1
- package/src/context/compactor.ts +52 -0
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +2 -13
- package/src/daemon/conversation-agent-loop.ts +126 -76
- package/src/daemon/conversation-error.ts +31 -1
- package/src/daemon/conversation-lifecycle.ts +27 -22
- package/src/daemon/conversation-runtime-assembly.ts +10 -9
- package/src/daemon/conversation-tool-setup.ts +63 -3
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +14 -29
- package/src/daemon/disk-pressure-guard.ts +14 -2
- package/src/daemon/handlers/config-model.test.ts +1 -0
- package/src/daemon/handlers/conversations.ts +11 -3
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +4 -4
- package/src/daemon/host-file-proxy.ts +4 -4
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +10 -10
- package/src/daemon/lifecycle.ts +23 -20
- package/src/daemon/meet-manifest-loader.ts +1 -7
- package/src/daemon/message-types/conversations.ts +6 -9
- package/src/daemon/message-types/home.ts +1 -13
- package/src/daemon/message-types/messages.ts +6 -14
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +52 -0
- package/src/daemon/tool-setup-types.ts +13 -0
- package/src/events/relationship-state-updated.ts +25 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -1
- package/src/home/home-greeting.ts +0 -9
- package/src/home/suggested-prompts.ts +0 -9
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/registries.ts +8 -12
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/memory-retrospective-job.test.ts +7 -0
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-crud.ts +71 -70
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-init.ts +10 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +55 -22
- package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
- package/src/memory/llm-request-log-source-local.ts +7 -0
- package/src/memory/llm-request-log-source.ts +9 -2
- package/src/memory/llm-request-log-store.ts +43 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-enqueue.ts +8 -1
- package/src/memory/memory-retrospective-job.ts +5 -0
- package/src/memory/memory-v2-activation-log-store.ts +15 -6
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/index.ts +17 -0
- package/src/memory/migrations/registry.ts +33 -0
- package/src/memory/schema/conversations.ts +1 -1
- package/src/memory/schema/infrastructure.ts +21 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
- package/src/memory/v2/__tests__/injection.test.ts +127 -98
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +171 -3
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +124 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +224 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +106 -0
- package/src/memory/v2/harness/trace.ts +58 -0
- package/src/memory/v2/injection.ts +21 -15
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +171 -18
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +563 -0
- package/src/memory/v3/__tests__/filter.test.ts +512 -0
- package/src/memory/v3/__tests__/gate.test.ts +574 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
- package/src/memory/v3/__tests__/loop.test.ts +530 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +440 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +469 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
- package/src/memory/v3/__tests__/validate.test.ts +245 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +249 -0
- package/src/memory/v3/filter.ts +281 -0
- package/src/memory/v3/gate.ts +334 -0
- package/src/memory/v3/index-composition.ts +113 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +382 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +420 -0
- package/src/memory/v3/shadow-middleware.ts +305 -0
- package/src/memory/v3/traversal.ts +206 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +351 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +300 -0
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/emit-signal.ts +29 -49
- package/src/permissions/prompter.ts +3 -3
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +2 -2
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +18 -11
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +11 -16
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +39 -7
- package/src/prompts/system-prompt.ts +50 -185
- package/src/prompts/templates/BOOTSTRAP.md +2 -2
- package/src/prompts/templates/system-sections.ts +230 -8
- package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +32 -66
- package/src/providers/call-site-routing.ts +14 -2
- package/src/providers/connection-model-compat.ts +38 -0
- package/src/providers/connection-resolution.ts +16 -2
- package/src/providers/gemini/client.ts +49 -6
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +43 -0
- package/src/providers/model-intents.ts +1 -1
- package/src/providers/openai/chat-completions-provider.ts +6 -3
- package/src/providers/openai/codex-models.ts +18 -0
- package/src/providers/openai/responses-provider.ts +78 -21
- package/src/providers/provider-send-message.ts +7 -1
- package/src/providers/retry.ts +34 -3
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/agent-wake.ts +1 -0
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +36 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/migrations/vbundle-builder.ts +10 -3
- package/src/runtime/pending-interactions.ts +0 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +106 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +25 -6
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +188 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +0 -6
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-list-routes.ts +12 -4
- package/src/runtime/routes/conversation-management-routes.ts +77 -20
- package/src/runtime/routes/conversation-query-routes.ts +142 -36
- package/src/runtime/routes/conversation-routes.ts +252 -410
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +24 -8
- package/src/runtime/routes/host-browser-routes.ts +10 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/index.ts +8 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +215 -5
- package/src/runtime/routes/memory-v3-routes.ts +316 -0
- package/src/runtime/routes/migration-routes.ts +21 -24
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +5 -4
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +2 -8
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
- package/src/tools/browser/browser-execution.ts +16 -3
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
- package/src/tools/browser/cdp-client/factory.ts +100 -17
- package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
- package/src/tools/browser/cdp-client/types.ts +65 -0
- package/src/tools/browser/pinned-tabs.ts +96 -40
- package/src/tools/computer-use/definitions.ts +22 -78
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-tool.ts +59 -0
- package/src/tools/execution-target.ts +21 -23
- package/src/tools/executor.ts +6 -1
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -8
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/web-fetch.ts +3 -9
- package/src/tools/network/web-search.ts +25 -32
- package/src/tools/registry.ts +7 -23
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +1 -8
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/types.ts +27 -98
- package/src/tools/ui-surface/definitions.ts +6 -22
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -2
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/daemon/query-complexity-router.ts +0 -75
- package/src/prompts/cache-boundary.ts +0 -8
|
@@ -22,6 +22,7 @@ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
|
22
22
|
|
|
23
23
|
async function handleOpenInferenceProfileSession({
|
|
24
24
|
body = {},
|
|
25
|
+
headers,
|
|
25
26
|
}: RouteHandlerArgs) {
|
|
26
27
|
if (body.profile == null || typeof body.profile !== "string") {
|
|
27
28
|
throw new BadRequestError("profile must be a non-empty string");
|
|
@@ -31,13 +32,18 @@ async function handleOpenInferenceProfileSession({
|
|
|
31
32
|
profile: body.profile,
|
|
32
33
|
ttlSeconds: body.ttlSeconds as number | null | undefined,
|
|
33
34
|
sessionId: body.sessionId as string | undefined,
|
|
35
|
+
originClientId: headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
34
36
|
});
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
async function handleCloseInferenceProfileSession({
|
|
38
40
|
body = {},
|
|
41
|
+
headers,
|
|
39
42
|
}: RouteHandlerArgs) {
|
|
40
|
-
return closeInferenceProfileSession(
|
|
43
|
+
return closeInferenceProfileSession(
|
|
44
|
+
body.conversationId as string,
|
|
45
|
+
headers?.["x-vellum-client-id"]?.trim() || undefined,
|
|
46
|
+
);
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
function handleListInferenceProfileSessions({
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { resolveDefaultProfileKey } from "../../config/llm-resolver.js";
|
|
2
2
|
import { loadConfig } from "../../config/loader.js";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
CALL_SITE_CATALOG,
|
|
5
|
+
CALL_SITE_DOMAINS,
|
|
6
|
+
} from "../../config/schemas/call-site-catalog.js";
|
|
4
7
|
import type { LLMCallSite } from "../../config/schemas/llm.js";
|
|
5
8
|
import type { RouteDefinition } from "./types.js";
|
|
6
9
|
|
|
@@ -10,14 +13,28 @@ async function handleGetCallSites() {
|
|
|
10
13
|
domains: CALL_SITE_DOMAINS,
|
|
11
14
|
callSites: CALL_SITE_CATALOG.map((entry) => ({
|
|
12
15
|
...entry,
|
|
13
|
-
defaultProfile: resolveDefaultProfileKey(
|
|
14
|
-
entry.id as LLMCallSite,
|
|
15
|
-
llm,
|
|
16
|
-
),
|
|
16
|
+
defaultProfile: resolveDefaultProfileKey(entry.id as LLMCallSite, llm),
|
|
17
17
|
})),
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
export interface LlmProfilesListResult {
|
|
22
|
+
/** Sorted list of profile names defined in `llm.profiles`. */
|
|
23
|
+
profiles: string[];
|
|
24
|
+
/** The workspace-wide active profile name, if one is set. */
|
|
25
|
+
activeProfile: string | null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function handleListProfiles(): Promise<LlmProfilesListResult> {
|
|
29
|
+
const { llm } = loadConfig();
|
|
30
|
+
const profiles = llm?.profiles ?? {};
|
|
31
|
+
return {
|
|
32
|
+
profiles: Object.keys(profiles).sort(),
|
|
33
|
+
activeProfile:
|
|
34
|
+
typeof llm?.activeProfile === "string" ? llm.activeProfile : null,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
21
38
|
export const ROUTES: RouteDefinition[] = [
|
|
22
39
|
{
|
|
23
40
|
operationId: "llm_call_sites_list",
|
|
@@ -29,4 +46,14 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
29
46
|
"Returns the full catalog of LLM call sites with display names, descriptions, and domain groupings. Used by clients to render the per-call-site override settings UI.",
|
|
30
47
|
tags: ["config"],
|
|
31
48
|
},
|
|
49
|
+
{
|
|
50
|
+
operationId: "llm_profiles_list",
|
|
51
|
+
method: "GET",
|
|
52
|
+
endpoint: "config/llm/profiles",
|
|
53
|
+
handler: handleListProfiles,
|
|
54
|
+
summary: "List defined LLM profiles",
|
|
55
|
+
description:
|
|
56
|
+
"Returns the sorted list of profile names defined in `llm.profiles` plus the workspace-wide active profile. Used to populate per-call profile dropdowns (e.g. memory router playground) without requiring the caller to type profile names.",
|
|
57
|
+
tags: ["config"],
|
|
58
|
+
},
|
|
32
59
|
];
|
|
@@ -44,7 +44,10 @@ import type {
|
|
|
44
44
|
MemoryType,
|
|
45
45
|
NewNode,
|
|
46
46
|
} from "../../memory/graph/types.js";
|
|
47
|
-
import {
|
|
47
|
+
import {
|
|
48
|
+
enqueueMemoryJob,
|
|
49
|
+
isMemoryEnabled,
|
|
50
|
+
} from "../../memory/jobs-store.js";
|
|
48
51
|
import { withQdrantBreaker } from "../../memory/qdrant-circuit-breaker.js";
|
|
49
52
|
import { getQdrantClient } from "../../memory/qdrant-client.js";
|
|
50
53
|
import { memoryGraphNodes } from "../../memory/schema.js";
|
|
@@ -525,7 +528,9 @@ async function handleCreateMemoryItem(body: Record<string, unknown>) {
|
|
|
525
528
|
};
|
|
526
529
|
|
|
527
530
|
const created = createNode(newNode);
|
|
528
|
-
|
|
531
|
+
if (isMemoryEnabled()) {
|
|
532
|
+
enqueueMemoryJob("embed_graph_node", { nodeId: created.id });
|
|
533
|
+
}
|
|
529
534
|
|
|
530
535
|
return { item: nodeToPayload(created) };
|
|
531
536
|
}
|
|
@@ -619,7 +624,7 @@ async function handleUpdateMemoryItem(
|
|
|
619
624
|
|
|
620
625
|
updateNode(id, changes);
|
|
621
626
|
|
|
622
|
-
if (contentChanged) {
|
|
627
|
+
if (contentChanged && isMemoryEnabled()) {
|
|
623
628
|
enqueueMemoryJob("embed_graph_node", { nodeId: id });
|
|
624
629
|
}
|
|
625
630
|
|
|
@@ -23,6 +23,10 @@ import {
|
|
|
23
23
|
totalEdgeCount,
|
|
24
24
|
validateEdgeTargets,
|
|
25
25
|
} from "../../memory/v2/edge-index.js";
|
|
26
|
+
import { runComparisonOverHistory } from "../../memory/v2/harness/compare.js";
|
|
27
|
+
import type { Retriever } from "../../memory/v2/harness/retriever.js";
|
|
28
|
+
import { createRouterRetriever } from "../../memory/v2/harness/router-retriever.js";
|
|
29
|
+
import type { ComparisonReport } from "../../memory/v2/harness/runner.js";
|
|
26
30
|
import { computeInjectionScores } from "../../memory/v2/injection-events.js";
|
|
27
31
|
import { loadNowText } from "../../memory/v2/now-text.js";
|
|
28
32
|
import { getPageIndex } from "../../memory/v2/page-index.js";
|
|
@@ -32,8 +36,10 @@ import {
|
|
|
32
36
|
readPage,
|
|
33
37
|
renderPageContent,
|
|
34
38
|
} from "../../memory/v2/page-store.js";
|
|
39
|
+
import { ROUTER_PROMPT } from "../../memory/v2/prompts/router.js";
|
|
35
40
|
import { type RouterSource, runRouter } from "../../memory/v2/router.js";
|
|
36
41
|
import { seedV2SkillEntries } from "../../memory/v2/skill-store.js";
|
|
42
|
+
import { createV3Retriever } from "../../memory/v3/retriever.js";
|
|
37
43
|
import { getLogger } from "../../util/logger.js";
|
|
38
44
|
import { getWorkspaceDir } from "../../util/platform.js";
|
|
39
45
|
import { RouteError } from "./errors.js";
|
|
@@ -347,10 +353,47 @@ const SimulateRouterOverridesSchema = z
|
|
|
347
353
|
})
|
|
348
354
|
.strict();
|
|
349
355
|
|
|
356
|
+
const RecentTurnPairSchema = z
|
|
357
|
+
.object({
|
|
358
|
+
assistantMessage: z.string(),
|
|
359
|
+
userMessage: z.string(),
|
|
360
|
+
})
|
|
361
|
+
.strict();
|
|
362
|
+
|
|
350
363
|
const MemoryV2SimulateRouterParams = z
|
|
351
364
|
.object({
|
|
352
|
-
|
|
365
|
+
/**
|
|
366
|
+
* Recent (assistant, user) turn pairs to render inside `<last_turn>`,
|
|
367
|
+
* oldest first. Required; must contain at least one entry. The last
|
|
368
|
+
* entry's `userMessage` is the just-arrived turn the router is
|
|
369
|
+
* routing for (must be non-empty); earlier entries are conversation
|
|
370
|
+
* history. The oldest pair's `assistantMessage` may be empty for a
|
|
371
|
+
* first-turn scenario — the daemon skips that `[assistant]:` line
|
|
372
|
+
* the same way `runRouterBatch` does in prod.
|
|
373
|
+
*/
|
|
374
|
+
recentTurnPairs: z
|
|
375
|
+
.array(RecentTurnPairSchema)
|
|
376
|
+
.min(1, "recentTurnPairs must contain at least one entry")
|
|
377
|
+
.refine(
|
|
378
|
+
(pairs) => pairs[pairs.length - 1].userMessage.length > 0,
|
|
379
|
+
"the last recentTurnPairs entry's userMessage must be non-empty",
|
|
380
|
+
),
|
|
381
|
+
/**
|
|
382
|
+
* Verbatim `<now>` body. When omitted, the daemon loads the workspace's
|
|
383
|
+
* live NOW.md so callers that don't care about per-call now context get
|
|
384
|
+
* production-like behavior for free. Pass an explicit string (including
|
|
385
|
+
* the empty string) to override.
|
|
386
|
+
*/
|
|
387
|
+
nowText: z.string().optional(),
|
|
353
388
|
configOverrides: SimulateRouterOverridesSchema.optional(),
|
|
389
|
+
profileOverride: z.string().min(1).optional(),
|
|
390
|
+
/**
|
|
391
|
+
* Inline router system-prompt override (simulator only). Empty /
|
|
392
|
+
* whitespace-only strings are normalized to "no override" so a
|
|
393
|
+
* cleared textarea behaves the same as never opening it. The 1 MiB
|
|
394
|
+
* cap mirrors the file-path size guard in `resolveRouterPrompt`.
|
|
395
|
+
*/
|
|
396
|
+
routerPromptOverride: z.string().max(1_000_000).optional(),
|
|
354
397
|
})
|
|
355
398
|
.strict();
|
|
356
399
|
|
|
@@ -380,6 +423,10 @@ export interface MemoryV2SimulateRouterResult {
|
|
|
380
423
|
};
|
|
381
424
|
/** Page index size the router was given (post-tier-carve, all batches). */
|
|
382
425
|
totalCandidatePages: number;
|
|
426
|
+
/** The profile name passed as a per-call override, if any. */
|
|
427
|
+
profileOverride: string | null;
|
|
428
|
+
/** `true` when an inline `routerPromptOverride` was applied this call. */
|
|
429
|
+
routerPromptOverridden: boolean;
|
|
383
430
|
}
|
|
384
431
|
|
|
385
432
|
/**
|
|
@@ -423,23 +470,70 @@ export async function handleSimulateRouter({
|
|
|
423
470
|
body = {},
|
|
424
471
|
}: RouteHandlerArgs): Promise<MemoryV2SimulateRouterResult> {
|
|
425
472
|
requireMemoryV2Enabled();
|
|
426
|
-
const {
|
|
473
|
+
const {
|
|
474
|
+
recentTurnPairs,
|
|
475
|
+
nowText: rawNowText,
|
|
476
|
+
configOverrides,
|
|
477
|
+
profileOverride,
|
|
478
|
+
routerPromptOverride: rawRouterPromptOverride,
|
|
479
|
+
} = MemoryV2SimulateRouterParams.parse(body);
|
|
480
|
+
|
|
481
|
+
// Normalize whitespace-only strings to "no override" so the
|
|
482
|
+
// bundled/file prompt resolution behaves the same as a cleared editor.
|
|
483
|
+
const routerPromptOverride =
|
|
484
|
+
rawRouterPromptOverride !== undefined &&
|
|
485
|
+
rawRouterPromptOverride.trim().length > 0
|
|
486
|
+
? rawRouterPromptOverride
|
|
487
|
+
: undefined;
|
|
427
488
|
|
|
428
489
|
const liveConfig = loadConfig();
|
|
429
490
|
const mergedConfig = applySimulateOverrides(liveConfig, configOverrides);
|
|
430
491
|
const effectiveRouter = mergedConfig.memory.v2.router;
|
|
431
492
|
|
|
493
|
+
// Validate the requested profile name against the configured profile
|
|
494
|
+
// catalog so the caller gets a structured 400 instead of a silent fall-
|
|
495
|
+
// through (the resolver tolerates missing override-profile references by
|
|
496
|
+
// design, but the playground wants the user to know they typo'd).
|
|
497
|
+
if (profileOverride !== undefined) {
|
|
498
|
+
const profiles = liveConfig.llm?.profiles ?? {};
|
|
499
|
+
if (!Object.prototype.hasOwnProperty.call(profiles, profileOverride)) {
|
|
500
|
+
const available = Object.keys(profiles).sort();
|
|
501
|
+
const hint =
|
|
502
|
+
available.length > 0
|
|
503
|
+
? ` Available profiles: ${available.join(", ")}.`
|
|
504
|
+
: " No profiles defined in llm.profiles.";
|
|
505
|
+
throw new RouteError(
|
|
506
|
+
`Profile "${profileOverride}" is not defined in llm.profiles.${hint}`,
|
|
507
|
+
"MEMORY_V2_SIMULATE_INVALID_PROFILE",
|
|
508
|
+
400,
|
|
509
|
+
);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
432
513
|
const workspaceDir = getWorkspaceDir();
|
|
433
|
-
|
|
514
|
+
// Caller can override `<now>` explicitly; otherwise fall back to the
|
|
515
|
+
// live workspace NOW.md so a UI that doesn't supply nowText still
|
|
516
|
+
// exercises a production-like context.
|
|
517
|
+
const nowText =
|
|
518
|
+
rawNowText !== undefined ? rawNowText : await loadNowText(workspaceDir);
|
|
434
519
|
|
|
435
520
|
const routerResult = await runRouter({
|
|
436
521
|
workspaceDir,
|
|
437
|
-
|
|
438
|
-
assistantMessage: "",
|
|
522
|
+
recentTurnPairs,
|
|
439
523
|
nowText,
|
|
440
524
|
priorEverInjected: [],
|
|
441
525
|
config: mergedConfig,
|
|
442
526
|
database: getDb(),
|
|
527
|
+
...(profileOverride !== undefined
|
|
528
|
+
? { overrideProfile: profileOverride }
|
|
529
|
+
: {}),
|
|
530
|
+
...(routerPromptOverride !== undefined ? { routerPromptOverride } : {}),
|
|
531
|
+
// Always return the full union — the simulator's job is to surface
|
|
532
|
+
// what the router actually picked across all batches, not what
|
|
533
|
+
// injection.ts would have trimmed it to. The `max_page_ids` knob is
|
|
534
|
+
// still echoed in `effectiveConfig` so the UI can show the live cap
|
|
535
|
+
// as informational context.
|
|
536
|
+
disableUnionCap: true,
|
|
443
537
|
});
|
|
444
538
|
|
|
445
539
|
const pageIndex = await getPageIndex(workspaceDir);
|
|
@@ -482,9 +576,93 @@ export async function handleSimulateRouter({
|
|
|
482
576
|
: {}),
|
|
483
577
|
},
|
|
484
578
|
totalCandidatePages: pageIndex.entries.length,
|
|
579
|
+
profileOverride: profileOverride ?? null,
|
|
580
|
+
routerPromptOverridden: routerPromptOverride !== undefined,
|
|
485
581
|
};
|
|
486
582
|
}
|
|
487
583
|
|
|
584
|
+
// ── Router prompt template (bundled default for the playground editor) ──
|
|
585
|
+
|
|
586
|
+
export interface MemoryV2RouterPromptTemplateResult {
|
|
587
|
+
/** The bundled router prompt body, placeholders intact. */
|
|
588
|
+
template: string;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
async function handleGetRouterPromptTemplate(): Promise<MemoryV2RouterPromptTemplateResult> {
|
|
592
|
+
requireMemoryV2Enabled();
|
|
593
|
+
return { template: ROUTER_PROMPT };
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
// ── Current `<now>` body (default value for the playground editor) ──────
|
|
597
|
+
|
|
598
|
+
export interface MemoryV2NowTextResult {
|
|
599
|
+
/** The current rendered NOW.md body (autoloaded essentials/threads/recent). */
|
|
600
|
+
nowText: string;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
async function handleGetNowText(): Promise<MemoryV2NowTextResult> {
|
|
604
|
+
requireMemoryV2Enabled();
|
|
605
|
+
const workspaceDir = getWorkspaceDir();
|
|
606
|
+
const nowText = await loadNowText(workspaceDir);
|
|
607
|
+
return { nowText };
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
// ── Compare retrievers over historical turns (read-only) ────────────────
|
|
611
|
+
|
|
612
|
+
const MemoryV2CompareRetrieversParams = z
|
|
613
|
+
.object({
|
|
614
|
+
/**
|
|
615
|
+
* How many historical `mode='router'` turns to sample. Each scored turn
|
|
616
|
+
* re-runs the router (one LLM call), so keep this modest. Default 20.
|
|
617
|
+
*/
|
|
618
|
+
limit: z.number().int().positive().optional(),
|
|
619
|
+
strategy: z.enum(["recent", "random"]).optional(),
|
|
620
|
+
conversationIds: z.array(z.string().min(1)).optional(),
|
|
621
|
+
ks: z.array(z.number().int().positive()).optional(),
|
|
622
|
+
includeNotInjected: z.boolean().optional(),
|
|
623
|
+
})
|
|
624
|
+
.strict();
|
|
625
|
+
|
|
626
|
+
const DEFAULT_COMPARE_LIMIT = 20;
|
|
627
|
+
const DEFAULT_COMPARE_KS = [5, 10, 25, 50];
|
|
628
|
+
|
|
629
|
+
export async function handleCompareRetrievers({
|
|
630
|
+
body = {},
|
|
631
|
+
abortSignal,
|
|
632
|
+
}: RouteHandlerArgs): Promise<ComparisonReport> {
|
|
633
|
+
requireMemoryV2Enabled();
|
|
634
|
+
const { limit, strategy, conversationIds, ks, includeNotInjected } =
|
|
635
|
+
MemoryV2CompareRetrieversParams.parse(body);
|
|
636
|
+
|
|
637
|
+
const config = loadConfig();
|
|
638
|
+
const workspaceDir = getWorkspaceDir();
|
|
639
|
+
const pageIndex = await getPageIndex(workspaceDir);
|
|
640
|
+
const db = getDb();
|
|
641
|
+
|
|
642
|
+
// The router is always comparand #1 (the harness self-test against its own
|
|
643
|
+
// logged ground truth). v3 joins as comparand #2 only when explicitly
|
|
644
|
+
// enabled, so the default compare surface is unchanged until v3 is switched
|
|
645
|
+
// on. v3 is offline-only here — the loop reads `db` but mutates nothing.
|
|
646
|
+
const retrievers: Retriever[] = [createRouterRetriever(db)];
|
|
647
|
+
if (config.memory.v3.enabled) {
|
|
648
|
+
retrievers.push(createV3Retriever(db));
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
return runComparisonOverHistory({
|
|
652
|
+
db,
|
|
653
|
+
workspaceDir,
|
|
654
|
+
config,
|
|
655
|
+
retrievers,
|
|
656
|
+
ks: ks ?? DEFAULT_COMPARE_KS,
|
|
657
|
+
limit: limit ?? DEFAULT_COMPARE_LIMIT,
|
|
658
|
+
pageExists: (slug) => pageIndex.bySlug.has(slug),
|
|
659
|
+
...(strategy !== undefined ? { strategy } : {}),
|
|
660
|
+
...(conversationIds !== undefined ? { conversationIds } : {}),
|
|
661
|
+
...(includeNotInjected !== undefined ? { includeNotInjected } : {}),
|
|
662
|
+
...(abortSignal !== undefined ? { signal: abortSignal } : {}),
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
|
|
488
666
|
// ── Route definitions ───────────────────────────────────────────────────
|
|
489
667
|
|
|
490
668
|
export const ROUTES: RouteDefinition[] = [
|
|
@@ -576,4 +754,36 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
576
754
|
tags: ["memory"],
|
|
577
755
|
requestBody: MemoryV2SimulateRouterParams,
|
|
578
756
|
},
|
|
757
|
+
{
|
|
758
|
+
operationId: "memory_v2_compare_retrievers",
|
|
759
|
+
method: "POST",
|
|
760
|
+
endpoint: "memory/v2/compare-retrievers",
|
|
761
|
+
handler: handleCompareRetrievers,
|
|
762
|
+
summary:
|
|
763
|
+
"Compare retrievers against the router's logged selections (read-only)",
|
|
764
|
+
description:
|
|
765
|
+
"Runs one or more retrievers over a sample of historical turns (memory_v2_activation_logs, mode='router') and scores their selected pages against the logged selections as ground truth, reconstructing each turn's inputs from the messages table + current NOW. Read-only — writes nothing. Each scored turn re-runs the router (one LLM call), so keep `limit` modest. Today the only retriever is the router itself, so this is the harness self-test.",
|
|
766
|
+
tags: ["memory"],
|
|
767
|
+
requestBody: MemoryV2CompareRetrieversParams,
|
|
768
|
+
},
|
|
769
|
+
{
|
|
770
|
+
operationId: "memory_v2_router_prompt_template",
|
|
771
|
+
method: "GET",
|
|
772
|
+
endpoint: "memory/v2/router-prompt-template",
|
|
773
|
+
handler: handleGetRouterPromptTemplate,
|
|
774
|
+
summary: "Return the bundled router system-prompt template",
|
|
775
|
+
description:
|
|
776
|
+
"Returns the bundled `ROUTER_PROMPT` body with placeholders intact (`{{ASSISTANT_NAME}}`, `{{USER_NAME}}`, `{{PAGE_INDEX}}`). Used by the memory router playground's 'Load default' affordance so users have a known-good starting point when authoring an inline prompt override.",
|
|
777
|
+
tags: ["memory"],
|
|
778
|
+
},
|
|
779
|
+
{
|
|
780
|
+
operationId: "memory_v2_now_text",
|
|
781
|
+
method: "GET",
|
|
782
|
+
endpoint: "memory/v2/now-text",
|
|
783
|
+
handler: handleGetNowText,
|
|
784
|
+
summary: "Return the current rendered `<now>` body",
|
|
785
|
+
description:
|
|
786
|
+
"Returns the current NOW.md (autoloaded essentials/threads/recent). Used by the memory router playground to seed its `<now>` text area with a production-like default so callers can edit from a realistic baseline.",
|
|
787
|
+
tags: ["memory"],
|
|
788
|
+
},
|
|
579
789
|
];
|