@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
|
@@ -27,13 +27,13 @@ import {
|
|
|
27
27
|
import {
|
|
28
28
|
type DeterministicRecallSearchOptions,
|
|
29
29
|
type DeterministicRecallSearchResult,
|
|
30
|
-
isAutoInjectedPkbContextEvidence,
|
|
31
30
|
runDeterministicRecallSearch,
|
|
32
31
|
} from "./search.js";
|
|
33
32
|
import {
|
|
34
33
|
extractWorkspacePathLiterals,
|
|
35
34
|
inspectWorkspacePaths,
|
|
36
35
|
isSafeWorkspaceRelativePath,
|
|
36
|
+
normalizeWorkspacePathLiteral,
|
|
37
37
|
} from "./sources/workspace.js";
|
|
38
38
|
import type {
|
|
39
39
|
RecallAnswer,
|
|
@@ -214,19 +214,6 @@ const FINISH_NEGATIVE_PATTERNS = [
|
|
|
214
214
|
/\bno text\b/i,
|
|
215
215
|
];
|
|
216
216
|
|
|
217
|
-
const PKB_RELATIVE_PATH_PREFIXES = [
|
|
218
|
-
"archive/",
|
|
219
|
-
"dpo/",
|
|
220
|
-
"essentials.md",
|
|
221
|
-
"INDEX.md",
|
|
222
|
-
"intimate/",
|
|
223
|
-
"people/",
|
|
224
|
-
"preferences/",
|
|
225
|
-
"procedures/",
|
|
226
|
-
"schedule/",
|
|
227
|
-
"us-arcs/",
|
|
228
|
-
];
|
|
229
|
-
|
|
230
217
|
export async function runAgenticRecall(
|
|
231
218
|
input: RecallInput,
|
|
232
219
|
context: RecallSearchContext,
|
|
@@ -429,7 +416,7 @@ export async function runAgenticRecall(
|
|
|
429
416
|
* Redact secrets from workspace-sourced evidence excerpts before they are
|
|
430
417
|
* serialised into a prompt that will be sent to an external LLM provider.
|
|
431
418
|
*
|
|
432
|
-
* Memory
|
|
419
|
+
* Memory and conversation evidence is already controlled content —
|
|
433
420
|
* only workspace files can contain arbitrary secrets (API keys, tokens, etc.)
|
|
434
421
|
* written by the user or by tools. This runs the same pattern-based scanner
|
|
435
422
|
* used for shell command summaries and approval prompts, replacing any
|
|
@@ -499,7 +486,7 @@ async function runSeedRecallSearch(
|
|
|
499
486
|
context,
|
|
500
487
|
searchOptions,
|
|
501
488
|
);
|
|
502
|
-
evidence = mergeEvidence(
|
|
489
|
+
evidence = mergeEvidence(evidence, expansionResult.evidence);
|
|
503
490
|
}
|
|
504
491
|
|
|
505
492
|
return withFallbackEvidence(baseResult, evidence);
|
|
@@ -694,6 +681,13 @@ function finishRecallFromToolUse(
|
|
|
694
681
|
}
|
|
695
682
|
|
|
696
683
|
const citedEvidence = selectCitedEvidence(promptEvidence, finish.citationIds);
|
|
684
|
+
if (citedEvidence.length === 0) {
|
|
685
|
+
return {
|
|
686
|
+
ok: false,
|
|
687
|
+
reason: "citation_validation_failed",
|
|
688
|
+
detail: "finish_recall returned no resolvable citations",
|
|
689
|
+
};
|
|
690
|
+
}
|
|
697
691
|
debug.finish = {
|
|
698
692
|
confidence: finish.confidence,
|
|
699
693
|
citationIds: finish.citationIds,
|
|
@@ -960,14 +954,16 @@ async function executeInspectWorkspacePaths(
|
|
|
960
954
|
}> {
|
|
961
955
|
const reason = readSearchReason(payload.reason);
|
|
962
956
|
const requestedPaths = readInspectPaths(payload.paths);
|
|
963
|
-
const
|
|
957
|
+
const workspaceSourceEnabled = input.sources.includes("workspace");
|
|
958
|
+
const allowedPaths = workspaceSourceEnabled
|
|
959
|
+
? collectInspectableWorkspacePaths(input.query, evidence)
|
|
960
|
+
: new Set<string>();
|
|
964
961
|
const acceptedPaths: string[] = [];
|
|
965
962
|
const rejectedPaths: string[] = [];
|
|
966
963
|
for (const requestedPath of requestedPaths) {
|
|
967
|
-
const acceptedPath =
|
|
968
|
-
requestedPath,
|
|
969
|
-
|
|
970
|
-
);
|
|
964
|
+
const acceptedPath = workspaceSourceEnabled
|
|
965
|
+
? normalizeRequestedWorkspaceInspectionPath(requestedPath, allowedPaths)
|
|
966
|
+
: null;
|
|
971
967
|
if (acceptedPath) {
|
|
972
968
|
acceptedPaths.push(acceptedPath);
|
|
973
969
|
} else {
|
|
@@ -994,6 +990,7 @@ async function executeInspectWorkspacePaths(
|
|
|
994
990
|
],
|
|
995
991
|
debug: {
|
|
996
992
|
...debug,
|
|
993
|
+
evidenceCount: 1,
|
|
997
994
|
errors: [
|
|
998
995
|
{
|
|
999
996
|
path: "inspect_workspace_paths",
|
|
@@ -1006,8 +1003,9 @@ async function executeInspectWorkspacePaths(
|
|
|
1006
1003
|
|
|
1007
1004
|
const errors = rejectedPaths.map((path) => ({
|
|
1008
1005
|
path,
|
|
1009
|
-
reason:
|
|
1010
|
-
"path was not a safe relative workspace file surfaced by the query or prior evidence"
|
|
1006
|
+
reason: workspaceSourceEnabled
|
|
1007
|
+
? "path was not a safe relative workspace file surfaced by the query or prior evidence"
|
|
1008
|
+
: "workspace source is disabled for this recall request",
|
|
1011
1009
|
}));
|
|
1012
1010
|
|
|
1013
1011
|
let inspectionEvidence: RecallEvidence[] = [];
|
|
@@ -1049,7 +1047,7 @@ async function runAutomaticWorkspaceInspection(
|
|
|
1049
1047
|
evidence: RecallEvidence[];
|
|
1050
1048
|
debug?: AgenticRecallInspectDebug;
|
|
1051
1049
|
}> {
|
|
1052
|
-
if (!input.sources.includes("workspace")
|
|
1050
|
+
if (!input.sources.includes("workspace")) {
|
|
1053
1051
|
return { evidence: [] };
|
|
1054
1052
|
}
|
|
1055
1053
|
|
|
@@ -1113,7 +1111,7 @@ function collectAutomaticWorkspaceInspectionPaths(
|
|
|
1113
1111
|
for (const item of evidence) {
|
|
1114
1112
|
collectEvidenceWorkspacePaths(item).forEach((path) => paths.add(path));
|
|
1115
1113
|
}
|
|
1116
|
-
return [...paths].
|
|
1114
|
+
return [...paths].slice(0, 3);
|
|
1117
1115
|
}
|
|
1118
1116
|
|
|
1119
1117
|
function collectInspectableWorkspacePaths(
|
|
@@ -1128,62 +1126,33 @@ function collectInspectableWorkspacePaths(
|
|
|
1128
1126
|
}
|
|
1129
1127
|
|
|
1130
1128
|
function collectEvidenceWorkspacePaths(item: RecallEvidence): string[] {
|
|
1131
|
-
|
|
1132
|
-
return [];
|
|
1133
|
-
}
|
|
1134
|
-
|
|
1135
|
-
const rawPaths = new Set<string>();
|
|
1129
|
+
const paths = new Set<string>();
|
|
1136
1130
|
const metadataPath = item.metadata?.path;
|
|
1137
|
-
if (
|
|
1138
|
-
|
|
1131
|
+
if (
|
|
1132
|
+
typeof metadataPath === "string" &&
|
|
1133
|
+
isSafeWorkspaceRelativePath(metadataPath)
|
|
1134
|
+
) {
|
|
1135
|
+
paths.add(metadataPath);
|
|
1139
1136
|
}
|
|
1140
1137
|
for (const text of [item.locator, item.title, item.excerpt]) {
|
|
1141
1138
|
for (const path of extractWorkspacePathLiterals(text)) {
|
|
1142
|
-
rawPaths.add(path);
|
|
1143
|
-
}
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1146
|
-
const paths: string[] = [];
|
|
1147
|
-
for (const rawPath of rawPaths) {
|
|
1148
|
-
for (const path of normalizeEvidenceWorkspacePath(rawPath, item.source)) {
|
|
1149
1139
|
if (isSafeWorkspaceRelativePath(path)) {
|
|
1150
|
-
paths.
|
|
1140
|
+
paths.add(path);
|
|
1151
1141
|
}
|
|
1152
1142
|
}
|
|
1153
1143
|
}
|
|
1154
|
-
return [...
|
|
1144
|
+
return [...paths];
|
|
1155
1145
|
}
|
|
1156
1146
|
|
|
1157
1147
|
function normalizeRequestedWorkspaceInspectionPath(
|
|
1158
1148
|
requestedPath: string,
|
|
1159
1149
|
allowedPaths: ReadonlySet<string>,
|
|
1160
1150
|
): string | null {
|
|
1161
|
-
const
|
|
1162
|
-
if (!
|
|
1163
|
-
return
|
|
1164
|
-
}
|
|
1165
|
-
|
|
1166
|
-
if (allowedPaths.has(requestedPath)) {
|
|
1167
|
-
return requestedPath;
|
|
1168
|
-
}
|
|
1169
|
-
|
|
1170
|
-
return null;
|
|
1171
|
-
}
|
|
1172
|
-
|
|
1173
|
-
function normalizeEvidenceWorkspacePath(
|
|
1174
|
-
path: string,
|
|
1175
|
-
source: RecallSource,
|
|
1176
|
-
): string[] {
|
|
1177
|
-
if (path.startsWith("pkb/")) {
|
|
1178
|
-
return [path];
|
|
1179
|
-
}
|
|
1180
|
-
if (
|
|
1181
|
-
source === "pkb" ||
|
|
1182
|
-
PKB_RELATIVE_PATH_PREFIXES.some((prefix) => path.startsWith(prefix))
|
|
1183
|
-
) {
|
|
1184
|
-
return [`pkb/${path}`];
|
|
1151
|
+
const normalized = normalizeWorkspacePathLiteral(requestedPath);
|
|
1152
|
+
if (!normalized) {
|
|
1153
|
+
return null;
|
|
1185
1154
|
}
|
|
1186
|
-
return
|
|
1155
|
+
return allowedPaths.has(normalized) ? normalized : null;
|
|
1187
1156
|
}
|
|
1188
1157
|
|
|
1189
1158
|
function makeWorkspaceInspectionErrorEvidence(options: {
|
|
@@ -1240,24 +1209,7 @@ function mergeEvidence(
|
|
|
1240
1209
|
merged.push(item);
|
|
1241
1210
|
}
|
|
1242
1211
|
|
|
1243
|
-
return
|
|
1244
|
-
}
|
|
1245
|
-
|
|
1246
|
-
function demoteAutoInjectedContextEvidence(
|
|
1247
|
-
evidence: readonly RecallEvidence[],
|
|
1248
|
-
): RecallEvidence[] {
|
|
1249
|
-
const regularEvidence: RecallEvidence[] = [];
|
|
1250
|
-
const autoInjectedContextEvidence: RecallEvidence[] = [];
|
|
1251
|
-
|
|
1252
|
-
for (const item of evidence) {
|
|
1253
|
-
if (isAutoInjectedPkbContextEvidence(item)) {
|
|
1254
|
-
autoInjectedContextEvidence.push(item);
|
|
1255
|
-
} else {
|
|
1256
|
-
regularEvidence.push(item);
|
|
1257
|
-
}
|
|
1258
|
-
}
|
|
1259
|
-
|
|
1260
|
-
return [...regularEvidence, ...autoInjectedContextEvidence];
|
|
1212
|
+
return merged;
|
|
1261
1213
|
}
|
|
1262
1214
|
|
|
1263
1215
|
function toRecallInput(input: NormalizedRecallInput): RecallInput {
|
|
@@ -1284,7 +1236,7 @@ function withFallbackEvidence(
|
|
|
1284
1236
|
result: DeterministicRecallSearchResult,
|
|
1285
1237
|
evidence: readonly RecallEvidence[],
|
|
1286
1238
|
): DeterministicRecallSearchResult {
|
|
1287
|
-
const orderedEvidence =
|
|
1239
|
+
const orderedEvidence = dedupeEvidenceByContent(evidence);
|
|
1288
1240
|
const evidenceCountBySource = new Map<RecallSource, number>();
|
|
1289
1241
|
for (const item of orderedEvidence) {
|
|
1290
1242
|
evidenceCountBySource.set(
|
|
@@ -1303,6 +1255,29 @@ function withFallbackEvidence(
|
|
|
1303
1255
|
};
|
|
1304
1256
|
}
|
|
1305
1257
|
|
|
1258
|
+
function dedupeEvidenceByContent(
|
|
1259
|
+
evidence: readonly RecallEvidence[],
|
|
1260
|
+
): RecallEvidence[] {
|
|
1261
|
+
const seenIds = new Set<string>();
|
|
1262
|
+
const seenContent = new Set<string>();
|
|
1263
|
+
const deduped: RecallEvidence[] = [];
|
|
1264
|
+
|
|
1265
|
+
for (const item of evidence) {
|
|
1266
|
+
if (seenIds.has(item.id)) {
|
|
1267
|
+
continue;
|
|
1268
|
+
}
|
|
1269
|
+
const contentKey = `${item.source}\0${item.locator}\0${item.excerpt}`;
|
|
1270
|
+
if (seenContent.has(contentKey)) {
|
|
1271
|
+
continue;
|
|
1272
|
+
}
|
|
1273
|
+
seenIds.add(item.id);
|
|
1274
|
+
seenContent.add(contentKey);
|
|
1275
|
+
deduped.push(item);
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
return deduped;
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1306
1281
|
function deterministicFallback(
|
|
1307
1282
|
result: DeterministicRecallSearchResult,
|
|
1308
1283
|
debug: AgenticRecallDebug,
|
|
@@ -2,7 +2,6 @@ import type { RecallDepth, RecallInput, RecallSource } from "./types.js";
|
|
|
2
2
|
|
|
3
3
|
export const ALL_RECALL_SOURCES: readonly RecallSource[] = [
|
|
4
4
|
"memory",
|
|
5
|
-
"pkb",
|
|
6
5
|
"conversations",
|
|
7
6
|
"workspace",
|
|
8
7
|
] as const;
|
|
@@ -81,9 +80,7 @@ export function normalizeRecallMaxResults(
|
|
|
81
80
|
);
|
|
82
81
|
}
|
|
83
82
|
|
|
84
|
-
function normalizeRecallDepth(
|
|
85
|
-
depth: RecallDepth | undefined,
|
|
86
|
-
): RecallDepth {
|
|
83
|
+
function normalizeRecallDepth(depth: RecallDepth | undefined): RecallDepth {
|
|
87
84
|
if (depth === undefined) {
|
|
88
85
|
return DEFAULT_RECALL_DEPTH;
|
|
89
86
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isAbortReason } from "../../util/abort-reasons.js";
|
|
1
2
|
import {
|
|
2
3
|
ALL_RECALL_SOURCES,
|
|
3
4
|
type NormalizedRecallInput,
|
|
@@ -30,23 +31,12 @@ export interface DeterministicRecallSearchResult extends RecallSearchResult {
|
|
|
30
31
|
|
|
31
32
|
export interface DeterministicRecallSearchOptions {
|
|
32
33
|
adapters?: readonly RecallSourceAdapter[];
|
|
33
|
-
readPkbContextEvidence?: (
|
|
34
|
-
context: RecallSearchContext,
|
|
35
|
-
) => Promise<readonly RecallEvidence[]> | readonly RecallEvidence[];
|
|
36
34
|
}
|
|
37
35
|
|
|
38
36
|
const SOURCE_PRIORITY = new Map<RecallSource, number>(
|
|
39
37
|
ALL_RECALL_SOURCES.map((source, index) => [source, index]),
|
|
40
38
|
);
|
|
41
39
|
|
|
42
|
-
const AUTO_INJECTED_PKB_CONTEXT_EVIDENCE_IDS = new Set([
|
|
43
|
-
"pkb:auto-inject",
|
|
44
|
-
"pkb:NOW.md",
|
|
45
|
-
]);
|
|
46
|
-
const AUTO_INJECTED_PKB_CONTEXT_TEXT_CAP = Math.floor(
|
|
47
|
-
RECALL_EVIDENCE_TEXT_CAP_PER_SOURCE / 2,
|
|
48
|
-
);
|
|
49
|
-
|
|
50
40
|
export async function runDeterministicRecallSearch(
|
|
51
41
|
input: RecallInput,
|
|
52
42
|
context: RecallSearchContext,
|
|
@@ -64,18 +54,6 @@ export async function runDeterministicRecallSearch(
|
|
|
64
54
|
);
|
|
65
55
|
const errorsBySource = new Map<RecallSource, string>();
|
|
66
56
|
|
|
67
|
-
if (normalizedInput.sources.includes("pkb")) {
|
|
68
|
-
try {
|
|
69
|
-
const contextEvidence = await readPkbContextEvidenceForSearch(
|
|
70
|
-
context,
|
|
71
|
-
options,
|
|
72
|
-
);
|
|
73
|
-
appendEvidence(evidenceBySource, "pkb", contextEvidence);
|
|
74
|
-
} catch (err) {
|
|
75
|
-
errorsBySource.set("pkb", errorToMessage(err));
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
57
|
const selectedAdapters = normalizedInput.sources.flatMap((source) => {
|
|
80
58
|
const adapter = adapterBySource.get(source);
|
|
81
59
|
return adapter ? [adapter] : [];
|
|
@@ -88,17 +66,20 @@ export async function runDeterministicRecallSearch(
|
|
|
88
66
|
),
|
|
89
67
|
);
|
|
90
68
|
|
|
91
|
-
adapterResults.
|
|
69
|
+
for (const [index, settledResult] of adapterResults.entries()) {
|
|
92
70
|
const source = selectedAdapters[index]?.source;
|
|
93
|
-
if (!source)
|
|
71
|
+
if (!source) continue;
|
|
94
72
|
|
|
95
73
|
if (settledResult.status === "fulfilled") {
|
|
96
74
|
appendEvidence(evidenceBySource, source, settledResult.value.evidence);
|
|
97
|
-
|
|
75
|
+
continue;
|
|
98
76
|
}
|
|
99
77
|
|
|
78
|
+
if (isAbortLikeError(settledResult.reason)) {
|
|
79
|
+
throw settledResult.reason;
|
|
80
|
+
}
|
|
100
81
|
errorsBySource.set(source, errorToMessage(settledResult.reason));
|
|
101
|
-
}
|
|
82
|
+
}
|
|
102
83
|
|
|
103
84
|
const evidence = capEvidence(
|
|
104
85
|
dedupeEvidence(sortEvidence([...evidenceBySource.values()].flat())),
|
|
@@ -142,10 +123,6 @@ async function loadDefaultRecallSourceAdapter(
|
|
|
142
123
|
const { searchMemorySource } = await import("./sources/memory.js");
|
|
143
124
|
return { source, search: searchMemorySource };
|
|
144
125
|
}
|
|
145
|
-
case "pkb": {
|
|
146
|
-
const { searchPkbSource } = await import("./sources/pkb.js");
|
|
147
|
-
return { source, search: searchPkbSource };
|
|
148
|
-
}
|
|
149
126
|
case "conversations": {
|
|
150
127
|
const { searchConversationSource } =
|
|
151
128
|
await import("./sources/conversations.js");
|
|
@@ -156,21 +133,6 @@ async function loadDefaultRecallSourceAdapter(
|
|
|
156
133
|
return { source, search: searchWorkspaceSource };
|
|
157
134
|
}
|
|
158
135
|
}
|
|
159
|
-
|
|
160
|
-
const exhaustiveSource: never = source;
|
|
161
|
-
throw new Error(`Unknown recall source: ${String(exhaustiveSource)}`);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
async function readPkbContextEvidenceForSearch(
|
|
165
|
-
context: RecallSearchContext,
|
|
166
|
-
options: DeterministicRecallSearchOptions,
|
|
167
|
-
): Promise<readonly RecallEvidence[]> {
|
|
168
|
-
if (options.readPkbContextEvidence) {
|
|
169
|
-
return options.readPkbContextEvidence(context);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
const { readPkbContextEvidence } = await import("./sources/pkb.js");
|
|
173
|
-
return readPkbContextEvidence(context);
|
|
174
136
|
}
|
|
175
137
|
|
|
176
138
|
function appendEvidence(
|
|
@@ -221,7 +183,7 @@ function retrievalRankBoost(item: RecallEvidence): number {
|
|
|
221
183
|
if (retrieval === "path") return 0.45;
|
|
222
184
|
if (retrieval === "structured-json") return 0.4;
|
|
223
185
|
if (retrieval === "section") return 0.35;
|
|
224
|
-
if (retrieval === "lexical") return
|
|
186
|
+
if (retrieval === "lexical") return 0.25;
|
|
225
187
|
return 0;
|
|
226
188
|
}
|
|
227
189
|
|
|
@@ -253,17 +215,11 @@ function capEvidence(
|
|
|
253
215
|
evidence: readonly RecallEvidence[],
|
|
254
216
|
maxResults: number,
|
|
255
217
|
): RecallEvidence[] {
|
|
256
|
-
const autoInjectedContextEvidence = evidence.filter(
|
|
257
|
-
isAutoInjectedPkbContextEvidence,
|
|
258
|
-
);
|
|
259
|
-
const regularEvidence = evidence.filter(
|
|
260
|
-
(item) => !isAutoInjectedPkbContextEvidence(item),
|
|
261
|
-
);
|
|
262
218
|
const capped: RecallEvidence[] = [];
|
|
263
219
|
const textSizeBySource = new Map<RecallSource, number>();
|
|
264
220
|
let totalTextSize = 0;
|
|
265
221
|
|
|
266
|
-
for (const item of
|
|
222
|
+
for (const item of evidence) {
|
|
267
223
|
if (capped.length >= maxResults) {
|
|
268
224
|
break;
|
|
269
225
|
}
|
|
@@ -277,79 +233,21 @@ function capEvidence(
|
|
|
277
233
|
if (appended.totalRemaining <= 0) break;
|
|
278
234
|
}
|
|
279
235
|
|
|
280
|
-
for (let index = 0; index < autoInjectedContextEvidence.length; index += 1) {
|
|
281
|
-
if (capped.length >= maxResults) {
|
|
282
|
-
break;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
const item = autoInjectedContextEvidence[index];
|
|
286
|
-
if (!item) continue;
|
|
287
|
-
|
|
288
|
-
const autoInjectedRemaining = autoInjectedContextEvidence.length - index;
|
|
289
|
-
const reservedTextBudget = getReservedAutoInjectedTextBudget(item, {
|
|
290
|
-
textSizeBySource,
|
|
291
|
-
totalTextSize,
|
|
292
|
-
autoInjectedRemaining,
|
|
293
|
-
});
|
|
294
|
-
const appended = appendCappedEvidence(item, {
|
|
295
|
-
capped,
|
|
296
|
-
textSizeBySource,
|
|
297
|
-
totalTextSize,
|
|
298
|
-
textBudget: reservedTextBudget,
|
|
299
|
-
});
|
|
300
|
-
totalTextSize = appended.totalTextSize;
|
|
301
|
-
if (appended.totalRemaining <= 0) {
|
|
302
|
-
break;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
236
|
return capped;
|
|
307
237
|
}
|
|
308
238
|
|
|
309
|
-
export function isAutoInjectedPkbContextEvidence(
|
|
310
|
-
item: RecallEvidence,
|
|
311
|
-
): boolean {
|
|
312
|
-
return (
|
|
313
|
-
item.source === "pkb" && AUTO_INJECTED_PKB_CONTEXT_EVIDENCE_IDS.has(item.id)
|
|
314
|
-
);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
function getReservedAutoInjectedTextBudget(
|
|
318
|
-
item: RecallEvidence,
|
|
319
|
-
state: {
|
|
320
|
-
textSizeBySource: Map<RecallSource, number>;
|
|
321
|
-
totalTextSize: number;
|
|
322
|
-
autoInjectedRemaining: number;
|
|
323
|
-
},
|
|
324
|
-
): number {
|
|
325
|
-
const sourceTextSize = state.textSizeBySource.get(item.source) ?? 0;
|
|
326
|
-
const autoInjectedSourceCap =
|
|
327
|
-
item.source === "pkb"
|
|
328
|
-
? AUTO_INJECTED_PKB_CONTEXT_TEXT_CAP
|
|
329
|
-
: RECALL_EVIDENCE_TEXT_CAP_PER_SOURCE;
|
|
330
|
-
const sourceRemaining = autoInjectedSourceCap - sourceTextSize;
|
|
331
|
-
const totalRemaining = RECALL_TOTAL_EVIDENCE_TEXT_CAP - state.totalTextSize;
|
|
332
|
-
const remaining = Math.min(sourceRemaining, totalRemaining);
|
|
333
|
-
return Math.max(1, Math.floor(remaining / state.autoInjectedRemaining));
|
|
334
|
-
}
|
|
335
|
-
|
|
336
239
|
function appendCappedEvidence(
|
|
337
240
|
item: RecallEvidence,
|
|
338
241
|
state: {
|
|
339
242
|
capped: RecallEvidence[];
|
|
340
243
|
textSizeBySource: Map<RecallSource, number>;
|
|
341
244
|
totalTextSize: number;
|
|
342
|
-
textBudget?: number;
|
|
343
245
|
},
|
|
344
246
|
): { totalTextSize: number; totalRemaining: number } {
|
|
345
247
|
const sourceTextSize = state.textSizeBySource.get(item.source) ?? 0;
|
|
346
248
|
const sourceRemaining = RECALL_EVIDENCE_TEXT_CAP_PER_SOURCE - sourceTextSize;
|
|
347
249
|
const totalRemaining = RECALL_TOTAL_EVIDENCE_TEXT_CAP - state.totalTextSize;
|
|
348
|
-
const remaining = Math.min(
|
|
349
|
-
sourceRemaining,
|
|
350
|
-
totalRemaining,
|
|
351
|
-
state.textBudget ?? Number.MAX_SAFE_INTEGER,
|
|
352
|
-
);
|
|
250
|
+
const remaining = Math.min(sourceRemaining, totalRemaining);
|
|
353
251
|
if (remaining <= 0) {
|
|
354
252
|
return { totalTextSize: state.totalTextSize, totalRemaining };
|
|
355
253
|
}
|
|
@@ -385,3 +283,15 @@ function errorToMessage(err: unknown): string {
|
|
|
385
283
|
}
|
|
386
284
|
return String(err);
|
|
387
285
|
}
|
|
286
|
+
|
|
287
|
+
function isAbortLikeError(err: unknown): boolean {
|
|
288
|
+
if (err instanceof Error && err.name === "AbortError") return true;
|
|
289
|
+
if (
|
|
290
|
+
typeof DOMException !== "undefined" &&
|
|
291
|
+
err instanceof DOMException &&
|
|
292
|
+
err.name === "AbortError"
|
|
293
|
+
) {
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
return isAbortReason(err);
|
|
297
|
+
}
|
|
@@ -7,6 +7,7 @@ import { rawAll } from "../../raw-query.js";
|
|
|
7
7
|
import type { RecallSearchContext, RecallSearchResult } from "../types.js";
|
|
8
8
|
|
|
9
9
|
const SUBAGENT_SOURCE = "subagent";
|
|
10
|
+
const NOTIFICATION_SOURCE = "notification";
|
|
10
11
|
|
|
11
12
|
interface ConversationEvidenceRow {
|
|
12
13
|
message_id: string;
|
|
@@ -88,7 +89,10 @@ export async function searchConversationSource(
|
|
|
88
89
|
|
|
89
90
|
for (const ftsMatch of ftsMatches) {
|
|
90
91
|
try {
|
|
91
|
-
rows = mergeConversationRows(
|
|
92
|
+
rows = mergeConversationRows(
|
|
93
|
+
rows,
|
|
94
|
+
searchWithFts(ftsMatch, queryLimit, context.conversationId),
|
|
95
|
+
);
|
|
92
96
|
} catch {
|
|
93
97
|
// Try the next, broader query shape.
|
|
94
98
|
}
|
|
@@ -97,7 +101,7 @@ export async function searchConversationSource(
|
|
|
97
101
|
}
|
|
98
102
|
|
|
99
103
|
if (rows.length === 0) {
|
|
100
|
-
rows = searchWithLike(trimmedQuery, queryLimit);
|
|
104
|
+
rows = searchWithLike(trimmedQuery, queryLimit, context.conversationId);
|
|
101
105
|
}
|
|
102
106
|
|
|
103
107
|
const sortedRows = rows
|
|
@@ -128,6 +132,7 @@ export async function searchConversationSource(
|
|
|
128
132
|
function searchWithFts(
|
|
129
133
|
ftsMatch: string,
|
|
130
134
|
limit: number,
|
|
135
|
+
excludedConversationId: string,
|
|
131
136
|
): ConversationEvidenceRow[] {
|
|
132
137
|
return rawAll<ConversationEvidenceRow>(
|
|
133
138
|
`
|
|
@@ -142,14 +147,17 @@ function searchWithFts(
|
|
|
142
147
|
JOIN messages m ON m.id = messages_fts.message_id
|
|
143
148
|
JOIN conversations c ON c.id = m.conversation_id
|
|
144
149
|
WHERE messages_fts MATCH ?
|
|
145
|
-
AND (c.
|
|
146
|
-
AND
|
|
150
|
+
AND (c.source IS NULL OR c.source NOT IN (?, ?, ?))
|
|
151
|
+
AND c.id != ?
|
|
152
|
+
AND c.conversation_type != 'private'
|
|
147
153
|
ORDER BY bm25(messages_fts), m.created_at DESC
|
|
148
154
|
LIMIT ?
|
|
149
155
|
`,
|
|
150
156
|
ftsMatch,
|
|
151
157
|
SUBAGENT_SOURCE,
|
|
152
158
|
AUTO_ANALYSIS_SOURCE,
|
|
159
|
+
NOTIFICATION_SOURCE,
|
|
160
|
+
excludedConversationId,
|
|
153
161
|
limit,
|
|
154
162
|
);
|
|
155
163
|
}
|
|
@@ -157,6 +165,7 @@ function searchWithFts(
|
|
|
157
165
|
function searchWithLike(
|
|
158
166
|
query: string,
|
|
159
167
|
limit: number,
|
|
168
|
+
excludedConversationId: string,
|
|
160
169
|
): ConversationEvidenceRow[] {
|
|
161
170
|
return rawAll<ConversationEvidenceRow>(
|
|
162
171
|
`
|
|
@@ -170,14 +179,17 @@ function searchWithLike(
|
|
|
170
179
|
FROM messages m
|
|
171
180
|
JOIN conversations c ON c.id = m.conversation_id
|
|
172
181
|
WHERE m.content LIKE ? ESCAPE '\\'
|
|
173
|
-
AND (c.
|
|
174
|
-
AND
|
|
182
|
+
AND (c.source IS NULL OR c.source NOT IN (?, ?, ?))
|
|
183
|
+
AND c.id != ?
|
|
184
|
+
AND c.conversation_type != 'private'
|
|
175
185
|
ORDER BY m.created_at DESC
|
|
176
186
|
LIMIT ?
|
|
177
187
|
`,
|
|
178
188
|
buildLikePattern(query),
|
|
179
189
|
SUBAGENT_SOURCE,
|
|
180
190
|
AUTO_ANALYSIS_SOURCE,
|
|
191
|
+
NOTIFICATION_SOURCE,
|
|
192
|
+
excludedConversationId,
|
|
181
193
|
limit,
|
|
182
194
|
);
|
|
183
195
|
}
|