@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
|
@@ -51,9 +51,13 @@ export function listConversations(
|
|
|
51
51
|
ensureDisplayOrderMigration();
|
|
52
52
|
ensureGroupMigration();
|
|
53
53
|
const db = getDb();
|
|
54
|
+
// 'private' is excluded defensively: in-place snapshot restore swaps the
|
|
55
|
+
// SQLite file without running migrations in-process, so legacy private rows
|
|
56
|
+
// can briefly exist before migration cleanup. Hide them from foreground
|
|
57
|
+
// lists until the next migration pass deletes them.
|
|
54
58
|
const typeCond = backgroundOnly
|
|
55
59
|
? sql`${conversations.conversationType} IN ('background', 'scheduled') AND (${conversations.source} IS NULL OR ${conversations.source} != 'subagent')`
|
|
56
|
-
: sql`${conversations.conversationType} NOT IN ('background', 'scheduled')`;
|
|
60
|
+
: sql`${conversations.conversationType} NOT IN ('background', 'scheduled', 'private')`;
|
|
57
61
|
const where = includeArchived
|
|
58
62
|
? typeCond
|
|
59
63
|
: sql`${typeCond} AND ${conversations.archivedAt} IS NULL`;
|
|
@@ -80,7 +84,7 @@ export function listPinnedConversations(): ConversationRow[] {
|
|
|
80
84
|
.from(conversations)
|
|
81
85
|
.where(
|
|
82
86
|
and(
|
|
83
|
-
sql`${conversations.conversationType} NOT IN ('background', 'scheduled')`,
|
|
87
|
+
sql`${conversations.conversationType} NOT IN ('background', 'scheduled', 'private')`,
|
|
84
88
|
sql`is_pinned = 1`,
|
|
85
89
|
),
|
|
86
90
|
)
|
|
@@ -258,7 +262,7 @@ export function searchConversations(
|
|
|
258
262
|
FROM messages_fts f
|
|
259
263
|
JOIN messages m ON m.id = f.message_id
|
|
260
264
|
JOIN conversations c ON c.id = m.conversation_id
|
|
261
|
-
WHERE messages_fts MATCH ? AND c.conversation_type NOT IN ('background', 'scheduled') AND c.archived_at IS NULL
|
|
265
|
+
WHERE messages_fts MATCH ? AND c.conversation_type NOT IN ('background', 'scheduled', 'private') AND c.archived_at IS NULL
|
|
262
266
|
LIMIT 1000
|
|
263
267
|
`,
|
|
264
268
|
ftsMatch,
|
|
@@ -283,7 +287,7 @@ export function searchConversations(
|
|
|
283
287
|
SELECT DISTINCT m.conversation_id
|
|
284
288
|
FROM messages m
|
|
285
289
|
JOIN conversations c ON c.id = m.conversation_id
|
|
286
|
-
WHERE m.content LIKE ? ESCAPE '\\' AND c.conversation_type NOT IN ('background', 'scheduled') AND c.archived_at IS NULL
|
|
290
|
+
WHERE m.content LIKE ? ESCAPE '\\' AND c.conversation_type NOT IN ('background', 'scheduled', 'private') AND c.archived_at IS NULL
|
|
287
291
|
LIMIT 1000
|
|
288
292
|
`,
|
|
289
293
|
likePattern,
|
|
@@ -297,7 +301,7 @@ export function searchConversations(
|
|
|
297
301
|
.from(conversations)
|
|
298
302
|
.where(
|
|
299
303
|
and(
|
|
300
|
-
sql`${conversations.conversationType} NOT IN ('background', 'scheduled')`,
|
|
304
|
+
sql`${conversations.conversationType} NOT IN ('background', 'scheduled', 'private')`,
|
|
301
305
|
sql`${conversations.title} LIKE ${titlePattern} ESCAPE '\\'`,
|
|
302
306
|
sql`${conversations.archivedAt} IS NULL`,
|
|
303
307
|
),
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Re-exports the canonical conversation-type union (defined alongside the
|
|
2
|
+
// create path in `conversation-crud.ts`) under a read-side name and provides
|
|
3
|
+
// the shared "is this a non-interactive / background conversation?" predicate
|
|
4
|
+
// used by notification-feed and memory filters.
|
|
5
|
+
|
|
6
|
+
import type { ConversationCreateType } from "./conversation-crud.js";
|
|
7
|
+
|
|
8
|
+
export type ConversationType = ConversationCreateType;
|
|
9
|
+
|
|
10
|
+
// Tolerant of null/undefined/unknown strings so it can be called directly on
|
|
11
|
+
// raw DB column values without pre-validation.
|
|
12
|
+
export function isBackgroundConversationType(
|
|
13
|
+
t: ConversationType | string | null | undefined,
|
|
14
|
+
): boolean {
|
|
15
|
+
return t === "background" || t === "scheduled";
|
|
16
|
+
}
|
package/src/memory/db-init.ts
CHANGED
|
@@ -39,6 +39,7 @@ import {
|
|
|
39
39
|
migrate230AcpSessionHistory,
|
|
40
40
|
migrate231RepairMemoryGraphEventDates,
|
|
41
41
|
migrateActivationState,
|
|
42
|
+
migrateActivationStateFkCascade,
|
|
42
43
|
migrateAddConversationInferenceProfile,
|
|
43
44
|
migrateAddSourceTypeColumns,
|
|
44
45
|
migrateAssistantContactMetadata,
|
|
@@ -46,6 +47,7 @@ import {
|
|
|
46
47
|
migrateBackfillContactInteractionStats,
|
|
47
48
|
migrateBackfillGuardianPrincipalId,
|
|
48
49
|
migrateBackfillInlineAttachmentsToDisk,
|
|
50
|
+
migrateBackfillProviderConnectionLabel,
|
|
49
51
|
migrateBackfillUsageCacheAccounting,
|
|
50
52
|
migrateCallSessionInviteMetadata,
|
|
51
53
|
migrateCallSessionMode,
|
|
@@ -63,6 +65,7 @@ import {
|
|
|
63
65
|
migrateContactsUserFileColumn,
|
|
64
66
|
migrateConversationForkLineage,
|
|
65
67
|
migrateConversationHostAccess,
|
|
68
|
+
migrateConversationInferenceProfileSession,
|
|
66
69
|
migrateConversationsArchivedAt,
|
|
67
70
|
migrateConversationsLastMessageAt,
|
|
68
71
|
migrateConversationsThreadTypeIndex,
|
|
@@ -71,6 +74,7 @@ import {
|
|
|
71
74
|
migrateCreateMemoryGraphNodeEdits,
|
|
72
75
|
migrateCreateMemoryGraphTables,
|
|
73
76
|
migrateCreateMemoryRecallLogs,
|
|
77
|
+
migrateCreateProviderConnections,
|
|
74
78
|
migrateCreateThreadStartersTable,
|
|
75
79
|
migrateCreateTraceEventsTable,
|
|
76
80
|
migrateDeletePrivateConversations,
|
|
@@ -112,7 +116,9 @@ import {
|
|
|
112
116
|
migrateMemoryGraphImageRefs,
|
|
113
117
|
migrateMemoryItemSupersession,
|
|
114
118
|
migrateMemoryRecallLogsQueryContext,
|
|
119
|
+
migrateMemoryRetrospectiveState,
|
|
115
120
|
migrateMemoryV2ActivationLogs,
|
|
121
|
+
migrateMessageBookmarks,
|
|
116
122
|
migrateMessagesConversationCreatedAtIndex,
|
|
117
123
|
migrateMessagesFtsBackfill,
|
|
118
124
|
migrateNormalizePhoneIdentities,
|
|
@@ -133,6 +139,7 @@ import {
|
|
|
133
139
|
migrateOAuthProvidersScopeSeparator,
|
|
134
140
|
migrateOAuthProvidersTokenAuthMethodDefault,
|
|
135
141
|
migrateOAuthProvidersTokenExchangeBodyFormat,
|
|
142
|
+
migrateProviderConnectionStatusLabel,
|
|
136
143
|
migrateReminderRoutingIntent,
|
|
137
144
|
migrateRemindersToSchedules,
|
|
138
145
|
migrateRenameConversationTypeColumn,
|
|
@@ -399,6 +406,7 @@ export function initializeDb(): void {
|
|
|
399
406
|
migrate230AcpSessionHistory,
|
|
400
407
|
migrate231RepairMemoryGraphEventDates,
|
|
401
408
|
migrateActivationState,
|
|
409
|
+
migrateActivationStateFkCascade,
|
|
402
410
|
migrateMemoryV2ActivationLogs,
|
|
403
411
|
migrateCreateDocumentConversations,
|
|
404
412
|
migrateLlmUsageAttribution,
|
|
@@ -410,6 +418,12 @@ export function initializeDb(): void {
|
|
|
410
418
|
},
|
|
411
419
|
migrateScheduleRetryPolicy,
|
|
412
420
|
migrateTraceEventsCreatedAtIndex,
|
|
421
|
+
migrateConversationInferenceProfileSession,
|
|
422
|
+
migrateMessageBookmarks,
|
|
423
|
+
migrateCreateProviderConnections,
|
|
424
|
+
migrateProviderConnectionStatusLabel,
|
|
425
|
+
migrateMemoryRetrospectiveState,
|
|
426
|
+
migrateBackfillProviderConnectionLabel,
|
|
413
427
|
];
|
|
414
428
|
|
|
415
429
|
// Run each migration step, catching and logging individual failures so one
|
|
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
|
|
3
3
|
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
4
4
|
import { getOllamaBaseUrlEnv } from "../config/env.js";
|
|
5
|
+
import { resolveCallSiteConfig } from "../config/llm-resolver.js";
|
|
5
6
|
import type { AssistantConfig } from "../config/types.js";
|
|
6
7
|
import { MANAGED_PROVIDER_META } from "../providers/managed-proxy/constants.js";
|
|
7
8
|
import { resolveManagedProxyContext } from "../providers/managed-proxy/context.js";
|
|
@@ -778,7 +779,7 @@ export async function selectedBackendSupportsMultimodal(
|
|
|
778
779
|
|
|
779
780
|
async function isOllamaConfigured(config: AssistantConfig): Promise<boolean> {
|
|
780
781
|
return (
|
|
781
|
-
config.llm.
|
|
782
|
+
resolveCallSiteConfig("mainAgent", config.llm).provider === "ollama" ||
|
|
782
783
|
Boolean(await getProviderKeyAsync("ollama")) ||
|
|
783
784
|
Boolean(getOllamaBaseUrlEnv())
|
|
784
785
|
);
|
|
@@ -44,7 +44,7 @@ const JINJA_VERSION = "0.5.5";
|
|
|
44
44
|
* scripts when the worker IPC contract or spawn-args list changes (without
|
|
45
45
|
* requiring an `@huggingface/transformers` version bump).
|
|
46
46
|
*/
|
|
47
|
-
const RUNTIME_VERSION = `ort-${ONNXRUNTIME_NODE_VERSION}_hf-${TRANSFORMERS_VERSION}_jinja-${JINJA_VERSION}_workers-
|
|
47
|
+
const RUNTIME_VERSION = `ort-${ONNXRUNTIME_NODE_VERSION}_hf-${TRANSFORMERS_VERSION}_jinja-${JINJA_VERSION}_workers-v3`;
|
|
48
48
|
|
|
49
49
|
const WORKER_FILENAME = "embed-worker.mjs";
|
|
50
50
|
const RERANK_WORKER_FILENAME = "rerank-worker.mjs";
|
|
@@ -252,7 +252,6 @@ async function processQueue() {
|
|
|
252
252
|
text_pair: passages,
|
|
253
253
|
padding: true,
|
|
254
254
|
truncation: true,
|
|
255
|
-
return_tensors: 'pt',
|
|
256
255
|
});
|
|
257
256
|
const out = await session(inputs);
|
|
258
257
|
const logits = out.logits.data;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
let flagEnabled = false;
|
|
4
|
+
|
|
5
|
+
mock.module("../../../config/assistant-feature-flags.js", () => ({
|
|
6
|
+
isAssistantFeatureFlagEnabled: (_key: string, _config: unknown) =>
|
|
7
|
+
flagEnabled,
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
import { getRememberDescription } from "../tools.js";
|
|
11
|
+
|
|
12
|
+
const stubConfig = {} as unknown as Parameters<
|
|
13
|
+
typeof getRememberDescription
|
|
14
|
+
>[0];
|
|
15
|
+
|
|
16
|
+
describe("getRememberDescription", () => {
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
flagEnabled = false;
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test("flag off — returns the default high-pressure description", () => {
|
|
22
|
+
const desc = getRememberDescription(stubConfig);
|
|
23
|
+
expect(desc).toContain("**CRITICAL:**");
|
|
24
|
+
expect(desc).toContain("most frequently used tool");
|
|
25
|
+
expect(desc).toContain("almost every turn");
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("flag on — returns the relaxed judgment-framing description", () => {
|
|
29
|
+
flagEnabled = true;
|
|
30
|
+
const desc = getRememberDescription(stubConfig);
|
|
31
|
+
expect(desc).not.toContain("**CRITICAL:**");
|
|
32
|
+
expect(desc).not.toContain("almost every turn");
|
|
33
|
+
expect(desc).toContain("a retrospective pass");
|
|
34
|
+
expect(desc).toContain("Use judgment");
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("the two variants differ", () => {
|
|
38
|
+
flagEnabled = false;
|
|
39
|
+
const off = getRememberDescription(stubConfig);
|
|
40
|
+
flagEnabled = true;
|
|
41
|
+
const on = getRememberDescription(stubConfig);
|
|
42
|
+
expect(off).not.toBe(on);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("corrections-are-priority language is preserved in BOTH variants", () => {
|
|
46
|
+
flagEnabled = false;
|
|
47
|
+
expect(getRememberDescription(stubConfig)).toMatch(
|
|
48
|
+
/Corrections are.*highest priority/i,
|
|
49
|
+
);
|
|
50
|
+
flagEnabled = true;
|
|
51
|
+
expect(getRememberDescription(stubConfig)).toMatch(
|
|
52
|
+
/Corrections are.*highest priority/i,
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
|
|
9
9
|
import { and, desc, eq, inArray, ne, notInArray } from "drizzle-orm";
|
|
10
|
+
import { z } from "zod";
|
|
10
11
|
|
|
11
12
|
import type { AssistantConfig } from "../../config/types.js";
|
|
12
13
|
import { estimateTextTokens } from "../../context/token-estimator.js";
|
|
@@ -19,6 +20,8 @@ import type {
|
|
|
19
20
|
import { getLogger } from "../../util/logger.js";
|
|
20
21
|
import { getWorkspaceDir } from "../../util/platform.js";
|
|
21
22
|
import { getDb } from "../db-connection.js";
|
|
23
|
+
import { embedWithRetry } from "../embed.js";
|
|
24
|
+
import { generateSparseEmbedding } from "../embedding-backend.js";
|
|
22
25
|
import type { QdrantSparseVector } from "../qdrant-client.js";
|
|
23
26
|
import { memorySummaries } from "../schema.js";
|
|
24
27
|
import { conversations } from "../schema/conversations.js";
|
|
@@ -388,8 +391,15 @@ export class ConversationGraphMemory {
|
|
|
388
391
|
|
|
389
392
|
return await this.runPerTurn(messages, config, abortSignal);
|
|
390
393
|
} catch (err) {
|
|
394
|
+
const errCode =
|
|
395
|
+
err instanceof z.ZodError ? err.issues[0]?.code : undefined;
|
|
391
396
|
log.warn(
|
|
392
|
-
{
|
|
397
|
+
{
|
|
398
|
+
err: err instanceof Error ? err.message : String(err),
|
|
399
|
+
conversationId: this.conversationId,
|
|
400
|
+
turn: this.tracker.getTurn(),
|
|
401
|
+
errCode,
|
|
402
|
+
},
|
|
393
403
|
"Memory retrieval failed (non-fatal)",
|
|
394
404
|
);
|
|
395
405
|
return noopResult;
|
|
@@ -422,10 +432,19 @@ export class ConversationGraphMemory {
|
|
|
422
432
|
"",
|
|
423
433
|
signal,
|
|
424
434
|
);
|
|
425
|
-
this.initialized = true;
|
|
426
|
-
this.needsReload = false;
|
|
427
435
|
|
|
428
436
|
if (v2.routed) {
|
|
437
|
+
// Surface a user-query embedding so PKB hint search still runs on v2
|
|
438
|
+
// turns. v1's `loadContextMemory` produced these as a side effect of
|
|
439
|
+
// hybrid retrieval; the v2 path skips that retrieval, so embed
|
|
440
|
+
// explicitly here.
|
|
441
|
+
const userQueryEmbed = await this.computeQueryVectors(
|
|
442
|
+
rawUserText ?? userQuery ?? "",
|
|
443
|
+
config,
|
|
444
|
+
signal,
|
|
445
|
+
);
|
|
446
|
+
this.initialized = true;
|
|
447
|
+
this.needsReload = false;
|
|
429
448
|
this.lastInjectedBlock = v2.injectedBlockText;
|
|
430
449
|
this.lastInjectedNodeIds = [];
|
|
431
450
|
this.lastInjectedImages = new Map();
|
|
@@ -438,6 +457,8 @@ export class ConversationGraphMemory {
|
|
|
438
457
|
mode: "context-load" as const,
|
|
439
458
|
injectedBlockText: v2.injectedBlockText,
|
|
440
459
|
metrics: null,
|
|
460
|
+
userQueryVector: userQueryEmbed.dense,
|
|
461
|
+
userQuerySparseVector: userQueryEmbed.sparse,
|
|
441
462
|
};
|
|
442
463
|
}
|
|
443
464
|
|
|
@@ -449,6 +470,12 @@ export class ConversationGraphMemory {
|
|
|
449
470
|
config,
|
|
450
471
|
signal,
|
|
451
472
|
});
|
|
473
|
+
// Set initialized only after v1 retrieval succeeds. If `loadContextMemory`
|
|
474
|
+
// throws (transient DB/Qdrant failure), `prepareMemory` catches and
|
|
475
|
+
// returns noop, but we want the next turn to retry the bootstrap path
|
|
476
|
+
// rather than be stuck in per-turn mode.
|
|
477
|
+
this.initialized = true;
|
|
478
|
+
this.needsReload = false;
|
|
452
479
|
|
|
453
480
|
if (result.nodes.length === 0) {
|
|
454
481
|
this.lastInjectedBlock = null;
|
|
@@ -569,6 +596,14 @@ export class ConversationGraphMemory {
|
|
|
569
596
|
signal,
|
|
570
597
|
);
|
|
571
598
|
if (v2.routed) {
|
|
599
|
+
// Surface a per-turn query embedding so PKB hint search still runs
|
|
600
|
+
// on v2 turns. v1's `retrieveForTurn` produced these as a side effect;
|
|
601
|
+
// the v2 path skips that retrieval, so embed explicitly here.
|
|
602
|
+
const perTurnEmbed = await this.computeQueryVectors(
|
|
603
|
+
userLast,
|
|
604
|
+
config,
|
|
605
|
+
signal,
|
|
606
|
+
);
|
|
572
607
|
this.lastInjectedBlock = v2.injectedBlockText;
|
|
573
608
|
this.lastInjectedNodeIds = [];
|
|
574
609
|
this.lastInjectedImages = new Map();
|
|
@@ -581,6 +616,8 @@ export class ConversationGraphMemory {
|
|
|
581
616
|
mode: "per-turn" as const,
|
|
582
617
|
injectedBlockText: v2.injectedBlockText,
|
|
583
618
|
metrics: null,
|
|
619
|
+
queryVector: perTurnEmbed.dense,
|
|
620
|
+
sparseVector: perTurnEmbed.sparse,
|
|
584
621
|
};
|
|
585
622
|
}
|
|
586
623
|
|
|
@@ -652,6 +689,35 @@ export class ConversationGraphMemory {
|
|
|
652
689
|
};
|
|
653
690
|
}
|
|
654
691
|
|
|
692
|
+
/**
|
|
693
|
+
* Embed a query string for PKB hint search on v2 turns. v1 retrieval
|
|
694
|
+
* produced these vectors as a side effect; on v2 we skip retrieval, so
|
|
695
|
+
* the agent loop loses the dense/sparse pair it needs to drive
|
|
696
|
+
* `buildPkbReminderWithHints`. Failures here degrade PKB hints to the
|
|
697
|
+
* static fallback rather than blocking the turn.
|
|
698
|
+
*/
|
|
699
|
+
private async computeQueryVectors(
|
|
700
|
+
text: string,
|
|
701
|
+
config: AssistantConfig,
|
|
702
|
+
signal: AbortSignal,
|
|
703
|
+
): Promise<{ dense?: number[]; sparse?: QdrantSparseVector }> {
|
|
704
|
+
const trimmed = text.trim();
|
|
705
|
+
if (trimmed.length === 0) return {};
|
|
706
|
+
let dense: number[] | undefined;
|
|
707
|
+
try {
|
|
708
|
+
const result = await embedWithRetry(config, [trimmed], { signal });
|
|
709
|
+
dense = result.vectors[0];
|
|
710
|
+
} catch (err) {
|
|
711
|
+
log.warn(
|
|
712
|
+
{ err: err instanceof Error ? err.message : String(err) },
|
|
713
|
+
"Failed to embed query for PKB hints on v2 path",
|
|
714
|
+
);
|
|
715
|
+
}
|
|
716
|
+
const sparseRaw = generateSparseEmbedding(trimmed);
|
|
717
|
+
const sparse = sparseRaw.indices.length > 0 ? sparseRaw : undefined;
|
|
718
|
+
return { dense, sparse };
|
|
719
|
+
}
|
|
720
|
+
|
|
655
721
|
/**
|
|
656
722
|
* Run the v2 activation pipeline when the workspace config
|
|
657
723
|
* (`memory.v2.enabled`) is on.
|
|
@@ -716,7 +782,11 @@ export class ConversationGraphMemory {
|
|
|
716
782
|
* Count the leading content blocks on a user message that were added by
|
|
717
783
|
* `injectMemoryBlock`. Memory-injected images use a 3-block pattern
|
|
718
784
|
* (opening `<memory_image>` text + image + closing `</memory_image>` text),
|
|
719
|
-
* followed by a `<memory>…</memory>` text block (legacy `<memory __injected>` is also accepted).
|
|
785
|
+
* followed by a `<memory>…</memory>` text block (legacy `<memory __injected>` is also accepted).
|
|
786
|
+
* The bare `<memory>` form is matched only when the block also ends with
|
|
787
|
+
* `\n</memory>`, so user-authored content that happens to begin with
|
|
788
|
+
* `<memory>` (for example, a message discussing the XML-like markup) is not
|
|
789
|
+
* mistaken for an injected prefix and stripped on re-injection. A legacy
|
|
720
790
|
* 2-block image pattern (no closing tag) is also accepted for backward
|
|
721
791
|
* compatibility. The injection prefix is always contiguous at the start,
|
|
722
792
|
* so we stop at the first non-memory block.
|
|
@@ -729,7 +799,8 @@ export function countMemoryPrefixBlocks(content: ContentBlock[]): number {
|
|
|
729
799
|
const block = content[firstNonMemory];
|
|
730
800
|
if (
|
|
731
801
|
block.type === "text" &&
|
|
732
|
-
(block.text.startsWith("<memory>\n")
|
|
802
|
+
((block.text.startsWith("<memory>\n") &&
|
|
803
|
+
block.text.endsWith("\n</memory>")) ||
|
|
733
804
|
block.text.startsWith("<memory __injected>\n"))
|
|
734
805
|
) {
|
|
735
806
|
firstNonMemory++;
|
|
@@ -723,8 +723,12 @@ export function parseExtractionResponse(
|
|
|
723
723
|
|
|
724
724
|
// Auto-create event trigger when event_date is set but LLM didn't include one,
|
|
725
725
|
// or replace a malformed event trigger (event_date unset) with a valid one.
|
|
726
|
+
// Only auto-create for future events — past-dated memories (historical
|
|
727
|
+
// milestones, dated events that already happened) shouldn't generate
|
|
728
|
+
// ramp/follow-up reminders.
|
|
726
729
|
if (
|
|
727
730
|
node.eventDate != null &&
|
|
731
|
+
node.eventDate > now &&
|
|
728
732
|
(!Array.isArray(raw.triggers) ||
|
|
729
733
|
!raw.triggers.some((t) => t.type === "event" && t.event_date != null))
|
|
730
734
|
) {
|
|
@@ -24,9 +24,7 @@ export function saveGraphMemoryState(
|
|
|
24
24
|
/**
|
|
25
25
|
* Load graph memory state for a conversation, or null if none exists.
|
|
26
26
|
*/
|
|
27
|
-
export function loadGraphMemoryState(
|
|
28
|
-
conversationId: string,
|
|
29
|
-
): string | null {
|
|
27
|
+
export function loadGraphMemoryState(conversationId: string): string | null {
|
|
30
28
|
const db = getDb();
|
|
31
29
|
const row = db
|
|
32
30
|
.select({ stateJson: conversationGraphMemoryState.stateJson })
|
|
@@ -35,3 +33,18 @@ export function loadGraphMemoryState(
|
|
|
35
33
|
.get();
|
|
36
34
|
return row?.stateJson ?? null;
|
|
37
35
|
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Copy the parent conversation's graph memory state row to a new conversation
|
|
39
|
+
* id so the forked conversation resumes with the parent's InContextTracker
|
|
40
|
+
* snapshot (in-context node IDs, per-node turn log, current turn). No-op if
|
|
41
|
+
* the parent has no row yet.
|
|
42
|
+
*/
|
|
43
|
+
export function forkGraphMemoryState(
|
|
44
|
+
parentConversationId: string,
|
|
45
|
+
newConversationId: string,
|
|
46
|
+
): void {
|
|
47
|
+
const stateJson = loadGraphMemoryState(parentConversationId);
|
|
48
|
+
if (stateJson == null) return;
|
|
49
|
+
saveGraphMemoryState(newConversationId, stateJson);
|
|
50
|
+
}
|
|
@@ -69,6 +69,22 @@ export function handleRemember(
|
|
|
69
69
|
return { success: true, message: "Saved to knowledge base." };
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Format `now` as a buffer-entry timestamp (`Mon D, h:mm AM/PM`). Exported so
|
|
74
|
+
* the memory v2 consolidation job can present its cutoff in the same shape
|
|
75
|
+
* the buffer entries use, making the agent's "timestamp ≥ cutoff" comparison
|
|
76
|
+
* unambiguous at minute precision.
|
|
77
|
+
*/
|
|
78
|
+
export function formatBufferTimestamp(now: Date): string {
|
|
79
|
+
const month = now.toLocaleString("en-US", { month: "short" });
|
|
80
|
+
const day = now.getDate();
|
|
81
|
+
const hours = now.getHours();
|
|
82
|
+
const minutes = String(now.getMinutes()).padStart(2, "0");
|
|
83
|
+
const ampm = hours >= 12 ? "PM" : "AM";
|
|
84
|
+
const displayHour = hours % 12 || 12;
|
|
85
|
+
return `${month} ${day}, ${displayHour}:${minutes} ${ampm}`;
|
|
86
|
+
}
|
|
87
|
+
|
|
72
88
|
/**
|
|
73
89
|
* Build a timestamped bullet entry for `buffer.md` / `archive/<date>.md`.
|
|
74
90
|
*
|
|
@@ -80,13 +96,7 @@ export function handleRemember(
|
|
|
80
96
|
* entries identically to user-facing `remember()` calls.
|
|
81
97
|
*/
|
|
82
98
|
export function formatRememberEntry(content: string, now: Date): string {
|
|
83
|
-
|
|
84
|
-
const day = now.getDate();
|
|
85
|
-
const hours = now.getHours();
|
|
86
|
-
const minutes = String(now.getMinutes()).padStart(2, "0");
|
|
87
|
-
const ampm = hours >= 12 ? "PM" : "AM";
|
|
88
|
-
const displayHour = hours % 12 || 12;
|
|
89
|
-
return `- [${month} ${day}, ${displayHour}:${minutes} ${ampm}] ${content}\n`;
|
|
99
|
+
return `- [${formatBufferTimestamp(now)}] ${content}\n`;
|
|
90
100
|
}
|
|
91
101
|
|
|
92
102
|
/**
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// Memory Tool definitions for agentic recall and remember.
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
|
|
5
|
+
import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
|
|
6
|
+
import type { AssistantConfig } from "../../config/types.js";
|
|
5
7
|
import type { ToolDefinition } from "../../providers/types.js";
|
|
6
8
|
import {
|
|
7
9
|
ALL_RECALL_SOURCES,
|
|
@@ -12,13 +14,13 @@ import {
|
|
|
12
14
|
const RECALL_DEPTHS = ["fast", "standard", "deep"] as const;
|
|
13
15
|
|
|
14
16
|
/**
|
|
15
|
-
* Explicit local information search across memory,
|
|
17
|
+
* Explicit local information search across memory, conversations, and
|
|
16
18
|
* workspace files.
|
|
17
19
|
*/
|
|
18
20
|
export const graphRecallDefinition: ToolDefinition = {
|
|
19
21
|
name: "recall",
|
|
20
22
|
description:
|
|
21
|
-
'Search local information the moment you feel uncertain. Use recall for memory,
|
|
23
|
+
'Search local information the moment you feel uncertain. Use recall for memory, past conversations, and workspace files — before you guess, before you ask, before you hedge. Auto-injection is incomplete by design; it surfaces patterns, not the specifics you need to answer well. If you catch yourself reaching for "I think", "I believe", "if I remember", "didn\'t we", "last time" — that\'s the signal. Recall. If the user references someone, a place, a decision, a document, or prior work you should be able to find locally — recall. Call it multiple times per conversation if the turn warrants it. Be specific in your query for best results.',
|
|
22
24
|
input_schema: {
|
|
23
25
|
type: "object",
|
|
24
26
|
properties: {
|
|
@@ -34,7 +36,7 @@ export const graphRecallDefinition: ToolDefinition = {
|
|
|
34
36
|
enum: [...ALL_RECALL_SOURCES],
|
|
35
37
|
},
|
|
36
38
|
description:
|
|
37
|
-
"Optional local sources to search. Omit to search memory,
|
|
39
|
+
"Optional local sources to search. Omit to search memory, conversations, and workspace files.",
|
|
38
40
|
},
|
|
39
41
|
max_results: {
|
|
40
42
|
type: "integer",
|
|
@@ -53,6 +55,38 @@ export const graphRecallDefinition: ToolDefinition = {
|
|
|
53
55
|
},
|
|
54
56
|
};
|
|
55
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Default (high-pressure) `remember` tool description. Used when the
|
|
60
|
+
* `memory-retrospective` feature flag is OFF. The volume-shaming language
|
|
61
|
+
* ("almost every turn", "most frequently used tool") drives aggressive
|
|
62
|
+
* in-conversation capture for users who don't have the retrospective
|
|
63
|
+
* backstop enabled.
|
|
64
|
+
*/
|
|
65
|
+
const REMEMBER_DESCRIPTION_DEFAULT =
|
|
66
|
+
"Remember anything concrete: facts, preferences, corrections, plans, felt moments, names, dates, decisions. Default to remembering. Never wait until end of conversation. Corrections are highest priority — call remember the same turn the correction lands. **CRITICAL:** You should be calling remember on almost every turn. This should be your most frequently used tool.";
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Relaxed `remember` tool description used when `memory-retrospective` is
|
|
70
|
+
* ON. The retrospective pass catches what isn't captured in the moment, so
|
|
71
|
+
* the in-conversation pressure eases to a judgment framing: pause when
|
|
72
|
+
* something feels worth marking, not because the volume is required.
|
|
73
|
+
*/
|
|
74
|
+
const REMEMBER_DESCRIPTION_RELAXED =
|
|
75
|
+
"Remember anything concrete the user shared: corrections, plans, decisions, felt moments, names, dates, commitments, preferences. Corrections are the highest priority — call `remember` the same turn the correction lands. You don't have to call this on every turn; a retrospective pass reviews the conversation after each message-count / time interval and saves what you didn't capture. Use judgment: pause and remember when something feels worth marking, not because the volume is required.";
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Return the description that should appear in the `remember` tool
|
|
79
|
+
* registration for the current config. The variant is selected by the
|
|
80
|
+
* `memory-retrospective` assistant feature flag. Exposed as a function so
|
|
81
|
+
* the tool registrar can compute the value at registration time without
|
|
82
|
+
* importing config layers into the static definition.
|
|
83
|
+
*/
|
|
84
|
+
export function getRememberDescription(config: AssistantConfig): string {
|
|
85
|
+
return isAssistantFeatureFlagEnabled("memory-retrospective", config)
|
|
86
|
+
? REMEMBER_DESCRIPTION_RELAXED
|
|
87
|
+
: REMEMBER_DESCRIPTION_DEFAULT;
|
|
88
|
+
}
|
|
89
|
+
|
|
56
90
|
/**
|
|
57
91
|
* Save a fact to the assistant's knowledge base. The fact is appended to
|
|
58
92
|
* `buffer.md` (immediately available in the next conversation) and the daily
|
|
@@ -60,11 +94,16 @@ export const graphRecallDefinition: ToolDefinition = {
|
|
|
60
94
|
* writes go under `memory/`; otherwise they go under `pkb/`. Consolidation
|
|
61
95
|
* of the buffer into longer-form storage runs as a separate periodic job in
|
|
62
96
|
* both modes.
|
|
97
|
+
*
|
|
98
|
+
* The static `description` field carries the default (high-pressure) text
|
|
99
|
+
* so any direct importer that doesn't go through `getRememberDescription`
|
|
100
|
+
* still gets a valid tool definition. The registered `RememberTool` in
|
|
101
|
+
* `tools/memory/register.ts` overrides this at registration time with the
|
|
102
|
+
* flag-aware variant.
|
|
63
103
|
*/
|
|
64
104
|
export const graphRememberDefinition: ToolDefinition = {
|
|
65
105
|
name: "remember",
|
|
66
|
-
description:
|
|
67
|
-
"Remember anything concrete: facts, preferences, corrections, plans, felt moments, names, dates, decisions. Default to remembering. Never wait until end of conversation. Corrections are highest priority — call remember the same turn the correction lands. **CRITICAL:** You should be calling remember on almost every turn. This should be your most frequently used tool.",
|
|
106
|
+
description: REMEMBER_DESCRIPTION_DEFAULT,
|
|
68
107
|
input_schema: {
|
|
69
108
|
type: "object",
|
|
70
109
|
properties: {
|
package/src/memory/indexer.ts
CHANGED
|
@@ -12,6 +12,8 @@ import { getMemoryCheckpoint, setMemoryCheckpoint } from "./checkpoints.js";
|
|
|
12
12
|
import { getDb } from "./db-connection.js";
|
|
13
13
|
import { selectedBackendSupportsMultimodal } from "./embedding-backend.js";
|
|
14
14
|
import { enqueueMemoryJob, upsertDebouncedJob } from "./jobs-store.js";
|
|
15
|
+
import { isMemoryRetrospectiveConversation } from "./memory-retrospective-enqueue.js";
|
|
16
|
+
import { maybeEnqueueRetrospective } from "./memory-retrospective-trigger-check.js";
|
|
15
17
|
import {
|
|
16
18
|
extractMediaBlockMeta,
|
|
17
19
|
extractTextFromStoredMessageContent,
|
|
@@ -283,6 +285,21 @@ export async function indexMessageNow(
|
|
|
283
285
|
});
|
|
284
286
|
}
|
|
285
287
|
}
|
|
288
|
+
|
|
289
|
+
// ── Memory retrospective triggers ─────────────────────────────────
|
|
290
|
+
// Independent of auto-analyze: the retrospective is a focused,
|
|
291
|
+
// memory-only pass that re-reads messages since its last successful
|
|
292
|
+
// run and saves what the in-conversation `remember` calls didn't
|
|
293
|
+
// capture. Triggers (interval / message_count) are evaluated by
|
|
294
|
+
// `maybeEnqueueRetrospective`, which also enforces the per-conversation
|
|
295
|
+
// cooldown gate against retry storms. Recursion guard skips the
|
|
296
|
+
// memory-retrospective background conversation itself.
|
|
297
|
+
if (
|
|
298
|
+
triggerConfig != null &&
|
|
299
|
+
!isMemoryRetrospectiveConversation(input.conversationId)
|
|
300
|
+
) {
|
|
301
|
+
maybeEnqueueRetrospective(input.conversationId, triggerConfig);
|
|
302
|
+
}
|
|
286
303
|
}
|
|
287
304
|
|
|
288
305
|
// ── Conversation summarization (independent of extraction) ────────
|