@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
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { Database } from "bun:sqlite";
|
|
2
|
+
import { describe, expect, test } from "bun:test";
|
|
3
|
+
|
|
4
|
+
import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
5
|
+
|
|
6
|
+
import { getSqliteFrom } from "../../db-connection.js";
|
|
7
|
+
import * as schema from "../../schema.js";
|
|
8
|
+
import { migrateCreateProviderConnections } from "../243-provider-connections.js";
|
|
9
|
+
import { migrateProviderConnectionStatusLabel } from "../244-provider-connection-status-label.js";
|
|
10
|
+
import { migrateBackfillProviderConnectionLabel } from "../246-backfill-provider-connection-label.js";
|
|
11
|
+
|
|
12
|
+
interface ConnectionRow {
|
|
13
|
+
name: string;
|
|
14
|
+
label: string | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function createTestDb() {
|
|
18
|
+
const sqlite = new Database(":memory:");
|
|
19
|
+
sqlite.exec("PRAGMA journal_mode=WAL");
|
|
20
|
+
sqlite.exec("PRAGMA foreign_keys = ON");
|
|
21
|
+
return drizzle(sqlite, { schema });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/// Ensure the `memory_checkpoints` table exists in test DBs — it's normally
|
|
25
|
+
/// provisioned by earlier infra migrations that the test harness doesn't
|
|
26
|
+
/// pull in. Schema mirrors what other backfill migrations expect.
|
|
27
|
+
function ensureCheckpointsTable(db: ReturnType<typeof createTestDb>): void {
|
|
28
|
+
const raw = getSqliteFrom(db);
|
|
29
|
+
raw.exec(`
|
|
30
|
+
CREATE TABLE IF NOT EXISTS memory_checkpoints (
|
|
31
|
+
key TEXT PRIMARY KEY,
|
|
32
|
+
value TEXT,
|
|
33
|
+
updated_at INTEGER
|
|
34
|
+
)
|
|
35
|
+
`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// Bring the test DB up to the state right before migration 246 runs:
|
|
39
|
+
/// provider_connections table present + status/label columns added.
|
|
40
|
+
function prepareSchemaThroughMigration244(
|
|
41
|
+
db: ReturnType<typeof createTestDb>,
|
|
42
|
+
): void {
|
|
43
|
+
migrateCreateProviderConnections(db);
|
|
44
|
+
migrateProviderConnectionStatusLabel(db);
|
|
45
|
+
ensureCheckpointsTable(db);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
describe("migration 246 — backfill provider_connection label", () => {
|
|
49
|
+
test("sets label = name for rows where label is NULL", () => {
|
|
50
|
+
const db = createTestDb();
|
|
51
|
+
const raw = getSqliteFrom(db);
|
|
52
|
+
prepareSchemaThroughMigration244(db);
|
|
53
|
+
|
|
54
|
+
// Insert a row with label = NULL (simulating a pre-244 connection).
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
raw
|
|
57
|
+
.query(
|
|
58
|
+
`INSERT INTO provider_connections (name, provider, auth, status, label, created_at, updated_at) VALUES (?, ?, ?, 'active', NULL, ?, ?)`,
|
|
59
|
+
)
|
|
60
|
+
.run("anthropic-personal", "anthropic", JSON.stringify({ type: "api_key", credential: "credential/anthropic/api_key" }), now, now);
|
|
61
|
+
|
|
62
|
+
migrateBackfillProviderConnectionLabel(db);
|
|
63
|
+
|
|
64
|
+
const row = raw
|
|
65
|
+
.query(`SELECT name, label FROM provider_connections WHERE name = ?`)
|
|
66
|
+
.get("anthropic-personal") as ConnectionRow;
|
|
67
|
+
expect(row.label).toBe("anthropic-personal");
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("sets label = name for rows where label is empty/whitespace", () => {
|
|
71
|
+
const db = createTestDb();
|
|
72
|
+
const raw = getSqliteFrom(db);
|
|
73
|
+
prepareSchemaThroughMigration244(db);
|
|
74
|
+
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
raw
|
|
77
|
+
.query(
|
|
78
|
+
`INSERT INTO provider_connections (name, provider, auth, status, label, created_at, updated_at) VALUES (?, ?, ?, 'active', ?, ?, ?)`,
|
|
79
|
+
)
|
|
80
|
+
.run("openai-empty", "openai", JSON.stringify({ type: "api_key", credential: "credential/openai/api_key" }), "", now, now);
|
|
81
|
+
raw
|
|
82
|
+
.query(
|
|
83
|
+
`INSERT INTO provider_connections (name, provider, auth, status, label, created_at, updated_at) VALUES (?, ?, ?, 'active', ?, ?, ?)`,
|
|
84
|
+
)
|
|
85
|
+
.run("openai-whitespace", "openai", JSON.stringify({ type: "api_key", credential: "credential/openai/api_key" }), " ", now, now);
|
|
86
|
+
|
|
87
|
+
migrateBackfillProviderConnectionLabel(db);
|
|
88
|
+
|
|
89
|
+
const empty = raw
|
|
90
|
+
.query(`SELECT label FROM provider_connections WHERE name = ?`)
|
|
91
|
+
.get("openai-empty") as ConnectionRow;
|
|
92
|
+
const whitespace = raw
|
|
93
|
+
.query(`SELECT label FROM provider_connections WHERE name = ?`)
|
|
94
|
+
.get("openai-whitespace") as ConnectionRow;
|
|
95
|
+
expect(empty.label).toBe("openai-empty");
|
|
96
|
+
expect(whitespace.label).toBe("openai-whitespace");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("does NOT overwrite rows where the user has set a non-empty label", () => {
|
|
100
|
+
const db = createTestDb();
|
|
101
|
+
const raw = getSqliteFrom(db);
|
|
102
|
+
prepareSchemaThroughMigration244(db);
|
|
103
|
+
|
|
104
|
+
const now = Date.now();
|
|
105
|
+
raw
|
|
106
|
+
.query(
|
|
107
|
+
`INSERT INTO provider_connections (name, provider, auth, status, label, created_at, updated_at) VALUES (?, ?, ?, 'active', ?, ?, ?)`,
|
|
108
|
+
)
|
|
109
|
+
.run("anthropic-work", "anthropic", JSON.stringify({ type: "api_key", credential: "credential/anthropic/api_key" }), "Anthropic — Work", now, now);
|
|
110
|
+
|
|
111
|
+
migrateBackfillProviderConnectionLabel(db);
|
|
112
|
+
|
|
113
|
+
const row = raw
|
|
114
|
+
.query(`SELECT label FROM provider_connections WHERE name = ?`)
|
|
115
|
+
.get("anthropic-work") as ConnectionRow;
|
|
116
|
+
expect(row.label).toBe("Anthropic — Work");
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test("is idempotent — second run does not re-clobber a later user-cleared label", () => {
|
|
120
|
+
const db = createTestDb();
|
|
121
|
+
const raw = getSqliteFrom(db);
|
|
122
|
+
prepareSchemaThroughMigration244(db);
|
|
123
|
+
|
|
124
|
+
const now = Date.now();
|
|
125
|
+
raw
|
|
126
|
+
.query(
|
|
127
|
+
`INSERT INTO provider_connections (name, provider, auth, status, label, created_at, updated_at) VALUES (?, ?, ?, 'active', NULL, ?, ?)`,
|
|
128
|
+
)
|
|
129
|
+
.run("anthropic-personal", "anthropic", JSON.stringify({ type: "api_key", credential: "credential/anthropic/api_key" }), now, now);
|
|
130
|
+
|
|
131
|
+
// First run: backfills NULL → "anthropic-personal".
|
|
132
|
+
migrateBackfillProviderConnectionLabel(db);
|
|
133
|
+
expect(
|
|
134
|
+
(raw.query(`SELECT label FROM provider_connections WHERE name = ?`).get("anthropic-personal") as ConnectionRow).label,
|
|
135
|
+
).toBe("anthropic-personal");
|
|
136
|
+
|
|
137
|
+
// User clears the label after the backfill ran.
|
|
138
|
+
raw.query(`UPDATE provider_connections SET label = NULL WHERE name = ?`).run("anthropic-personal");
|
|
139
|
+
|
|
140
|
+
// Second run: should NOT re-clobber the user's deliberate clear, because
|
|
141
|
+
// the checkpoint was set on the first successful run.
|
|
142
|
+
migrateBackfillProviderConnectionLabel(db);
|
|
143
|
+
expect(
|
|
144
|
+
(raw.query(`SELECT label FROM provider_connections WHERE name = ?`).get("anthropic-personal") as ConnectionRow).label,
|
|
145
|
+
).toBeNull();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test("checkpoint is set after a successful run", () => {
|
|
149
|
+
const db = createTestDb();
|
|
150
|
+
const raw = getSqliteFrom(db);
|
|
151
|
+
prepareSchemaThroughMigration244(db);
|
|
152
|
+
|
|
153
|
+
migrateBackfillProviderConnectionLabel(db);
|
|
154
|
+
|
|
155
|
+
const checkpoint = raw
|
|
156
|
+
.query(`SELECT key FROM memory_checkpoints WHERE key = ?`)
|
|
157
|
+
.get("backfill_provider_connection_label") as { key: string } | null;
|
|
158
|
+
expect(checkpoint).not.toBeNull();
|
|
159
|
+
expect(checkpoint?.key).toBe("backfill_provider_connection_label");
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test("no-op when provider_connections table is absent (first-boot edge)", () => {
|
|
163
|
+
const db = createTestDb();
|
|
164
|
+
ensureCheckpointsTable(db);
|
|
165
|
+
|
|
166
|
+
// Don't run 243/244 — the table doesn't exist yet.
|
|
167
|
+
expect(() => migrateBackfillProviderConnectionLabel(db)).not.toThrow();
|
|
168
|
+
|
|
169
|
+
// Checkpoint should still get set so we don't retry forever.
|
|
170
|
+
const raw = getSqliteFrom(db);
|
|
171
|
+
const checkpoint = raw
|
|
172
|
+
.query(`SELECT key FROM memory_checkpoints WHERE key = ?`)
|
|
173
|
+
.get("backfill_provider_connection_label");
|
|
174
|
+
expect(checkpoint).not.toBeNull();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test("no-op when label column is absent (244 hasn't run yet) — no checkpoint set", () => {
|
|
178
|
+
const db = createTestDb();
|
|
179
|
+
const raw = getSqliteFrom(db);
|
|
180
|
+
migrateCreateProviderConnections(db); // 243 only, NOT 244
|
|
181
|
+
ensureCheckpointsTable(db);
|
|
182
|
+
|
|
183
|
+
expect(() => migrateBackfillProviderConnectionLabel(db)).not.toThrow();
|
|
184
|
+
|
|
185
|
+
// Crucially: no checkpoint should be set, so the backfill can run later
|
|
186
|
+
// once 244 has provisioned the column.
|
|
187
|
+
const checkpoint = raw
|
|
188
|
+
.query(`SELECT key FROM memory_checkpoints WHERE key = ?`)
|
|
189
|
+
.get("backfill_provider_connection_label");
|
|
190
|
+
expect(checkpoint).toBeNull();
|
|
191
|
+
});
|
|
192
|
+
});
|
|
@@ -201,6 +201,13 @@ export {
|
|
|
201
201
|
} from "./237-heartbeat-runs.js";
|
|
202
202
|
export { migrateScheduleRetryPolicy } from "./238-schedule-retry-policy.js";
|
|
203
203
|
export { migrateTraceEventsCreatedAtIndex } from "./239-trace-events-created-at-index.js";
|
|
204
|
+
export { migrateConversationInferenceProfileSession } from "./240-conversation-inference-profile-session.js";
|
|
205
|
+
export { migrateActivationStateFkCascade } from "./241-activation-state-fk-cascade.js";
|
|
206
|
+
export { migrateMessageBookmarks } from "./242-message-bookmarks.js";
|
|
207
|
+
export { migrateCreateProviderConnections } from "./243-provider-connections.js";
|
|
208
|
+
export { migrateProviderConnectionStatusLabel } from "./244-provider-connection-status-label.js";
|
|
209
|
+
export { migrateMemoryRetrospectiveState } from "./245-memory-retrospective-state.js";
|
|
210
|
+
export { migrateBackfillProviderConnectionLabel } from "./246-backfill-provider-connection-label.js";
|
|
204
211
|
export {
|
|
205
212
|
MIGRATION_REGISTRY,
|
|
206
213
|
type MigrationRegistryEntry,
|
|
@@ -36,6 +36,21 @@ export function getActivePublishedPageByAppId(
|
|
|
36
36
|
return row ?? null;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
export function insertPublishedPage(record: {
|
|
40
|
+
id: string;
|
|
41
|
+
deploymentId: string;
|
|
42
|
+
publicUrl: string;
|
|
43
|
+
pageTitle: string | null;
|
|
44
|
+
htmlHash: string;
|
|
45
|
+
publishedAt: number;
|
|
46
|
+
status: string;
|
|
47
|
+
appId: string | null;
|
|
48
|
+
projectSlug: string | null;
|
|
49
|
+
}): void {
|
|
50
|
+
const db = getDb();
|
|
51
|
+
db.insert(publishedPages).values(record).run();
|
|
52
|
+
}
|
|
53
|
+
|
|
39
54
|
export function updatePublishedPage(
|
|
40
55
|
id: string,
|
|
41
56
|
updates: {
|
|
@@ -44,6 +59,7 @@ export function updatePublishedPage(
|
|
|
44
59
|
htmlHash?: string;
|
|
45
60
|
publishedAt?: number;
|
|
46
61
|
appId?: string;
|
|
62
|
+
status?: string;
|
|
47
63
|
},
|
|
48
64
|
): void {
|
|
49
65
|
const db = getDb();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import {
|
|
2
|
+
index,
|
|
3
|
+
integer,
|
|
4
|
+
sqliteTable,
|
|
5
|
+
text,
|
|
6
|
+
uniqueIndex,
|
|
7
|
+
} from "drizzle-orm/sqlite-core";
|
|
8
|
+
|
|
9
|
+
import { conversations, messages } from "./conversations.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* User-saved bookmarks for individual messages. Surfaced in the macOS app
|
|
13
|
+
* Settings → Bookmarks tab and on the message hover overflow menu, behind the
|
|
14
|
+
* `bookmarks` client feature flag.
|
|
15
|
+
*
|
|
16
|
+
* Both foreign keys CASCADE so bookmarks disappear automatically when their
|
|
17
|
+
* parent message or conversation is deleted. A unique index on `message_id`
|
|
18
|
+
* keeps the create-bookmark path idempotent.
|
|
19
|
+
*/
|
|
20
|
+
export const messageBookmarks = sqliteTable(
|
|
21
|
+
"message_bookmarks",
|
|
22
|
+
{
|
|
23
|
+
id: text("id").primaryKey(),
|
|
24
|
+
messageId: text("message_id")
|
|
25
|
+
.notNull()
|
|
26
|
+
.references(() => messages.id, { onDelete: "cascade" }),
|
|
27
|
+
conversationId: text("conversation_id")
|
|
28
|
+
.notNull()
|
|
29
|
+
.references(() => conversations.id, { onDelete: "cascade" }),
|
|
30
|
+
createdAt: integer("created_at").notNull(),
|
|
31
|
+
},
|
|
32
|
+
(table) => [
|
|
33
|
+
uniqueIndex("message_bookmarks_message_id_uniq").on(table.messageId),
|
|
34
|
+
index("message_bookmarks_created_at_idx").on(table.createdAt),
|
|
35
|
+
],
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
export type MessageBookmarkRow = typeof messageBookmarks.$inferSelect;
|
|
@@ -39,6 +39,8 @@ export const conversations = sqliteTable(
|
|
|
39
39
|
lastMessageAt: integer("last_message_at"),
|
|
40
40
|
archivedAt: integer("archived_at"),
|
|
41
41
|
inferenceProfile: text("inference_profile"),
|
|
42
|
+
inferenceProfileSessionId: text("inference_profile_session_id"),
|
|
43
|
+
inferenceProfileExpiresAt: integer("inference_profile_expires_at"),
|
|
42
44
|
},
|
|
43
45
|
(table) => [
|
|
44
46
|
index("idx_conversations_updated_at").on(table.updatedAt),
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export * from "./acp.js";
|
|
2
|
+
export * from "./bookmarks.js";
|
|
2
3
|
export * from "./calls.js";
|
|
3
4
|
export * from "./contacts.js";
|
|
4
5
|
export * from "./conversations.js";
|
|
5
6
|
export * from "./guardian.js";
|
|
7
|
+
export * from "./inference.js";
|
|
6
8
|
export * from "./infrastructure.js";
|
|
7
9
|
export * from "./memory-core.js";
|
|
8
10
|
export * from "./memory-graph.js";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { index, integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Named provider connections.
|
|
5
|
+
*
|
|
6
|
+
* Each row is a named auth-config instance for a code-defined provider.
|
|
7
|
+
* Profiles in config.json reference connections by `name` via the
|
|
8
|
+
* `provider_connection` field.
|
|
9
|
+
*
|
|
10
|
+
* Created by migration 243.
|
|
11
|
+
*/
|
|
12
|
+
export const providerConnections = sqliteTable(
|
|
13
|
+
"provider_connections",
|
|
14
|
+
{
|
|
15
|
+
name: text("name").primaryKey(),
|
|
16
|
+
provider: text("provider").notNull(),
|
|
17
|
+
auth: text("auth").notNull(),
|
|
18
|
+
status: text("status").notNull().default("active"),
|
|
19
|
+
label: text("label"),
|
|
20
|
+
createdAt: integer("created_at").notNull(),
|
|
21
|
+
updatedAt: integer("updated_at").notNull(),
|
|
22
|
+
},
|
|
23
|
+
(table) => [
|
|
24
|
+
index("idx_provider_connections_provider").on(table.provider),
|
|
25
|
+
],
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
export type ProviderConnectionRow = typeof providerConnections.$inferSelect;
|
|
29
|
+
export type NewProviderConnectionRow = typeof providerConnections.$inferInsert;
|
|
@@ -100,6 +100,15 @@ export const memoryCheckpoints = sqliteTable("memory_checkpoints", {
|
|
|
100
100
|
updatedAt: integer("updated_at").notNull(),
|
|
101
101
|
});
|
|
102
102
|
|
|
103
|
+
export const memoryRetrospectiveState = sqliteTable(
|
|
104
|
+
"memory_retrospective_state",
|
|
105
|
+
{
|
|
106
|
+
conversationId: text("conversation_id").primaryKey(),
|
|
107
|
+
lastProcessedMessageId: text("last_processed_message_id").notNull(),
|
|
108
|
+
lastRunAt: integer("last_run_at").notNull(),
|
|
109
|
+
},
|
|
110
|
+
);
|
|
111
|
+
|
|
103
112
|
export const conversationStarters = sqliteTable(
|
|
104
113
|
"conversation_starters",
|
|
105
114
|
{
|
|
@@ -9,6 +9,7 @@ import type {
|
|
|
9
9
|
} from "../qdrant-client.js";
|
|
10
10
|
import { getQdrantClient } from "../qdrant-client.js";
|
|
11
11
|
import { memorySegments, memorySummaries } from "../schema.js";
|
|
12
|
+
import { mapCosineToUnit } from "../validation.js";
|
|
12
13
|
// ── Types (inlined from deleted types.ts) ──────────────────────────
|
|
13
14
|
|
|
14
15
|
type CandidateType = "segment" | "item" | "summary" | "media";
|
|
@@ -235,7 +236,3 @@ function buildHybridFilter(
|
|
|
235
236
|
must_not: mustNotConditions,
|
|
236
237
|
};
|
|
237
238
|
}
|
|
238
|
-
|
|
239
|
-
function mapCosineToUnit(value: number): number {
|
|
240
|
-
return Math.max(0, Math.min(1, (value + 1) / 2));
|
|
241
|
-
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Bun Snapshot v1, https://bun.sh/docs/test/snapshots
|
|
2
|
+
|
|
3
|
+
exports[`renderRouterPrompt — determinism & snapshot stability snapshot of fixed inputs 1`] = `
|
|
4
|
+
"You are a background helper for Aria. Your job is to route memory pages for the next assistant turn between Aria and Alice.
|
|
5
|
+
|
|
6
|
+
You will be shown the recent conversation, a \`<now>\` marker for the current time, an \`<already_injected_ids>\` block listing pages picked on the previous turn, and a \`# Concept Page Index\` listing every routable page on this workspace.
|
|
7
|
+
|
|
8
|
+
Pick the concept pages whose contents would help Aria respond well on this turn. Lean toward inclusion when in doubt — missing a relevant page is a worse error than surfacing a few unused ones, because the assistant can ignore extras but can't summon context that wasn't loaded. Abstain (return an empty list) only when nothing in the index plausibly bears on the turn.
|
|
9
|
+
|
|
10
|
+
Index format. Each line of the index has the shape:
|
|
11
|
+
|
|
12
|
+
[id] slug — summary (edges: a, b, c)
|
|
13
|
+
|
|
14
|
+
\`id\` is a small integer used to refer to this page. \`edges\` are numeric IDs into the same list, pointing at related pages; you may follow them when one page strongly implies another.
|
|
15
|
+
|
|
16
|
+
Already-injected pages. Pages whose IDs appear in \`<already_injected_ids>\` were picked on the previous turn. Do not pick them again unless Aria should re-anchor on that material — e.g., the topic genuinely returns after drifting away. Routine continuity does not require re-picking; the prior turn's pages are already in the assistant's working context.
|
|
17
|
+
|
|
18
|
+
Time. Bias toward pages that match the current state implied by \`<now>\` and the active conversational threads (what is happening today, what was just decided, who is being discussed). Stale pages with no bearing on the live conversation should be skipped even if their summaries look superficially relevant.
|
|
19
|
+
|
|
20
|
+
Emit your selection by calling \`select_pages_to_inject\` with the chosen \`page_ids\`. Return an empty array to abstain.
|
|
21
|
+
|
|
22
|
+
# Concept Page Index
|
|
23
|
+
|
|
24
|
+
[1] morning-routine — coffee, walk, journal (edges: 2)
|
|
25
|
+
[2] journal-style — terse, dated, no fluff (edges: 1)
|
|
26
|
+
[3] taxes-2025 — Q1 estimate due April 15 (edges: )"
|
|
27
|
+
`;
|
|
@@ -8,7 +8,7 @@ import { migrateActivationState } from "../../migrations/232-activation-state.js
|
|
|
8
8
|
import * as schema from "../../schema.js";
|
|
9
9
|
import {
|
|
10
10
|
evictCompactedTurns,
|
|
11
|
-
|
|
11
|
+
forkActivationState,
|
|
12
12
|
hydrate,
|
|
13
13
|
save,
|
|
14
14
|
} from "../activation-store.js";
|
|
@@ -113,12 +113,12 @@ describe("activation-store", () => {
|
|
|
113
113
|
});
|
|
114
114
|
});
|
|
115
115
|
|
|
116
|
-
describe("
|
|
116
|
+
describe("forkActivationState", () => {
|
|
117
117
|
test("copies parent state to a new conversation id", async () => {
|
|
118
118
|
const parentState = buildState();
|
|
119
119
|
await save(db, "conv-parent", parentState);
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
forkActivationState(db, "conv-parent", "conv-child");
|
|
122
122
|
|
|
123
123
|
const child = await hydrate(db, "conv-child");
|
|
124
124
|
expect(child).toEqual(parentState);
|
|
@@ -129,7 +129,7 @@ describe("activation-store", () => {
|
|
|
129
129
|
});
|
|
130
130
|
|
|
131
131
|
test("is a no-op when the parent has no state", async () => {
|
|
132
|
-
|
|
132
|
+
forkActivationState(db, "conv-parent-missing", "conv-child");
|
|
133
133
|
|
|
134
134
|
expect(await hydrate(db, "conv-child")).toBeNull();
|
|
135
135
|
});
|
|
@@ -139,7 +139,7 @@ describe("activation-store", () => {
|
|
|
139
139
|
await save(db, "conv-parent", parentState);
|
|
140
140
|
await save(db, "conv-child", buildState({ currentTurn: 99 }));
|
|
141
141
|
|
|
142
|
-
|
|
142
|
+
forkActivationState(db, "conv-parent", "conv-child");
|
|
143
143
|
|
|
144
144
|
const child = await hydrate(db, "conv-child");
|
|
145
145
|
expect(child?.currentTurn).toBe(7);
|
|
@@ -470,7 +470,9 @@ describe("computeOwnActivation", () => {
|
|
|
470
470
|
c_now: 0.2,
|
|
471
471
|
}),
|
|
472
472
|
});
|
|
473
|
-
//
|
|
473
|
+
// Positive cosines pass through unchanged (negatives clamp to 0).
|
|
474
|
+
// Expected: 0.3*0.6 + 0.3*0.5 + 0.2*0.4 + 0.2*0.2
|
|
475
|
+
// = 0.18 + 0.15 + 0.08 + 0.04 = 0.45
|
|
474
476
|
expect(out.activation.get("alice")).toBeCloseTo(0.45, 6);
|
|
475
477
|
});
|
|
476
478
|
|
|
@@ -523,6 +525,7 @@ describe("computeOwnActivation", () => {
|
|
|
523
525
|
c_now: 0.2,
|
|
524
526
|
}),
|
|
525
527
|
});
|
|
528
|
+
// Positive cosines pass through unchanged: 1.0 stays 1.0; 0 stays 0.
|
|
526
529
|
// 0.3*0 + 0.3*1 + 0.2*0 + 0.2*0 = 0.3
|
|
527
530
|
expect(out.activation.get("fresh")).toBeCloseTo(0.3, 6);
|
|
528
531
|
});
|
|
@@ -573,7 +576,8 @@ describe("computeOwnActivation", () => {
|
|
|
573
576
|
expect(breakdown).toBeDefined();
|
|
574
577
|
// priorContribution is `d * prev`, not the weighted sim term.
|
|
575
578
|
expect(breakdown?.priorContribution).toBeCloseTo(d * 0.6, 6);
|
|
576
|
-
//
|
|
579
|
+
// Fused sims (positive cosines pass through unchanged), captured before
|
|
580
|
+
// c_user / c_assistant / c_now weighting.
|
|
577
581
|
expect(breakdown?.simUser).toBeCloseTo(0.5, 6);
|
|
578
582
|
expect(breakdown?.simAssistant).toBeCloseTo(0.4, 6);
|
|
579
583
|
expect(breakdown?.simNow).toBeCloseTo(0.2, 6);
|
|
@@ -801,8 +805,10 @@ describe("computeOwnActivation", () => {
|
|
|
801
805
|
});
|
|
802
806
|
|
|
803
807
|
test("rerank boost is additive on A_o and leaves raw simUser / simAssistant untouched", async () => {
|
|
804
|
-
|
|
805
|
-
|
|
808
|
+
// Positive cosines pass through unchanged; pick 0.5 / 0.4 directly so
|
|
809
|
+
// the round fused values used in the formula assertion below hold.
|
|
810
|
+
stageHybridResponse([{ slug: "a", denseScore: 0.5 }]); // user — fused 0.5
|
|
811
|
+
stageHybridResponse([{ slug: "a", denseScore: 0.4 }]); // assistant — fused 0.4
|
|
806
812
|
stageHybridResponse([]); // now
|
|
807
813
|
rerankState.scores = new Map([["a", 0.8]]);
|
|
808
814
|
|
|
@@ -1219,6 +1225,7 @@ describe("skills participate in the unified pipeline", () => {
|
|
|
1219
1225
|
});
|
|
1220
1226
|
|
|
1221
1227
|
// No prior state → priorContribution = 0.
|
|
1228
|
+
// Positive cosines pass through unchanged.
|
|
1222
1229
|
// 0.3*0.5 + 0.2*0.4 + 0.2*0.2 = 0.15 + 0.08 + 0.04 = 0.27
|
|
1223
1230
|
expect(out.activation.get("skills/example-skill-a")).toBeCloseTo(0.27, 6);
|
|
1224
1231
|
expect(out.breakdown.get("skills/example-skill-a")?.priorContribution).toBe(
|
|
@@ -8,8 +8,7 @@
|
|
|
8
8
|
* Coverage matrix:
|
|
9
9
|
* - migrate: wraps `runMemoryV2Migration`; force flag propagates;
|
|
10
10
|
* `MigrationAlreadyAppliedError` is swallowed (no rethrow).
|
|
11
|
-
* - reembed: enqueues `N
|
|
12
|
-
* meta-file slugs).
|
|
11
|
+
* - reembed: enqueues `N` jobs, one per concept-page slug.
|
|
13
12
|
* - activation-recompute: walks conversations with rows, runs the pipeline
|
|
14
13
|
* end-to-end against the real activation module, persists fresh state.
|
|
15
14
|
*
|
|
@@ -116,7 +115,10 @@ const STUB_RUNTIME_CONFIG = {
|
|
|
116
115
|
};
|
|
117
116
|
mock.module("../../../config/loader.js", () => ({
|
|
118
117
|
getConfig: () => STUB_RUNTIME_CONFIG,
|
|
118
|
+
getConfigReadOnly: () => STUB_RUNTIME_CONFIG,
|
|
119
119
|
loadConfig: () => STUB_RUNTIME_CONFIG,
|
|
120
|
+
loadRawConfig: () => ({}) as Record<string, unknown>,
|
|
121
|
+
saveRawConfig: () => {},
|
|
120
122
|
invalidateConfigCache: () => {},
|
|
121
123
|
applyNestedDefaults: () => STUB_RUNTIME_CONFIG,
|
|
122
124
|
}));
|
|
@@ -208,7 +210,6 @@ const { writePage } = await import("../page-store.js");
|
|
|
208
210
|
const { save: saveActivation, hydrate: hydrateActivation } =
|
|
209
211
|
await import("../activation-store.js");
|
|
210
212
|
const {
|
|
211
|
-
META_FILE_SLUGS,
|
|
212
213
|
memoryV2ActivationRecomputeJob,
|
|
213
214
|
memoryV2MigrateJob,
|
|
214
215
|
memoryV2ReembedJob,
|
|
@@ -322,15 +323,15 @@ describe("memoryV2MigrateJob", () => {
|
|
|
322
323
|
// ---------------------------------------------------------------------------
|
|
323
324
|
|
|
324
325
|
describe("memoryV2ReembedJob", () => {
|
|
325
|
-
test("returns N
|
|
326
|
+
test("returns N (one per concept page) and writes that many job rows", async () => {
|
|
326
327
|
await writePage(tmpWorkspace, {
|
|
327
328
|
slug: "alice",
|
|
328
|
-
frontmatter: { edges: [], ref_files: [] },
|
|
329
|
+
frontmatter: { edges: [], ref_files: [], ref_urls: [] },
|
|
329
330
|
body: "Alice.\n",
|
|
330
331
|
});
|
|
331
332
|
await writePage(tmpWorkspace, {
|
|
332
333
|
slug: "bob",
|
|
333
|
-
frontmatter: { edges: [], ref_files: [] },
|
|
334
|
+
frontmatter: { edges: [], ref_files: [], ref_urls: [] },
|
|
334
335
|
body: "Bob.\n",
|
|
335
336
|
});
|
|
336
337
|
|
|
@@ -339,8 +340,8 @@ describe("memoryV2ReembedJob", () => {
|
|
|
339
340
|
TEST_CONFIG,
|
|
340
341
|
);
|
|
341
342
|
|
|
342
|
-
// Return value covers the contract:
|
|
343
|
-
expect(total).toBe(2
|
|
343
|
+
// Return value covers the contract: one job per concept page.
|
|
344
|
+
expect(total).toBe(2);
|
|
344
345
|
|
|
345
346
|
// Verify the slugs that were enqueued by reading the memory_jobs table.
|
|
346
347
|
// Tests that mock `jobs-store.js` skip inserting rows; when this suite
|
|
@@ -349,34 +350,50 @@ describe("memoryV2ReembedJob", () => {
|
|
|
349
350
|
// belt-and-suspenders.
|
|
350
351
|
const rows = getDb().select().from(memoryJobs).all();
|
|
351
352
|
if (rows.length > 0) {
|
|
352
|
-
expect(rows).toHaveLength(2
|
|
353
|
+
expect(rows).toHaveLength(2);
|
|
353
354
|
const slugs = rows.map((row) => JSON.parse(row.payload).slug);
|
|
354
355
|
expect(slugs).toContain("alice");
|
|
355
356
|
expect(slugs).toContain("bob");
|
|
356
|
-
for (const metaSlug of META_FILE_SLUGS) {
|
|
357
|
-
expect(slugs).toContain(metaSlug);
|
|
358
|
-
}
|
|
359
357
|
for (const row of rows) {
|
|
360
358
|
expect(row.type).toBe("embed_concept_page");
|
|
361
359
|
}
|
|
362
360
|
}
|
|
363
361
|
});
|
|
364
362
|
|
|
365
|
-
test("with no concept pages on disk,
|
|
363
|
+
test("with no concept pages on disk, enqueues nothing", async () => {
|
|
366
364
|
const total = await memoryV2ReembedJob(
|
|
367
365
|
makeJob("memory_v2_reembed"),
|
|
368
366
|
TEST_CONFIG,
|
|
369
367
|
);
|
|
370
|
-
expect(total).toBe(
|
|
368
|
+
expect(total).toBe(0);
|
|
371
369
|
});
|
|
372
370
|
|
|
373
|
-
test("
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
371
|
+
test("does NOT enqueue reserved meta-file slugs", async () => {
|
|
372
|
+
// The four prose meta files (essentials/threads/recent/buffer) live at
|
|
373
|
+
// `memory/<name>.md` and are direct-injected into the system prompt via
|
|
374
|
+
// `_autoinject.md`. Their underscore-bracketed slug aliases (e.g.
|
|
375
|
+
// `__essentials__`) fail the concept-page slug validator
|
|
376
|
+
// (`[a-z0-9][a-z0-9-]*`), so the reembed fan-out must not enqueue them.
|
|
377
|
+
await writePage(tmpWorkspace, {
|
|
378
|
+
slug: "alice",
|
|
379
|
+
frontmatter: { edges: [], ref_files: [], ref_urls: [] },
|
|
380
|
+
body: "Alice.\n",
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
await memoryV2ReembedJob(makeJob("memory_v2_reembed"), TEST_CONFIG);
|
|
384
|
+
|
|
385
|
+
const rows = getDb().select().from(memoryJobs).all();
|
|
386
|
+
if (rows.length > 0) {
|
|
387
|
+
const slugs = rows.map((row) => JSON.parse(row.payload).slug);
|
|
388
|
+
for (const reserved of [
|
|
389
|
+
"__essentials__",
|
|
390
|
+
"__threads__",
|
|
391
|
+
"__recent__",
|
|
392
|
+
"__buffer__",
|
|
393
|
+
]) {
|
|
394
|
+
expect(slugs).not.toContain(reserved);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
380
397
|
});
|
|
381
398
|
});
|
|
382
399
|
|