@vellumai/assistant 0.6.4 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +5 -0
- package/ARCHITECTURE.md +32 -36
- package/Dockerfile +12 -0
- package/README.md +3 -4
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +1 -20
- package/docs/architecture/security.md +16 -16
- package/docs/error-handling.md +111 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/openapi.yaml +123 -11
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- package/src/__tests__/approval-cascade.test.ts +31 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +27 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +428 -501
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/compaction-circuit-breaker.test.ts +336 -0
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +11 -28
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +427 -114
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +530 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +30 -16
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +61 -17
- package/src/__tests__/conversation-agent-loop.test.ts +412 -82
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +30 -9
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +6 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +36 -0
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +30 -16
- package/src/__tests__/conversation-process-callsite.test.ts +306 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -16
- package/src/__tests__/conversation-queue.test.ts +41 -26
- package/src/__tests__/conversation-routes-disk-view.test.ts +29 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2735 -55
- package/src/__tests__/conversation-runtime-workspace.test.ts +12 -12
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +34 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +30 -16
- package/src/__tests__/conversation-speed-override.test.ts +30 -11
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +2 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +3 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +31 -10
- package/src/__tests__/conversation-workspace-injection.test.ts +43 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +44 -16
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-security-invariants.test.ts +3 -0
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +26 -7
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/intent-routing.test.ts +1 -40
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +684 -0
- package/src/__tests__/model-intents.test.ts +9 -83
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/oauth-store.test.ts +10 -7
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -1
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/pricing.test.ts +50 -3
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +0 -1
- package/src/__tests__/reaction-persistence.test.ts +560 -0
- package/src/__tests__/relay-server.test.ts +1 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +160 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor.test.ts +60 -94
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +1 -13
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +209 -17
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +666 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +451 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +594 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/completions.ts +0 -3
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +14 -1
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +300 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +23 -4
- package/src/cli.ts +0 -37
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +23 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +8 -1
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +11 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -175
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +30 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +318 -0
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +53 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skills.ts +2 -2
- package/src/context/__tests__/compact-prompt.test.ts +45 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/prompts/compact.md +12 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/window-manager.ts +229 -25
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- package/src/daemon/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +0 -1
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +79 -12
- package/src/daemon/conversation-agent-loop.ts +462 -80
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-lifecycle.ts +30 -6
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-process.ts +10 -4
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +760 -29
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +10 -5
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +118 -30
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +54 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +2 -2
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +76 -14
- package/src/daemon/message-types/conversations.ts +14 -0
- package/src/daemon/message-types/messages.ts +9 -1
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +117 -9
- package/src/daemon/tool-side-effects.ts +0 -9
- package/src/daemon/watch-handler.ts +4 -4
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/heartbeat-service.ts +76 -28
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +4 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +56 -2
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/socket-path.test.ts +73 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +4 -4
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +61 -0
- package/src/ipc/routes/browser.ts +96 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/index.ts +17 -1
- package/src/ipc/routes/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +100 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +103 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-title-service.ts +7 -4
- package/src/memory/db-init.ts +2 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/graph/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +173 -51
- package/src/memory/graph/graph-search.test.ts +92 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +230 -48
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/pkb/pkb-index.test.ts +368 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +251 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +438 -0
- package/src/memory/pkb/pkb-search.ts +137 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.ts +122 -1
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1373 -0
- package/src/messaging/providers/slack/render-transcript.ts +443 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/oauth/oauth-store.ts +1 -0
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/seed-providers.ts +4 -2
- package/src/permissions/approval-policy.test.ts +948 -0
- package/src/permissions/approval-policy.ts +257 -0
- package/src/permissions/bash-risk-classifier.test.ts +1208 -0
- package/src/permissions/bash-risk-classifier.ts +707 -0
- package/src/permissions/checker.ts +217 -708
- package/src/permissions/command-registry.test.ts +535 -0
- package/src/permissions/command-registry.ts +825 -0
- package/src/permissions/defaults.ts +26 -78
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/risk-types.ts +205 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +161 -62
- package/src/permissions/types.ts +23 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +1 -16
- package/src/platform/client.ts +19 -1
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +501 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +76 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +578 -0
- package/src/providers/speech-to-text/xai-realtime.ts +796 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +93 -3
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +52 -1
- package/src/runtime/http-types.ts +23 -1
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/vbundle-importer.ts +154 -9
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +58 -0
- package/src/runtime/routes/approval-routes.ts +12 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +133 -27
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- package/src/runtime/routes/inbound-message-handler.ts +912 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/migration-routes.ts +720 -124
- package/src/runtime/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +28 -6
- package/src/schedule/scheduler.ts +8 -0
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +26 -7
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +45 -2
- package/src/tools/browser/browser-execution.ts +65 -38
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +4 -0
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/web-fetch.ts +20 -10
- package/src/tools/network/web-search.ts +19 -4
- package/src/tools/permission-checker.ts +36 -15
- package/src/tools/policy-context.ts +25 -8
- package/src/tools/registry.ts +55 -3
- package/src/tools/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +12 -3
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +2 -2
- package/src/util/pricing.ts +15 -5
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +57 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +16 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- package/src/__tests__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/gmail/SKILL.md +0 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/slack/SKILL.md +0 -108
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -139
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -71,7 +71,11 @@ Call the \`extract_graph_diff\` tool with the diff. Each node needs:
|
|
|
71
71
|
|
|
72
72
|
- **content**: First-person prose — how the assistant naturally remembers this. Write naturally, not as a database entry. E.g. "He mentioned his mom used to make amazing Sunday dinners — he still misses them" not "User's mother cooked Sunday dinners."
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
**LENGTH: 1-3 sentences. HARD CAP — no exceptions.** This applies to every memory, including 1.0-significance transformative moments. Emotional weight lives in \`emotionalCharge\`, not wordcount. The more significant an event feels, the stronger the pull to preserve narrative — resist it. A memory whose \`content\` exceeds ~300 characters is a bug.
|
|
75
|
+
|
|
76
|
+
If a memory has multiple distinct facts or beats, **split into multiple nodes connected by edges** (\`caused-by\`, \`part-of\`, \`reminds-of\`) — one node per fact or moment. Never pack a multi-beat story into a single content field. To connect two NEW nodes you create in the same diff, assign each a distinct \`temp_id\` (e.g. \`"new-1"\`, \`"new-2"\`) and reference that temp_id from \`edges_to_existing\` or \`new_edges\`. Temp IDs live only inside this single extraction call — pick values that clearly don't collide with existing candidate IDs.
|
|
77
|
+
|
|
78
|
+
Do not: set the scene, describe surrounding context, preserve dialogue verbatim, catalog every emotional nuance, or narrate "what it meant." Write the SNAPSHOT. The \`emotionalCharge\` and \`significance\` fields carry the weight — content stays lean.
|
|
75
79
|
|
|
76
80
|
- **type**: Classify by WHAT the memory IS, not how it FEELS. Almost every memory has emotional weight — that goes in emotionalCharge, not the type.
|
|
77
81
|
|
|
@@ -120,6 +124,8 @@ Create edges between nodes when there's a meaningful relationship:
|
|
|
120
124
|
- "supersedes": replaces an outdated memory (new node inherits old node's durability)
|
|
121
125
|
- "resolved-by": an event, plan, or task was completed, canceled, or its outcome is now known
|
|
122
126
|
|
|
127
|
+
Edges can connect any pair of nodes: existing ↔ existing, new ↔ existing, or new ↔ new. Use \`edges_to_existing\` on a new node to declare outbound edges from that node (target may be an existing candidate ID or a sibling new node's \`temp_id\`). Use top-level \`new_edges\` for edges where the source is existing or where it's cleaner to declare the edge once by referencing both endpoints by ID/temp_id.
|
|
128
|
+
|
|
123
129
|
## Triggers
|
|
124
130
|
|
|
125
131
|
Create triggers for:
|
|
@@ -231,6 +237,11 @@ const EXTRACT_TOOL_SCHEMA = {
|
|
|
231
237
|
items: {
|
|
232
238
|
type: "object",
|
|
233
239
|
properties: {
|
|
240
|
+
temp_id: {
|
|
241
|
+
type: "string",
|
|
242
|
+
description:
|
|
243
|
+
"Optional local identifier for this new node. Reference it from edges_to_existing.target_node_id or new_edges.source_node_id/target_node_id to connect two new nodes created in the same diff. Scope is this single call only — pick distinctive values (e.g. 'new-1') that won't collide with existing candidate IDs.",
|
|
244
|
+
},
|
|
234
245
|
content: {
|
|
235
246
|
type: "string",
|
|
236
247
|
description: "First-person prose memory",
|
|
@@ -299,11 +310,15 @@ const EXTRACT_TOOL_SCHEMA = {
|
|
|
299
310
|
edges_to_existing: {
|
|
300
311
|
type: "array",
|
|
301
312
|
description:
|
|
302
|
-
"
|
|
313
|
+
"Outbound edges from this new node. target_node_id may be an existing candidate node ID OR the temp_id of another new node in this same extraction.",
|
|
303
314
|
items: {
|
|
304
315
|
type: "object",
|
|
305
316
|
properties: {
|
|
306
|
-
target_node_id: {
|
|
317
|
+
target_node_id: {
|
|
318
|
+
type: "string",
|
|
319
|
+
description:
|
|
320
|
+
"An existing candidate node ID, or the temp_id of another node in create_nodes.",
|
|
321
|
+
},
|
|
307
322
|
relationship: {
|
|
308
323
|
type: "string",
|
|
309
324
|
enum: [
|
|
@@ -383,12 +398,21 @@ const EXTRACT_TOOL_SCHEMA = {
|
|
|
383
398
|
},
|
|
384
399
|
new_edges: {
|
|
385
400
|
type: "array",
|
|
386
|
-
description:
|
|
401
|
+
description:
|
|
402
|
+
"Edges between any pair of nodes (existing ↔ existing, new ↔ existing, or new ↔ new). Each endpoint may be an existing candidate node ID or the temp_id of a node declared in create_nodes.",
|
|
387
403
|
items: {
|
|
388
404
|
type: "object",
|
|
389
405
|
properties: {
|
|
390
|
-
source_node_id: {
|
|
391
|
-
|
|
406
|
+
source_node_id: {
|
|
407
|
+
type: "string",
|
|
408
|
+
description:
|
|
409
|
+
"An existing candidate node ID, or the temp_id of a node in create_nodes.",
|
|
410
|
+
},
|
|
411
|
+
target_node_id: {
|
|
412
|
+
type: "string",
|
|
413
|
+
description:
|
|
414
|
+
"An existing candidate node ID, or the temp_id of a node in create_nodes.",
|
|
415
|
+
},
|
|
392
416
|
relationship: { type: "string" },
|
|
393
417
|
weight: { type: "number" },
|
|
394
418
|
},
|
|
@@ -405,6 +429,7 @@ const EXTRACT_TOOL_SCHEMA = {
|
|
|
405
429
|
// ---------------------------------------------------------------------------
|
|
406
430
|
|
|
407
431
|
interface RawCreateNode {
|
|
432
|
+
temp_id?: string;
|
|
408
433
|
content?: string;
|
|
409
434
|
type?: string;
|
|
410
435
|
emotional_charge?: {
|
|
@@ -498,6 +523,22 @@ export function parseEpochMs(value: unknown): number | null {
|
|
|
498
523
|
return Number.isFinite(n) ? n : null;
|
|
499
524
|
}
|
|
500
525
|
|
|
526
|
+
/**
|
|
527
|
+
* An edge endpoint that may reference either a pre-existing candidate node
|
|
528
|
+
* (by its real ID) or a brand-new node being created in the same diff
|
|
529
|
+
* (by its index into `diff.createNodes`, resolved to a real ID after apply).
|
|
530
|
+
*/
|
|
531
|
+
export type DeferredEdgeEndpoint =
|
|
532
|
+
| { kind: "existing"; nodeId: string }
|
|
533
|
+
| { kind: "new"; newNodeIndex: number };
|
|
534
|
+
|
|
535
|
+
export interface DeferredEdge {
|
|
536
|
+
source: DeferredEdgeEndpoint;
|
|
537
|
+
target: DeferredEdgeEndpoint;
|
|
538
|
+
relationship: string;
|
|
539
|
+
weight: number;
|
|
540
|
+
}
|
|
541
|
+
|
|
501
542
|
export function parseExtractionResponse(
|
|
502
543
|
input: Record<string, unknown>,
|
|
503
544
|
conversationId: string,
|
|
@@ -507,13 +548,12 @@ export function parseExtractionResponse(
|
|
|
507
548
|
conversationTimestamp: number,
|
|
508
549
|
): {
|
|
509
550
|
diff: MemoryDiff;
|
|
510
|
-
/**
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
}>;
|
|
551
|
+
/**
|
|
552
|
+
* Edges with at least one endpoint that is a new node (new→existing,
|
|
553
|
+
* existing→new, or new→new). Applied after node creation so new node IDs
|
|
554
|
+
* can be resolved from their indices.
|
|
555
|
+
*/
|
|
556
|
+
deferredEdges: DeferredEdge[];
|
|
517
557
|
/** Triggers for new nodes. Applied after node creation (needs IDs). */
|
|
518
558
|
deferredTriggers: Array<{
|
|
519
559
|
newNodeIndex: number;
|
|
@@ -537,17 +577,18 @@ export function parseExtractionResponse(
|
|
|
537
577
|
reinforceNodeIds: reinforceNodeIds.filter((id) => candidateNodeIds.has(id)),
|
|
538
578
|
};
|
|
539
579
|
|
|
540
|
-
const deferredEdges:
|
|
541
|
-
newNodeIndex: number;
|
|
542
|
-
targetNodeId: string;
|
|
543
|
-
relationship: string;
|
|
544
|
-
weight: number;
|
|
545
|
-
}> = [];
|
|
580
|
+
const deferredEdges: DeferredEdge[] = [];
|
|
546
581
|
const deferredTriggers: Array<{
|
|
547
582
|
newNodeIndex: number;
|
|
548
583
|
trigger: Omit<NewTrigger, "nodeId">;
|
|
549
584
|
}> = [];
|
|
550
585
|
|
|
586
|
+
// Track raw-index → diff-index for nodes that pass validation. Edges
|
|
587
|
+
// reference nodes by temp_id, which resolves via the raw index — but
|
|
588
|
+
// deferredEdges must carry the diff index (aligns with createdNodeIds
|
|
589
|
+
// in applyDiff's return value).
|
|
590
|
+
const rawIndexToDiffIndex = new Map<number, number>();
|
|
591
|
+
|
|
551
592
|
// Parse new nodes
|
|
552
593
|
for (let i = 0; i < createNodes.length; i++) {
|
|
553
594
|
const raw = createNodes[i];
|
|
@@ -606,22 +647,11 @@ export function parseExtractionResponse(
|
|
|
606
647
|
|
|
607
648
|
diff.createNodes.push(node);
|
|
608
649
|
const nodeIndex = diff.createNodes.length - 1;
|
|
650
|
+
rawIndexToDiffIndex.set(i, nodeIndex);
|
|
609
651
|
|
|
610
|
-
//
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
if (!edge.target_node_id || !candidateNodeIds.has(edge.target_node_id))
|
|
614
|
-
continue;
|
|
615
|
-
if (!edge.relationship || !VALID_RELATIONSHIPS.has(edge.relationship))
|
|
616
|
-
continue;
|
|
617
|
-
deferredEdges.push({
|
|
618
|
-
newNodeIndex: nodeIndex,
|
|
619
|
-
targetNodeId: edge.target_node_id,
|
|
620
|
-
relationship: edge.relationship,
|
|
621
|
-
weight: clamp(Number(edge.weight) || 1.0, 0, 1),
|
|
622
|
-
});
|
|
623
|
-
}
|
|
624
|
-
}
|
|
652
|
+
// Edges declared on this new node are processed in a second pass below
|
|
653
|
+
// — they can reference sibling new nodes via temp_id, which may appear
|
|
654
|
+
// later in create_nodes than the edge's declaring node.
|
|
625
655
|
|
|
626
656
|
// Collect triggers
|
|
627
657
|
if (Array.isArray(raw.triggers)) {
|
|
@@ -710,6 +740,81 @@ export function parseExtractionResponse(
|
|
|
710
740
|
}
|
|
711
741
|
}
|
|
712
742
|
|
|
743
|
+
// Build temp_id → diff.createNodes-index map from nodes that passed
|
|
744
|
+
// validation. A temp_id that collides with an existing candidate ID is
|
|
745
|
+
// skipped so real IDs win on lookup — the prompt instructs the LLM to
|
|
746
|
+
// choose distinctive values so this should be rare.
|
|
747
|
+
const tempIdToDiffIndex = new Map<string, number>();
|
|
748
|
+
for (let i = 0; i < createNodes.length; i++) {
|
|
749
|
+
const raw = createNodes[i];
|
|
750
|
+
const tempId = raw?.temp_id;
|
|
751
|
+
if (typeof tempId !== "string" || tempId.length === 0) continue;
|
|
752
|
+
if (candidateNodeIds.has(tempId)) continue;
|
|
753
|
+
if (tempIdToDiffIndex.has(tempId)) continue; // first writer wins
|
|
754
|
+
const diffIndex = rawIndexToDiffIndex.get(i);
|
|
755
|
+
if (diffIndex == null) continue; // raw node was rejected during validation
|
|
756
|
+
tempIdToDiffIndex.set(tempId, diffIndex);
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
const resolveEndpoint = (id: string): DeferredEdgeEndpoint | null => {
|
|
760
|
+
if (candidateNodeIds.has(id)) return { kind: "existing", nodeId: id };
|
|
761
|
+
const idx = tempIdToDiffIndex.get(id);
|
|
762
|
+
if (idx != null) return { kind: "new", newNodeIndex: idx };
|
|
763
|
+
return null;
|
|
764
|
+
};
|
|
765
|
+
|
|
766
|
+
const pushResolvedEdge = (
|
|
767
|
+
source: DeferredEdgeEndpoint,
|
|
768
|
+
target: DeferredEdgeEndpoint,
|
|
769
|
+
relationship: string,
|
|
770
|
+
weight: number,
|
|
771
|
+
) => {
|
|
772
|
+
// Both endpoints existing → apply directly via diff.createEdges.
|
|
773
|
+
// Otherwise defer until new node IDs are known post-applyDiff.
|
|
774
|
+
if (source.kind === "existing" && target.kind === "existing") {
|
|
775
|
+
diff.createEdges.push({
|
|
776
|
+
sourceNodeId: source.nodeId,
|
|
777
|
+
targetNodeId: target.nodeId,
|
|
778
|
+
relationship: relationship as NewEdge["relationship"],
|
|
779
|
+
weight,
|
|
780
|
+
created: now,
|
|
781
|
+
});
|
|
782
|
+
} else {
|
|
783
|
+
deferredEdges.push({ source, target, relationship, weight });
|
|
784
|
+
}
|
|
785
|
+
};
|
|
786
|
+
|
|
787
|
+
// Second pass: resolve edges_to_existing on each raw create_nodes entry.
|
|
788
|
+
// The source is always the containing new node; the target may be either
|
|
789
|
+
// an existing candidate or a sibling new node referenced by temp_id.
|
|
790
|
+
for (let i = 0; i < createNodes.length; i++) {
|
|
791
|
+
const raw = createNodes[i];
|
|
792
|
+
const sourceDiffIndex = rawIndexToDiffIndex.get(i);
|
|
793
|
+
if (sourceDiffIndex == null) continue;
|
|
794
|
+
if (!Array.isArray(raw.edges_to_existing)) continue;
|
|
795
|
+
|
|
796
|
+
for (const edge of raw.edges_to_existing) {
|
|
797
|
+
if (!edge.target_node_id) continue;
|
|
798
|
+
if (!edge.relationship || !VALID_RELATIONSHIPS.has(edge.relationship))
|
|
799
|
+
continue;
|
|
800
|
+
const target = resolveEndpoint(edge.target_node_id);
|
|
801
|
+
if (!target) continue;
|
|
802
|
+
const source: DeferredEdgeEndpoint = {
|
|
803
|
+
kind: "new",
|
|
804
|
+
newNodeIndex: sourceDiffIndex,
|
|
805
|
+
};
|
|
806
|
+
// Skip self-loops.
|
|
807
|
+
if (target.kind === "new" && target.newNodeIndex === sourceDiffIndex)
|
|
808
|
+
continue;
|
|
809
|
+
pushResolvedEdge(
|
|
810
|
+
source,
|
|
811
|
+
target,
|
|
812
|
+
edge.relationship,
|
|
813
|
+
clamp(Number(edge.weight) || 1.0, 0, 1),
|
|
814
|
+
);
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
|
|
713
818
|
// Parse updates
|
|
714
819
|
for (const raw of updateNodes) {
|
|
715
820
|
if (!raw.id || !candidateNodeIds.has(raw.id)) continue;
|
|
@@ -731,23 +836,34 @@ export function parseExtractionResponse(
|
|
|
731
836
|
}
|
|
732
837
|
}
|
|
733
838
|
|
|
734
|
-
// Parse edges
|
|
839
|
+
// Parse top-level edges — each endpoint may be an existing candidate ID or
|
|
840
|
+
// the temp_id of a new node declared in create_nodes.
|
|
735
841
|
for (const raw of newEdges) {
|
|
736
842
|
if (!raw.source_node_id || !raw.target_node_id) continue;
|
|
843
|
+
if (!raw.relationship || !VALID_RELATIONSHIPS.has(raw.relationship))
|
|
844
|
+
continue;
|
|
845
|
+
const source = resolveEndpoint(raw.source_node_id);
|
|
846
|
+
const target = resolveEndpoint(raw.target_node_id);
|
|
847
|
+
if (!source || !target) continue;
|
|
848
|
+
// Skip self-loops.
|
|
737
849
|
if (
|
|
738
|
-
|
|
739
|
-
|
|
850
|
+
source.kind === "new" &&
|
|
851
|
+
target.kind === "new" &&
|
|
852
|
+
source.newNodeIndex === target.newNodeIndex
|
|
740
853
|
)
|
|
741
854
|
continue;
|
|
742
|
-
if (
|
|
855
|
+
if (
|
|
856
|
+
source.kind === "existing" &&
|
|
857
|
+
target.kind === "existing" &&
|
|
858
|
+
source.nodeId === target.nodeId
|
|
859
|
+
)
|
|
743
860
|
continue;
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
});
|
|
861
|
+
pushResolvedEdge(
|
|
862
|
+
source,
|
|
863
|
+
target,
|
|
864
|
+
raw.relationship,
|
|
865
|
+
clamp(Number(raw.weight) || 1.0, 0, 1),
|
|
866
|
+
);
|
|
751
867
|
}
|
|
752
868
|
|
|
753
869
|
return { diff, deferredEdges, deferredTriggers };
|
|
@@ -844,7 +960,7 @@ export async function runGraphExtraction(
|
|
|
844
960
|
}
|
|
845
961
|
|
|
846
962
|
// 2. Get provider
|
|
847
|
-
const provider = await getConfiguredProvider();
|
|
963
|
+
const provider = await getConfiguredProvider("memoryExtraction");
|
|
848
964
|
if (!provider) {
|
|
849
965
|
throw new BackendUnavailableError(
|
|
850
966
|
"Provider unavailable for graph extraction",
|
|
@@ -929,7 +1045,7 @@ export async function runGraphExtraction(
|
|
|
929
1045
|
systemPrompt,
|
|
930
1046
|
{
|
|
931
1047
|
config: {
|
|
932
|
-
|
|
1048
|
+
callSite: "memoryExtraction" as const,
|
|
933
1049
|
tool_choice: { type: "tool" as const, name: "extract_graph_diff" },
|
|
934
1050
|
},
|
|
935
1051
|
},
|
|
@@ -965,13 +1081,19 @@ export async function runGraphExtraction(
|
|
|
965
1081
|
let edgesCreated = result.edgesCreated;
|
|
966
1082
|
let triggersCreated = result.triggersCreated;
|
|
967
1083
|
|
|
1084
|
+
const resolveCreatedEndpoint = (ep: DeferredEdgeEndpoint): string | null => {
|
|
1085
|
+
if (ep.kind === "existing") return ep.nodeId;
|
|
1086
|
+
return createdNodeIds[ep.newNodeIndex] ?? null;
|
|
1087
|
+
};
|
|
1088
|
+
|
|
968
1089
|
for (const de of deferredEdges) {
|
|
969
|
-
const
|
|
970
|
-
|
|
1090
|
+
const sourceNodeId = resolveCreatedEndpoint(de.source);
|
|
1091
|
+
const targetNodeId = resolveCreatedEndpoint(de.target);
|
|
1092
|
+
if (!sourceNodeId || !targetNodeId) continue;
|
|
971
1093
|
|
|
972
1094
|
createEdge({
|
|
973
|
-
sourceNodeId
|
|
974
|
-
targetNodeId
|
|
1095
|
+
sourceNodeId,
|
|
1096
|
+
targetNodeId,
|
|
975
1097
|
relationship: de.relationship as NewEdge["relationship"],
|
|
976
1098
|
weight: de.weight,
|
|
977
1099
|
created: conversationTimestamp,
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
mock.module("../../util/logger.js", () => ({
|
|
4
|
+
getLogger: () =>
|
|
5
|
+
new Proxy({} as Record<string, unknown>, { get: () => () => {} }),
|
|
6
|
+
}));
|
|
7
|
+
|
|
8
|
+
let breakerOpen = false;
|
|
9
|
+
const hybridSearchCalls: Array<{
|
|
10
|
+
denseVector: number[];
|
|
11
|
+
sparseVector: { indices: number[]; values: number[] };
|
|
12
|
+
filter?: unknown;
|
|
13
|
+
limit: number;
|
|
14
|
+
prefetchLimit?: number;
|
|
15
|
+
}> = [];
|
|
16
|
+
const searchCalls: Array<{
|
|
17
|
+
vector: number[];
|
|
18
|
+
limit: number;
|
|
19
|
+
filter?: unknown;
|
|
20
|
+
}> = [];
|
|
21
|
+
|
|
22
|
+
mock.module("../qdrant-circuit-breaker.js", () => ({
|
|
23
|
+
isQdrantBreakerOpen: () => breakerOpen,
|
|
24
|
+
withQdrantBreaker: async <T>(fn: () => Promise<T>): Promise<T> => fn(),
|
|
25
|
+
shouldAllowQdrantProbe: () => true,
|
|
26
|
+
_resetQdrantBreaker: () => {},
|
|
27
|
+
QdrantCircuitOpenError: class extends Error {},
|
|
28
|
+
}));
|
|
29
|
+
|
|
30
|
+
mock.module("../qdrant-client.js", () => ({
|
|
31
|
+
getQdrantClient: () => ({
|
|
32
|
+
hybridSearch: async (params: {
|
|
33
|
+
denseVector: number[];
|
|
34
|
+
sparseVector: { indices: number[]; values: number[] };
|
|
35
|
+
filter?: unknown;
|
|
36
|
+
limit: number;
|
|
37
|
+
prefetchLimit?: number;
|
|
38
|
+
}) => {
|
|
39
|
+
hybridSearchCalls.push(params);
|
|
40
|
+
return [];
|
|
41
|
+
},
|
|
42
|
+
search: async (
|
|
43
|
+
vector: number[],
|
|
44
|
+
limit: number,
|
|
45
|
+
filter?: Record<string, unknown>,
|
|
46
|
+
) => {
|
|
47
|
+
searchCalls.push({ vector, limit, filter });
|
|
48
|
+
return [];
|
|
49
|
+
},
|
|
50
|
+
}),
|
|
51
|
+
initQdrantClient: () => {},
|
|
52
|
+
VellumQdrantClient: class {},
|
|
53
|
+
}));
|
|
54
|
+
|
|
55
|
+
const { searchGraphNodes } = await import("./graph-search.js");
|
|
56
|
+
|
|
57
|
+
describe("searchGraphNodes — _meta filter parity", () => {
|
|
58
|
+
beforeEach(() => {
|
|
59
|
+
breakerOpen = false;
|
|
60
|
+
hybridSearchCalls.length = 0;
|
|
61
|
+
searchCalls.length = 0;
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test("hybrid path excludes _meta sentinel points", async () => {
|
|
65
|
+
await searchGraphNodes([0.1], 5, ["default"], {
|
|
66
|
+
indices: [1],
|
|
67
|
+
values: [1],
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
expect(hybridSearchCalls).toHaveLength(1);
|
|
71
|
+
const filter = hybridSearchCalls[0]?.filter as {
|
|
72
|
+
must_not: Array<Record<string, unknown>>;
|
|
73
|
+
};
|
|
74
|
+
const metaClause = filter.must_not.find((c) => c.key === "_meta") as
|
|
75
|
+
| { match: { value: boolean } }
|
|
76
|
+
| undefined;
|
|
77
|
+
expect(metaClause?.match.value).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test("dense-only path also excludes _meta sentinel points", async () => {
|
|
81
|
+
await searchGraphNodes([0.1], 5, ["default"]);
|
|
82
|
+
|
|
83
|
+
expect(searchCalls).toHaveLength(1);
|
|
84
|
+
const filter = searchCalls[0]?.filter as {
|
|
85
|
+
must_not: Array<Record<string, unknown>>;
|
|
86
|
+
};
|
|
87
|
+
const metaClause = filter.must_not.find((c) => c.key === "_meta") as
|
|
88
|
+
| { match: { value: boolean } }
|
|
89
|
+
| undefined;
|
|
90
|
+
expect(metaClause?.match.value).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
@@ -110,7 +110,10 @@ export async function searchGraphNodes(
|
|
|
110
110
|
denseMusts.push({ key: "created_at", range: { lte: dateRange.beforeMs } });
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
const filter: Record<string, unknown> = {
|
|
113
|
+
const filter: Record<string, unknown> = {
|
|
114
|
+
must: denseMusts,
|
|
115
|
+
must_not: [{ key: "_meta", match: { value: true } }],
|
|
116
|
+
};
|
|
114
117
|
|
|
115
118
|
const results: QdrantSearchResult[] = await withQdrantBreaker(async () => {
|
|
116
119
|
return client.search(queryVector, limit, filter);
|
|
@@ -165,7 +165,7 @@ export async function runNarrativeRefinement(
|
|
|
165
165
|
.sort((a, b) => b.significance - a.significance)
|
|
166
166
|
.slice(0, 150);
|
|
167
167
|
|
|
168
|
-
const provider = await getConfiguredProvider();
|
|
168
|
+
const provider = await getConfiguredProvider("narrativeRefinement");
|
|
169
169
|
if (!provider) {
|
|
170
170
|
throw new BackendUnavailableError(
|
|
171
171
|
"Provider unavailable for narrative refinement",
|
|
@@ -196,7 +196,7 @@ export async function runNarrativeRefinement(
|
|
|
196
196
|
systemPrompt,
|
|
197
197
|
{
|
|
198
198
|
config: {
|
|
199
|
-
|
|
199
|
+
callSite: "narrativeRefinement" as const,
|
|
200
200
|
tool_choice: { type: "tool" as const, name: "refine_narratives" },
|
|
201
201
|
},
|
|
202
202
|
},
|
|
@@ -141,7 +141,7 @@ export async function runPatternScan(
|
|
|
141
141
|
return result;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
const provider = await getConfiguredProvider();
|
|
144
|
+
const provider = await getConfiguredProvider("patternScan");
|
|
145
145
|
if (!provider) {
|
|
146
146
|
throw new BackendUnavailableError("Provider unavailable for pattern scan");
|
|
147
147
|
}
|
|
@@ -165,7 +165,7 @@ export async function runPatternScan(
|
|
|
165
165
|
systemPrompt,
|
|
166
166
|
{
|
|
167
167
|
config: {
|
|
168
|
-
|
|
168
|
+
callSite: "patternScan" as const,
|
|
169
169
|
tool_choice: { type: "tool" as const, name: "detect_patterns" },
|
|
170
170
|
},
|
|
171
171
|
},
|