@vellumai/assistant 0.8.0 → 0.8.1
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/AGENTS.md +11 -0
- package/Dockerfile +5 -4
- package/README.md +2 -2
- package/docker-entrypoint.sh +16 -0
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
- package/eslint-rules/cli-no-daemon-internals.js +283 -0
- package/eslint.config.mjs +12 -0
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/openapi.yaml +4847 -1698
- package/package.json +3 -1
- package/scripts/generate-openapi.ts +52 -4
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +107 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/anthropic-provider.test.ts +92 -2
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/avatar-identity-sync.test.ts +87 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +1 -0
- package/src/__tests__/call-site-routing-provider.test.ts +172 -45
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
- package/src/__tests__/channel-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
- package/src/__tests__/config-loader-backfill.test.ts +526 -102
- package/src/__tests__/config-loader-corrupt.test.ts +68 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +14 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +198 -0
- package/src/__tests__/config-watcher.test.ts +6 -0
- package/src/__tests__/contacts-tools.test.ts +51 -199
- package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
- package/src/__tests__/context-search-agent-runner.test.ts +22 -138
- package/src/__tests__/context-search-conversations-source.test.ts +42 -16
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -3
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-window-manager.test.ts +389 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +38 -0
- package/src/__tests__/conversation-fork-crud.test.ts +241 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +14 -14
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
- package/src/__tests__/conversation-lifecycle.test.ts +124 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +21 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +4 -4
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/credential-security-invariants.test.ts +5 -6
- package/src/__tests__/daemon-credential-client.test.ts +56 -1
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
- package/src/__tests__/db-proxy-transaction.test.ts +206 -0
- package/src/__tests__/external-plugin-loader.test.ts +458 -0
- package/src/__tests__/filing-service.test.ts +23 -3
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -8
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/history-repair.test.ts +89 -0
- package/src/__tests__/host-app-control-proxy.test.ts +109 -1
- package/src/__tests__/host-app-control-routes.test.ts +247 -1
- package/src/__tests__/host-browser-proxy.test.ts +416 -20
- package/src/__tests__/host-browser-routes.test.ts +325 -33
- package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +154 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +398 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +236 -0
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +2 -2
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +15 -0
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +146 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +188 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +124 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/managed-profile-guard.test.ts +131 -2
- package/src/__tests__/mcp-auth-routes.test.ts +1 -0
- package/src/__tests__/mcp-cli.test.ts +182 -220
- package/src/__tests__/mcp-health-check.test.ts +56 -27
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -2009
- package/src/__tests__/oauth-commands-routes.test.ts +711 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-responses-cutover-guard.test.ts +33 -12
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/plugin-bootstrap.test.ts +31 -2
- package/src/__tests__/plugin-route-contribution.test.ts +31 -3
- package/src/__tests__/plugin-tool-contribution.test.ts +31 -3
- package/src/__tests__/plugin-types.test.ts +13 -11
- package/src/__tests__/process-message-background-slack.test.ts +46 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +12 -4
- package/src/__tests__/provider-registry-ollama.test.ts +12 -4
- package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
- package/src/__tests__/relay-server.test.ts +118 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +104 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
- package/src/__tests__/scheduler-recurrence.test.ts +87 -34
- package/src/__tests__/scheduler-reuse-conversation.test.ts +161 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
- package/src/__tests__/shell-credential-ref.test.ts +95 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skill-load-tool.test.ts +2 -4
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/update-bulletin-job.test.ts +96 -193
- package/src/__tests__/usage-cli.test.ts +11 -73
- package/src/__tests__/user-plugin-loader.test.ts +145 -0
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +86 -0
- package/src/__tests__/web-search.test.ts +303 -2
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +58 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +191 -0
- package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
- package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
- package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
- package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
- package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
- package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
- package/src/acp/__tests__/helpers/which-stub.ts +4 -2
- package/src/acp/resolve-agent.test.ts +25 -0
- package/src/acp/resolve-agent.ts +13 -2
- package/src/acp/session-manager.ts +14 -0
- package/src/approvals/guardian-request-resolvers.ts +32 -87
- package/src/calls/relay-server.ts +35 -0
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +23 -4
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +1 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -0
- package/src/cli/commands/__tests__/avatar.test.ts +540 -0
- package/src/cli/commands/__tests__/backup.test.ts +236 -776
- package/src/cli/commands/__tests__/cache.test.ts +1 -1
- package/src/cli/commands/__tests__/changelog.test.ts +593 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
- package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
- package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
- package/src/cli/commands/__tests__/email-core.test.ts +579 -0
- package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
- package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
- package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
- package/src/cli/commands/__tests__/skills.test.ts +563 -0
- package/src/cli/commands/__tests__/status.test.ts +249 -0
- package/src/cli/commands/__tests__/stt.test.ts +320 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
- package/src/cli/commands/__tests__/tts.test.ts +321 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
- package/src/cli/commands/attachment.ts +8 -3
- package/src/cli/commands/audit.ts +95 -64
- package/src/cli/commands/auth.ts +61 -58
- package/src/cli/commands/avatar.ts +276 -390
- package/src/cli/commands/backup.ts +409 -505
- package/src/cli/commands/bash.ts +9 -5
- package/src/cli/commands/browser.ts +28 -9
- package/src/cli/commands/cache.ts +9 -4
- package/src/cli/commands/changelog.ts +414 -0
- package/src/cli/commands/channel-verification-sessions.ts +238 -317
- package/src/cli/commands/clients.ts +8 -3
- package/src/cli/commands/completions.ts +9 -9
- package/src/cli/commands/config.ts +102 -72
- package/src/cli/commands/contacts.ts +575 -696
- package/src/cli/commands/conversations-defer.ts +17 -69
- package/src/cli/commands/conversations-import.ts +90 -253
- package/src/cli/commands/conversations.ts +346 -436
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- package/src/cli/commands/domain.ts +128 -206
- package/src/cli/commands/email.ts +606 -794
- package/src/cli/commands/gateway.ts +8 -1
- package/src/cli/commands/image-generation.ts +157 -205
- package/src/cli/commands/inference-providers.ts +352 -0
- package/src/cli/commands/inference-session.ts +415 -0
- package/src/cli/commands/inference.ts +87 -65
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.ts +103 -287
- package/src/cli/commands/memory-v2.ts +162 -516
- package/src/cli/commands/notifications.ts +33 -7
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +176 -297
- package/src/cli/commands/oauth/disconnect.ts +16 -215
- package/src/cli/commands/oauth/index.ts +49 -45
- package/src/cli/commands/oauth/mode.ts +43 -199
- package/src/cli/commands/oauth/ping.ts +17 -125
- package/src/cli/commands/oauth/providers.ts +732 -921
- package/src/cli/commands/oauth/request.ts +60 -350
- package/src/cli/commands/oauth/shared.ts +11 -121
- package/src/cli/commands/oauth/status.ts +31 -121
- package/src/cli/commands/oauth/token.ts +13 -55
- package/src/cli/commands/pending.ts +19 -10
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
- package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
- package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
- package/src/cli/commands/platform/connect.ts +16 -80
- package/src/cli/commands/platform/disconnect.ts +14 -112
- package/src/cli/commands/platform/index.ts +177 -246
- package/src/cli/commands/routes.ts +153 -336
- package/src/cli/commands/sequence.ts +316 -360
- package/src/cli/commands/skills.ts +449 -671
- package/src/cli/commands/status.ts +58 -37
- package/src/cli/commands/stt.ts +94 -262
- package/src/cli/commands/task.ts +14 -40
- package/src/cli/commands/trust.ts +8 -3
- package/src/cli/commands/tts.ts +162 -167
- package/src/cli/commands/ui.ts +35 -42
- package/src/cli/commands/usage.ts +188 -126
- package/src/cli/commands/watchers.ts +8 -3
- package/src/cli/commands/webhooks.ts +99 -193
- package/src/cli/lib/__tests__/register-command.test.ts +85 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- package/src/cli/lib/nested-value.ts +44 -0
- package/src/cli/lib/open-browser.ts +36 -0
- package/src/cli/lib/register-command.ts +19 -0
- package/src/cli/lib/time-ago.ts +34 -0
- package/src/cli/program.ts +2 -4
- package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
- package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
- package/src/cli/utils/conversation-id.ts +30 -0
- package/src/cli/utils/parse-duration.ts +41 -0
- package/src/config/acp-defaults.test.ts +5 -1
- package/src/config/acp-defaults.ts +11 -4
- package/src/config/bundled-skills/acp/TOOLS.json +2 -2
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- package/src/config/bundled-skills/contacts/SKILL.md +12 -45
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
- package/src/config/bundled-tool-registry.ts +0 -2
- package/src/config/feature-flag-registry.json +16 -0
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +76 -14
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +4 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
- package/src/config/schemas/call-site-catalog.ts +29 -7
- package/src/config/schemas/llm-request-logs.ts +57 -0
- package/src/config/schemas/llm.ts +52 -2
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +32 -1
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/window-manager.ts +191 -5
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +79 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +109 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +23 -29
- package/src/daemon/config-watcher.ts +2 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
- package/src/daemon/conversation-agent-loop.ts +127 -97
- package/src/daemon/conversation-error.ts +21 -0
- package/src/daemon/conversation-lifecycle.ts +46 -5
- package/src/daemon/conversation-process.ts +36 -19
- package/src/daemon/conversation-runtime-assembly.ts +14 -5
- package/src/daemon/conversation-slash.ts +175 -23
- package/src/daemon/conversation-store.ts +17 -10
- package/src/daemon/conversation-surfaces.ts +76 -12
- package/src/daemon/conversation-tool-setup.ts +24 -14
- package/src/daemon/conversation.ts +48 -9
- package/src/daemon/external-plugins-bootstrap.ts +18 -8
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +8 -126
- package/src/daemon/handlers/config-slack-channel.ts +10 -7
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/skills.ts +84 -5
- package/src/daemon/history-repair.ts +33 -6
- package/src/daemon/host-app-control-proxy.ts +44 -19
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +96 -35
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +42 -43
- package/src/daemon/meet-host-supervisor.ts +15 -15
- package/src/daemon/memory-v2-startup.ts +9 -2
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +12 -9
- package/src/daemon/message-types/messages.ts +9 -1
- package/src/daemon/message-types/sync.ts +60 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/process-message.ts +56 -23
- package/src/daemon/server.ts +23 -18
- package/src/daemon/shutdown-handlers.ts +0 -2
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/daemon/tool-side-effects.ts +6 -4
- package/src/daemon/wake-target-adapter.ts +11 -0
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +40 -53
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +359 -0
- package/src/heartbeat/heartbeat-run-store.ts +2 -1
- package/src/heartbeat/heartbeat-service.ts +148 -127
- package/src/home/__tests__/feed-types.test.ts +63 -131
- package/src/home/__tests__/feed-writer.test.ts +77 -278
- package/src/home/__tests__/post-connect-feed.test.ts +9 -12
- package/src/home/feed-types.ts +19 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +1 -3
- package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
- package/src/ipc/__tests__/email-ipc.test.ts +506 -0
- package/src/ipc/__tests__/exit-helper.test.ts +104 -0
- package/src/ipc/__tests__/streaming-client.test.ts +237 -0
- package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
- package/src/ipc/assistant-server.ts +55 -6
- package/src/ipc/cli-client.ts +370 -50
- package/src/ipc/routes/db-proxy-transaction.ts +151 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
- package/src/ipc/skill-routes/events.ts +30 -3
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
- package/src/live-voice/live-voice-session-manager.ts +11 -4
- package/src/live-voice/live-voice-session.ts +14 -6
- package/src/memory/__tests__/bookmark-crud.test.ts +258 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +213 -0
- package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
- package/src/memory/bookmark-crud.ts +179 -0
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
- package/src/memory/context-search/agent-protocol.ts +5 -1
- package/src/memory/context-search/agent-runner.ts +60 -85
- package/src/memory/context-search/limits.ts +1 -4
- package/src/memory/context-search/search.ts +23 -113
- package/src/memory/context-search/sources/conversations.ts +18 -6
- package/src/memory/context-search/sources/memory-v2.ts +39 -14
- package/src/memory/context-search/sources/memory.ts +7 -0
- package/src/memory/context-search/sources/workspace.ts +13 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +312 -10
- package/src/memory/conversation-queries.ts +9 -5
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.ts +2 -1
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +76 -5
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/tool-handlers.ts +17 -7
- package/src/memory/graph/tools.ts +44 -5
- package/src/memory/indexer.ts +17 -0
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +13 -15
- package/src/memory/jobs/embed-concept-page.ts +45 -9
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +52 -3
- package/src/memory/llm-request-log-source-clickhouse.ts +317 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +97 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/memory-retrospective-constants.ts +13 -0
- package/src/memory/memory-retrospective-enqueue.ts +114 -0
- package/src/memory/memory-retrospective-job.ts +351 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +108 -0
- package/src/memory/memory-retrospective-state.ts +162 -0
- package/src/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/memory/memory-v2-activation-log-store.ts +49 -5
- package/src/memory/memory-v2-concept-frequency.ts +4 -0
- package/src/memory/message-content.ts +38 -1
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
- package/src/memory/migrations/229-delete-private-conversations.test.ts +70 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +12 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
- package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
- package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
- package/src/memory/migrations/242-message-bookmarks.ts +38 -0
- package/src/memory/migrations/243-provider-connections.ts +68 -0
- package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
- package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
- package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
- package/src/memory/migrations/index.ts +7 -0
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/schema/bookmarks.ts +38 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +29 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +1 -4
- package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
- package/src/memory/v2/__tests__/activation.test.ts +11 -4
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
- package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
- package/src/memory/v2/__tests__/injection.test.ts +628 -10
- package/src/memory/v2/__tests__/migration.test.ts +7 -3
- package/src/memory/v2/__tests__/page-index.test.ts +277 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +257 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +72 -0
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +516 -0
- package/src/memory/v2/__tests__/sim.test.ts +45 -1
- package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
- package/src/memory/v2/__tests__/static-context.test.ts +7 -22
- package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
- package/src/memory/v2/activation-store.ts +34 -5
- package/src/memory/v2/activation.ts +40 -27
- package/src/memory/v2/backfill-jobs.ts +17 -84
- package/src/memory/v2/consolidation-job.ts +85 -78
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +440 -109
- package/src/memory/v2/migration.ts +117 -20
- package/src/memory/v2/page-index.ts +191 -0
- package/src/memory/v2/page-store.ts +3 -0
- package/src/memory/v2/prompts/consolidation.ts +9 -7
- package/src/memory/v2/prompts/router.ts +192 -0
- package/src/memory/v2/qdrant.ts +100 -87
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +322 -0
- package/src/memory/v2/sim.ts +25 -12
- package/src/memory/v2/skill-store.ts +118 -29
- package/src/memory/v2/static-context.ts +16 -9
- package/src/memory/v2/sweep-job.ts +122 -96
- package/src/memory/v2/types.ts +10 -6
- package/src/memory/validation.ts +13 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
- package/src/notifications/__tests__/signal-registry.test.ts +17 -0
- package/src/notifications/adapters/platform.ts +171 -0
- package/src/notifications/conversation-pairing.ts +2 -2
- package/src/notifications/copy-composer.ts +15 -0
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +28 -1
- package/src/notifications/home-feed-side-effect.ts +111 -0
- package/src/notifications/signal.ts +5 -0
- package/src/permissions/checker.ts +12 -0
- package/src/permissions/ipc-risk-types.ts +2 -0
- package/src/plugin-api/index.ts +13 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +62 -0
- package/src/plugins/defaults/injectors.ts +19 -3
- package/src/plugins/external-plugin-loader.ts +294 -0
- package/src/plugins/types.ts +46 -30
- package/src/plugins/user-loader.ts +64 -41
- package/src/proactive-artifact/job.test.ts +12 -4
- package/src/proactive-artifact/job.ts +4 -0
- package/src/proactive-artifact/trigger-state.test.ts +9 -0
- package/src/proactive-artifact/trigger-state.ts +4 -0
- package/src/prompts/__tests__/system-prompt.test.ts +105 -0
- package/src/prompts/system-prompt.ts +22 -1
- package/src/prompts/update-bulletin-job.ts +61 -73
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
- package/src/providers/__tests__/inference.test.ts +288 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +14 -32
- package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
- package/src/providers/anthropic/client.ts +95 -26
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +163 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +173 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +356 -0
- package/src/providers/inference/resolve-auth.ts +65 -0
- package/src/providers/model-catalog.ts +104 -6
- package/src/providers/openai/responses-provider.ts +4 -2
- package/src/providers/provider-env-vars.ts +17 -7
- package/src/providers/provider-secret-catalog.ts +49 -30
- package/src/providers/provider-send-message.ts +41 -20
- package/src/providers/registry.ts +143 -159
- package/src/providers/retry.ts +18 -10
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
- package/src/runtime/actor-trust-resolver.ts +32 -10
- package/src/runtime/agent-wake.ts +35 -6
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +303 -8
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +1 -0
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +2 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/pre-first-message-gate.ts +83 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +251 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +315 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +189 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
- package/src/runtime/routes/acp-routes.ts +10 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +0 -18
- package/src/runtime/routes/audit-routes.ts +43 -0
- package/src/runtime/routes/auth-routes.ts +72 -0
- package/src/runtime/routes/avatar-routes.ts +273 -20
- package/src/runtime/routes/backup-routes.ts +406 -2
- package/src/runtime/routes/bookmark-routes.ts +154 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +192 -0
- package/src/runtime/routes/conversation-management-routes.ts +30 -43
- package/src/runtime/routes/conversation-query-routes.ts +334 -86
- package/src/runtime/routes/conversation-routes.ts +31 -10
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- package/src/runtime/routes/domain-routes.ts +167 -0
- package/src/runtime/routes/email-routes.ts +603 -0
- package/src/runtime/routes/errors.ts +2 -2
- package/src/runtime/routes/events-routes.ts +192 -0
- package/src/runtime/routes/home-feed-routes.ts +6 -78
- package/src/runtime/routes/host-app-control-routes.ts +44 -2
- package/src/runtime/routes/host-browser-routes.ts +103 -22
- package/src/runtime/routes/http-adapter.ts +2 -0
- package/src/runtime/routes/identity-routes.ts +5 -0
- package/src/runtime/routes/image-generation-routes.ts +99 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +137 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +87 -7
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
- package/src/runtime/routes/index.ts +36 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +312 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +98 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +317 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/twilio.ts +1 -0
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-v2-routes.ts +13 -398
- package/src/runtime/routes/notification-routes.ts +2 -0
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1007 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- package/src/runtime/routes/oauth-providers.ts +298 -8
- package/src/runtime/routes/platform-routes.ts +336 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -1
- package/src/runtime/routes/playground/reset-circuit.ts +2 -1
- package/src/runtime/routes/playground/state.ts +2 -1
- package/src/runtime/routes/publish-routes.ts +221 -0
- package/src/runtime/routes/schedule-routes.ts +82 -0
- package/src/runtime/routes/sequence-routes.ts +291 -0
- package/src/runtime/routes/settings-routes.ts +2 -10
- package/src/runtime/routes/skills-routes.ts +31 -1
- package/src/runtime/routes/stt-routes.ts +240 -3
- package/src/runtime/routes/surface-action-routes.ts +43 -7
- package/src/runtime/routes/tts-routes.ts +67 -0
- package/src/runtime/routes/types.ts +32 -0
- package/src/runtime/routes/user-routes-cli.ts +243 -0
- package/src/runtime/routes/webhook-routes.ts +165 -0
- package/src/runtime/sync/resource-sync-events.ts +25 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/scheduler.ts +200 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/secret-patterns.ts +3 -0
- package/src/sequence/engine.ts +38 -40
- package/src/subagent/manager.ts +20 -15
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +15 -4
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
- package/src/tools/browser/cdp-client/factory.ts +66 -5
- package/src/tools/browser/runtime-check.ts +77 -0
- package/src/tools/memory/register.test.ts +3 -3
- package/src/tools/memory/register.ts +9 -1
- package/src/tools/network/__tests__/web-search.test.ts +156 -0
- package/src/tools/network/web-search.ts +280 -37
- package/src/tools/permission-checker.ts +13 -5
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/terminal/shell.ts +44 -0
- package/src/usage/attribution.ts +3 -2
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +301 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +90 -90
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
- package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +28 -4
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +104 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +93 -0
- package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
- package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
- package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
- package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
- package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
- package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
- package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
- package/src/workspace/migrations/registry.ts +22 -0
- package/src/workspace/migrations/runner.ts +13 -2
- package/src/workspace/migrations/types.ts +13 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -498
- package/src/__tests__/credentials-cli.test.ts +0 -1225
- package/src/__tests__/memory-admin-recall.test.ts +0 -213
- package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
- package/src/cli/commands/__tests__/email-download.test.ts +0 -260
- package/src/cli/commands/__tests__/email-list.test.ts +0 -216
- package/src/cli/commands/__tests__/email-register.test.ts +0 -186
- package/src/cli/commands/__tests__/email-send.test.ts +0 -416
- package/src/cli/commands/__tests__/email-status.test.ts +0 -185
- package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
- package/src/cli/commands/__tests__/routes.test.ts +0 -562
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
- package/src/cli/commands/autonomy.ts +0 -365
- package/src/cli/commands/memory.ts +0 -424
- package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
- package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
- package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
- package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
- package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
- package/src/cli/lib/daemon-avatar-client.ts +0 -37
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
- package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
- package/src/home/__tests__/emit-feed-event.test.ts +0 -169
- package/src/home/__tests__/feed-population-integration.test.ts +0 -312
- package/src/home/__tests__/feed-scheduler.test.ts +0 -222
- package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
- package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
- package/src/home/__tests__/rollup-producer.test.ts +0 -507
- package/src/home/assistant-feed-authoring.ts +0 -135
- package/src/home/emit-feed-event.ts +0 -169
- package/src/home/feed-scheduler.ts +0 -281
- package/src/home/platform-gmail-digest.ts +0 -163
- package/src/home/rewrite-command-preview.ts +0 -66
- package/src/home/rewrite-feed-title.ts +0 -58
- package/src/home/rollup-producer.ts +0 -426
- package/src/memory/admin.ts +0 -326
- package/src/memory/context-search/sources/pkb.ts +0 -476
- package/src/memory/graph/compaction.ts +0 -299
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memory v2 route definitions — backfill
|
|
3
|
-
*
|
|
4
|
-
* Migrated from `ipc/routes/memory-v2-backfill.ts` and
|
|
5
|
-
* `ipc/routes/memory-v2-validate.ts` into the shared ROUTES array.
|
|
2
|
+
* Memory v2 route definitions — backfill, validate, concept-page reads,
|
|
3
|
+
* reembed-skills, and the activation-log concept-frequency aggregator.
|
|
6
4
|
*/
|
|
7
5
|
import { stat } from "node:fs/promises";
|
|
8
6
|
import { join } from "node:path";
|
|
@@ -10,16 +8,6 @@ import { join } from "node:path";
|
|
|
10
8
|
import { z } from "zod";
|
|
11
9
|
|
|
12
10
|
import { loadConfig } from "../../config/loader.js";
|
|
13
|
-
import {
|
|
14
|
-
applyCorrectionIfCalibrated,
|
|
15
|
-
explainedVarianceRatio,
|
|
16
|
-
fitAnisotropyCalibration,
|
|
17
|
-
saveCalibration,
|
|
18
|
-
} from "../../memory/anisotropy.js";
|
|
19
|
-
import {
|
|
20
|
-
embedWithBackend,
|
|
21
|
-
selectEmbeddingBackend,
|
|
22
|
-
} from "../../memory/embedding-backend.js";
|
|
23
11
|
import {
|
|
24
12
|
enqueueMemoryJob,
|
|
25
13
|
type MemoryJobType,
|
|
@@ -39,17 +27,7 @@ import {
|
|
|
39
27
|
readPage,
|
|
40
28
|
renderPageContent,
|
|
41
29
|
} from "../../memory/v2/page-store.js";
|
|
42
|
-
import {
|
|
43
|
-
hybridQueryConceptPages,
|
|
44
|
-
sampleConceptPageDenseVectors,
|
|
45
|
-
} from "../../memory/v2/qdrant.js";
|
|
46
|
-
import { effectiveWeights } from "../../memory/v2/sim.js";
|
|
47
30
|
import { seedV2SkillEntries } from "../../memory/v2/skill-store.js";
|
|
48
|
-
import {
|
|
49
|
-
generateBm25QueryEmbedding,
|
|
50
|
-
getConceptPageCorpusStats,
|
|
51
|
-
rebuildConceptPageCorpusStats,
|
|
52
|
-
} from "../../memory/v2/sparse-bm25.js";
|
|
53
31
|
import { getLogger } from "../../util/logger.js";
|
|
54
32
|
import { getWorkspaceDir } from "../../util/platform.js";
|
|
55
33
|
import { RouteError } from "./errors.js";
|
|
@@ -132,7 +110,11 @@ export type MemoryV2ValidateResult = {
|
|
|
132
110
|
async function handleValidate({
|
|
133
111
|
body = {},
|
|
134
112
|
}: RouteHandlerArgs): Promise<MemoryV2ValidateResult> {
|
|
135
|
-
|
|
113
|
+
// Intentionally NOT gated on `memory.v2.enabled`. Validate is a read-only
|
|
114
|
+
// diagnostic walk over the on-disk concept-page workspace and must be
|
|
115
|
+
// runnable before flipping the flag — operators (and the
|
|
116
|
+
// vellum-memory-v2-migration skill) use it as the final dry-run check
|
|
117
|
+
// immediately before enabling v2.
|
|
136
118
|
MemoryV2ValidateParams.parse(body);
|
|
137
119
|
|
|
138
120
|
const workspaceDir = getWorkspaceDir();
|
|
@@ -148,7 +130,7 @@ async function handleValidate({
|
|
|
148
130
|
const page = await readPage(workspaceDir, slug);
|
|
149
131
|
if (!page) continue;
|
|
150
132
|
knownSlugs.add(slug);
|
|
151
|
-
const chars =
|
|
133
|
+
const chars = page.body.length;
|
|
152
134
|
if (chars > maxPageChars) {
|
|
153
135
|
oversizedPages.push({ slug, chars });
|
|
154
136
|
}
|
|
@@ -265,41 +247,6 @@ async function handleListConceptPages({
|
|
|
265
247
|
return { pages };
|
|
266
248
|
}
|
|
267
249
|
|
|
268
|
-
// ── Rebuild BM25 corpus stats ───────────────────────────────────────────
|
|
269
|
-
|
|
270
|
-
const MemoryV2RebuildCorpusStatsParams = z.object({}).strict();
|
|
271
|
-
|
|
272
|
-
export interface MemoryV2RebuildCorpusStatsResult {
|
|
273
|
-
totalDocs: number;
|
|
274
|
-
avgDl: number;
|
|
275
|
-
/** Number of distinct hashed-token buckets that received any DF count. */
|
|
276
|
-
vocabularyBuckets: number;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
async function handleRebuildCorpusStats({
|
|
280
|
-
body = {},
|
|
281
|
-
}: RouteHandlerArgs): Promise<MemoryV2RebuildCorpusStatsResult> {
|
|
282
|
-
requireMemoryV2Enabled();
|
|
283
|
-
MemoryV2RebuildCorpusStatsParams.parse(body);
|
|
284
|
-
const workspaceDir = getWorkspaceDir();
|
|
285
|
-
await rebuildConceptPageCorpusStats(workspaceDir);
|
|
286
|
-
const stats = getConceptPageCorpusStats();
|
|
287
|
-
if (!stats) {
|
|
288
|
-
// The rebuild always swaps in a non-null table on success, so a missing
|
|
289
|
-
// value here means an unexpected reset between rebuild and read.
|
|
290
|
-
throw new RouteError(
|
|
291
|
-
"Corpus stats rebuild completed but no table is loaded",
|
|
292
|
-
"MEMORY_V2_CORPUS_STATS_MISSING",
|
|
293
|
-
500,
|
|
294
|
-
);
|
|
295
|
-
}
|
|
296
|
-
return {
|
|
297
|
-
totalDocs: stats.totalDocs,
|
|
298
|
-
avgDl: stats.avgDl,
|
|
299
|
-
vocabularyBuckets: stats.df.size,
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
|
|
303
250
|
// ── Reembed skills ──────────────────────────────────────────────────────
|
|
304
251
|
|
|
305
252
|
const MemoryV2ReembedSkillsParams = z.object({}).strict();
|
|
@@ -316,226 +263,14 @@ async function handleReembedSkills({
|
|
|
316
263
|
|
|
317
264
|
// Unlike the queued backfill jobs above, this is a CLI-driven sync
|
|
318
265
|
// request: the operator wants the cache replaced before the next prompt
|
|
319
|
-
// assembly, so we await the seed inline rather than enqueueing it.
|
|
320
|
-
|
|
266
|
+
// assembly, so we await the seed inline rather than enqueueing it. Pass
|
|
267
|
+
// `throwOnError` so embedding/Qdrant failures surface to the CLI instead
|
|
268
|
+
// of being swallowed by the default best-effort behavior.
|
|
269
|
+
await seedV2SkillEntries({ throwOnError: true });
|
|
321
270
|
|
|
322
271
|
return { success: true };
|
|
323
272
|
}
|
|
324
273
|
|
|
325
|
-
// ── Explain similarity ──────────────────────────────────────────────────
|
|
326
|
-
|
|
327
|
-
const MemoryV2ExplainSimilarityParams = z
|
|
328
|
-
.object({
|
|
329
|
-
userText: z.string().min(1),
|
|
330
|
-
assistantText: z.string().optional(),
|
|
331
|
-
nowText: z.string().optional(),
|
|
332
|
-
top: z.number().int().min(1).default(25),
|
|
333
|
-
})
|
|
334
|
-
.strict();
|
|
335
|
-
|
|
336
|
-
export interface MemoryV2ExplainSimilarityRow {
|
|
337
|
-
slug: string;
|
|
338
|
-
/** Raw dense cosine score, or null when the slug missed the dense channel. */
|
|
339
|
-
denseScore: number | null;
|
|
340
|
-
/** Raw sparse score (Qdrant scale), or null when the slug missed sparse. */
|
|
341
|
-
sparseRaw: number | null;
|
|
342
|
-
/** Sparse score divided by the per-batch max, in [0, 1]. */
|
|
343
|
-
sparseNorm: number | null;
|
|
344
|
-
/** `clamp01(dense_weight·dense + sparse_weight·sparseNorm)` — the simBatch fused value. */
|
|
345
|
-
fused: number;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
export interface MemoryV2ExplainSimilarityStats {
|
|
349
|
-
count: number;
|
|
350
|
-
min: number;
|
|
351
|
-
max: number;
|
|
352
|
-
mean: number;
|
|
353
|
-
stddev: number;
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
export interface MemoryV2ExplainSimilarityChannel {
|
|
357
|
-
channel: "user" | "assistant" | "now";
|
|
358
|
-
textPreview: string;
|
|
359
|
-
maxSparse: number;
|
|
360
|
-
/**
|
|
361
|
-
* Spread (max - min) of normalized sparse scores across this channel's
|
|
362
|
-
* hits. Drives adaptive sparse weighting — low spread means the sparse
|
|
363
|
-
* channel can't discriminate, so its weight collapses for this query.
|
|
364
|
-
*/
|
|
365
|
-
sparseSpread: number;
|
|
366
|
-
/** Sparse weight after adaptive collapse (≤ the configured base). */
|
|
367
|
-
effectiveSparseWeight: number;
|
|
368
|
-
/** Dense weight after adaptive compensation (≥ the configured base). */
|
|
369
|
-
effectiveDenseWeight: number;
|
|
370
|
-
rows: MemoryV2ExplainSimilarityRow[];
|
|
371
|
-
stats: {
|
|
372
|
-
dense: MemoryV2ExplainSimilarityStats;
|
|
373
|
-
sparseRaw: MemoryV2ExplainSimilarityStats;
|
|
374
|
-
sparseNorm: MemoryV2ExplainSimilarityStats;
|
|
375
|
-
fused: MemoryV2ExplainSimilarityStats;
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
export interface MemoryV2ExplainSimilarityResult {
|
|
380
|
-
config: {
|
|
381
|
-
dense_weight: number;
|
|
382
|
-
sparse_weight: number;
|
|
383
|
-
};
|
|
384
|
-
channels: MemoryV2ExplainSimilarityChannel[];
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
function summarizeStats(values: number[]): MemoryV2ExplainSimilarityStats {
|
|
388
|
-
if (values.length === 0) {
|
|
389
|
-
return { count: 0, min: 0, max: 0, mean: 0, stddev: 0 };
|
|
390
|
-
}
|
|
391
|
-
let min = Infinity;
|
|
392
|
-
let max = -Infinity;
|
|
393
|
-
let sum = 0;
|
|
394
|
-
for (const v of values) {
|
|
395
|
-
if (v < min) min = v;
|
|
396
|
-
if (v > max) max = v;
|
|
397
|
-
sum += v;
|
|
398
|
-
}
|
|
399
|
-
const mean = sum / values.length;
|
|
400
|
-
let sqDiff = 0;
|
|
401
|
-
for (const v of values) sqDiff += (v - mean) * (v - mean);
|
|
402
|
-
const stddev = Math.sqrt(sqDiff / values.length);
|
|
403
|
-
return { count: values.length, min, max, mean, stddev };
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
async function scoreChannel(
|
|
407
|
-
channel: "user" | "assistant" | "now",
|
|
408
|
-
text: string,
|
|
409
|
-
top: number,
|
|
410
|
-
denseWeight: number,
|
|
411
|
-
sparseWeight: number,
|
|
412
|
-
config: ReturnType<typeof loadConfig>,
|
|
413
|
-
): Promise<MemoryV2ExplainSimilarityChannel> {
|
|
414
|
-
const denseResult = await embedWithBackend(config, [text]);
|
|
415
|
-
const denseVec = await applyCorrectionIfCalibrated(
|
|
416
|
-
denseResult.vectors[0],
|
|
417
|
-
denseResult.provider,
|
|
418
|
-
denseResult.model,
|
|
419
|
-
);
|
|
420
|
-
const sparseVec = generateBm25QueryEmbedding(text);
|
|
421
|
-
|
|
422
|
-
const hits = await hybridQueryConceptPages(denseVec, sparseVec, top);
|
|
423
|
-
|
|
424
|
-
let maxSparse = 0;
|
|
425
|
-
for (const hit of hits) {
|
|
426
|
-
if (hit.sparseScore !== undefined && hit.sparseScore > maxSparse) {
|
|
427
|
-
maxSparse = hit.sparseScore;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
// Mirror simBatch's adaptive weighting so the printed `fused` matches what
|
|
432
|
-
// production retrieval would actually score for this query — otherwise
|
|
433
|
-
// operators staring at the diagnostic would see different numbers than
|
|
434
|
-
// the activation pipeline saw.
|
|
435
|
-
const {
|
|
436
|
-
dense: effDense,
|
|
437
|
-
sparse: effSparse,
|
|
438
|
-
spread: sparseSpread,
|
|
439
|
-
} = effectiveWeights(hits, maxSparse, denseWeight, sparseWeight, config);
|
|
440
|
-
|
|
441
|
-
const rows: MemoryV2ExplainSimilarityRow[] = hits.map((hit) => {
|
|
442
|
-
const dense = hit.denseScore ?? 0;
|
|
443
|
-
const sparseNorm =
|
|
444
|
-
hit.sparseScore !== undefined && maxSparse > 0
|
|
445
|
-
? hit.sparseScore / maxSparse
|
|
446
|
-
: 0;
|
|
447
|
-
const fusedRaw = effDense * dense + effSparse * sparseNorm;
|
|
448
|
-
const fused = Math.max(0, Math.min(1, fusedRaw));
|
|
449
|
-
return {
|
|
450
|
-
slug: hit.slug,
|
|
451
|
-
denseScore: hit.denseScore ?? null,
|
|
452
|
-
sparseRaw: hit.sparseScore ?? null,
|
|
453
|
-
sparseNorm: hit.sparseScore !== undefined ? sparseNorm : null,
|
|
454
|
-
fused,
|
|
455
|
-
};
|
|
456
|
-
});
|
|
457
|
-
|
|
458
|
-
rows.sort((a, b) => b.fused - a.fused);
|
|
459
|
-
|
|
460
|
-
const denseValues: number[] = [];
|
|
461
|
-
const sparseRawValues: number[] = [];
|
|
462
|
-
const sparseNormValues: number[] = [];
|
|
463
|
-
const fusedValues: number[] = [];
|
|
464
|
-
for (const row of rows) {
|
|
465
|
-
if (row.denseScore !== null) denseValues.push(row.denseScore);
|
|
466
|
-
if (row.sparseRaw !== null) sparseRawValues.push(row.sparseRaw);
|
|
467
|
-
if (row.sparseNorm !== null) sparseNormValues.push(row.sparseNorm);
|
|
468
|
-
fusedValues.push(row.fused);
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
return {
|
|
472
|
-
channel,
|
|
473
|
-
textPreview: text.length > 120 ? `${text.slice(0, 120)}…` : text,
|
|
474
|
-
maxSparse,
|
|
475
|
-
sparseSpread,
|
|
476
|
-
effectiveSparseWeight: effSparse,
|
|
477
|
-
effectiveDenseWeight: effDense,
|
|
478
|
-
rows,
|
|
479
|
-
stats: {
|
|
480
|
-
dense: summarizeStats(denseValues),
|
|
481
|
-
sparseRaw: summarizeStats(sparseRawValues),
|
|
482
|
-
sparseNorm: summarizeStats(sparseNormValues),
|
|
483
|
-
fused: summarizeStats(fusedValues),
|
|
484
|
-
},
|
|
485
|
-
};
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
async function handleExplainSimilarity({
|
|
489
|
-
body = {},
|
|
490
|
-
}: RouteHandlerArgs): Promise<MemoryV2ExplainSimilarityResult> {
|
|
491
|
-
requireMemoryV2Enabled();
|
|
492
|
-
const params = MemoryV2ExplainSimilarityParams.parse(body);
|
|
493
|
-
const config = loadConfig();
|
|
494
|
-
const { dense_weight: denseWeight, sparse_weight: sparseWeight } =
|
|
495
|
-
config.memory.v2;
|
|
496
|
-
|
|
497
|
-
const channels: MemoryV2ExplainSimilarityChannel[] = [];
|
|
498
|
-
channels.push(
|
|
499
|
-
await scoreChannel(
|
|
500
|
-
"user",
|
|
501
|
-
params.userText,
|
|
502
|
-
params.top,
|
|
503
|
-
denseWeight,
|
|
504
|
-
sparseWeight,
|
|
505
|
-
config,
|
|
506
|
-
),
|
|
507
|
-
);
|
|
508
|
-
if (params.assistantText && params.assistantText.length > 0) {
|
|
509
|
-
channels.push(
|
|
510
|
-
await scoreChannel(
|
|
511
|
-
"assistant",
|
|
512
|
-
params.assistantText,
|
|
513
|
-
params.top,
|
|
514
|
-
denseWeight,
|
|
515
|
-
sparseWeight,
|
|
516
|
-
config,
|
|
517
|
-
),
|
|
518
|
-
);
|
|
519
|
-
}
|
|
520
|
-
if (params.nowText && params.nowText.length > 0) {
|
|
521
|
-
channels.push(
|
|
522
|
-
await scoreChannel(
|
|
523
|
-
"now",
|
|
524
|
-
params.nowText,
|
|
525
|
-
params.top,
|
|
526
|
-
denseWeight,
|
|
527
|
-
sparseWeight,
|
|
528
|
-
config,
|
|
529
|
-
),
|
|
530
|
-
);
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
return {
|
|
534
|
-
config: { dense_weight: denseWeight, sparse_weight: sparseWeight },
|
|
535
|
-
channels,
|
|
536
|
-
};
|
|
537
|
-
}
|
|
538
|
-
|
|
539
274
|
// ── Concept injection frequency (debug-only) ────────────────────────────
|
|
540
275
|
|
|
541
276
|
const MemoryV2ConceptFrequencyParams = z
|
|
@@ -555,93 +290,6 @@ async function handleConceptFrequency({
|
|
|
555
290
|
return getConceptFrequencySummary(workspaceDir, { conversationId, sinceMs });
|
|
556
291
|
}
|
|
557
292
|
|
|
558
|
-
// ── Fit anisotropy calibration ──────────────────────────────────────────
|
|
559
|
-
|
|
560
|
-
const MemoryV2FitAnisotropyParams = z
|
|
561
|
-
.object({
|
|
562
|
-
/**
|
|
563
|
-
* Number of leading principal components to project out at apply time.
|
|
564
|
-
* `1` is the canonical default for transformer embeddings; raise to 2-3
|
|
565
|
-
* only when the variance spectrum shows multiple dominant directions.
|
|
566
|
-
*/
|
|
567
|
-
k: z.number().int().min(1).max(16).default(1),
|
|
568
|
-
/**
|
|
569
|
-
* Maximum number of stored vectors to pull from Qdrant for the fit.
|
|
570
|
-
* 5_000 is plenty for 3072-dim Gemini — power iteration converges fast
|
|
571
|
-
* and pulling the full corpus would just cost wall-clock time.
|
|
572
|
-
*/
|
|
573
|
-
sample: z.number().int().min(1).max(100_000).default(5_000),
|
|
574
|
-
})
|
|
575
|
-
.strict();
|
|
576
|
-
|
|
577
|
-
export interface MemoryV2FitAnisotropyResult {
|
|
578
|
-
provider: string;
|
|
579
|
-
model: string;
|
|
580
|
-
dim: number;
|
|
581
|
-
k: number;
|
|
582
|
-
sampleCount: number;
|
|
583
|
-
totalVariance: number;
|
|
584
|
-
componentVariance: number[];
|
|
585
|
-
/** `componentVariance[i] / totalVariance` for each component. */
|
|
586
|
-
explainedVarianceRatio: number[];
|
|
587
|
-
/** Absolute path the calibration was written to. */
|
|
588
|
-
path: string;
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
async function handleFitAnisotropy({
|
|
592
|
-
body = {},
|
|
593
|
-
}: RouteHandlerArgs): Promise<MemoryV2FitAnisotropyResult> {
|
|
594
|
-
requireMemoryV2Enabled();
|
|
595
|
-
const { k, sample } = MemoryV2FitAnisotropyParams.parse(body);
|
|
596
|
-
const config = loadConfig();
|
|
597
|
-
|
|
598
|
-
const selection = await selectEmbeddingBackend(config);
|
|
599
|
-
if (!selection.backend) {
|
|
600
|
-
throw new RouteError(
|
|
601
|
-
`Cannot fit anisotropy calibration: ${selection.reason ?? "no embedding backend configured"}`,
|
|
602
|
-
"MEMORY_V2_NO_EMBEDDING_BACKEND",
|
|
603
|
-
409,
|
|
604
|
-
);
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
const vectors = await sampleConceptPageDenseVectors(sample);
|
|
608
|
-
if (vectors.length === 0) {
|
|
609
|
-
throw new RouteError(
|
|
610
|
-
"Cannot fit anisotropy calibration: the v2 concept-page collection is empty. " +
|
|
611
|
-
"Embed some concept pages first (run `assistant memory v2 reembed`), then retry.",
|
|
612
|
-
"MEMORY_V2_NO_VECTORS",
|
|
613
|
-
409,
|
|
614
|
-
);
|
|
615
|
-
}
|
|
616
|
-
if (vectors.length < k * 4) {
|
|
617
|
-
// PCA on too-few samples is unstable — refuse rather than hand back
|
|
618
|
-
// overfit components. The 4× heuristic is conservative; in practice
|
|
619
|
-
// anisotropy fits stabilise at a few hundred samples per component.
|
|
620
|
-
throw new RouteError(
|
|
621
|
-
`Cannot fit k=${k} components from only ${vectors.length} vectors — need at least ${k * 4}. ` +
|
|
622
|
-
"Embed more concept pages or fit a smaller k.",
|
|
623
|
-
"MEMORY_V2_INSUFFICIENT_VECTORS",
|
|
624
|
-
409,
|
|
625
|
-
);
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
const { provider, model } = selection.backend;
|
|
629
|
-
const calib = fitAnisotropyCalibration(vectors, k, { provider, model });
|
|
630
|
-
const path = await saveCalibration(calib);
|
|
631
|
-
|
|
632
|
-
return {
|
|
633
|
-
provider,
|
|
634
|
-
model,
|
|
635
|
-
dim: calib.dim,
|
|
636
|
-
k,
|
|
637
|
-
sampleCount: calib.sampleCount,
|
|
638
|
-
totalVariance: calib.totalVariance,
|
|
639
|
-
componentVariance: calib.componentVariance,
|
|
640
|
-
explainedVarianceRatio: explainedVarianceRatio(calib),
|
|
641
|
-
path,
|
|
642
|
-
};
|
|
643
|
-
}
|
|
644
|
-
|
|
645
293
|
// ── Route definitions ───────────────────────────────────────────────────
|
|
646
294
|
|
|
647
295
|
export const ROUTES: RouteDefinition[] = [
|
|
@@ -663,7 +311,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
663
311
|
handler: handleValidate,
|
|
664
312
|
summary: "Validate memory v2 workspace state",
|
|
665
313
|
description:
|
|
666
|
-
"Read-only structural validation of the v2 workspace — reports orphan edges, oversized pages, and parse failures.",
|
|
314
|
+
"Read-only structural validation of the v2 workspace — reports orphan edges, oversized pages, and parse failures. Runnable regardless of memory.v2.enabled so operators can dry-run validation before flipping the flag.",
|
|
667
315
|
tags: ["memory"],
|
|
668
316
|
requestBody: MemoryV2ValidateParams,
|
|
669
317
|
},
|
|
@@ -700,28 +348,6 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
700
348
|
tags: ["memory"],
|
|
701
349
|
requestBody: MemoryV2ReembedSkillsParams,
|
|
702
350
|
},
|
|
703
|
-
{
|
|
704
|
-
operationId: "memory_v2_explain_similarity",
|
|
705
|
-
method: "POST",
|
|
706
|
-
endpoint: "memory/v2/explain-similarity",
|
|
707
|
-
handler: handleExplainSimilarity,
|
|
708
|
-
summary: "Diagnose dense vs sparse similarity score distributions",
|
|
709
|
-
description:
|
|
710
|
-
"Read-only diagnostic. Embeds the supplied text(s), runs hybrid dense + sparse queries against the concept-page collection, and returns per-slug raw dense, raw sparse, normalized sparse, and fused scores plus per-channel summary stats. Used to investigate score-compression at the head of the activation distribution.",
|
|
711
|
-
tags: ["memory"],
|
|
712
|
-
requestBody: MemoryV2ExplainSimilarityParams,
|
|
713
|
-
},
|
|
714
|
-
{
|
|
715
|
-
operationId: "memory_v2_rebuild_corpus_stats",
|
|
716
|
-
method: "POST",
|
|
717
|
-
endpoint: "memory/v2/rebuild-corpus-stats",
|
|
718
|
-
handler: handleRebuildCorpusStats,
|
|
719
|
-
summary: "Rebuild the BM25 corpus statistics for memory v2",
|
|
720
|
-
description:
|
|
721
|
-
"Walks every concept page on disk, recomputes the document-frequency table and average document length used by the BM25 sparse channel, and atomically swaps the in-memory stats. Run after bulk content imports or to recover from a rebuild that errored at startup. Does not reembed individual page sparse vectors — pair with `assistant memory v2 reembed` when document-side weights need refreshing.",
|
|
722
|
-
tags: ["memory"],
|
|
723
|
-
requestBody: MemoryV2RebuildCorpusStatsParams,
|
|
724
|
-
},
|
|
725
351
|
{
|
|
726
352
|
operationId: "memory_v2_concept_frequency",
|
|
727
353
|
method: "POST",
|
|
@@ -733,15 +359,4 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
733
359
|
tags: ["memory"],
|
|
734
360
|
requestBody: MemoryV2ConceptFrequencyParams,
|
|
735
361
|
},
|
|
736
|
-
{
|
|
737
|
-
operationId: "memory_v2_fit_anisotropy",
|
|
738
|
-
method: "POST",
|
|
739
|
-
endpoint: "memory/v2/fit-anisotropy",
|
|
740
|
-
handler: handleFitAnisotropy,
|
|
741
|
-
summary: "Fit the embedding anisotropy correction for memory v2",
|
|
742
|
-
description:
|
|
743
|
-
"Samples stored dense vectors from the concept-page Qdrant collection, fits a corpus mean + top-k principal components (Mu & Viswanath 'all-but-the-top'), and persists the calibration so subsequent embeds and queries apply the correction. Run `assistant memory v2 reembed` after fitting so stored vectors are written under the new calibration — until then, queries (corrected) and stored vectors (uncorrected) live in different spaces.",
|
|
744
|
-
tags: ["memory"],
|
|
745
|
-
requestBody: MemoryV2FitAnisotropyParams,
|
|
746
|
-
},
|
|
747
362
|
];
|
|
@@ -75,6 +75,7 @@ const EmitSignalParams = z.object({
|
|
|
75
75
|
routingIntent: z
|
|
76
76
|
.enum(["single_channel", "multi_channel", "all_channels"])
|
|
77
77
|
.optional(),
|
|
78
|
+
conversationAffinityHint: z.record(z.string(), z.string()).optional(),
|
|
78
79
|
dedupeKey: z.string().optional(),
|
|
79
80
|
throwOnError: z.boolean().optional(),
|
|
80
81
|
});
|
|
@@ -95,6 +96,7 @@ async function handleEmitSignal({ body = {} }: RouteHandlerArgs) {
|
|
|
95
96
|
attentionHints: validated.attentionHints as AttentionHints,
|
|
96
97
|
contextPayload: validated.contextPayload as Record<string, unknown>,
|
|
97
98
|
routingIntent: validated.routingIntent,
|
|
99
|
+
conversationAffinityHint: validated.conversationAffinityHint,
|
|
98
100
|
dedupeKey: validated.dedupeKey,
|
|
99
101
|
throwOnError: validated.throwOnError,
|
|
100
102
|
});
|
|
@@ -11,8 +11,10 @@ import {
|
|
|
11
11
|
deleteApp,
|
|
12
12
|
disconnectOAuthProvider,
|
|
13
13
|
getApp,
|
|
14
|
+
getAppByProviderAndClientId,
|
|
14
15
|
getAppClientSecret,
|
|
15
16
|
getConnection,
|
|
17
|
+
getMostRecentAppByProvider,
|
|
16
18
|
getProvider,
|
|
17
19
|
listApps,
|
|
18
20
|
listConnections,
|
|
@@ -58,6 +60,22 @@ function normalizeHasRefreshToken(
|
|
|
58
60
|
// Handlers
|
|
59
61
|
// ---------------------------------------------------------------------------
|
|
60
62
|
|
|
63
|
+
function formatAppRow(row: {
|
|
64
|
+
id: string;
|
|
65
|
+
provider: string;
|
|
66
|
+
clientId: string;
|
|
67
|
+
createdAt: number;
|
|
68
|
+
updatedAt: number;
|
|
69
|
+
}) {
|
|
70
|
+
return {
|
|
71
|
+
id: row.id,
|
|
72
|
+
provider_key: row.provider,
|
|
73
|
+
client_id: row.clientId,
|
|
74
|
+
created_at: row.createdAt,
|
|
75
|
+
updated_at: row.updatedAt,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
61
79
|
function handleListApps({ queryParams = {} }: RouteHandlerArgs) {
|
|
62
80
|
const provider = queryParams.provider_key;
|
|
63
81
|
if (!provider) {
|
|
@@ -74,16 +92,63 @@ function handleListApps({ queryParams = {} }: RouteHandlerArgs) {
|
|
|
74
92
|
|
|
75
93
|
return {
|
|
76
94
|
provider: providerSummary,
|
|
77
|
-
apps: filtered.map(
|
|
78
|
-
id: row.id,
|
|
79
|
-
provider_key: row.provider,
|
|
80
|
-
client_id: row.clientId,
|
|
81
|
-
created_at: row.createdAt,
|
|
82
|
-
updated_at: row.updatedAt,
|
|
83
|
-
})),
|
|
95
|
+
apps: filtered.map(formatAppRow),
|
|
84
96
|
};
|
|
85
97
|
}
|
|
86
98
|
|
|
99
|
+
function handleGetApp({ queryParams = {} }: RouteHandlerArgs) {
|
|
100
|
+
const { id, provider, client_id } = queryParams;
|
|
101
|
+
|
|
102
|
+
let row;
|
|
103
|
+
if (id) {
|
|
104
|
+
row = getApp(id);
|
|
105
|
+
} else if (provider && client_id) {
|
|
106
|
+
row = getAppByProviderAndClientId(provider, client_id);
|
|
107
|
+
} else if (provider) {
|
|
108
|
+
row = getMostRecentAppByProvider(provider);
|
|
109
|
+
} else {
|
|
110
|
+
throw new BadRequestError(
|
|
111
|
+
"Provide id, provider, or provider + client_id query parameters",
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (!row) {
|
|
116
|
+
const lookup = id
|
|
117
|
+
? `id=${id}`
|
|
118
|
+
: provider && client_id
|
|
119
|
+
? `provider=${provider}, client_id=${client_id}`
|
|
120
|
+
: `provider=${provider}`;
|
|
121
|
+
throw new NotFoundError(`No app found for ${lookup}`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return { app: formatAppRow(row) };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function handleUpsertApp({ body = {} }: RouteHandlerArgs) {
|
|
128
|
+
const b = body as Record<string, unknown>;
|
|
129
|
+
const providerKey = b.provider_key as string | undefined;
|
|
130
|
+
const clientId = b.client_id as string | undefined;
|
|
131
|
+
|
|
132
|
+
if (!providerKey || !clientId) {
|
|
133
|
+
throw new BadRequestError(
|
|
134
|
+
"provider_key and client_id are required",
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const clientSecretOpts = b.client_secret
|
|
139
|
+
? { clientSecretValue: b.client_secret as string }
|
|
140
|
+
: b.client_secret_credential_path
|
|
141
|
+
? {
|
|
142
|
+
clientSecretCredentialPath:
|
|
143
|
+
b.client_secret_credential_path as string,
|
|
144
|
+
}
|
|
145
|
+
: undefined;
|
|
146
|
+
|
|
147
|
+
const row = await upsertApp(providerKey, clientId, clientSecretOpts);
|
|
148
|
+
|
|
149
|
+
return { app: formatAppRow(row) };
|
|
150
|
+
}
|
|
151
|
+
|
|
87
152
|
async function handleCreateApp({ body = {} }: RouteHandlerArgs) {
|
|
88
153
|
const { provider_key, client_id, client_secret } = body as {
|
|
89
154
|
provider_key?: string;
|
|
@@ -254,6 +319,46 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
254
319
|
],
|
|
255
320
|
handler: handleListApps,
|
|
256
321
|
},
|
|
322
|
+
{
|
|
323
|
+
operationId: "oauth_apps_by_query_get",
|
|
324
|
+
endpoint: "oauth/apps/lookup",
|
|
325
|
+
method: "GET",
|
|
326
|
+
summary: "Get OAuth app",
|
|
327
|
+
description:
|
|
328
|
+
"Look up a single OAuth app by ID, provider + client_id, or provider (most recent).",
|
|
329
|
+
tags: ["oauth"],
|
|
330
|
+
requirePolicyEnforcement: true,
|
|
331
|
+
queryParams: [
|
|
332
|
+
{
|
|
333
|
+
name: "id",
|
|
334
|
+
type: "string",
|
|
335
|
+
description: "App UUID",
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
name: "provider",
|
|
339
|
+
type: "string",
|
|
340
|
+
description: "Provider key",
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
name: "client_id",
|
|
344
|
+
type: "string",
|
|
345
|
+
description: "OAuth client ID (requires provider)",
|
|
346
|
+
},
|
|
347
|
+
],
|
|
348
|
+
handler: handleGetApp,
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
operationId: "oauth_apps_upsert",
|
|
352
|
+
endpoint: "oauth/apps/upsert",
|
|
353
|
+
method: "POST",
|
|
354
|
+
policyKey: "oauth/apps.upsert",
|
|
355
|
+
summary: "Upsert OAuth app",
|
|
356
|
+
description:
|
|
357
|
+
"Create or return an existing OAuth app registration. Updates client secret if provided.",
|
|
358
|
+
tags: ["oauth"],
|
|
359
|
+
requirePolicyEnforcement: true,
|
|
360
|
+
handler: handleUpsertApp,
|
|
361
|
+
},
|
|
257
362
|
{
|
|
258
363
|
operationId: "oauth_apps_post",
|
|
259
364
|
endpoint: "oauth/apps",
|