@vellumai/assistant 0.8.3 → 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/docker-entrypoint.sh +0 -1
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/knip.json +2 -1
- package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
- package/openapi.yaml +1492 -100
- package/package.json +1 -1
- package/src/__tests__/agent-loop-exit-reason.test.ts +4 -5
- package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
- package/src/__tests__/agent-loop.test.ts +88 -3
- package/src/__tests__/anthropic-provider.test.ts +302 -33
- package/src/__tests__/approval-cascade.test.ts +1 -1
- 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 +4 -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-delivery-store.test.ts +193 -0
- package/src/__tests__/channel-guardian.test.ts +3 -3
- package/src/__tests__/channel-reply-delivery.test.ts +284 -5
- package/src/__tests__/channel-retry-sweep.test.ts +274 -1
- package/src/__tests__/checker.test.ts +6 -15
- package/src/__tests__/compaction-events.test.ts +2 -1
- package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -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__/config-watcher.test.ts +1 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/context-token-estimator.test.ts +91 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +55 -4
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +228 -8
- package/src/__tests__/conversation-agent-loop.test.ts +188 -129
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-clean-command.test.ts +137 -0
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -1
- 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 +324 -0
- package/src/__tests__/conversation-lifecycle.test.ts +53 -12
- package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
- package/src/__tests__/conversation-load-history-stripped.test.ts +279 -0
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-process-callsite.test.ts +1 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- 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-runtime-assembly.test.ts +264 -81
- package/src/__tests__/conversation-seed-composer.test.ts +66 -4
- package/src/__tests__/conversation-skill-tools.test.ts +2 -5
- package/src/__tests__/conversation-slash-commands.test.ts +36 -8
- package/src/__tests__/conversation-slash-queue.test.ts +1 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -1
- package/src/__tests__/conversation-speed-override.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +220 -0
- package/src/__tests__/conversation-sync-tags.test.ts +99 -32
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -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 +7 -0
- package/src/__tests__/credential-vault-unit.test.ts +2 -2
- package/src/__tests__/cu-unified-flow.test.ts +10 -1
- package/src/__tests__/dm-backfill.test.ts +64 -0
- package/src/__tests__/dm-persistence.test.ts +33 -0
- package/src/__tests__/document-find-replace.test.ts +501 -0
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/first-greeting.test.ts +23 -2
- 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__/headless-browser-navigate.test.ts +172 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +4 -0
- package/src/__tests__/host-bash-proxy.test.ts +6 -0
- package/src/__tests__/host-browser-proxy.test.ts +10 -0
- package/src/__tests__/host-cu-proxy.test.ts +8 -1
- package/src/__tests__/host-file-proxy.test.ts +8 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/host-transfer-proxy.test.ts +8 -1
- package/src/__tests__/identity-routes.test.ts +57 -0
- package/src/__tests__/inbound-slack-persistence.test.ts +3 -0
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/injector-chain.test.ts +2 -0
- package/src/__tests__/injector-document-comments.test.ts +378 -0
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +4 -25
- package/src/__tests__/list-messages-attachments.test.ts +21 -17
- package/src/__tests__/list-messages-hidden-metadata.test.ts +217 -0
- package/src/__tests__/list-messages-page-latest.test.ts +130 -14
- package/src/__tests__/list-messages-tool-merge.test.ts +77 -17
- package/src/__tests__/llm-context-normalization.test.ts +0 -2
- 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 +161 -9
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/log-export-routes.test.ts +99 -2
- 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__/message-queue-steer.test.ts +114 -0
- 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 +151 -0
- package/src/__tests__/openai-responses-provider.test.ts +118 -16
- package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
- package/src/__tests__/pending-interactions-resolved-event.test.ts +189 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -5
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +2 -2
- package/src/__tests__/plugin-source-watcher.test.ts +302 -0
- 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__/process-message-background-slack.test.ts +1 -51
- package/src/__tests__/process-message-display-content.test.ts +21 -16
- 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__/server-history-render.test.ts +83 -4
- 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__/steer-tool-repair.test.ts +249 -0
- 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 +161 -124
- package/src/__tests__/terminal-tools.test.ts +12 -2
- package/src/__tests__/thinking-block-replay.test.ts +113 -0
- package/src/__tests__/thread-backfill.test.ts +370 -22
- 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 +89 -53
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
- 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__/twilio-routes.test.ts +1 -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__/web-fetch.test.ts +2 -2
- package/src/__tests__/workspace-git-service.test.ts +94 -10
- package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
- 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/attachments.ts +1 -0
- package/src/agent/loop.ts +65 -20
- 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/next-wake.test.ts +289 -0
- package/src/background-wake/next-wake.ts +172 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/browser/operations.ts +15 -0
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
- 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 +10 -12
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/conversations.ts +128 -1
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference-providers.ts +147 -1
- 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 +483 -0
- package/src/cli/commands/memory-v3-render.ts +344 -0
- package/src/cli/commands/memory-v3.ts +316 -0
- package/src/cli/commands/notifications.ts +24 -2
- package/src/cli/program.ts +2 -0
- package/src/cli/utils/conversation-id.ts +17 -5
- package/src/config/assistant-feature-flags.ts +21 -9
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
- package/src/config/bundled-skills/document-editor/SKILL.md +124 -0
- package/src/config/bundled-skills/document-editor/TOOLS.json +258 -0
- package/src/config/bundled-skills/document-editor/tools/comment-list.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/comment-reply.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/comment-resolve.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-find.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-replace-text.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/SKILL.md +8 -0
- 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-skills/schedule/SKILL.md +8 -0
- package/src/config/bundled-tool-registry.ts +24 -12
- package/src/config/call-site-defaults.ts +20 -0
- package/src/config/feature-flag-registry.json +115 -3
- package/src/config/llm-resolver.ts +16 -2
- package/src/config/schemas/__tests__/memory-v2.test.ts +217 -1
- package/src/config/schemas/call-site-catalog.ts +35 -0
- package/src/config/schemas/llm.ts +14 -0
- package/src/config/schemas/memory-v2.ts +294 -1
- package/src/config/schemas/memory.ts +2 -1
- package/src/context/compactor.ts +60 -1
- package/src/context/token-estimator.ts +47 -4
- package/src/context/window-manager.ts +25 -0
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/credential-health/credential-health-service.ts +34 -19
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +357 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +287 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +155 -36
- package/src/daemon/conversation-agent-loop.ts +307 -88
- package/src/daemon/conversation-error.ts +31 -1
- package/src/daemon/conversation-lifecycle.ts +149 -118
- package/src/daemon/conversation-messaging.ts +3 -0
- package/src/daemon/conversation-process.ts +273 -0
- package/src/daemon/conversation-queue-manager.ts +14 -0
- package/src/daemon/conversation-runtime-assembly.ts +145 -84
- package/src/daemon/conversation-slash.ts +37 -5
- package/src/daemon/conversation-surfaces.ts +45 -2
- package/src/daemon/conversation-tool-setup.ts +70 -3
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +54 -32
- package/src/daemon/disk-pressure-guard.ts +14 -2
- package/src/daemon/first-greeting.ts +10 -0
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
- package/src/daemon/handlers/config-a2a.ts +160 -0
- package/src/daemon/handlers/config-model.test.ts +2 -0
- package/src/daemon/handlers/conversations.ts +90 -3
- package/src/daemon/handlers/shared.ts +92 -29
- package/src/daemon/host-bash-proxy.ts +1 -1
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +5 -5
- package/src/daemon/host-file-proxy.ts +5 -5
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +11 -11
- package/src/daemon/lifecycle.ts +40 -23
- package/src/daemon/meet-manifest-loader.ts +1 -7
- package/src/daemon/message-protocol.ts +4 -0
- package/src/daemon/message-types/conversations.ts +14 -9
- package/src/daemon/message-types/document-comments.ts +50 -0
- package/src/daemon/message-types/home.ts +1 -13
- package/src/daemon/message-types/messages.ts +66 -7
- package/src/daemon/message-types/surfaces.ts +3 -1
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/message-types/web-activity.ts +57 -0
- package/src/daemon/plugin-source-watcher.ts +135 -3
- package/src/daemon/process-message.ts +69 -12
- 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/daemon/trust-context.ts +6 -0
- package/src/documents/document-comments-store.test.ts +338 -0
- package/src/documents/document-comments-store.ts +237 -0
- package/src/documents/document-store.ts +202 -0
- package/src/events/relationship-state-updated.ts +25 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -2
- package/src/heartbeat/heartbeat-service.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +33 -2
- package/src/home/feed-types.ts +6 -1
- package/src/home/home-content-refresh.ts +52 -0
- package/src/home/home-greeting-cache.ts +69 -0
- package/src/home/home-greeting.ts +85 -0
- package/src/home/suggested-prompts.ts +168 -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__/jobs-worker-v2-schedule.test.ts +135 -2
- package/src/memory/__tests__/memory-retrospective-job.test.ts +327 -6
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-crud.ts +191 -100
- 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 +26 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/delivery-crud.ts +41 -0
- package/src/memory/delivery-status.ts +141 -15
- package/src/memory/external-conversation-store.ts +32 -1
- 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 +68 -15
- 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-constants.ts +28 -0
- package/src/memory/memory-retrospective-enqueue.ts +11 -3
- package/src/memory/memory-retrospective-job.ts +413 -18
- package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
- package/src/memory/memory-v2-activation-log-store.ts +41 -14
- package/src/memory/migrations/100-core-tables.ts +1 -0
- package/src/memory/migrations/109-external-conversation-bindings.ts +1 -0
- package/src/memory/migrations/253-conversation-last-notified-profile.ts +15 -0
- package/src/memory/migrations/253-document-comments.ts +47 -0
- package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +43 -0
- package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +24 -0
- package/src/memory/migrations/256-memory-v2-injection-events.ts +113 -0
- package/src/memory/migrations/257-strip-base-url-non-openai-compatible.ts +22 -0
- package/src/memory/migrations/258-onboarding-events-prior-assistants.ts +13 -0
- package/src/memory/migrations/259-conversation-cleaned-at.ts +33 -0
- 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 +34 -0
- package/src/memory/migrations/registry.ts +58 -0
- package/src/memory/onboarding-events-store.ts +7 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +3 -0
- package/src/memory/schema/infrastructure.ts +22 -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-events.test.ts +318 -0
- package/src/memory/v2/__tests__/injection.test.ts +158 -112
- package/src/memory/v2/__tests__/page-index.test.ts +365 -1
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +660 -4
- package/src/memory/v2/consolidation-job.ts +14 -0
- 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-events.ts +101 -0
- package/src/memory/v2/injection.ts +42 -25
- package/src/memory/v2/page-index.ts +209 -7
- package/src/memory/v2/page-store.ts +18 -0
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +369 -62
- 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/messaging/providers/index.ts +7 -1
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +329 -3
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +34 -1
- package/src/messaging/providers/slack/adapter.ts +178 -25
- package/src/messaging/providers/slack/api.test.ts +54 -0
- package/src/messaging/providers/slack/api.ts +119 -3
- package/src/messaging/providers/slack/client.ts +12 -0
- package/src/messaging/providers/slack/deep-link.ts +20 -1
- package/src/messaging/providers/slack/message-metadata.test.ts +48 -0
- package/src/messaging/providers/slack/message-metadata.ts +156 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +107 -75
- package/src/messaging/providers/slack/render-transcript.ts +176 -49
- package/src/messaging/providers/slack/send.test.ts +77 -0
- package/src/messaging/providers/slack/send.ts +8 -2
- package/src/messaging/providers/slack/types.ts +14 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +4 -1
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +116 -54
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/conversation-seed-composer.ts +14 -2
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/deferred-emit.ts +135 -0
- package/src/notifications/emit-signal.ts +38 -50
- package/src/notifications/home-feed-side-effect.ts +60 -30
- package/src/oauth/connect-orchestrator.ts +3 -0
- package/src/oauth/credential-token-resolver.ts +2 -0
- package/src/oauth/manual-token-connection.ts +19 -0
- package/src/oauth/oauth-store.ts +12 -0
- package/src/oauth/seed-providers.ts +22 -0
- package/src/permissions/prompter.ts +8 -5
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +6 -3
- 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 +100 -20
- 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__/system-prompt.test.ts +46 -2
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/normalize-onboarding.ts +40 -0
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +69 -19
- package/src/prompts/system-prompt.ts +118 -216
- package/src/prompts/template-detection.ts +37 -0
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
- package/src/prompts/templates/BOOTSTRAP.md +10 -2
- package/src/prompts/templates/VOICE.md +3 -0
- package/src/prompts/templates/system-sections.ts +281 -9
- 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 +159 -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/fireworks/client.ts +20 -2
- package/src/providers/gemini/client.ts +49 -6
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +342 -0
- package/src/providers/inference/__tests__/base-url-security.test.ts +189 -0
- package/src/providers/inference/__tests__/codex-token-refresh.test.ts +254 -0
- package/src/providers/inference/adapter-factory.ts +18 -1
- package/src/providers/inference/auth.ts +3 -3
- package/src/providers/inference/codex-token-refresh.ts +128 -0
- package/src/providers/inference/resolve-auth.ts +49 -6
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +91 -1
- package/src/providers/model-intents.ts +1 -1
- package/src/providers/openai/chat-completions-provider.ts +63 -23
- package/src/providers/openai/codex-models.ts +18 -0
- package/src/providers/openai/responses-provider.ts +86 -23
- package/src/providers/openrouter/client.ts +5 -1
- 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/types.ts +25 -0
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +214 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +128 -0
- package/src/runtime/agent-wake.ts +152 -56
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +43 -3
- package/src/runtime/background-job-runner.ts +26 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/channel-reply-delivery.ts +182 -47
- package/src/runtime/channel-retry-sweep.ts +141 -16
- package/src/runtime/http-types.ts +7 -6
- package/src/runtime/migrations/vbundle-builder.ts +10 -3
- package/src/runtime/pending-interactions.ts +50 -8
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +161 -1
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +290 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +280 -0
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +266 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/approval-routes.ts +4 -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/chatgpt-subscription-auth-routes.ts +246 -0
- package/src/runtime/routes/content-source-routes.ts +78 -0
- package/src/runtime/routes/conversation-cli-routes.ts +147 -2
- 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 +196 -31
- package/src/runtime/routes/conversation-routes.ts +472 -425
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/document-comments-routes.ts +287 -0
- package/src/runtime/routes/documents-routes.ts +33 -0
- 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/home-feed-routes.ts +6 -3
- package/src/runtime/routes/host-app-control-routes.ts +1 -1
- package/src/runtime/routes/host-browser-routes.ts +17 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/identity-routes.ts +21 -0
- package/src/runtime/routes/inbound-message-handler.ts +288 -58
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +365 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
- package/src/runtime/routes/index.ts +20 -4
- 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/inference-provider-connection-routes.ts +63 -7
- package/src/runtime/routes/integrations/a2a.ts +60 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/log-export-routes.ts +39 -0
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +427 -0
- package/src/runtime/routes/memory-v3-routes.ts +316 -0
- package/src/runtime/routes/migration-routes.ts +21 -24
- package/src/runtime/routes/notification-routes.ts +19 -2
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/question-routes.ts +4 -1
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/sanity-routes.ts +159 -0
- 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 +188 -0
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/services/conversation-serializer.ts +30 -4
- 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/schedule/integration-status.ts +3 -1
- package/src/security/__tests__/oauth2-device-code.test.ts +479 -0
- package/src/security/oauth2-device-code.ts +307 -0
- package/src/security/oauth2.ts +26 -9
- package/src/security/secure-keys.ts +5 -0
- package/src/skills/catalog-install.ts +6 -2
- 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 +150 -0
- package/src/tools/browser/browser-execution.ts +106 -0
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +4 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +22 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +42 -2
- package/src/tools/browser/cdp-client/factory.ts +171 -4
- package/src/tools/browser/cdp-client/local-cdp-client.ts +21 -0
- package/src/tools/browser/cdp-client/types.ts +101 -0
- package/src/tools/browser/pinned-tabs.ts +146 -0
- 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-comment-tool.test.ts +379 -0
- package/src/tools/document/document-comment-tool.ts +156 -0
- package/src/tools/document/document-tool.ts +187 -2
- 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/__tests__/web-fetch-metadata.test.ts +229 -0
- package/src/tools/network/__tests__/web-search-metadata.test.ts +346 -0
- package/src/tools/network/domain-normalize.ts +17 -0
- package/src/tools/network/web-fetch.ts +216 -73
- package/src/tools/network/web-search.ts +216 -98
- 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/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-approval-handler.ts +19 -12
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/types.ts +31 -98
- package/src/tools/ui-surface/definitions.ts +9 -23
- package/src/types/onboarding-context.ts +4 -0
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/__tests__/favicon.test.ts +84 -0
- package/src/util/favicon.ts +40 -0
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -7
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/git-service.ts +75 -4
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/registry.ts +4 -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/config/bundled-skills/document/SKILL.md +0 -54
- package/src/config/bundled-skills/document/TOOLS.json +0 -106
- package/src/daemon/seed-files.ts +0 -18
- package/src/prompts/cache-boundary.ts +0 -8
- package/src/runtime/routes/interface-routes.ts +0 -43
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-create.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-delete.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-list.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-read.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-update.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
3
|
import { MemoryConfigSchema } from "../memory.js";
|
|
4
|
-
import { MemoryV2ConfigSchema } from "../memory-v2.js";
|
|
4
|
+
import { MemoryV2ConfigSchema, MemoryV3ConfigSchema } from "../memory-v2.js";
|
|
5
5
|
|
|
6
6
|
describe("MemoryV2ConfigSchema", () => {
|
|
7
7
|
test("parses an empty object to documented defaults", () => {
|
|
@@ -23,6 +23,7 @@ describe("MemoryV2ConfigSchema", () => {
|
|
|
23
23
|
bm25_k1: 1.2,
|
|
24
24
|
bm25_b: 0.4,
|
|
25
25
|
consolidation_interval_hours: 4,
|
|
26
|
+
consolidation_max_buffer_lines: 100,
|
|
26
27
|
max_page_chars: 5000,
|
|
27
28
|
consolidation_prompt_path: null,
|
|
28
29
|
rerank: {
|
|
@@ -36,6 +37,11 @@ describe("MemoryV2ConfigSchema", () => {
|
|
|
36
37
|
enabled: true,
|
|
37
38
|
max_page_ids: 25,
|
|
38
39
|
router_prompt_path: null,
|
|
40
|
+
batch_size: null,
|
|
41
|
+
tier1_size: null,
|
|
42
|
+
tier2_size: null,
|
|
43
|
+
historical_pairs: 1,
|
|
44
|
+
historical_pairs_max_chars: null,
|
|
39
45
|
},
|
|
40
46
|
});
|
|
41
47
|
});
|
|
@@ -206,6 +212,216 @@ describe("MemoryV2ConfigSchema", () => {
|
|
|
206
212
|
});
|
|
207
213
|
});
|
|
208
214
|
|
|
215
|
+
describe("MemoryV3ConfigSchema", () => {
|
|
216
|
+
test("parses an empty object to documented defaults", () => {
|
|
217
|
+
const parsed = MemoryV3ConfigSchema.parse({});
|
|
218
|
+
expect(parsed).toEqual({
|
|
219
|
+
enabled: false,
|
|
220
|
+
shadow: false,
|
|
221
|
+
passCap: 3,
|
|
222
|
+
breadthBudget: 6,
|
|
223
|
+
maxDepth: 6,
|
|
224
|
+
denseQuota: { activeDomain: 30, offDomain: 8 },
|
|
225
|
+
hotLimit: 50,
|
|
226
|
+
lanes: { hot: true, sparse: true, dense: true, tree: true, edges: true },
|
|
227
|
+
ks: [5, 10, 25, 50],
|
|
228
|
+
write: {
|
|
229
|
+
enabled: false,
|
|
230
|
+
consolidateIntervalMs: 3600000,
|
|
231
|
+
coactivation: false,
|
|
232
|
+
},
|
|
233
|
+
prompts: {
|
|
234
|
+
filter: { override: null, path: null },
|
|
235
|
+
descent: { override: null, path: null },
|
|
236
|
+
gate: { override: null, path: null },
|
|
237
|
+
},
|
|
238
|
+
gateCandidateSummaries: false,
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test("parses undefined to the same defaults (top-level .default)", () => {
|
|
243
|
+
expect(MemoryV3ConfigSchema.parse(undefined)).toEqual(
|
|
244
|
+
MemoryV3ConfigSchema.parse({}),
|
|
245
|
+
);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test("defaults to disabled for backwards compatibility", () => {
|
|
249
|
+
expect(MemoryV3ConfigSchema.parse({}).enabled).toBe(false);
|
|
250
|
+
expect(MemoryV3ConfigSchema.parse({}).shadow).toBe(false);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test("accepts explicit scalar overrides", () => {
|
|
254
|
+
const parsed = MemoryV3ConfigSchema.parse({
|
|
255
|
+
enabled: true,
|
|
256
|
+
shadow: true,
|
|
257
|
+
passCap: 5,
|
|
258
|
+
breadthBudget: 10,
|
|
259
|
+
maxDepth: 8,
|
|
260
|
+
});
|
|
261
|
+
expect(parsed.enabled).toBe(true);
|
|
262
|
+
expect(parsed.shadow).toBe(true);
|
|
263
|
+
expect(parsed.passCap).toBe(5);
|
|
264
|
+
expect(parsed.breadthBudget).toBe(10);
|
|
265
|
+
expect(parsed.maxDepth).toBe(8);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
test("accepts explicit denseQuota override", () => {
|
|
269
|
+
const parsed = MemoryV3ConfigSchema.parse({
|
|
270
|
+
denseQuota: { activeDomain: 50, offDomain: 12 },
|
|
271
|
+
});
|
|
272
|
+
expect(parsed.denseQuota).toEqual({ activeDomain: 50, offDomain: 12 });
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
test("accepts a partial lanes override and defaults the rest", () => {
|
|
276
|
+
const parsed = MemoryV3ConfigSchema.parse({ lanes: { dense: false } });
|
|
277
|
+
expect(parsed.lanes).toEqual({
|
|
278
|
+
hot: true,
|
|
279
|
+
sparse: true,
|
|
280
|
+
dense: false,
|
|
281
|
+
tree: true,
|
|
282
|
+
edges: true,
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test("accepts an explicit ks override", () => {
|
|
287
|
+
const parsed = MemoryV3ConfigSchema.parse({ ks: [1, 3, 7] });
|
|
288
|
+
expect(parsed.ks).toEqual([1, 3, 7]);
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
test("rejects a non-boolean enabled", () => {
|
|
292
|
+
expect(() => MemoryV3ConfigSchema.parse({ enabled: "yes" })).toThrow();
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
test("rejects a non-integer passCap", () => {
|
|
296
|
+
expect(() => MemoryV3ConfigSchema.parse({ passCap: 2.5 })).toThrow();
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
test("rejects non-number ks entries", () => {
|
|
300
|
+
expect(() => MemoryV3ConfigSchema.parse({ ks: ["a"] })).toThrow();
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
test("parses the write subtree to safe off defaults when omitted", () => {
|
|
304
|
+
const parsed = MemoryV3ConfigSchema.parse({});
|
|
305
|
+
expect(parsed.write).toEqual({
|
|
306
|
+
enabled: false,
|
|
307
|
+
consolidateIntervalMs: 3600000,
|
|
308
|
+
coactivation: false,
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
test("accepts a partial write override and defaults the rest", () => {
|
|
313
|
+
const parsed = MemoryV3ConfigSchema.parse({ write: { enabled: true } });
|
|
314
|
+
expect(parsed.write).toEqual({
|
|
315
|
+
enabled: true,
|
|
316
|
+
consolidateIntervalMs: 3600000,
|
|
317
|
+
coactivation: false,
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
test("rejects a non-integer write.consolidateIntervalMs", () => {
|
|
322
|
+
expect(() =>
|
|
323
|
+
MemoryV3ConfigSchema.parse({ write: { consolidateIntervalMs: 1.5 } }),
|
|
324
|
+
).toThrow();
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
test("rejects a non-positive write.consolidateIntervalMs", () => {
|
|
328
|
+
// 0 or negative would make the scheduler's `now - lastRun >= interval`
|
|
329
|
+
// check always true, flooding the queue with consolidation jobs.
|
|
330
|
+
expect(() =>
|
|
331
|
+
MemoryV3ConfigSchema.parse({ write: { consolidateIntervalMs: 0 } }),
|
|
332
|
+
).toThrow();
|
|
333
|
+
expect(() =>
|
|
334
|
+
MemoryV3ConfigSchema.parse({ write: { consolidateIntervalMs: -1000 } }),
|
|
335
|
+
).toThrow();
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
test("accepts a positive write.consolidateIntervalMs override", () => {
|
|
339
|
+
const parsed = MemoryV3ConfigSchema.parse({
|
|
340
|
+
write: { consolidateIntervalMs: 1800000 },
|
|
341
|
+
});
|
|
342
|
+
expect(parsed.write.consolidateIntervalMs).toBe(1800000);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
test("parses the prompts subtree to null overrides when omitted", () => {
|
|
346
|
+
const parsed = MemoryV3ConfigSchema.parse({});
|
|
347
|
+
expect(parsed.prompts).toEqual({
|
|
348
|
+
filter: { override: null, path: null },
|
|
349
|
+
descent: { override: null, path: null },
|
|
350
|
+
gate: { override: null, path: null },
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
test("accepts a partial prompts override and defaults the rest", () => {
|
|
355
|
+
const parsed = MemoryV3ConfigSchema.parse({
|
|
356
|
+
prompts: { filter: { override: "custom filter prompt" } },
|
|
357
|
+
});
|
|
358
|
+
expect(parsed.prompts.filter).toEqual({
|
|
359
|
+
override: "custom filter prompt",
|
|
360
|
+
path: null,
|
|
361
|
+
});
|
|
362
|
+
// Lanes not mentioned keep their null defaults.
|
|
363
|
+
expect(parsed.prompts.descent).toEqual({ override: null, path: null });
|
|
364
|
+
expect(parsed.prompts.gate).toEqual({ override: null, path: null });
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
test("accepts a file path override for a prompt lane", () => {
|
|
368
|
+
const parsed = MemoryV3ConfigSchema.parse({
|
|
369
|
+
prompts: { gate: { path: "~/prompts/v3-gate.md" } },
|
|
370
|
+
});
|
|
371
|
+
expect(parsed.prompts.gate).toEqual({
|
|
372
|
+
override: null,
|
|
373
|
+
path: "~/prompts/v3-gate.md",
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
test("rejects a non-string prompts override", () => {
|
|
378
|
+
expect(() =>
|
|
379
|
+
MemoryV3ConfigSchema.parse({ prompts: { filter: { override: 42 } } }),
|
|
380
|
+
).toThrow();
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
test("rejects a non-string prompts path", () => {
|
|
384
|
+
expect(() =>
|
|
385
|
+
MemoryV3ConfigSchema.parse({ prompts: { descent: { path: 7 } } }),
|
|
386
|
+
).toThrow();
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
describe("MemoryConfigSchema integration with v3 block", () => {
|
|
391
|
+
test("includes a v3 block defaulting to disabled when v3 is omitted", () => {
|
|
392
|
+
const parsed = MemoryConfigSchema.parse({});
|
|
393
|
+
expect(parsed.v3).toBeDefined();
|
|
394
|
+
expect(parsed.v3.enabled).toBe(false);
|
|
395
|
+
expect(parsed.v3.shadow).toBe(false);
|
|
396
|
+
expect(parsed.v3.passCap).toBe(3);
|
|
397
|
+
expect(parsed.v3.lanes.dense).toBe(true);
|
|
398
|
+
expect(parsed.v3.ks).toEqual([5, 10, 25, 50]);
|
|
399
|
+
expect(parsed.v3.write).toEqual({
|
|
400
|
+
enabled: false,
|
|
401
|
+
consolidateIntervalMs: 3600000,
|
|
402
|
+
coactivation: false,
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
test("leaves pre-existing configs (no v3 key) otherwise unchanged", () => {
|
|
407
|
+
// A config authored before v3 existed parses fine and its v2 block is
|
|
408
|
+
// untouched; the v3 block is purely additive.
|
|
409
|
+
const parsed = MemoryConfigSchema.parse({ v2: { top_k: 50 } });
|
|
410
|
+
expect(parsed.v2.top_k).toBe(50);
|
|
411
|
+
expect(parsed.v3.enabled).toBe(false);
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
test("propagates v3 overrides through MemoryConfigSchema", () => {
|
|
415
|
+
const parsed = MemoryConfigSchema.parse({
|
|
416
|
+
v3: { enabled: true, passCap: 4 },
|
|
417
|
+
});
|
|
418
|
+
expect(parsed.v3.enabled).toBe(true);
|
|
419
|
+
expect(parsed.v3.passCap).toBe(4);
|
|
420
|
+
// Non-overridden v3 fields keep their defaults.
|
|
421
|
+
expect(parsed.v3.maxDepth).toBe(6);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
|
|
209
425
|
describe("MemoryConfigSchema integration with v2 block", () => {
|
|
210
426
|
test("parses an empty memory config and includes a v2 block with defaults", () => {
|
|
211
427
|
const parsed = MemoryConfigSchema.parse({});
|
|
@@ -121,6 +121,27 @@ const CATALOG_RECORD: CatalogRecord = {
|
|
|
121
121
|
"Selects which concept pages to inject for the next agent turn by routing over a cached page index.",
|
|
122
122
|
domain: "memory",
|
|
123
123
|
},
|
|
124
|
+
memoryV3Filter: {
|
|
125
|
+
id: "memoryV3Filter",
|
|
126
|
+
displayName: "Memory V3 Filter",
|
|
127
|
+
description:
|
|
128
|
+
"Cheaply filters the V3 multi-lane candidate set before descent.",
|
|
129
|
+
domain: "memory",
|
|
130
|
+
},
|
|
131
|
+
memoryV3Descent: {
|
|
132
|
+
id: "memoryV3Descent",
|
|
133
|
+
displayName: "Memory V3 Descent",
|
|
134
|
+
description:
|
|
135
|
+
"Drives the V3 bounded-descent traversal through the memory tree.",
|
|
136
|
+
domain: "memory",
|
|
137
|
+
},
|
|
138
|
+
memoryV3Gate: {
|
|
139
|
+
id: "memoryV3Gate",
|
|
140
|
+
displayName: "Memory V3 Gate",
|
|
141
|
+
description:
|
|
142
|
+
"Final capable gate that decides which V3 candidates are injected for the next turn.",
|
|
143
|
+
domain: "memory",
|
|
144
|
+
},
|
|
124
145
|
memoryV2Consolidation: {
|
|
125
146
|
id: "memoryV2Consolidation",
|
|
126
147
|
displayName: "Memory V2 Consolidation",
|
|
@@ -300,6 +321,20 @@ const CATALOG_RECORD: CatalogRecord = {
|
|
|
300
321
|
"Builds the personalized artifact in a background conversation with tool access.",
|
|
301
322
|
domain: "agentLoop",
|
|
302
323
|
},
|
|
324
|
+
homeGreeting: {
|
|
325
|
+
id: "homeGreeting",
|
|
326
|
+
displayName: "Home Greeting",
|
|
327
|
+
description:
|
|
328
|
+
"Generates the personalized greeting shown on the Home page in the assistant's tone/persona.",
|
|
329
|
+
domain: "ui",
|
|
330
|
+
},
|
|
331
|
+
homeSuggestedPrompts: {
|
|
332
|
+
id: "homeSuggestedPrompts",
|
|
333
|
+
displayName: "Home Suggested Prompts",
|
|
334
|
+
description:
|
|
335
|
+
"Generates contextual conversation-starter suggestions for the Home page.",
|
|
336
|
+
domain: "ui",
|
|
337
|
+
},
|
|
303
338
|
};
|
|
304
339
|
|
|
305
340
|
// Source of truth for call-site display metadata. API responses and usage
|
|
@@ -49,6 +49,9 @@ export const LLMCallSiteEnum = z.enum([
|
|
|
49
49
|
"memoryV2Migration",
|
|
50
50
|
"memoryV2Sweep",
|
|
51
51
|
"memoryRouter",
|
|
52
|
+
"memoryV3Filter",
|
|
53
|
+
"memoryV3Descent",
|
|
54
|
+
"memoryV3Gate",
|
|
52
55
|
"memoryV2Consolidation",
|
|
53
56
|
"memoryRetrospective",
|
|
54
57
|
"recall",
|
|
@@ -76,6 +79,8 @@ export const LLMCallSiteEnum = z.enum([
|
|
|
76
79
|
"trustRuleSuggestion",
|
|
77
80
|
"proactiveArtifactDecision",
|
|
78
81
|
"proactiveArtifactBuild",
|
|
82
|
+
"homeGreeting",
|
|
83
|
+
"homeSuggestedPrompts",
|
|
79
84
|
]);
|
|
80
85
|
export type LLMCallSite = z.infer<typeof LLMCallSiteEnum>;
|
|
81
86
|
|
|
@@ -149,10 +154,18 @@ const TemperatureSchema = z.number().min(0).max(2).nullable();
|
|
|
149
154
|
// defaulted (`ThinkingSchema`) and fragment (`ThinkingFragmentSchema`) views.
|
|
150
155
|
const ThinkingEnabledSchema = z.boolean();
|
|
151
156
|
const ThinkingStreamThinkingSchema = z.boolean();
|
|
157
|
+
// Gemini-style thinking depth knob. Maps to Gemini's `thinkingLevel`. Other
|
|
158
|
+
// providers (Anthropic, OpenRouter) ignore this field — they use `effort`
|
|
159
|
+
// instead to size reasoning. Optional with no default so the underlying
|
|
160
|
+
// provider can pick its own default (Gemini 3.x defaults to "medium").
|
|
161
|
+
export const THINKING_LEVELS = ["minimal", "low", "medium", "high"] as const;
|
|
162
|
+
export type ThinkingLevel = (typeof THINKING_LEVELS)[number];
|
|
163
|
+
const ThinkingLevelSchema = z.enum(THINKING_LEVELS);
|
|
152
164
|
|
|
153
165
|
const ThinkingSchema = z.object({
|
|
154
166
|
enabled: ThinkingEnabledSchema.default(true),
|
|
155
167
|
streamThinking: ThinkingStreamThinkingSchema.default(true),
|
|
168
|
+
level: ThinkingLevelSchema.optional(),
|
|
156
169
|
});
|
|
157
170
|
|
|
158
171
|
// Fragment view: every field optional, no defaults injected. Defining this
|
|
@@ -162,6 +175,7 @@ const ThinkingSchema = z.object({
|
|
|
162
175
|
const ThinkingFragmentSchema = z.object({
|
|
163
176
|
enabled: ThinkingEnabledSchema.optional(),
|
|
164
177
|
streamThinking: ThinkingStreamThinkingSchema.optional(),
|
|
178
|
+
level: ThinkingLevelSchema.optional(),
|
|
165
179
|
});
|
|
166
180
|
|
|
167
181
|
// Leaf primitives for context-overflow recovery.
|
|
@@ -194,6 +194,19 @@ export const MemoryV2ConfigSchema = z
|
|
|
194
194
|
.describe(
|
|
195
195
|
"Hours between scheduled consolidation runs that synthesize buffered memories into concept pages",
|
|
196
196
|
),
|
|
197
|
+
consolidation_max_buffer_lines: z
|
|
198
|
+
.number({
|
|
199
|
+
error: "memory.v2.consolidation_max_buffer_lines must be a number",
|
|
200
|
+
})
|
|
201
|
+
.int("memory.v2.consolidation_max_buffer_lines must be an integer")
|
|
202
|
+
.positive(
|
|
203
|
+
"memory.v2.consolidation_max_buffer_lines must be a positive integer",
|
|
204
|
+
)
|
|
205
|
+
.nullable()
|
|
206
|
+
.default(100)
|
|
207
|
+
.describe(
|
|
208
|
+
"Size-based trigger for consolidation. When `memory/buffer.md` reaches this many non-empty lines, consolidation runs even if the time-based interval hasn't elapsed. Defaults to 100. Set to `null` to disable the size trigger and rely solely on `consolidation_interval_hours`.",
|
|
209
|
+
),
|
|
197
210
|
max_page_chars: z
|
|
198
211
|
.number({ error: "memory.v2.max_page_chars must be a number" })
|
|
199
212
|
.int("memory.v2.max_page_chars must be an integer")
|
|
@@ -282,8 +295,61 @@ export const MemoryV2ConfigSchema = z
|
|
|
282
295
|
.describe(
|
|
283
296
|
"Optional path to a file whose contents replace the bundled router prompt. Absolute paths are used as-is, a leading `~/` is expanded to the home directory, otherwise the path is resolved under the workspace root. The loaded contents may include `{{ASSISTANT_NAME}}`, `{{USER_NAME}}`, and `{{PAGE_INDEX}}`, which are substituted at runtime. If the file is missing, unreadable, or empty, the bundled prompt is used and a warning is logged.",
|
|
284
297
|
),
|
|
298
|
+
batch_size: z
|
|
299
|
+
.number()
|
|
300
|
+
.int()
|
|
301
|
+
.min(1)
|
|
302
|
+
.nullable()
|
|
303
|
+
.default(null)
|
|
304
|
+
.describe(
|
|
305
|
+
"Target batch size for parallel page-index routing. `null` (default) sends the entire page index in one call — identical to v3 behavior. When set, pages are split into `ceil(N / batch_size)` batches by stable FNV-1a hash on slug (so adding/removing a single page only invalidates one batch's KV cache), routed in parallel, and the selected slugs are unioned. A failure in one batch does not abort the turn as long as at least one batch succeeds.",
|
|
306
|
+
),
|
|
307
|
+
tier1_size: z
|
|
308
|
+
.number()
|
|
309
|
+
.int()
|
|
310
|
+
.min(1)
|
|
311
|
+
.nullable()
|
|
312
|
+
.default(null)
|
|
313
|
+
.describe(
|
|
314
|
+
"Pool size for the tier-1 'recently modified' batch. `null` (default) disables tier 1 entirely — all pages flow through tier 3 batching. When set, the top-N concept pages by file mtime become their own dedicated parallel batch with mtime-desc ordering; everything else is partitioned into tier 3 batches by `batch_size`. Synthetic entries (skills, CLI commands) have mtime=0 and naturally rank below real concept pages so they don't crowd tier 1.",
|
|
315
|
+
),
|
|
316
|
+
tier2_size: z
|
|
317
|
+
.number()
|
|
318
|
+
.int()
|
|
319
|
+
.min(1)
|
|
320
|
+
.nullable()
|
|
321
|
+
.default(null)
|
|
322
|
+
.describe(
|
|
323
|
+
"Pool size for the tier-2 'useful' batch. `null` (default) disables tier 2 — pages skip straight from tier 1 to tier 3. When set, the top-M pages by injection-frequency EMA (excluding tier 1) become their own parallel batch ordered by score desc. Pages with score 0 (never selected since EMA tracking began) are ineligible for tier 2 and stay in tier 3 regardless of `tier2_size`. Score is the time-decayed sum `Σ exp(-λ(now - tᵢ))` with 3-day half-life, computed on read from `memory_v2_injection_events`.",
|
|
324
|
+
),
|
|
325
|
+
historical_pairs: z
|
|
326
|
+
.number()
|
|
327
|
+
.int()
|
|
328
|
+
.min(1)
|
|
329
|
+
.default(1)
|
|
330
|
+
.describe(
|
|
331
|
+
"Number of recent (assistant, user) turn pairs to render inside the router prompt's `<last_turn>` block. Each pair is the assistant's reply followed by the user message that came after; the most recent pair's user line is the just-arrived turn that triggered the router. `1` (default) shows only the prior assistant reply plus the current user message — bit-identical to pre-knob behavior. Higher values walk further back through conversation history to give the router more dialogue context at the cost of larger per-turn prompt size. Pairs are emitted in chronological order (oldest first).",
|
|
332
|
+
),
|
|
333
|
+
historical_pairs_max_chars: z
|
|
334
|
+
.number()
|
|
335
|
+
.int()
|
|
336
|
+
.min(1)
|
|
337
|
+
.nullable()
|
|
338
|
+
.default(null)
|
|
339
|
+
.describe(
|
|
340
|
+
"Optional character cap on the total message content rendered inside `<last_turn>`. `null` (default) means no limit — every message inside the configured `historical_pairs` window is included verbatim. When set, the router walks the assembled pairs newest-first; messages are included until the budget is exhausted, at which point the oldest still-includable message is front-truncated with a leading `…` marker. Older pairs whose content does not fit are dropped entirely. The cap counts message content only — framing characters (`[assistant]: `, `[user]: `, newlines) are not deducted from the budget. Set this when raising `historical_pairs` on workspaces with long messages so the router prompt stays bounded.",
|
|
341
|
+
),
|
|
342
|
+
})
|
|
343
|
+
.default({
|
|
344
|
+
enabled: true,
|
|
345
|
+
max_page_ids: 25,
|
|
346
|
+
router_prompt_path: null,
|
|
347
|
+
batch_size: null,
|
|
348
|
+
tier1_size: null,
|
|
349
|
+
tier2_size: null,
|
|
350
|
+
historical_pairs: 1,
|
|
351
|
+
historical_pairs_max_chars: null,
|
|
285
352
|
})
|
|
286
|
-
.default({ enabled: true, max_page_ids: 25, router_prompt_path: null })
|
|
287
353
|
.describe(
|
|
288
354
|
"LLM router configuration. When enabled, a single router LLM call replaces spreading activation for per-turn page selection.",
|
|
289
355
|
),
|
|
@@ -322,3 +388,230 @@ export const MemoryV2ConfigSchema = z
|
|
|
322
388
|
});
|
|
323
389
|
|
|
324
390
|
export type MemoryV2Config = z.infer<typeof MemoryV2ConfigSchema>;
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Per-lane system-prompt override for a v3 LLM call site. `override` is an
|
|
394
|
+
* inline prompt string (highest precedence); `path` points at a file whose
|
|
395
|
+
* contents replace the bundled prompt. Both default to `null` (use the bundled
|
|
396
|
+
* prompt). Shared by the filter, descent, and gate entries under
|
|
397
|
+
* `memory.v3.prompts`. The whole object is `.default(...)`-wrapped so an
|
|
398
|
+
* omitted lane parses to `{ override: null, path: null }`.
|
|
399
|
+
*/
|
|
400
|
+
const V3PromptOverrideSchema = z
|
|
401
|
+
.object({
|
|
402
|
+
override: z
|
|
403
|
+
.string({ error: "memory.v3.prompts.*.override must be a string" })
|
|
404
|
+
.nullable()
|
|
405
|
+
.default(null)
|
|
406
|
+
.describe(
|
|
407
|
+
"Optional inline system-prompt string that replaces the bundled prompt for this lane. Takes precedence over `path`. An empty or whitespace-only string is ignored (falls back to `path` / bundled).",
|
|
408
|
+
),
|
|
409
|
+
path: z
|
|
410
|
+
.string({ error: "memory.v3.prompts.*.path must be a string" })
|
|
411
|
+
.nullable()
|
|
412
|
+
.default(null)
|
|
413
|
+
.describe(
|
|
414
|
+
"Optional path to a file whose contents replace the bundled prompt for this lane. Absolute paths are used as-is, a leading `~/` expands to the home directory, otherwise the path resolves under the workspace root. If the file is missing, unreadable, or empty, the bundled prompt is used and a warning is logged.",
|
|
415
|
+
),
|
|
416
|
+
})
|
|
417
|
+
.default({ override: null, path: null });
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Memory v3 (multi-lane, bounded-descent retrieval) configuration.
|
|
421
|
+
*
|
|
422
|
+
* Additive scaffolding only — defaults to `enabled: false` so existing
|
|
423
|
+
* configs are untouched and the v3 retrieval loop stays inert until later
|
|
424
|
+
* PRs wire it up. Every field carries a default and the whole block is
|
|
425
|
+
* `.default(...)`-wrapped so a config that omits `memory.v3` entirely still
|
|
426
|
+
* parses to these documented defaults.
|
|
427
|
+
*/
|
|
428
|
+
export const MemoryV3ConfigSchema = z
|
|
429
|
+
.object({
|
|
430
|
+
enabled: z
|
|
431
|
+
.boolean({ error: "memory.v3.enabled must be a boolean" })
|
|
432
|
+
.default(false)
|
|
433
|
+
.describe(
|
|
434
|
+
"Whether the v3 memory subsystem (multi-lane bounded-descent retrieval) is enabled. Off by default until the v3 loop is wired up.",
|
|
435
|
+
),
|
|
436
|
+
shadow: z
|
|
437
|
+
.boolean({ error: "memory.v3.shadow must be a boolean" })
|
|
438
|
+
.default(false)
|
|
439
|
+
.describe(
|
|
440
|
+
"Live-shadow toggle: when on, the v3 retrieval loop runs alongside the active path for comparison without affecting injected context. Consumed by a later PR.",
|
|
441
|
+
),
|
|
442
|
+
passCap: z
|
|
443
|
+
.number({ error: "memory.v3.passCap must be a number" })
|
|
444
|
+
.int("memory.v3.passCap must be an integer")
|
|
445
|
+
.default(3)
|
|
446
|
+
.describe(
|
|
447
|
+
"Maximum number of retrieval passes (router → descent rounds) the v3 loop may run per turn.",
|
|
448
|
+
),
|
|
449
|
+
breadthBudget: z
|
|
450
|
+
.number({ error: "memory.v3.breadthBudget must be a number" })
|
|
451
|
+
.int("memory.v3.breadthBudget must be an integer")
|
|
452
|
+
.default(6)
|
|
453
|
+
.describe(
|
|
454
|
+
"Per-pass breadth budget — the number of frontier candidates the v3 loop may expand at each step.",
|
|
455
|
+
),
|
|
456
|
+
maxDepth: z
|
|
457
|
+
.number({ error: "memory.v3.maxDepth must be a number" })
|
|
458
|
+
.int("memory.v3.maxDepth must be an integer")
|
|
459
|
+
.default(6)
|
|
460
|
+
.describe(
|
|
461
|
+
"Maximum descent depth the v3 loop traverses through the memory tree before stopping.",
|
|
462
|
+
),
|
|
463
|
+
denseQuota: z
|
|
464
|
+
.object({
|
|
465
|
+
activeDomain: z
|
|
466
|
+
.number({
|
|
467
|
+
error: "memory.v3.denseQuota.activeDomain must be a number",
|
|
468
|
+
})
|
|
469
|
+
.describe(
|
|
470
|
+
"Dense-lane candidate quota allocated to the conversation's active domain.",
|
|
471
|
+
),
|
|
472
|
+
offDomain: z
|
|
473
|
+
.number({ error: "memory.v3.denseQuota.offDomain must be a number" })
|
|
474
|
+
.describe(
|
|
475
|
+
"Dense-lane candidate quota allocated to off-domain (exploratory) retrieval.",
|
|
476
|
+
),
|
|
477
|
+
})
|
|
478
|
+
.default({ activeDomain: 30, offDomain: 8 })
|
|
479
|
+
.describe(
|
|
480
|
+
"Dense-lane candidate quotas split between the active domain and off-domain exploration.",
|
|
481
|
+
),
|
|
482
|
+
hotLimit: z
|
|
483
|
+
.number({ error: "memory.v3.hotLimit must be a number" })
|
|
484
|
+
.int("memory.v3.hotLimit must be an integer")
|
|
485
|
+
.positive("memory.v3.hotLimit must be positive")
|
|
486
|
+
.default(50)
|
|
487
|
+
.describe(
|
|
488
|
+
"Top-N cap on the hot scout lane, ranked by injection-frequency EMA. Hot hits are sticky (kept past the gate), so this bounds how many always-on pages the lane forces into the selection. Without a cap a mature corpus — where nearly every page has been injected at some point — surfaces the entire corpus.",
|
|
489
|
+
),
|
|
490
|
+
lanes: z
|
|
491
|
+
.object({
|
|
492
|
+
hot: z
|
|
493
|
+
.boolean()
|
|
494
|
+
.default(true)
|
|
495
|
+
.describe("Whether the hot (recently-touched) retrieval lane is on."),
|
|
496
|
+
sparse: z
|
|
497
|
+
.boolean()
|
|
498
|
+
.default(true)
|
|
499
|
+
.describe("Whether the sparse (BM25-style keyword) lane is on."),
|
|
500
|
+
dense: z
|
|
501
|
+
.boolean()
|
|
502
|
+
.default(true)
|
|
503
|
+
.describe("Whether the dense (embedding-similarity) lane is on."),
|
|
504
|
+
tree: z
|
|
505
|
+
.boolean()
|
|
506
|
+
.default(true)
|
|
507
|
+
.describe("Whether the tree (hierarchical descent) lane is on."),
|
|
508
|
+
edges: z
|
|
509
|
+
.boolean()
|
|
510
|
+
.default(true)
|
|
511
|
+
.describe("Whether the edges (graph-adjacency) lane is on."),
|
|
512
|
+
})
|
|
513
|
+
.default({
|
|
514
|
+
hot: true,
|
|
515
|
+
sparse: true,
|
|
516
|
+
dense: true,
|
|
517
|
+
tree: true,
|
|
518
|
+
edges: true,
|
|
519
|
+
})
|
|
520
|
+
.describe(
|
|
521
|
+
"Per-lane on/off toggles for the v3 multi-lane retrieval fanout. All lanes on by default.",
|
|
522
|
+
),
|
|
523
|
+
ks: z
|
|
524
|
+
.array(z.number({ error: "memory.v3.ks entries must be numbers" }))
|
|
525
|
+
.default([5, 10, 25, 50])
|
|
526
|
+
.describe(
|
|
527
|
+
"Evaluation top-K cutoffs the v3 loop reports metrics at (e.g. recall@K).",
|
|
528
|
+
),
|
|
529
|
+
write: z
|
|
530
|
+
.object({
|
|
531
|
+
enabled: z
|
|
532
|
+
.boolean({ error: "memory.v3.write.enabled must be a boolean" })
|
|
533
|
+
.default(false)
|
|
534
|
+
.describe(
|
|
535
|
+
"Whether v3 consolidation owns the shared-buffer drain + tree build. Off by default — v2 consolidation stays the sole buffer-drainer. Does NOT introduce a separate buffer.",
|
|
536
|
+
),
|
|
537
|
+
consolidateIntervalMs: z
|
|
538
|
+
.number({
|
|
539
|
+
error: "memory.v3.write.consolidateIntervalMs must be a number",
|
|
540
|
+
})
|
|
541
|
+
.int("memory.v3.write.consolidateIntervalMs must be an integer")
|
|
542
|
+
.positive("memory.v3.write.consolidateIntervalMs must be positive")
|
|
543
|
+
.default(3600000)
|
|
544
|
+
.describe(
|
|
545
|
+
"Interval, in milliseconds, between scheduled v3 consolidation runs once the v3 write path owns the drain. Default 1 hour.",
|
|
546
|
+
),
|
|
547
|
+
coactivation: z
|
|
548
|
+
.boolean({ error: "memory.v3.write.coactivation must be a boolean" })
|
|
549
|
+
.default(false)
|
|
550
|
+
.describe(
|
|
551
|
+
"Whether v3 consolidation learns co-activation edges during the tree build. Off by default; consumed by a later PR.",
|
|
552
|
+
),
|
|
553
|
+
})
|
|
554
|
+
.default({
|
|
555
|
+
enabled: false,
|
|
556
|
+
consolidateIntervalMs: 3600000,
|
|
557
|
+
coactivation: false,
|
|
558
|
+
})
|
|
559
|
+
.describe(
|
|
560
|
+
"Memory v3 write-path configuration. All default-off scaffolding — controls whether v3 consolidation owns the shared-buffer drain + tree build. Consumed by later PRs.",
|
|
561
|
+
),
|
|
562
|
+
prompts: z
|
|
563
|
+
.object({
|
|
564
|
+
filter: V3PromptOverrideSchema.describe(
|
|
565
|
+
"Override for the dense-hit filter lane's system prompt.",
|
|
566
|
+
),
|
|
567
|
+
descent: V3PromptOverrideSchema.describe(
|
|
568
|
+
"Override for the tree-walk descent driver's system prompt.",
|
|
569
|
+
),
|
|
570
|
+
gate: V3PromptOverrideSchema.describe(
|
|
571
|
+
"Override for the selection gate's system prompt.",
|
|
572
|
+
),
|
|
573
|
+
})
|
|
574
|
+
.default({
|
|
575
|
+
filter: { override: null, path: null },
|
|
576
|
+
descent: { override: null, path: null },
|
|
577
|
+
gate: { override: null, path: null },
|
|
578
|
+
})
|
|
579
|
+
.describe(
|
|
580
|
+
"Per-lane system-prompt overrides for the three v3 LLM call sites (filter, descent, gate). Each entry takes an inline `override` string (highest precedence) and/or a file `path` whose contents replace the bundled prompt; absolute paths are used as-is, a leading `~/` expands to the home directory, otherwise the path resolves under the workspace root. An empty/whitespace inline override or a missing/unreadable/empty file falls back to the bundled prompt. Lets the prompts be iterated at runtime without a rebuild/restart — mirroring `memory.v2.router.router_prompt_path`.",
|
|
581
|
+
),
|
|
582
|
+
gateCandidateSummaries: z
|
|
583
|
+
.boolean({
|
|
584
|
+
error: "memory.v3.gateCandidateSummaries must be a boolean",
|
|
585
|
+
})
|
|
586
|
+
.default(false)
|
|
587
|
+
.describe(
|
|
588
|
+
"When true, the selection gate sees each candidate as `slug — summary` instead of the bare slug, so it can judge relevance on page content. Off by default: with the bundled (precision-leaning) gate prompt this makes the gate more selective. It pays off paired with a recall-leaning gate prompt override, where the summaries let the gate recognize non-obvious associative/emotional matches it would otherwise pass over. Adds the candidate summaries to the gate prompt (larger input).",
|
|
589
|
+
),
|
|
590
|
+
})
|
|
591
|
+
.default({
|
|
592
|
+
enabled: false,
|
|
593
|
+
shadow: false,
|
|
594
|
+
passCap: 3,
|
|
595
|
+
breadthBudget: 6,
|
|
596
|
+
maxDepth: 6,
|
|
597
|
+
denseQuota: { activeDomain: 30, offDomain: 8 },
|
|
598
|
+
hotLimit: 50,
|
|
599
|
+
lanes: { hot: true, sparse: true, dense: true, tree: true, edges: true },
|
|
600
|
+
ks: [5, 10, 25, 50],
|
|
601
|
+
write: {
|
|
602
|
+
enabled: false,
|
|
603
|
+
consolidateIntervalMs: 3600000,
|
|
604
|
+
coactivation: false,
|
|
605
|
+
},
|
|
606
|
+
prompts: {
|
|
607
|
+
filter: { override: null, path: null },
|
|
608
|
+
descent: { override: null, path: null },
|
|
609
|
+
gate: { override: null, path: null },
|
|
610
|
+
},
|
|
611
|
+
gateCandidateSummaries: false,
|
|
612
|
+
})
|
|
613
|
+
.describe(
|
|
614
|
+
"Memory v3 — multi-lane bounded-descent retrieval. Additive scaffolding, disabled by default.",
|
|
615
|
+
);
|
|
616
|
+
|
|
617
|
+
export type MemoryV3Config = z.infer<typeof MemoryV3ConfigSchema>;
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
MemorySegmentationConfigSchema,
|
|
17
17
|
QdrantConfigSchema,
|
|
18
18
|
} from "./memory-storage.js";
|
|
19
|
-
import { MemoryV2ConfigSchema } from "./memory-v2.js";
|
|
19
|
+
import { MemoryV2ConfigSchema, MemoryV3ConfigSchema } from "./memory-v2.js";
|
|
20
20
|
|
|
21
21
|
export const MemoryConfigSchema = z
|
|
22
22
|
.object({
|
|
@@ -50,6 +50,7 @@ export const MemoryConfigSchema = z
|
|
|
50
50
|
MemorySummarizationConfigSchema.parse({}),
|
|
51
51
|
),
|
|
52
52
|
v2: MemoryV2ConfigSchema.default(MemoryV2ConfigSchema.parse({})),
|
|
53
|
+
v3: MemoryV3ConfigSchema.default(MemoryV3ConfigSchema.parse({})),
|
|
53
54
|
retrospective: MemoryRetrospectiveConfigSchema.default(
|
|
54
55
|
MemoryRetrospectiveConfigSchema.parse({}),
|
|
55
56
|
),
|