@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
package/src/memory/jobs-store.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { and, asc, eq, inArray, lte, notInArray, or, sql } from "drizzle-orm";
|
|
2
2
|
import { v4 as uuid } from "uuid";
|
|
3
3
|
|
|
4
|
+
import { getConfig } from "../config/loader.js";
|
|
4
5
|
import { getLogger } from "../util/logger.js";
|
|
5
6
|
import { truncate } from "../util/truncate.js";
|
|
6
7
|
import { getDb } from "./db-connection.js";
|
|
@@ -43,6 +44,9 @@ export type MemoryJobType =
|
|
|
43
44
|
| "memory_v2_migrate"
|
|
44
45
|
| "memory_v2_reembed"
|
|
45
46
|
| "memory_v2_activation_recompute"
|
|
47
|
+
| "memory_v3_consolidate"
|
|
48
|
+
| "memory_v3_index_maintenance"
|
|
49
|
+
| "memory_v3_edge_learning"
|
|
46
50
|
| "memory_retrospective";
|
|
47
51
|
|
|
48
52
|
export const EMBED_JOB_TYPES: MemoryJobType[] = [
|
|
@@ -66,12 +70,22 @@ export const SLOW_LLM_JOB_TYPES: MemoryJobType[] = [
|
|
|
66
70
|
"generate_conversation_starters",
|
|
67
71
|
"memory_v2_sweep",
|
|
68
72
|
"memory_v2_consolidate",
|
|
73
|
+
"memory_v3_consolidate",
|
|
69
74
|
"memory_v2_migrate",
|
|
70
75
|
"memory_retrospective",
|
|
71
76
|
"backfill",
|
|
72
77
|
"graph_bootstrap",
|
|
73
78
|
];
|
|
74
79
|
|
|
80
|
+
/** Returns `false` only when `config.memory.enabled` is explicitly `false`; defaults to `true` on missing config or load errors. */
|
|
81
|
+
export function isMemoryEnabled(): boolean {
|
|
82
|
+
try {
|
|
83
|
+
return getConfig().memory?.enabled !== false;
|
|
84
|
+
} catch {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
75
89
|
export interface MemoryJob<T = Record<string, unknown>> {
|
|
76
90
|
id: string;
|
|
77
91
|
type: MemoryJobType;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
|
|
1
3
|
import { getConfig } from "../config/loader.js";
|
|
2
4
|
import type { AssistantConfig } from "../config/types.js";
|
|
3
5
|
import {
|
|
@@ -6,6 +8,7 @@ import {
|
|
|
6
8
|
shouldLogDiskPressureBackgroundSkip,
|
|
7
9
|
} from "../daemon/disk-pressure-background-gate.js";
|
|
8
10
|
import { getLogger } from "../util/logger.js";
|
|
11
|
+
import { getWorkspaceDir } from "../util/platform.js";
|
|
9
12
|
import { getMemoryCheckpoint, setMemoryCheckpoint } from "./checkpoints.js";
|
|
10
13
|
import {
|
|
11
14
|
getLastScheduledCleanupEnqueueMs,
|
|
@@ -75,8 +78,14 @@ import {
|
|
|
75
78
|
memoryV2MigrateJob,
|
|
76
79
|
memoryV2ReembedJob,
|
|
77
80
|
} from "./v2/backfill-jobs.js";
|
|
78
|
-
import {
|
|
81
|
+
import {
|
|
82
|
+
countBufferLines,
|
|
83
|
+
memoryV2ConsolidateJob,
|
|
84
|
+
} from "./v2/consolidation-job.js";
|
|
79
85
|
import { memoryV2SweepJob } from "./v2/sweep-job.js";
|
|
86
|
+
import { memoryV3ConsolidateJob } from "./v3/consolidation-job.js";
|
|
87
|
+
import { memoryV3EdgeLearningJob } from "./v3/edge-learning-job.js";
|
|
88
|
+
import { memoryV3IndexMaintenanceJob } from "./v3/maintenance.js";
|
|
80
89
|
|
|
81
90
|
const log = getLogger("memory-jobs-worker");
|
|
82
91
|
|
|
@@ -253,7 +262,7 @@ export async function runMemoryJobsOnce(
|
|
|
253
262
|
maybeEnqueueScheduledCleanupJobs(config);
|
|
254
263
|
}
|
|
255
264
|
maybeEnqueueGraphMaintenanceJobs(config);
|
|
256
|
-
maybeRunDbMaintenance();
|
|
265
|
+
await maybeRunDbMaintenance();
|
|
257
266
|
return 0;
|
|
258
267
|
}
|
|
259
268
|
|
|
@@ -307,7 +316,7 @@ export async function runMemoryJobsOnce(
|
|
|
307
316
|
maybeEnqueueScheduledCleanupJobs(config);
|
|
308
317
|
}
|
|
309
318
|
maybeEnqueueGraphMaintenanceJobs(config);
|
|
310
|
-
maybeRunDbMaintenance();
|
|
319
|
+
await maybeRunDbMaintenance();
|
|
311
320
|
return slowProcessed + fastProcessed + embedProcessed;
|
|
312
321
|
}
|
|
313
322
|
|
|
@@ -518,10 +527,10 @@ async function processJob(
|
|
|
518
527
|
pruneOldConversationsJob(job, config);
|
|
519
528
|
return;
|
|
520
529
|
case "prune_old_llm_request_logs":
|
|
521
|
-
pruneOldLlmRequestLogsJob(job, config);
|
|
530
|
+
await pruneOldLlmRequestLogsJob(job, config);
|
|
522
531
|
return;
|
|
523
532
|
case "prune_old_trace_events":
|
|
524
|
-
pruneOldTraceEventsJob(job, config);
|
|
533
|
+
await pruneOldTraceEventsJob(job, config);
|
|
525
534
|
return;
|
|
526
535
|
case "build_conversation_summary":
|
|
527
536
|
// Stale rows enqueued before v2 was enabled must not consume the
|
|
@@ -597,6 +606,16 @@ async function processJob(
|
|
|
597
606
|
case "memory_v2_consolidate":
|
|
598
607
|
await memoryV2ConsolidateJob(job, config);
|
|
599
608
|
return;
|
|
609
|
+
case "memory_v3_consolidate":
|
|
610
|
+
await memoryV3ConsolidateJob(job, config);
|
|
611
|
+
return;
|
|
612
|
+
case "memory_v3_index_maintenance":
|
|
613
|
+
await memoryV3IndexMaintenanceJob(job);
|
|
614
|
+
return;
|
|
615
|
+
case "memory_v3_edge_learning":
|
|
616
|
+
// Fast lane: bounded DB work (decay + reinforce + read), no LLM.
|
|
617
|
+
memoryV3EdgeLearningJob(job);
|
|
618
|
+
return;
|
|
600
619
|
case "memory_v2_migrate":
|
|
601
620
|
await memoryV2MigrateJob(job, config);
|
|
602
621
|
return;
|
|
@@ -675,17 +694,28 @@ export const GRAPH_MAINTENANCE_CHECKPOINTS = {
|
|
|
675
694
|
patternScan: "graph_maintenance:pattern_scan:last_run",
|
|
676
695
|
narrative: "graph_maintenance:narrative:last_run",
|
|
677
696
|
memoryV2Consolidate: "memory_v2_consolidate_last_run",
|
|
697
|
+
memoryV3Consolidate: "memory_v3_consolidate_last_run",
|
|
678
698
|
} as const;
|
|
679
699
|
|
|
680
700
|
/**
|
|
681
701
|
* Enqueue periodic graph maintenance jobs.
|
|
682
702
|
*
|
|
683
703
|
* Mutually exclusive between v1 and v2:
|
|
684
|
-
* - v2 active (`memory.v2.enabled` on) → only
|
|
685
|
-
* scheduled.
|
|
704
|
+
* - v2 active (`memory.v2.enabled` on) → only one buffer-drainer is
|
|
705
|
+
* scheduled (see below).
|
|
686
706
|
* - v2 inactive → the four v1 entries (decay, consolidate, pattern_scan,
|
|
687
707
|
* narrative) are scheduled instead.
|
|
688
708
|
*
|
|
709
|
+
* **Buffer-drainer retarget (v2 vs v3).** The `memory/buffer.md` is shared, so
|
|
710
|
+
* exactly one consolidator may own the drain at a time. When
|
|
711
|
+
* `memory.v3.write.enabled` is on, the v3 consolidator (`memory_v3_consolidate`)
|
|
712
|
+
* is scheduled INSTEAD of `memory_v2_consolidate` — same shared buffer +
|
|
713
|
+
* standing-context files, additionally authored into the v3 tree. When the v3
|
|
714
|
+
* write flag is off (default) the v2 consolidator stays the sole drainer,
|
|
715
|
+
* unchanged. The retarget is a clean conditional, fully reversible via the flag.
|
|
716
|
+
* Concept pages stay the shared canonical store, so the v2 router keeps working
|
|
717
|
+
* off pages v3 writes regardless of which consolidator ran.
|
|
718
|
+
*
|
|
689
719
|
* Read/write paths route to v2 when the flag is on, so v1 graph data goes
|
|
690
720
|
* unread; running v1 maintenance alongside v2 is wasted compute and LLM
|
|
691
721
|
* spend. The v1 code path remains live so flipping the flag back to off
|
|
@@ -702,20 +732,29 @@ export function maybeEnqueueGraphMaintenanceJobs(
|
|
|
702
732
|
nowMs = Date.now(),
|
|
703
733
|
): void {
|
|
704
734
|
const v2Active = config.memory.v2.enabled;
|
|
735
|
+
const v3WriteActive = config.memory.v3.write.enabled;
|
|
736
|
+
|
|
737
|
+
// The single buffer-drainer entry for the v2-active branch: v3 when the v3
|
|
738
|
+
// write flag owns the drain, v2 otherwise. Same shared buffer either way.
|
|
739
|
+
const consolidateEntry = v3WriteActive
|
|
740
|
+
? {
|
|
741
|
+
key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV3Consolidate,
|
|
742
|
+
intervalMs: config.memory.v3.write.consolidateIntervalMs,
|
|
743
|
+
jobType: "memory_v3_consolidate" as MemoryJobType,
|
|
744
|
+
}
|
|
745
|
+
: {
|
|
746
|
+
key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV2Consolidate,
|
|
747
|
+
intervalMs:
|
|
748
|
+
config.memory.v2.consolidation_interval_hours * 60 * 60 * 1000,
|
|
749
|
+
jobType: "memory_v2_consolidate" as MemoryJobType,
|
|
750
|
+
};
|
|
705
751
|
|
|
706
752
|
const schedule: Array<{
|
|
707
753
|
key: string;
|
|
708
754
|
intervalMs: number;
|
|
709
755
|
jobType: MemoryJobType;
|
|
710
756
|
}> = v2Active
|
|
711
|
-
? [
|
|
712
|
-
{
|
|
713
|
-
key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV2Consolidate,
|
|
714
|
-
intervalMs:
|
|
715
|
-
config.memory.v2.consolidation_interval_hours * 60 * 60 * 1000,
|
|
716
|
-
jobType: "memory_v2_consolidate",
|
|
717
|
-
},
|
|
718
|
-
]
|
|
757
|
+
? [consolidateEntry]
|
|
719
758
|
: [
|
|
720
759
|
{
|
|
721
760
|
key: GRAPH_MAINTENANCE_CHECKPOINTS.decay,
|
|
@@ -739,11 +778,25 @@ export function maybeEnqueueGraphMaintenanceJobs(
|
|
|
739
778
|
},
|
|
740
779
|
];
|
|
741
780
|
|
|
781
|
+
let enqueuedConsolidate = false;
|
|
742
782
|
for (const { key, intervalMs, jobType } of schedule) {
|
|
743
783
|
const lastRun = parseInt(getMemoryCheckpoint(key) ?? "0", 10);
|
|
744
784
|
if (nowMs - lastRun >= intervalMs) {
|
|
745
785
|
enqueueMemoryJob(jobType, {});
|
|
746
786
|
setMemoryCheckpoint(key, String(nowMs));
|
|
787
|
+
if (jobType === consolidateEntry.jobType) enqueuedConsolidate = true;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
// Size-based trigger: when the shared buffer crosses the configured line
|
|
792
|
+
// count, drain it now rather than waiting out the interval. Retargets to the
|
|
793
|
+
// same consolidator the interval branch above selected.
|
|
794
|
+
const maxLines = config.memory.v2.consolidation_max_buffer_lines;
|
|
795
|
+
if (v2Active && !enqueuedConsolidate && maxLines !== null) {
|
|
796
|
+
const bufferPath = join(getWorkspaceDir(), "memory", "buffer.md");
|
|
797
|
+
if (countBufferLines(bufferPath) >= maxLines) {
|
|
798
|
+
enqueueMemoryJob(consolidateEntry.jobType, {});
|
|
799
|
+
setMemoryCheckpoint(consolidateEntry.key, String(nowMs));
|
|
747
800
|
}
|
|
748
801
|
}
|
|
749
802
|
}
|
|
@@ -58,6 +58,16 @@ interface ClickHouseRow {
|
|
|
58
58
|
response_payload: string;
|
|
59
59
|
created_at: string;
|
|
60
60
|
agent_loop_exit_reason: string;
|
|
61
|
+
/**
|
|
62
|
+
* Mirrors `llm_request_logs.call_site` from the SQLite source. Added
|
|
63
|
+
* to the CH `default.llm_request_logs` table via ALTER TABLE (matching
|
|
64
|
+
* the `agent_loop_exit_reason` precedent — see
|
|
65
|
+
* `memory/concepts/objects/clickhouse-mirror.md`).
|
|
66
|
+
*
|
|
67
|
+
* CH columns are `DEFAULT ''` rather than Nullable, so empty-string
|
|
68
|
+
* means "not set" — `toLogRow` maps that back to NULL on the JS side.
|
|
69
|
+
*/
|
|
70
|
+
call_site: string;
|
|
61
71
|
}
|
|
62
72
|
|
|
63
73
|
/** Injectable fetch override for tests. Defaults to globalThis.fetch. */
|
|
@@ -125,7 +135,8 @@ export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
|
|
|
125
135
|
request_payload,
|
|
126
136
|
response_payload,
|
|
127
137
|
toUnixTimestamp64Milli(created_at) AS created_at,
|
|
128
|
-
agent_loop_exit_reason
|
|
138
|
+
agent_loop_exit_reason,
|
|
139
|
+
call_site
|
|
129
140
|
FROM ${this.tableRef()}
|
|
130
141
|
WHERE assistant_id = {assistant_id:String}
|
|
131
142
|
AND id = {log_id:String}
|
|
@@ -171,6 +182,33 @@ export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
|
|
|
171
182
|
);
|
|
172
183
|
}
|
|
173
184
|
|
|
185
|
+
async getRequestLogsByConversationId(
|
|
186
|
+
conversationId: string,
|
|
187
|
+
): Promise<LogRow[]> {
|
|
188
|
+
const aid = await this.assistantId();
|
|
189
|
+
const sql = `SELECT
|
|
190
|
+
id,
|
|
191
|
+
conversation_id,
|
|
192
|
+
message_id,
|
|
193
|
+
provider,
|
|
194
|
+
request_payload,
|
|
195
|
+
response_payload,
|
|
196
|
+
toUnixTimestamp64Milli(created_at) AS created_at,
|
|
197
|
+
agent_loop_exit_reason,
|
|
198
|
+
call_site
|
|
199
|
+
FROM ${this.tableRef()}
|
|
200
|
+
WHERE assistant_id = {assistant_id:String}
|
|
201
|
+
AND conversation_id = {conversation_id:String}
|
|
202
|
+
ORDER BY created_at ASC, id ASC
|
|
203
|
+
LIMIT 1 BY id
|
|
204
|
+
FORMAT JSONEachRow`;
|
|
205
|
+
const rows = await this.exec(sql, {
|
|
206
|
+
assistant_id: aid,
|
|
207
|
+
conversation_id: conversationId,
|
|
208
|
+
});
|
|
209
|
+
return rows.map((r) => this.toLogRow(r));
|
|
210
|
+
}
|
|
211
|
+
|
|
174
212
|
private async selectByMessageIds(ids: string[]): Promise<LogRow[]> {
|
|
175
213
|
if (ids.length === 0) return [];
|
|
176
214
|
const aid = await this.assistantId();
|
|
@@ -197,7 +235,8 @@ export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
|
|
|
197
235
|
request_payload,
|
|
198
236
|
response_payload,
|
|
199
237
|
toUnixTimestamp64Milli(created_at) AS created_at,
|
|
200
|
-
agent_loop_exit_reason
|
|
238
|
+
agent_loop_exit_reason,
|
|
239
|
+
call_site
|
|
201
240
|
FROM ${this.tableRef()}
|
|
202
241
|
WHERE assistant_id = {assistant_id:String}
|
|
203
242
|
AND message_id IN (${placeholders.join(",")})
|
|
@@ -288,6 +327,7 @@ export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
|
|
|
288
327
|
createdAt: Number(row.created_at),
|
|
289
328
|
agentLoopExitReason:
|
|
290
329
|
row.agent_loop_exit_reason === "" ? null : row.agent_loop_exit_reason,
|
|
330
|
+
callSite: row.call_site === "" ? null : row.call_site,
|
|
291
331
|
};
|
|
292
332
|
}
|
|
293
333
|
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
import type { LlmRequestLogSource } from "./llm-request-log-source.js";
|
|
12
12
|
import {
|
|
13
13
|
getRequestLogById,
|
|
14
|
+
getRequestLogsByConversationId,
|
|
14
15
|
getRequestLogsByMessageId,
|
|
15
16
|
type LogRow,
|
|
16
17
|
} from "./llm-request-log-store.js";
|
|
@@ -23,4 +24,10 @@ export class LocalLlmRequestLogSource implements LlmRequestLogSource {
|
|
|
23
24
|
async getRequestLogsByMessageId(messageId: string): Promise<LogRow[]> {
|
|
24
25
|
return getRequestLogsByMessageId(messageId);
|
|
25
26
|
}
|
|
27
|
+
|
|
28
|
+
async getRequestLogsByConversationId(
|
|
29
|
+
conversationId: string,
|
|
30
|
+
): Promise<LogRow[]> {
|
|
31
|
+
return getRequestLogsByConversationId(conversationId);
|
|
32
|
+
}
|
|
26
33
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pluggable read source for LLM request logs.
|
|
3
3
|
*
|
|
4
|
-
* The Inspector
|
|
5
|
-
* single-log payload route) historically read directly from the local
|
|
4
|
+
* The Inspector views at `GET /v1/messages/:id/llm-context` and
|
|
5
|
+
* `GET /v1/conversations/llm-context` (plus the single-log payload route) historically read directly from the local
|
|
6
6
|
* SQLite `llm_request_logs` table via `llm-request-log-store.ts`. The
|
|
7
7
|
* source-of-truth remains local, but the *read path* is now configurable
|
|
8
8
|
* via `llmRequestLogs.readSource` in workspace config.
|
|
@@ -31,6 +31,13 @@ export interface LlmRequestLogSource {
|
|
|
31
31
|
* INSERT-only against the source-of-truth).
|
|
32
32
|
*/
|
|
33
33
|
getRequestLogsByMessageId(messageId: string): Promise<LogRow[]>;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Fetch every LLM request log associated with the given conversation.
|
|
37
|
+
* This is the conversation-wide inspector read path: linked, unlinked,
|
|
38
|
+
* and orphaned logs are all included because they share conversation_id.
|
|
39
|
+
*/
|
|
40
|
+
getRequestLogsByConversationId(conversationId: string): Promise<LogRow[]>;
|
|
34
41
|
}
|
|
35
42
|
|
|
36
43
|
/**
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { and, desc, eq, gte, inArray, isNull, lte, sql } from "drizzle-orm";
|
|
1
|
+
import { and, asc, desc, eq, gte, inArray, isNull, lte, sql } from "drizzle-orm";
|
|
2
2
|
import { v4 as uuid } from "uuid";
|
|
3
3
|
|
|
4
|
+
import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
4
5
|
import { AssistantError, ProviderError } from "../util/errors.js";
|
|
5
6
|
import {
|
|
6
7
|
getAssistantMessageIdsInTurn,
|
|
@@ -26,6 +27,12 @@ export type LogRow = {
|
|
|
26
27
|
* `AgentLoopExitReason` in `agent/loop.ts`.
|
|
27
28
|
*/
|
|
28
29
|
agentLoopExitReason: string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Logical call site that produced this row — `mainAgent`,
|
|
32
|
+
* `compactionAgent`, etc. NULL on pre-migration-264 rows (no backfill).
|
|
33
|
+
* In practice values come from `LLMCallSite` (`config/schemas/llm.ts`).
|
|
34
|
+
*/
|
|
35
|
+
callSite: string | null;
|
|
29
36
|
};
|
|
30
37
|
|
|
31
38
|
/**
|
|
@@ -73,6 +80,7 @@ export function recordRequestLog(
|
|
|
73
80
|
responsePayload: string,
|
|
74
81
|
messageId?: string,
|
|
75
82
|
provider?: string,
|
|
83
|
+
callSite?: LLMCallSite,
|
|
76
84
|
): string {
|
|
77
85
|
const db = getDb();
|
|
78
86
|
const id = uuid();
|
|
@@ -88,6 +96,10 @@ export function recordRequestLog(
|
|
|
88
96
|
// Stamped later via setAgentLoopExitReasonOnLatestLog, once the
|
|
89
97
|
// agent loop body actually exits. Intermediate rows stay NULL.
|
|
90
98
|
agentLoopExitReason: null,
|
|
99
|
+
// Logical call site (`mainAgent`, `compactionAgent`, …). NULL when
|
|
100
|
+
// a caller hasn't been updated yet — preserves backward compat
|
|
101
|
+
// while we plumb call sites through one site at a time.
|
|
102
|
+
callSite: callSite ?? null,
|
|
91
103
|
})
|
|
92
104
|
.run();
|
|
93
105
|
return id;
|
|
@@ -182,6 +194,7 @@ function selectLogsByMessageIds(messageIds: string[]): LogRow[] {
|
|
|
182
194
|
responsePayload: llmRequestLogs.responsePayload,
|
|
183
195
|
createdAt: llmRequestLogs.createdAt,
|
|
184
196
|
agentLoopExitReason: llmRequestLogs.agentLoopExitReason,
|
|
197
|
+
callSite: llmRequestLogs.callSite,
|
|
185
198
|
})
|
|
186
199
|
.from(llmRequestLogs)
|
|
187
200
|
.where(inArray(llmRequestLogs.messageId, messageIds))
|
|
@@ -189,6 +202,32 @@ function selectLogsByMessageIds(messageIds: string[]): LogRow[] {
|
|
|
189
202
|
.all();
|
|
190
203
|
}
|
|
191
204
|
|
|
205
|
+
/**
|
|
206
|
+
* Query every LLM request log recorded for a conversation, ordered by
|
|
207
|
+
* creation time. Conversation-scoped inspector views intentionally do
|
|
208
|
+
* not apply turn recovery: the `conversation_id` column already includes
|
|
209
|
+
* linked, unlinked, and orphaned rows for the full conversation.
|
|
210
|
+
*/
|
|
211
|
+
export function getRequestLogsByConversationId(conversationId: string): LogRow[] {
|
|
212
|
+
const db = getDb();
|
|
213
|
+
return db
|
|
214
|
+
.select({
|
|
215
|
+
id: llmRequestLogs.id,
|
|
216
|
+
conversationId: llmRequestLogs.conversationId,
|
|
217
|
+
messageId: llmRequestLogs.messageId,
|
|
218
|
+
provider: llmRequestLogs.provider,
|
|
219
|
+
requestPayload: llmRequestLogs.requestPayload,
|
|
220
|
+
responsePayload: llmRequestLogs.responsePayload,
|
|
221
|
+
createdAt: llmRequestLogs.createdAt,
|
|
222
|
+
agentLoopExitReason: llmRequestLogs.agentLoopExitReason,
|
|
223
|
+
callSite: llmRequestLogs.callSite,
|
|
224
|
+
})
|
|
225
|
+
.from(llmRequestLogs)
|
|
226
|
+
.where(eq(llmRequestLogs.conversationId, conversationId))
|
|
227
|
+
.orderBy(asc(llmRequestLogs.createdAt), asc(llmRequestLogs.id))
|
|
228
|
+
.all();
|
|
229
|
+
}
|
|
230
|
+
|
|
192
231
|
/**
|
|
193
232
|
* Find orphaned logs — logs whose `message_id` references a message that no
|
|
194
233
|
* longer exists in the DB. These are left behind when intermediate assistant
|
|
@@ -214,6 +253,7 @@ function selectOrphanedLogsInRange(
|
|
|
214
253
|
responsePayload: llmRequestLogs.responsePayload,
|
|
215
254
|
createdAt: llmRequestLogs.createdAt,
|
|
216
255
|
agentLoopExitReason: llmRequestLogs.agentLoopExitReason,
|
|
256
|
+
callSite: llmRequestLogs.callSite,
|
|
217
257
|
})
|
|
218
258
|
.from(llmRequestLogs)
|
|
219
259
|
.leftJoin(messages, eq(llmRequestLogs.messageId, messages.id))
|
|
@@ -255,6 +295,7 @@ function selectUnlinkedLogsInRange(
|
|
|
255
295
|
responsePayload: llmRequestLogs.responsePayload,
|
|
256
296
|
createdAt: llmRequestLogs.createdAt,
|
|
257
297
|
agentLoopExitReason: llmRequestLogs.agentLoopExitReason,
|
|
298
|
+
callSite: llmRequestLogs.callSite,
|
|
258
299
|
})
|
|
259
300
|
.from(llmRequestLogs)
|
|
260
301
|
.where(
|
|
@@ -282,6 +323,7 @@ export function getRequestLogById(logId: string): LogRow | null {
|
|
|
282
323
|
responsePayload: llmRequestLogs.responsePayload,
|
|
283
324
|
createdAt: llmRequestLogs.createdAt,
|
|
284
325
|
agentLoopExitReason: llmRequestLogs.agentLoopExitReason,
|
|
326
|
+
callSite: llmRequestLogs.callSite,
|
|
285
327
|
})
|
|
286
328
|
.from(llmRequestLogs)
|
|
287
329
|
.where(eq(llmRequestLogs.id, logId))
|
|
@@ -57,6 +57,7 @@ export function recordUsageEvent(
|
|
|
57
57
|
outputTokens: event.outputTokens,
|
|
58
58
|
cacheCreationInputTokens: event.cacheCreationInputTokens,
|
|
59
59
|
cacheReadInputTokens: event.cacheReadInputTokens,
|
|
60
|
+
rawUsage: event.rawUsage === null ? null : JSON.stringify(event.rawUsage),
|
|
60
61
|
estimatedCostUsd: event.estimatedCostUsd,
|
|
61
62
|
pricingStatus: event.pricingStatus,
|
|
62
63
|
llmCallCount: event.llmCallCount ?? 1,
|
|
@@ -87,6 +88,7 @@ function rowToUsageEvent(row: {
|
|
|
87
88
|
outputTokens: number;
|
|
88
89
|
cacheCreationInputTokens: number | null;
|
|
89
90
|
cacheReadInputTokens: number | null;
|
|
91
|
+
rawUsage: string | null;
|
|
90
92
|
estimatedCostUsd: number | null;
|
|
91
93
|
pricingStatus: string;
|
|
92
94
|
}): UsageEvent {
|
|
@@ -107,11 +109,32 @@ function rowToUsageEvent(row: {
|
|
|
107
109
|
outputTokens: row.outputTokens,
|
|
108
110
|
cacheCreationInputTokens: row.cacheCreationInputTokens,
|
|
109
111
|
cacheReadInputTokens: row.cacheReadInputTokens,
|
|
112
|
+
rawUsage: parseRawUsage(row.rawUsage),
|
|
110
113
|
estimatedCostUsd: row.estimatedCostUsd,
|
|
111
114
|
pricingStatus: row.pricingStatus as "priced" | "unpriced",
|
|
112
115
|
};
|
|
113
116
|
}
|
|
114
117
|
|
|
118
|
+
/**
|
|
119
|
+
* Parse the JSON-serialized provider usage payload stored in `raw_usage`.
|
|
120
|
+
* Returns `null` for missing or malformed values; malformed JSON is logged
|
|
121
|
+
* and discarded rather than failing the read, because callers (admin
|
|
122
|
+
* dashboards, telemetry forwarders) treat `raw_usage` as opaque diagnostic
|
|
123
|
+
* data and shouldn't be blocked by a single corrupt row.
|
|
124
|
+
*/
|
|
125
|
+
function parseRawUsage(value: string | null): Record<string, unknown> | null {
|
|
126
|
+
if (value === null) return null;
|
|
127
|
+
try {
|
|
128
|
+
const parsed = JSON.parse(value);
|
|
129
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
130
|
+
return parsed as Record<string, unknown>;
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
} catch {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
115
138
|
export function listUsageEvents(options?: { limit?: number }): UsageEvent[] {
|
|
116
139
|
const db = getDb();
|
|
117
140
|
const rows = db
|
|
@@ -187,6 +210,7 @@ export function queryUnreportedUsageEvents(
|
|
|
187
210
|
outputTokens: llmUsageEvents.outputTokens,
|
|
188
211
|
cacheCreationInputTokens: llmUsageEvents.cacheCreationInputTokens,
|
|
189
212
|
cacheReadInputTokens: llmUsageEvents.cacheReadInputTokens,
|
|
213
|
+
rawUsage: llmUsageEvents.rawUsage,
|
|
190
214
|
estimatedCostUsd: llmUsageEvents.estimatedCostUsd,
|
|
191
215
|
pricingStatus: llmUsageEvents.pricingStatus,
|
|
192
216
|
conversationType: conversations.conversationType,
|
|
@@ -5,9 +5,37 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export const MEMORY_RETROSPECTIVE_SOURCE = "memory-retrospective";
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Sentinel value for the `source` column of fork-based memory-retrospective
|
|
10
|
+
* conversations (the new `memory-retrospective-fork` flag path). Distinct
|
|
11
|
+
* from MEMORY_RETROSPECTIVE_SOURCE so dedup can scope its message scan to the
|
|
12
|
+
* post-fork tail — fork-kind rows carry the full source prefix and would
|
|
13
|
+
* otherwise pollute prior-remember dedup with source-inline `remember` calls.
|
|
14
|
+
*/
|
|
15
|
+
export const MEMORY_RETROSPECTIVE_FORK_SOURCE = "memory-retrospective-fork";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Union of both retrospective source sentinels. Use when looking up the most
|
|
19
|
+
* recent retrospective for a source conversation (either kind is valid) or
|
|
20
|
+
* when filtering retrospective bg conversations out of recursion queries.
|
|
21
|
+
*/
|
|
22
|
+
export const MEMORY_RETROSPECTIVE_SOURCES: readonly string[] = [
|
|
23
|
+
MEMORY_RETROSPECTIVE_SOURCE,
|
|
24
|
+
MEMORY_RETROSPECTIVE_FORK_SOURCE,
|
|
25
|
+
];
|
|
26
|
+
|
|
8
27
|
/**
|
|
9
28
|
* Dedicated `group_id` value for memory-retrospective background
|
|
10
29
|
* conversations. Placed under `system:background` alongside auto-analysis,
|
|
11
30
|
* heartbeat, and filing conversations.
|
|
12
31
|
*/
|
|
13
32
|
export const MEMORY_RETROSPECTIVE_GROUP_ID = "system:background";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* `metadata.kind` value stamped on the user-role instruction message that
|
|
36
|
+
* fork-based retrospectives append to the forked conversation. Used purely
|
|
37
|
+
* for observability — operators inspecting a retrospective fork's history
|
|
38
|
+
* can tell the user-role message apart from a real user turn.
|
|
39
|
+
*/
|
|
40
|
+
export const MEMORY_RETROSPECTIVE_INSTRUCTION_KIND =
|
|
41
|
+
"memory_retrospective_instruction";
|
|
@@ -19,8 +19,11 @@ import {
|
|
|
19
19
|
} from "../runtime/actor-trust-resolver.js";
|
|
20
20
|
import { getLogger } from "../util/logger.js";
|
|
21
21
|
import { getConversationSource } from "./conversation-crud.js";
|
|
22
|
-
import {
|
|
23
|
-
|
|
22
|
+
import {
|
|
23
|
+
isMemoryEnabled,
|
|
24
|
+
upsertMemoryRetrospectiveJob,
|
|
25
|
+
} from "./jobs-store.js";
|
|
26
|
+
import { MEMORY_RETROSPECTIVE_SOURCES } from "./memory-retrospective-constants.js";
|
|
24
27
|
|
|
25
28
|
const log = getLogger("memory-retrospective-enqueue");
|
|
26
29
|
|
|
@@ -38,6 +41,10 @@ export function enqueueMemoryRetrospectiveIfEnabled(args: {
|
|
|
38
41
|
}): void {
|
|
39
42
|
const { conversationId, trigger } = args;
|
|
40
43
|
|
|
44
|
+
if (!isMemoryEnabled()) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
41
48
|
if (isMemoryRetrospectiveConversation(conversationId)) {
|
|
42
49
|
log.debug(
|
|
43
50
|
{ conversationId, trigger },
|
|
@@ -67,7 +74,8 @@ export function enqueueMemoryRetrospectiveIfEnabled(args: {
|
|
|
67
74
|
export function isMemoryRetrospectiveConversation(
|
|
68
75
|
conversationId: string,
|
|
69
76
|
): boolean {
|
|
70
|
-
|
|
77
|
+
const source = getConversationSource(conversationId);
|
|
78
|
+
return source !== null && MEMORY_RETROSPECTIVE_SOURCES.includes(source);
|
|
71
79
|
}
|
|
72
80
|
|
|
73
81
|
/**
|