@vellumai/assistant 0.8.3 → 0.8.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/ARCHITECTURE.md +2 -2
- package/docker-entrypoint.sh +0 -1
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/knip.json +2 -1
- package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
- package/openapi.yaml +1492 -100
- package/package.json +1 -1
- package/src/__tests__/agent-loop-exit-reason.test.ts +4 -5
- package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
- package/src/__tests__/agent-loop.test.ts +88 -3
- package/src/__tests__/anthropic-provider.test.ts +302 -33
- package/src/__tests__/approval-cascade.test.ts +1 -1
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
- package/src/__tests__/audit-log-rotation.test.ts +70 -16
- package/src/__tests__/background-workers-disk-pressure.test.ts +4 -3
- package/src/__tests__/btw-routes.test.ts +2 -3
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-delivery-store.test.ts +193 -0
- package/src/__tests__/channel-guardian.test.ts +3 -3
- package/src/__tests__/channel-reply-delivery.test.ts +284 -5
- package/src/__tests__/channel-retry-sweep.test.ts +274 -1
- package/src/__tests__/checker.test.ts +6 -15
- package/src/__tests__/compaction-events.test.ts +2 -1
- package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
- package/src/__tests__/computer-use-tools.test.ts +2 -4
- package/src/__tests__/config-watcher.test.ts +1 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/context-token-estimator.test.ts +91 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +55 -4
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +228 -8
- package/src/__tests__/conversation-agent-loop.test.ts +188 -129
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-clean-command.test.ts +137 -0
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -1
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +31 -0
- package/src/__tests__/conversation-fork-crud.test.ts +324 -0
- package/src/__tests__/conversation-lifecycle.test.ts +53 -12
- package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
- package/src/__tests__/conversation-load-history-stripped.test.ts +279 -0
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-process-callsite.test.ts +1 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +264 -81
- package/src/__tests__/conversation-seed-composer.test.ts +66 -4
- package/src/__tests__/conversation-skill-tools.test.ts +2 -5
- package/src/__tests__/conversation-slash-commands.test.ts +36 -8
- package/src/__tests__/conversation-slash-queue.test.ts +1 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -1
- package/src/__tests__/conversation-speed-override.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +220 -0
- package/src/__tests__/conversation-sync-tags.test.ts +99 -32
- package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-security-invariants.test.ts +7 -0
- package/src/__tests__/credential-vault-unit.test.ts +2 -2
- package/src/__tests__/cu-unified-flow.test.ts +10 -1
- package/src/__tests__/dm-backfill.test.ts +64 -0
- package/src/__tests__/dm-persistence.test.ts +33 -0
- package/src/__tests__/document-find-replace.test.ts +501 -0
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/first-greeting.test.ts +23 -2
- package/src/__tests__/gateway-flag-listener.test.ts +237 -0
- package/src/__tests__/gemini-provider.test.ts +78 -0
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +7 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/headless-browser-navigate.test.ts +172 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +4 -0
- package/src/__tests__/host-bash-proxy.test.ts +6 -0
- package/src/__tests__/host-browser-proxy.test.ts +10 -0
- package/src/__tests__/host-cu-proxy.test.ts +8 -1
- package/src/__tests__/host-file-proxy.test.ts +8 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/host-transfer-proxy.test.ts +8 -1
- package/src/__tests__/identity-routes.test.ts +57 -0
- package/src/__tests__/inbound-slack-persistence.test.ts +3 -0
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/injector-chain.test.ts +2 -0
- package/src/__tests__/injector-document-comments.test.ts +378 -0
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +4 -25
- package/src/__tests__/list-messages-attachments.test.ts +21 -17
- package/src/__tests__/list-messages-hidden-metadata.test.ts +217 -0
- package/src/__tests__/list-messages-page-latest.test.ts +130 -14
- package/src/__tests__/list-messages-tool-merge.test.ts +77 -17
- package/src/__tests__/llm-context-normalization.test.ts +0 -2
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +161 -9
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/log-export-routes.test.ts +99 -2
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/mcp-abort-signal.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/message-queue-steer.test.ts +114 -0
- package/src/__tests__/model-intents.test.ts +2 -4
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +151 -0
- package/src/__tests__/openai-responses-provider.test.ts +118 -16
- package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
- package/src/__tests__/pending-interactions-resolved-event.test.ts +189 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -5
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +2 -2
- package/src/__tests__/plugin-source-watcher.test.ts +302 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/process-message-background-slack.test.ts +1 -51
- package/src/__tests__/process-message-display-content.test.ts +21 -16
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/registry.test.ts +2 -8
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/server-history-render.test.ts +83 -4
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags.test.ts +2 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
- package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/steer-tool-repair.test.ts +249 -0
- package/src/__tests__/subagent-notify-parent.test.ts +1 -1
- package/src/__tests__/suggestion-routes.test.ts +1 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +161 -124
- package/src/__tests__/terminal-tools.test.ts +12 -2
- package/src/__tests__/thinking-block-replay.test.ts +113 -0
- package/src/__tests__/thread-backfill.test.ts +370 -22
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
- package/src/__tests__/tool-executor.test.ts +89 -53
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/twilio-routes.test.ts +1 -1
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/web-fetch.test.ts +2 -2
- package/src/__tests__/workspace-git-service.test.ts +94 -10
- package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +1 -1
- package/src/agent/attachments.ts +1 -0
- package/src/agent/loop.ts +65 -20
- package/src/api/README.md +5 -0
- package/src/api/index.ts +4 -0
- package/src/api/package.json +10 -0
- package/src/background-wake/background-wake-routes.test.ts +233 -0
- package/src/background-wake/next-wake.test.ts +289 -0
- package/src/background-wake/next-wake.ts +172 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/browser/operations.ts +15 -0
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +10 -12
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/conversations.ts +128 -1
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference-providers.ts +147 -1
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +483 -0
- package/src/cli/commands/memory-v3-render.ts +344 -0
- package/src/cli/commands/memory-v3.ts +316 -0
- package/src/cli/commands/notifications.ts +24 -2
- package/src/cli/program.ts +2 -0
- package/src/cli/utils/conversation-id.ts +17 -5
- package/src/config/assistant-feature-flags.ts +21 -9
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
- package/src/config/bundled-skills/document-editor/SKILL.md +124 -0
- package/src/config/bundled-skills/document-editor/TOOLS.json +258 -0
- package/src/config/bundled-skills/document-editor/tools/comment-list.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/comment-reply.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/comment-resolve.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-find.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/document-editor/tools/document-replace-text.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/SKILL.md +8 -0
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +8 -0
- package/src/config/bundled-tool-registry.ts +24 -12
- package/src/config/call-site-defaults.ts +20 -0
- package/src/config/feature-flag-registry.json +115 -3
- package/src/config/llm-resolver.ts +16 -2
- package/src/config/schemas/__tests__/memory-v2.test.ts +217 -1
- package/src/config/schemas/call-site-catalog.ts +35 -0
- package/src/config/schemas/llm.ts +14 -0
- package/src/config/schemas/memory-v2.ts +294 -1
- package/src/config/schemas/memory.ts +2 -1
- package/src/context/compactor.ts +60 -1
- package/src/context/token-estimator.ts +47 -4
- package/src/context/window-manager.ts +25 -0
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/credential-health/credential-health-service.ts +34 -19
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +357 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +287 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +155 -36
- package/src/daemon/conversation-agent-loop.ts +307 -88
- package/src/daemon/conversation-error.ts +31 -1
- package/src/daemon/conversation-lifecycle.ts +149 -118
- package/src/daemon/conversation-messaging.ts +3 -0
- package/src/daemon/conversation-process.ts +273 -0
- package/src/daemon/conversation-queue-manager.ts +14 -0
- package/src/daemon/conversation-runtime-assembly.ts +145 -84
- package/src/daemon/conversation-slash.ts +37 -5
- package/src/daemon/conversation-surfaces.ts +45 -2
- package/src/daemon/conversation-tool-setup.ts +70 -3
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +54 -32
- package/src/daemon/disk-pressure-guard.ts +14 -2
- package/src/daemon/first-greeting.ts +10 -0
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
- package/src/daemon/handlers/config-a2a.ts +160 -0
- package/src/daemon/handlers/config-model.test.ts +2 -0
- package/src/daemon/handlers/conversations.ts +90 -3
- package/src/daemon/handlers/shared.ts +92 -29
- package/src/daemon/host-bash-proxy.ts +1 -1
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +5 -5
- package/src/daemon/host-file-proxy.ts +5 -5
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +11 -11
- package/src/daemon/lifecycle.ts +40 -23
- package/src/daemon/meet-manifest-loader.ts +1 -7
- package/src/daemon/message-protocol.ts +4 -0
- package/src/daemon/message-types/conversations.ts +14 -9
- package/src/daemon/message-types/document-comments.ts +50 -0
- package/src/daemon/message-types/home.ts +1 -13
- package/src/daemon/message-types/messages.ts +66 -7
- package/src/daemon/message-types/surfaces.ts +3 -1
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/message-types/web-activity.ts +57 -0
- package/src/daemon/plugin-source-watcher.ts +135 -3
- package/src/daemon/process-message.ts +69 -12
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +52 -0
- package/src/daemon/tool-setup-types.ts +13 -0
- package/src/daemon/trust-context.ts +6 -0
- package/src/documents/document-comments-store.test.ts +338 -0
- package/src/documents/document-comments-store.ts +237 -0
- package/src/documents/document-store.ts +202 -0
- package/src/events/relationship-state-updated.ts +25 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -2
- package/src/heartbeat/heartbeat-service.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +33 -2
- package/src/home/feed-types.ts +6 -1
- package/src/home/home-content-refresh.ts +52 -0
- package/src/home/home-greeting-cache.ts +69 -0
- package/src/home/home-greeting.ts +85 -0
- package/src/home/suggested-prompts.ts +168 -9
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/registries.ts +8 -12
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +135 -2
- package/src/memory/__tests__/memory-retrospective-job.test.ts +327 -6
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-crud.ts +191 -100
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-init.ts +26 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/delivery-crud.ts +41 -0
- package/src/memory/delivery-status.ts +141 -15
- package/src/memory/external-conversation-store.ts +32 -1
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +68 -15
- package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
- package/src/memory/llm-request-log-source-local.ts +7 -0
- package/src/memory/llm-request-log-source.ts +9 -2
- package/src/memory/llm-request-log-store.ts +43 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-constants.ts +28 -0
- package/src/memory/memory-retrospective-enqueue.ts +11 -3
- package/src/memory/memory-retrospective-job.ts +413 -18
- package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
- package/src/memory/memory-v2-activation-log-store.ts +41 -14
- package/src/memory/migrations/100-core-tables.ts +1 -0
- package/src/memory/migrations/109-external-conversation-bindings.ts +1 -0
- package/src/memory/migrations/253-conversation-last-notified-profile.ts +15 -0
- package/src/memory/migrations/253-document-comments.ts +47 -0
- package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +43 -0
- package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +24 -0
- package/src/memory/migrations/256-memory-v2-injection-events.ts +113 -0
- package/src/memory/migrations/257-strip-base-url-non-openai-compatible.ts +22 -0
- package/src/memory/migrations/258-onboarding-events-prior-assistants.ts +13 -0
- package/src/memory/migrations/259-conversation-cleaned-at.ts +33 -0
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/index.ts +34 -0
- package/src/memory/migrations/registry.ts +58 -0
- package/src/memory/onboarding-events-store.ts +7 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +3 -0
- package/src/memory/schema/infrastructure.ts +22 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
- package/src/memory/v2/__tests__/injection-events.test.ts +318 -0
- package/src/memory/v2/__tests__/injection.test.ts +158 -112
- package/src/memory/v2/__tests__/page-index.test.ts +365 -1
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +660 -4
- package/src/memory/v2/consolidation-job.ts +14 -0
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +124 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +224 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +106 -0
- package/src/memory/v2/harness/trace.ts +58 -0
- package/src/memory/v2/injection-events.ts +101 -0
- package/src/memory/v2/injection.ts +42 -25
- package/src/memory/v2/page-index.ts +209 -7
- package/src/memory/v2/page-store.ts +18 -0
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +369 -62
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +563 -0
- package/src/memory/v3/__tests__/filter.test.ts +512 -0
- package/src/memory/v3/__tests__/gate.test.ts +574 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
- package/src/memory/v3/__tests__/loop.test.ts +530 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +440 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +469 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
- package/src/memory/v3/__tests__/validate.test.ts +245 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +249 -0
- package/src/memory/v3/filter.ts +281 -0
- package/src/memory/v3/gate.ts +334 -0
- package/src/memory/v3/index-composition.ts +113 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +382 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +420 -0
- package/src/memory/v3/shadow-middleware.ts +305 -0
- package/src/memory/v3/traversal.ts +206 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +351 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +300 -0
- package/src/messaging/providers/index.ts +7 -1
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +329 -3
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +34 -1
- package/src/messaging/providers/slack/adapter.ts +178 -25
- package/src/messaging/providers/slack/api.test.ts +54 -0
- package/src/messaging/providers/slack/api.ts +119 -3
- package/src/messaging/providers/slack/client.ts +12 -0
- package/src/messaging/providers/slack/deep-link.ts +20 -1
- package/src/messaging/providers/slack/message-metadata.test.ts +48 -0
- package/src/messaging/providers/slack/message-metadata.ts +156 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +107 -75
- package/src/messaging/providers/slack/render-transcript.ts +176 -49
- package/src/messaging/providers/slack/send.test.ts +77 -0
- package/src/messaging/providers/slack/send.ts +8 -2
- package/src/messaging/providers/slack/types.ts +14 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +4 -1
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +116 -54
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/conversation-seed-composer.ts +14 -2
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/deferred-emit.ts +135 -0
- package/src/notifications/emit-signal.ts +38 -50
- package/src/notifications/home-feed-side-effect.ts +60 -30
- package/src/oauth/connect-orchestrator.ts +3 -0
- package/src/oauth/credential-token-resolver.ts +2 -0
- package/src/oauth/manual-token-connection.ts +19 -0
- package/src/oauth/oauth-store.ts +12 -0
- package/src/oauth/seed-providers.ts +22 -0
- package/src/permissions/prompter.ts +8 -5
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +6 -3
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +100 -20
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +11 -16
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/prompts/__tests__/system-prompt.test.ts +46 -2
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/normalize-onboarding.ts +40 -0
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +69 -19
- package/src/prompts/system-prompt.ts +118 -216
- package/src/prompts/template-detection.ts +37 -0
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
- package/src/prompts/templates/BOOTSTRAP.md +10 -2
- package/src/prompts/templates/VOICE.md +3 -0
- package/src/prompts/templates/system-sections.ts +281 -9
- package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +159 -66
- package/src/providers/call-site-routing.ts +14 -2
- package/src/providers/connection-model-compat.ts +38 -0
- package/src/providers/connection-resolution.ts +16 -2
- package/src/providers/fireworks/client.ts +20 -2
- package/src/providers/gemini/client.ts +49 -6
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +342 -0
- package/src/providers/inference/__tests__/base-url-security.test.ts +189 -0
- package/src/providers/inference/__tests__/codex-token-refresh.test.ts +254 -0
- package/src/providers/inference/adapter-factory.ts +18 -1
- package/src/providers/inference/auth.ts +3 -3
- package/src/providers/inference/codex-token-refresh.ts +128 -0
- package/src/providers/inference/resolve-auth.ts +49 -6
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +91 -1
- package/src/providers/model-intents.ts +1 -1
- package/src/providers/openai/chat-completions-provider.ts +63 -23
- package/src/providers/openai/codex-models.ts +18 -0
- package/src/providers/openai/responses-provider.ts +86 -23
- package/src/providers/openrouter/client.ts +5 -1
- package/src/providers/provider-send-message.ts +7 -1
- package/src/providers/retry.ts +34 -3
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/types.ts +25 -0
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +214 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +128 -0
- package/src/runtime/agent-wake.ts +152 -56
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +43 -3
- package/src/runtime/background-job-runner.ts +26 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/channel-reply-delivery.ts +182 -47
- package/src/runtime/channel-retry-sweep.ts +141 -16
- package/src/runtime/http-types.ts +7 -6
- package/src/runtime/migrations/vbundle-builder.ts +10 -3
- package/src/runtime/pending-interactions.ts +50 -8
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +161 -1
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +290 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +280 -0
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +266 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/approval-routes.ts +4 -1
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +188 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +0 -6
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +246 -0
- package/src/runtime/routes/content-source-routes.ts +78 -0
- package/src/runtime/routes/conversation-cli-routes.ts +147 -2
- package/src/runtime/routes/conversation-list-routes.ts +12 -4
- package/src/runtime/routes/conversation-management-routes.ts +77 -20
- package/src/runtime/routes/conversation-query-routes.ts +196 -31
- package/src/runtime/routes/conversation-routes.ts +472 -425
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/document-comments-routes.ts +287 -0
- package/src/runtime/routes/documents-routes.ts +33 -0
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +24 -8
- package/src/runtime/routes/home-feed-routes.ts +6 -3
- package/src/runtime/routes/host-app-control-routes.ts +1 -1
- package/src/runtime/routes/host-browser-routes.ts +17 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/identity-routes.ts +21 -0
- package/src/runtime/routes/inbound-message-handler.ts +288 -58
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +365 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
- package/src/runtime/routes/index.ts +20 -4
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/inference-provider-connection-routes.ts +63 -7
- package/src/runtime/routes/integrations/a2a.ts +60 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/log-export-routes.ts +39 -0
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +427 -0
- package/src/runtime/routes/memory-v3-routes.ts +316 -0
- package/src/runtime/routes/migration-routes.ts +21 -24
- package/src/runtime/routes/notification-routes.ts +19 -2
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/question-routes.ts +4 -1
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/sanity-routes.ts +159 -0
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +188 -0
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/services/conversation-serializer.ts +30 -4
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/schedule/integration-status.ts +3 -1
- package/src/security/__tests__/oauth2-device-code.test.ts +479 -0
- package/src/security/oauth2-device-code.ts +307 -0
- package/src/security/oauth2.ts +26 -9
- package/src/security/secure-keys.ts +5 -0
- package/src/skills/catalog-install.ts +6 -2
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +2 -8
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +150 -0
- package/src/tools/browser/browser-execution.ts +106 -0
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +4 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +22 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +42 -2
- package/src/tools/browser/cdp-client/factory.ts +171 -4
- package/src/tools/browser/cdp-client/local-cdp-client.ts +21 -0
- package/src/tools/browser/cdp-client/types.ts +101 -0
- package/src/tools/browser/pinned-tabs.ts +146 -0
- package/src/tools/computer-use/definitions.ts +22 -78
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-comment-tool.test.ts +379 -0
- package/src/tools/document/document-comment-tool.ts +156 -0
- package/src/tools/document/document-tool.ts +187 -2
- package/src/tools/execution-target.ts +21 -23
- package/src/tools/executor.ts +6 -1
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -8
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/__tests__/web-fetch-metadata.test.ts +229 -0
- package/src/tools/network/__tests__/web-search-metadata.test.ts +346 -0
- package/src/tools/network/domain-normalize.ts +17 -0
- package/src/tools/network/web-fetch.ts +216 -73
- package/src/tools/network/web-search.ts +216 -98
- package/src/tools/registry.ts +7 -23
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +1 -8
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-approval-handler.ts +19 -12
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/types.ts +31 -98
- package/src/tools/ui-surface/definitions.ts +9 -23
- package/src/types/onboarding-context.ts +4 -0
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/__tests__/favicon.test.ts +84 -0
- package/src/util/favicon.ts +40 -0
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -7
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/git-service.ts +75 -4
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/config/bundled-skills/document/SKILL.md +0 -54
- package/src/config/bundled-skills/document/TOOLS.json +0 -106
- package/src/daemon/seed-files.ts +0 -18
- package/src/prompts/cache-boundary.ts +0 -8
- package/src/runtime/routes/interface-routes.ts +0 -43
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-create.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-delete.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-list.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-read.ts +0 -0
- /package/src/config/bundled-skills/{document → document-editor}/tools/document-update.ts +0 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comparison runner — execute N retrievers over a set of oracle turns and score
|
|
3
|
+
* each against ground truth.
|
|
4
|
+
*
|
|
5
|
+
* The runner is DB/workspace-agnostic: input reconstruction is injected as a
|
|
6
|
+
* function, so it can be unit-tested with stubs and the route/CLI can wire in
|
|
7
|
+
* the real `reconstructInput` (which needs a DB + workspace).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
aggregate,
|
|
12
|
+
type AggregateEval,
|
|
13
|
+
evalTurn,
|
|
14
|
+
type TurnEval,
|
|
15
|
+
} from "./metrics.js";
|
|
16
|
+
import type { OracleTurn } from "./oracle.js";
|
|
17
|
+
import type { ReconstructedInput } from "./replay-input.js";
|
|
18
|
+
import type { Retriever } from "./retriever.js";
|
|
19
|
+
|
|
20
|
+
export interface ComparisonTurnResult {
|
|
21
|
+
conversationId: string;
|
|
22
|
+
turn: number;
|
|
23
|
+
/** Per-retriever evaluation for this turn, keyed by retriever name. */
|
|
24
|
+
byRetriever: Record<string, TurnEval>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface RetrieverReport {
|
|
28
|
+
name: string;
|
|
29
|
+
aggregate: AggregateEval;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface ComparisonReport {
|
|
33
|
+
ks: number[];
|
|
34
|
+
/** Oracle turns handed to the runner. */
|
|
35
|
+
turnsConsidered: number;
|
|
36
|
+
/** Turns actually scored (reconstruction succeeded). */
|
|
37
|
+
turnsScored: number;
|
|
38
|
+
/** Turns skipped because input reconstruction returned null. */
|
|
39
|
+
turnsSkipped: number;
|
|
40
|
+
perTurn: ComparisonTurnResult[];
|
|
41
|
+
retrievers: RetrieverReport[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface RunComparisonParams {
|
|
45
|
+
retrievers: readonly Retriever[];
|
|
46
|
+
oracleTurns: readonly OracleTurn[];
|
|
47
|
+
/** Reconstruct a turn's retriever input; return null to skip the turn. */
|
|
48
|
+
reconstruct: (turn: OracleTurn) => Promise<ReconstructedInput | null>;
|
|
49
|
+
ks: readonly number[];
|
|
50
|
+
signal?: AbortSignal;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export async function runComparison(
|
|
54
|
+
params: RunComparisonParams,
|
|
55
|
+
): Promise<ComparisonReport> {
|
|
56
|
+
const { retrievers, oracleTurns, reconstruct, ks, signal } = params;
|
|
57
|
+
|
|
58
|
+
const perTurn: ComparisonTurnResult[] = [];
|
|
59
|
+
const perRetrieverEvals = new Map<string, TurnEval[]>();
|
|
60
|
+
for (const retriever of retrievers) {
|
|
61
|
+
perRetrieverEvals.set(retriever.name, []);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let turnsScored = 0;
|
|
65
|
+
let turnsSkipped = 0;
|
|
66
|
+
|
|
67
|
+
for (const turn of oracleTurns) {
|
|
68
|
+
if (signal?.aborted) break;
|
|
69
|
+
|
|
70
|
+
const reconstructed = await reconstruct(turn);
|
|
71
|
+
if (!reconstructed) {
|
|
72
|
+
turnsSkipped++;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
turnsScored++;
|
|
76
|
+
|
|
77
|
+
const byRetriever: Record<string, TurnEval> = {};
|
|
78
|
+
for (const retriever of retrievers) {
|
|
79
|
+
if (signal?.aborted) break;
|
|
80
|
+
const output = await retriever.retrieve(reconstructed.input);
|
|
81
|
+
const turnEval = evalTurn(output, turn.groundTruthSlugs, ks);
|
|
82
|
+
byRetriever[retriever.name] = turnEval;
|
|
83
|
+
perRetrieverEvals.get(retriever.name)?.push(turnEval);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
perTurn.push({
|
|
87
|
+
conversationId: turn.conversationId,
|
|
88
|
+
turn: turn.turn,
|
|
89
|
+
byRetriever,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const retrieverReports: RetrieverReport[] = retrievers.map((retriever) => ({
|
|
94
|
+
name: retriever.name,
|
|
95
|
+
aggregate: aggregate(perRetrieverEvals.get(retriever.name) ?? [], ks),
|
|
96
|
+
}));
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
ks: [...ks],
|
|
100
|
+
turnsConsidered: oracleTurns.length,
|
|
101
|
+
turnsScored,
|
|
102
|
+
turnsSkipped,
|
|
103
|
+
perTurn,
|
|
104
|
+
retrievers: retrieverReports,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Descent-trace schema for a tree-walking retriever.
|
|
3
|
+
*
|
|
4
|
+
* Defined ahead of its producer: the comparison harness renders this and a
|
|
5
|
+
* tree-walking retriever emits it; a tier-based retriever (no tree walk) leaves
|
|
6
|
+
* `RetrievalOutput.trace` undefined. Per level it records which branches were
|
|
7
|
+
* considered, descended, and skipped plus the model's reasoning, so a wrong
|
|
8
|
+
* high-level skip is observable rather than silent.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { RetrievalCost } from "./retriever.js";
|
|
12
|
+
|
|
13
|
+
/** A scout lane's contribution on one pass. */
|
|
14
|
+
export interface ScoutResult {
|
|
15
|
+
lane: "hot" | "sparse" | "dense";
|
|
16
|
+
slugs: string[];
|
|
17
|
+
/** Optional per-slug score (BM25 / cosine / EMA) for inspection. */
|
|
18
|
+
scoreBySlug?: Record<string, number>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** One level of the tree walk: what was considered, descended, and skipped. */
|
|
22
|
+
export interface TreeLevel {
|
|
23
|
+
/** Node whose index page was read ("" for root, else a branch path). */
|
|
24
|
+
node: string;
|
|
25
|
+
considered: string[];
|
|
26
|
+
descended: string[];
|
|
27
|
+
skipped: string[];
|
|
28
|
+
/** The model's stated reason for the descend/skip split at this node. */
|
|
29
|
+
reasoning: string;
|
|
30
|
+
cost?: RetrievalCost;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** A 1–2 hop walk along the curated `edges:` graph from a seed page. */
|
|
34
|
+
export interface EdgeExpansion {
|
|
35
|
+
from: string;
|
|
36
|
+
pulled: string[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** The gate's decision at the end of a pass. */
|
|
40
|
+
export interface GateDecision {
|
|
41
|
+
decision: "ready" | "more";
|
|
42
|
+
/** When "more", the generated follow-up queries seeding the next pass. */
|
|
43
|
+
questions?: string[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Everything that happened on one pass of the loop. */
|
|
47
|
+
export interface DescentPass {
|
|
48
|
+
passNumber: number;
|
|
49
|
+
scouts?: ScoutResult[];
|
|
50
|
+
treeLevels?: TreeLevel[];
|
|
51
|
+
edgeExpansions?: EdgeExpansion[];
|
|
52
|
+
gate?: GateDecision;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** A full loop execution, pass by pass. */
|
|
56
|
+
export interface DescentTrace {
|
|
57
|
+
passes: DescentPass[];
|
|
58
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { getLogger } from "../../util/logger.js";
|
|
2
|
+
import type { DrizzleDb } from "../db-connection.js";
|
|
3
|
+
import { getSqliteFrom } from "../db-connection.js";
|
|
4
|
+
|
|
5
|
+
const log = getLogger("memory-v2-injection-events");
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Half-life of the injection-frequency decay, in milliseconds.
|
|
9
|
+
*
|
|
10
|
+
* Per the memory router v4 spec: a +1 from 3 days ago contributes 0.5; from
|
|
11
|
+
* 6 days ago 0.25. Decoupled from turn volume — busy and quiet days decay
|
|
12
|
+
* at the same wall-clock rate.
|
|
13
|
+
*/
|
|
14
|
+
export const INJECTION_SCORE_HALF_LIFE_MS = 3 * 24 * 60 * 60 * 1000;
|
|
15
|
+
|
|
16
|
+
export const INJECTION_SCORE_LAMBDA =
|
|
17
|
+
Math.log(2) / INJECTION_SCORE_HALF_LIFE_MS;
|
|
18
|
+
|
|
19
|
+
// Events past 6 half-lives contribute <1.6% each. Reads bound the scan to
|
|
20
|
+
// this window so per-slug score computation stays cheap as history grows.
|
|
21
|
+
const READ_WINDOW_MS = 6 * INJECTION_SCORE_HALF_LIFE_MS;
|
|
22
|
+
|
|
23
|
+
function decayContribution(elapsedMs: number): number {
|
|
24
|
+
return Math.exp(-INJECTION_SCORE_LAMBDA * elapsedMs);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Append one event per slug. Best-effort — a SQLite write must never abort
|
|
29
|
+
* the agent turn on top of a successful routing decision the rest of the
|
|
30
|
+
* caller depends on.
|
|
31
|
+
*/
|
|
32
|
+
export function recordInjectionEvents(
|
|
33
|
+
database: DrizzleDb,
|
|
34
|
+
slugs: readonly string[],
|
|
35
|
+
injectedAt: number,
|
|
36
|
+
): void {
|
|
37
|
+
if (slugs.length === 0) return;
|
|
38
|
+
try {
|
|
39
|
+
const raw = getSqliteFrom(database);
|
|
40
|
+
const insert = raw.prepare(
|
|
41
|
+
`INSERT INTO memory_v2_injection_events (slug, injected_at) VALUES (?, ?)`,
|
|
42
|
+
);
|
|
43
|
+
const append = raw.transaction((items: readonly string[]) => {
|
|
44
|
+
for (const slug of items) insert.run(slug, injectedAt);
|
|
45
|
+
});
|
|
46
|
+
append(slugs);
|
|
47
|
+
} catch (err) {
|
|
48
|
+
log.warn(
|
|
49
|
+
{ err, slugCount: slugs.length },
|
|
50
|
+
"failed to record injection events; continuing",
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** `score(now) = Σᵢ exp(-λ × (now - tᵢ))` over events within READ_WINDOW_MS. */
|
|
56
|
+
export function computeInjectionScore(
|
|
57
|
+
database: DrizzleDb,
|
|
58
|
+
slug: string,
|
|
59
|
+
now: number,
|
|
60
|
+
): number {
|
|
61
|
+
const cutoff = now - READ_WINDOW_MS;
|
|
62
|
+
const raw = getSqliteFrom(database);
|
|
63
|
+
const rows = raw
|
|
64
|
+
.query(
|
|
65
|
+
`SELECT injected_at FROM memory_v2_injection_events
|
|
66
|
+
WHERE slug = ? AND injected_at >= ?`,
|
|
67
|
+
)
|
|
68
|
+
.all(slug, cutoff) as Array<{ injected_at: number }>;
|
|
69
|
+
let score = 0;
|
|
70
|
+
for (const row of rows) score += decayContribution(now - row.injected_at);
|
|
71
|
+
return score;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Batch variant of `computeInjectionScore` — single SQL pass scoped to the
|
|
76
|
+
* requested slugs so tier assignment doesn't issue O(M) queries. Slugs
|
|
77
|
+
* with no events in the read window are omitted from the result; callers
|
|
78
|
+
* should treat a missing entry as score 0.
|
|
79
|
+
*/
|
|
80
|
+
export function computeInjectionScores(
|
|
81
|
+
database: DrizzleDb,
|
|
82
|
+
slugs: readonly string[],
|
|
83
|
+
now: number,
|
|
84
|
+
): Map<string, number> {
|
|
85
|
+
const out = new Map<string, number>();
|
|
86
|
+
if (slugs.length === 0) return out;
|
|
87
|
+
const cutoff = now - READ_WINDOW_MS;
|
|
88
|
+
const raw = getSqliteFrom(database);
|
|
89
|
+
const placeholders = slugs.map(() => "?").join(",");
|
|
90
|
+
const rows = raw
|
|
91
|
+
.query(
|
|
92
|
+
`SELECT slug, injected_at FROM memory_v2_injection_events
|
|
93
|
+
WHERE slug IN (${placeholders}) AND injected_at >= ?`,
|
|
94
|
+
)
|
|
95
|
+
.all(...slugs, cutoff) as Array<{ slug: string; injected_at: number }>;
|
|
96
|
+
for (const row of rows) {
|
|
97
|
+
const prev = out.get(row.slug) ?? 0;
|
|
98
|
+
out.set(row.slug, prev + decayContribution(now - row.injected_at));
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
@@ -43,8 +43,9 @@ import {
|
|
|
43
43
|
isCliCommandSlug,
|
|
44
44
|
} from "./cli-command-store.js";
|
|
45
45
|
import { getEdgeIndex } from "./edge-index.js";
|
|
46
|
+
import { recordInjectionEvents } from "./injection-events.js";
|
|
46
47
|
import { readPage, renderPageContent } from "./page-store.js";
|
|
47
|
-
import { runRouter } from "./router.js";
|
|
48
|
+
import { type RouterTurnPair, runRouter } from "./router.js";
|
|
48
49
|
import { getSkillCapability, isSkillSlug } from "./skill-store.js";
|
|
49
50
|
import type { ActivationState, EverInjectedEntry } from "./types.js";
|
|
50
51
|
|
|
@@ -80,10 +81,13 @@ export interface InjectMemoryV2BlockParams {
|
|
|
80
81
|
conversationId: string;
|
|
81
82
|
/** Caller-tracked turn number, persisted with each new everInjected entry. */
|
|
82
83
|
currentTurn: number;
|
|
83
|
-
/**
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
/**
|
|
85
|
+
* Recent assistant/user turn pairs, oldest first. Must contain at least
|
|
86
|
+
* one entry whose `userMessage` is the just-arrived turn that triggered
|
|
87
|
+
* this call. The number of pairs the production caller passes is
|
|
88
|
+
* controlled by `memory.v2.router.historical_pairs`.
|
|
89
|
+
*/
|
|
90
|
+
recentTurnPairs: readonly RouterTurnPair[];
|
|
87
91
|
/** NOW context (autoloaded essentials/threads/recent or NOW.md). */
|
|
88
92
|
nowText: string;
|
|
89
93
|
/** Resolved messageId to persist on the activation_state row. */
|
|
@@ -139,14 +143,21 @@ export async function injectMemoryV2Block(
|
|
|
139
143
|
database,
|
|
140
144
|
conversationId,
|
|
141
145
|
currentTurn,
|
|
142
|
-
|
|
143
|
-
assistantMessage,
|
|
146
|
+
recentTurnPairs,
|
|
144
147
|
nowText,
|
|
145
148
|
messageId,
|
|
146
149
|
config,
|
|
147
150
|
signal,
|
|
148
151
|
} = params;
|
|
149
152
|
|
|
153
|
+
// The spreading-activation fallback (only used when the router is off)
|
|
154
|
+
// still needs the most recent (assistant, user) pair for semantic
|
|
155
|
+
// scoring. Pulling these from the last pair preserves bit-identical
|
|
156
|
+
// K=1 behavior — the router-off path never benefits from extra pairs.
|
|
157
|
+
const lastPair = recentTurnPairs[recentTurnPairs.length - 1];
|
|
158
|
+
const userMessage = lastPair.userMessage;
|
|
159
|
+
const assistantMessage = lastPair.assistantMessage;
|
|
160
|
+
|
|
150
161
|
const workspaceDir = getWorkspaceDir();
|
|
151
162
|
const mode: InjectMemoryV2Mode = params.mode ?? "per-turn";
|
|
152
163
|
|
|
@@ -173,8 +184,7 @@ export async function injectMemoryV2Block(
|
|
|
173
184
|
database,
|
|
174
185
|
conversationId,
|
|
175
186
|
currentTurn,
|
|
176
|
-
|
|
177
|
-
assistantMessage,
|
|
187
|
+
recentTurnPairs,
|
|
178
188
|
nowText,
|
|
179
189
|
messageId,
|
|
180
190
|
config,
|
|
@@ -520,8 +530,7 @@ async function injectViaRouter(args: {
|
|
|
520
530
|
database: DrizzleDb;
|
|
521
531
|
conversationId: string;
|
|
522
532
|
currentTurn: number;
|
|
523
|
-
|
|
524
|
-
assistantMessage: string;
|
|
533
|
+
recentTurnPairs: readonly RouterTurnPair[];
|
|
525
534
|
nowText: string;
|
|
526
535
|
messageId: string;
|
|
527
536
|
config: AssistantConfig;
|
|
@@ -533,8 +542,7 @@ async function injectViaRouter(args: {
|
|
|
533
542
|
database,
|
|
534
543
|
conversationId,
|
|
535
544
|
currentTurn,
|
|
536
|
-
|
|
537
|
-
assistantMessage,
|
|
545
|
+
recentTurnPairs,
|
|
538
546
|
nowText,
|
|
539
547
|
messageId,
|
|
540
548
|
config,
|
|
@@ -547,14 +555,23 @@ async function injectViaRouter(args: {
|
|
|
547
555
|
|
|
548
556
|
const routerResult = await runRouter({
|
|
549
557
|
workspaceDir,
|
|
550
|
-
|
|
551
|
-
assistantMessage,
|
|
558
|
+
recentTurnPairs,
|
|
552
559
|
nowText,
|
|
553
560
|
priorEverInjected,
|
|
554
561
|
config,
|
|
562
|
+
database,
|
|
555
563
|
...(signal ? { signal } : {}),
|
|
556
564
|
});
|
|
557
565
|
|
|
566
|
+
// Record router selections to the EMA event log. The router decided these
|
|
567
|
+
// slugs are relevant THIS turn (regardless of whether they're newly
|
|
568
|
+
// rendered or re-picked from prior context). The helper swallows its own
|
|
569
|
+
// errors — a SQLite write must not abort the turn on top of a successful
|
|
570
|
+
// routing decision the rest of this function depends on.
|
|
571
|
+
if (routerResult.failureReason === null) {
|
|
572
|
+
recordInjectionEvents(database, routerResult.selectedSlugs, Date.now());
|
|
573
|
+
}
|
|
574
|
+
|
|
558
575
|
if (routerResult.failureReason !== null) {
|
|
559
576
|
log.warn(
|
|
560
577
|
{ failureReason: routerResult.failureReason },
|
|
@@ -603,12 +620,12 @@ async function injectViaRouter(args: {
|
|
|
603
620
|
|
|
604
621
|
// Build minimal telemetry rows for the union of router-selected slugs and
|
|
605
622
|
// prior `everInjected` slugs. Router-mode rows zero out every activation
|
|
606
|
-
// value (no spreading activation runs). Slugs the router picked
|
|
607
|
-
//
|
|
608
|
-
//
|
|
609
|
-
// overwritten by
|
|
610
|
-
|
|
611
|
-
const telemetrySlugs = new Set<string>(
|
|
623
|
+
// value (no spreading activation runs). Slugs the router picked carry
|
|
624
|
+
// their batch's tier tag from `routerResult.sourceBySlug` (e.g. `tier1`,
|
|
625
|
+
// `tier3:2`); prior-everInjected slugs the router did NOT re-pick get
|
|
626
|
+
// `source: "carry_over"`. The `status` placeholder is overwritten by
|
|
627
|
+
// `finalizeInjection`.
|
|
628
|
+
const telemetrySlugs = new Set<string>(routerResult.selectedSlugs);
|
|
612
629
|
for (const entry of priorEverInjected) telemetrySlugs.add(entry.slug);
|
|
613
630
|
const telemetryRows: MemoryV2ConceptRowRecord[] = [...telemetrySlugs].map(
|
|
614
631
|
(slug) => ({
|
|
@@ -623,7 +640,7 @@ async function injectViaRouter(args: {
|
|
|
623
640
|
simAssistantRerankBoost: 0,
|
|
624
641
|
inRerankPool: false,
|
|
625
642
|
spreadContribution: 0,
|
|
626
|
-
source:
|
|
643
|
+
source: routerResult.sourceBySlug.get(slug) ?? "carry_over",
|
|
627
644
|
status: "not_injected",
|
|
628
645
|
}),
|
|
629
646
|
);
|
|
@@ -712,7 +729,7 @@ interface RenderInjectionBlockResult {
|
|
|
712
729
|
* the agent into wasted reads.
|
|
713
730
|
*/
|
|
714
731
|
const INJECTION_HEADER =
|
|
715
|
-
"
|
|
732
|
+
'Use `file_read("memory/concepts/path/to/file.md")` to read the full pages for any of the injected memory summaries you want more information on.';
|
|
716
733
|
|
|
717
734
|
/**
|
|
718
735
|
* Render the inner content of the `<memory>` block for a list of slugs.
|
|
@@ -745,9 +762,9 @@ const INJECTION_HEADER =
|
|
|
745
762
|
* fallback for pages predating the summary field). Skills sit after the
|
|
746
763
|
* concept sections under `### Skills You Can Use`, and CLI subcommands sit
|
|
747
764
|
* after the skills under `### CLI Commands You Can Use`. The leading
|
|
748
|
-
*
|
|
765
|
+
* instruction line tells the agent how to read the block.
|
|
749
766
|
*
|
|
750
|
-
*
|
|
767
|
+
* Use `file_read("memory/concepts/path/to/file.md")` to read the full pages for any of the injected memory summaries you want more information on.
|
|
751
768
|
*
|
|
752
769
|
* # memory/concepts/<concept-slug-1>.md
|
|
753
770
|
* <summary-1>
|