@vellumai/assistant 0.10.12 → 0.11.0-staging.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/ARCHITECTURE.md +4 -5
- package/README.md +1 -1
- package/docs/architecture/memory.md +60 -23
- package/docs/error-handling.md +3 -3
- package/docs/guardian-request-flow.md +112 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/openapi.yaml +264 -14
- package/package.json +2 -2
- package/src/__tests__/acp-session.test.ts +3 -3
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
- package/src/__tests__/anthropic-provider.test.ts +40 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +33 -2
- package/src/__tests__/app-conversation-ids.test.ts +204 -0
- package/src/__tests__/approval-cascade.test.ts +5 -5
- package/src/__tests__/approval-routes-http.test.ts +3 -3
- package/src/__tests__/ask-question-resolver.test.ts +207 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
- package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
- package/src/__tests__/assistant-event-hub.test.ts +13 -11
- package/src/__tests__/assistant-event.test.ts +12 -9
- package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -58
- package/src/__tests__/assistant-stream-state.test.ts +17 -7
- package/src/__tests__/avatar-identity-sync.test.ts +3 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +134 -18
- package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
- package/src/__tests__/channel-approvals.test.ts +0 -27
- package/src/__tests__/channel-guardian.test.ts +85 -512
- package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
- package/src/__tests__/channel-retry-sweep.test.ts +88 -1
- package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
- package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
- package/src/__tests__/config-model-image-provider.test.ts +20 -0
- package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
- package/src/__tests__/config-schema.test.ts +14 -2
- package/src/__tests__/config-set-platform-guard.test.ts +11 -12
- package/src/__tests__/config-sounds-sync.test.ts +4 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
- package/src/__tests__/context-search-memory-source.test.ts +1 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
- package/src/__tests__/context-token-estimator.test.ts +54 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
- package/src/__tests__/conversation-agent-loop.test.ts +39 -30
- package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
- package/src/__tests__/conversation-evictor.test.ts +49 -0
- package/src/__tests__/conversation-fork-crud.test.ts +1 -1
- package/src/__tests__/conversation-group-tools.test.ts +279 -0
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-lineage.test.ts +235 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
- package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
- package/src/__tests__/conversation-queue.test.ts +81 -81
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
- package/src/__tests__/conversation-slash-queue.test.ts +11 -11
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +2 -2
- package/src/__tests__/conversation-summarize-route.test.ts +9 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
- package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
- package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
- package/src/__tests__/conversation-sync-tags.test.ts +5 -5
- package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
- package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/daemon-assistant-events.test.ts +14 -15
- package/src/__tests__/db-test-helpers.ts +13 -27
- package/src/__tests__/disk-pressure-routes.test.ts +12 -3
- package/src/__tests__/document-tool-security.test.ts +95 -0
- package/src/__tests__/drain-kick-guard.test.ts +232 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
- package/src/__tests__/emit-event-signal.test.ts +5 -6
- package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
- package/src/__tests__/events-tail-route.test.ts +6 -4
- package/src/__tests__/feature-flag-test-helpers.ts +10 -20
- package/src/__tests__/file-edit-tool.test.ts +24 -4
- package/src/__tests__/file-list-tool.test.ts +2 -1
- package/src/__tests__/file-read-tool.test.ts +62 -10
- package/src/__tests__/file-write-tool.test.ts +24 -5
- package/src/__tests__/followup-tools.test.ts +58 -0
- package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-question-mode.test.ts +42 -3
- package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
- package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
- package/src/__tests__/host-browser-proxy.test.ts +1 -1
- package/src/__tests__/host-file-edit-tool.test.ts +3 -3
- package/src/__tests__/host-file-read-tool.test.ts +2 -2
- package/src/__tests__/host-file-write-tool.test.ts +7 -3
- package/src/__tests__/host-shell-tool.test.ts +17 -5
- package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +65 -8
- package/src/__tests__/injection-block.test.ts +4 -4
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
- package/src/__tests__/injector-v3-suppression.test.ts +6 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
- package/src/__tests__/list-messages-page-latest.test.ts +2 -2
- package/src/__tests__/llm-usage-store.test.ts +67 -4
- package/src/__tests__/log-redact.test.ts +18 -0
- package/src/__tests__/managed-profile-guard.test.ts +27 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +62 -11
- package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
- package/src/__tests__/notification-decision-strategy.test.ts +115 -11
- package/src/__tests__/notification-deep-link.test.ts +12 -12
- package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +315 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
- package/src/__tests__/persistence-layering-guard.test.ts +2 -2
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
- package/src/__tests__/platform-callback-registration.test.ts +10 -10
- package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
- package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
- package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
- package/src/__tests__/require-fresh-approval.test.ts +38 -38
- package/src/__tests__/resolve-app-id.test.ts +32 -0
- package/src/__tests__/run-due-schedules.test.ts +72 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +44 -5
- package/src/__tests__/schedule-store.test.ts +3 -3
- package/src/__tests__/schedule-tools.test.ts +176 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
- package/src/__tests__/secret-response-routing.test.ts +3 -3
- package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
- package/src/__tests__/secret-scanner.test.ts +36 -0
- package/src/__tests__/send-endpoint-busy.test.ts +7 -7
- package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
- package/src/__tests__/starter-task-flow.test.ts +26 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-disposal.test.ts +40 -11
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
- package/src/__tests__/subagent-manager-notify.test.ts +73 -14
- package/src/__tests__/subagent-notify-parent.test.ts +48 -4
- package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
- package/src/__tests__/subagent-tools.test.ts +64 -0
- package/src/__tests__/sync-message-contract.test.ts +3 -3
- package/src/__tests__/terminal-tools.test.ts +12 -3
- package/src/__tests__/test-preload.ts +9 -0
- package/src/__tests__/tool-approval-handler.test.ts +587 -43
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
- package/src/__tests__/tool-executor.test.ts +116 -0
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-start-timestamp.test.ts +4 -4
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
- package/src/__tests__/ui-work-result-surface.test.ts +3 -3
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
- package/src/__tests__/voice-session-bridge.test.ts +44 -44
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
- package/src/__tests__/workspace-policy.test.ts +482 -2
- package/src/acp/__tests__/client-handler.test.ts +3 -3
- package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
- package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
- package/src/acp/client-handler.ts +3 -3
- package/src/acp/session-manager.ts +8 -8
- package/src/api/events/subagent-event.ts +2 -2
- package/src/api/responses/memory-v2-activation-log.ts +2 -2
- package/src/api/responses/subagent-detail.ts +13 -0
- package/src/approvals/AGENTS.md +2 -0
- package/src/approvals/guardian-request-resolvers.ts +118 -24
- package/src/apps/app-store.ts +95 -4
- package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +229 -7
- package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
- package/src/calls/call-controller.ts +27 -27
- package/src/calls/call-conversation-messages.ts +58 -18
- package/src/calls/voice-control-protocol.ts +56 -0
- package/src/calls/voice-session-bridge.ts +178 -65
- package/src/calls/voice-triage-escalate.ts +2 -3
- package/src/channels/config.ts +8 -0
- package/src/channels/types.ts +1 -0
- package/src/cli/commands/config.ts +49 -13
- package/src/cli/commands/memory/index.help.ts +4 -2
- package/src/cli/commands/memory/memory-retrospective.ts +5 -0
- package/src/cli/commands/webhooks.help.ts +9 -4
- package/src/cli/lib/bundled-marketplace.json +12 -0
- package/src/cli.ts +2 -109
- package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
- package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
- package/src/config/assistant-feature-flags.ts +1 -1
- package/src/config/bundled-skills/conversation-groups/SKILL.md +29 -0
- package/src/config/bundled-skills/conversation-groups/TOOLS.json +58 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-create.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-list.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/move-to-group.ts +12 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
- package/src/config/bundled-skills/schedule/SKILL.md +2 -0
- package/src/config/feature-flag-cache.ts +6 -16
- package/src/config/feature-flag-registry.json +14 -38
- package/src/config/loader.ts +7 -1
- package/src/config/memory-tier.ts +15 -10
- package/src/config/memory-v3-gate.test.ts +278 -1
- package/src/config/memory-v3-gate.ts +88 -26
- package/src/config/raw-config-utils.ts +1 -1
- package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/live-voice.ts +33 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrospective.ts +13 -0
- package/src/config/schemas/memory-substrate.ts +183 -0
- package/src/config/schemas/memory-v2.ts +3 -2
- package/src/config/schemas/memory-v3.ts +11 -4
- package/src/config/schemas/memory.ts +35 -1
- package/src/config/schemas/services.ts +10 -2
- package/src/config/substrate-twin-shadowing.ts +195 -0
- package/src/config/webhook-routing.ts +67 -0
- package/src/context/compactor.ts +10 -3
- package/src/context/token-estimator.ts +21 -0
- package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
- package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
- package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
- package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
- package/src/daemon/channel-ui-capability.ts +70 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
- package/src/daemon/conversation-agent-loop.ts +12 -5
- package/src/daemon/conversation-evictor.ts +26 -4
- package/src/daemon/conversation-launch.ts +11 -14
- package/src/daemon/conversation-lineage.ts +76 -0
- package/src/daemon/conversation-messaging.ts +14 -14
- package/src/daemon/conversation-notifiers.ts +2 -2
- package/src/daemon/conversation-process.ts +133 -21
- package/src/daemon/conversation-queue-manager.ts +7 -7
- package/src/daemon/conversation-runtime-assembly.ts +16 -0
- package/src/daemon/conversation-store.ts +11 -3
- package/src/daemon/conversation-surfaces.ts +8 -14
- package/src/daemon/conversation-tool-setup.ts +13 -7
- package/src/daemon/conversation-usage.ts +12 -11
- package/src/daemon/conversation.ts +38 -15
- package/src/daemon/disk-pressure-guard.ts +5 -12
- package/src/daemon/embedding-reconcile.ts +14 -9
- package/src/daemon/handlers/config-channels.ts +40 -134
- package/src/daemon/handlers/config-model.ts +15 -7
- package/src/daemon/handlers/conversations.ts +4 -2
- package/src/daemon/handlers/shared.ts +29 -0
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/lifecycle.ts +13 -0
- package/src/daemon/message-protocol.ts +8 -144
- package/src/daemon/message-types/computer-use.ts +0 -12
- package/src/daemon/message-types/conversations.ts +9 -345
- package/src/daemon/message-types/host-app-control.ts +0 -9
- package/src/daemon/message-types/host-browser.ts +0 -7
- package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
- package/src/daemon/message-types/messages.ts +0 -48
- package/src/daemon/message-types/notifications.ts +0 -7
- package/src/daemon/message-types/skills.ts +0 -5
- package/src/daemon/message-types/surfaces.ts +0 -9
- package/src/daemon/message-types/sync.ts +0 -2
- package/src/daemon/process-message.ts +5 -5
- package/src/daemon/skill-memory-refresh.ts +5 -5
- package/src/daemon/tool-side-effects.ts +32 -16
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +4 -4
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
- package/src/heartbeat/heartbeat-run-store.ts +81 -4
- package/src/heartbeat/heartbeat-service.ts +32 -1
- package/src/home/__tests__/feed-writer.test.ts +7 -7
- package/src/home/__tests__/home-content-refresh.test.ts +3 -0
- package/src/home/__tests__/suggested-prompts.test.ts +1 -0
- package/src/home/feed-writer.ts +6 -13
- package/src/home/home-content-refresh.ts +6 -9
- package/src/home/relationship-state-writer.ts +5 -12
- package/src/home/suggested-prompts-cache.ts +6 -19
- package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
- package/src/ipc/events-publish-client.ts +44 -0
- package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
- package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
- package/src/ipc/routes/events-ipc-routes.ts +11 -31
- package/src/live-voice/__tests__/front-decision.test.ts +4 -176
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
- package/src/live-voice/__tests__/live-voice-continuation-fork-hydration.test.ts +286 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
- package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1154 -636
- package/src/live-voice/front-decision.ts +5 -155
- package/src/live-voice/live-voice-metrics.ts +4 -1
- package/src/live-voice/live-voice-session.ts +1288 -439
- package/src/live-voice/progress-phrases.ts +17 -0
- package/src/live-voice/protocol.ts +15 -0
- package/src/media/app-icon-generator.ts +15 -8
- package/src/media/avatar-router.ts +9 -5
- package/src/media/image-credentials.ts +42 -10
- package/src/media/image-service.ts +1 -13
- package/src/media/types.ts +26 -3
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/__tests__/broadcaster.test.ts +95 -0
- package/src/notifications/adapters/macos.ts +3 -3
- package/src/notifications/broadcaster.ts +57 -0
- package/src/notifications/copy-composer.ts +0 -15
- package/src/notifications/decision-engine.ts +21 -22
- package/src/notifications/guardian-question-mode.ts +57 -2
- package/src/notifications/home-feed-side-effect.ts +4 -0
- package/src/notifications/signal.ts +6 -4
- package/src/notifications/trusted-contact-payloads.ts +3 -4
- package/src/notifications/vellum-card-affinity.ts +39 -0
- package/src/oauth/AGENTS.md +1 -1
- package/src/permissions/channel-permission-query.test.ts +69 -0
- package/src/permissions/channel-permission-query.ts +73 -1
- package/src/permissions/checker.test.ts +298 -15
- package/src/permissions/checker.ts +102 -36
- package/src/permissions/confirmation-guardian-request.test.ts +2 -2
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/gateway-threshold-reader.test.ts +224 -17
- package/src/permissions/gateway-threshold-reader.ts +82 -10
- package/src/permissions/ipc-risk-types.ts +8 -0
- package/src/permissions/prompter.ts +5 -5
- package/src/permissions/question-guardian-request.test.ts +222 -0
- package/src/permissions/question-guardian-request.ts +179 -0
- package/src/permissions/question-prompter.test.ts +8 -8
- package/src/permissions/question-prompter.ts +18 -0
- package/src/permissions/secret-prompter.ts +2 -4
- package/src/permissions/workspace-policy.ts +269 -34
- package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
- package/src/persistence/__tests__/message-content-file.test.ts +58 -3
- package/src/persistence/conversation-crud.ts +93 -0
- package/src/persistence/conversation-key-store.ts +63 -0
- package/src/persistence/conversation-parent.ts +27 -0
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-singleton.ts +14 -27
- package/src/persistence/delivery-crud.ts +45 -0
- package/src/persistence/embeddings/embedding-backend.ts +2 -1
- package/src/persistence/embeddings/embedding-identity.ts +7 -3
- package/src/persistence/job-utils.ts +32 -27
- package/src/persistence/jobs-store.ts +92 -3
- package/src/persistence/lifecycle-quiesce.ts +80 -0
- package/src/persistence/llm-usage-store.ts +45 -8
- package/src/persistence/message-content-file.ts +4 -4
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
- package/src/persistence/migrations/354-backfill-app-conversation-lineage.ts +41 -0
- package/src/persistence/schema/infrastructure.ts +11 -0
- package/src/persistence/steps.ts +9 -1
- package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
- package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
- package/src/plugin-api/conversation-turn.ts +4 -4
- package/src/plugin-api/event-hub-facade.ts +15 -6
- package/src/plugin-api/index.ts +10 -4
- package/src/plugin-api/publish-event.ts +36 -0
- package/src/plugins/AGENTS.md +2 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/index.ts +9 -13
- package/src/plugins/defaults/memory/AGENTS.md +775 -0
- package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
- package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
- package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
- package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
- package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
- package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
- package/src/plugins/defaults/memory/graph/store.ts +1 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
- package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
- package/src/plugins/defaults/memory/indexer.ts +146 -89
- package/src/plugins/defaults/memory/injectors.ts +86 -41
- package/src/plugins/defaults/memory/job-handlers.ts +130 -39
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
- package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
- package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
- package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
- package/src/plugins/defaults/memory/startup.ts +58 -21
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
- package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
- package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
- package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
- package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
- package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
- package/src/plugins/defaults/memory/tools.test.ts +1 -1
- package/src/plugins/defaults/memory/tools.ts +1 -1
- package/src/plugins/defaults/memory/v1/README.md +5 -0
- package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
- package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
- package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
- package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
- package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
- package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
- package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
- package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
- package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
- package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
- package/src/plugins/defaults/memory/v2/activation.ts +30 -163
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
- package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/injection.ts +36 -26
- package/src/plugins/defaults/memory/v2/migration.ts +2 -2
- package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
- package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
- package/src/plugins/defaults/memory/v2/router.ts +38 -15
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
- package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
- package/src/plugins/defaults/memory/v3/card.ts +25 -9
- package/src/plugins/defaults/memory/v3/edge.ts +52 -18
- package/src/plugins/defaults/memory/v3/gate.ts +4 -4
- package/src/plugins/defaults/memory/v3/injector.ts +10 -3
- package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
- package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
- package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
- package/src/plugins/defaults/memory/v3/prune.ts +40 -16
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
- package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
- package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
- package/src/plugins/defaults/memory/v3/types.ts +4 -1
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
- package/src/plugins/defaults/memory/validation.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -1
- package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
- package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
- package/src/plugins/types.ts +2 -2
- package/src/prompts/sections.ts +4 -16
- package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
- package/src/providers/anthropic/client.ts +15 -6
- package/src/providers/content-block-schema.ts +26 -0
- package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +30 -14
- package/src/providers/model-catalog.ts +77 -0
- package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
- package/src/providers/openai/chat-completions-provider.ts +65 -17
- package/src/providers/openai/input-audio.ts +76 -0
- package/src/providers/openrouter/client.ts +0 -2
- package/src/providers/platform-proxy/constants.ts +4 -0
- package/src/providers/poolside/client.ts +42 -0
- package/src/providers/registry.ts +40 -8
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +39 -1
- package/src/providers/vercel-ai-gateway/client.ts +0 -2
- package/src/runtime/AGENTS.md +7 -5
- package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
- package/src/runtime/__tests__/question-resolution.test.ts +111 -0
- package/src/runtime/access-request-helper.ts +7 -15
- package/src/runtime/assistant-event-hub.ts +43 -31
- package/src/runtime/assistant-event-publish-options.ts +31 -0
- package/src/runtime/assistant-event.ts +19 -30
- package/src/runtime/assistant-stream-state.ts +4 -4
- package/src/runtime/channel-approvals.ts +0 -25
- package/src/runtime/channel-readiness-service.ts +99 -40
- package/src/runtime/channel-retry-sweep.ts +38 -15
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
- package/src/runtime/guardian-reply-router.ts +108 -0
- package/src/runtime/http-server.ts +8 -0
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/process-role.ts +42 -0
- package/src/runtime/question-request-guardian-bridge.ts +184 -0
- package/src/runtime/question-resolution.ts +153 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/subagents-routes.test.ts +250 -0
- package/src/runtime/routes/__tests__/webhook-routes.test.ts +201 -0
- package/src/runtime/routes/acp-routes.ts +2 -2
- package/src/runtime/routes/bookmark-routes.ts +3 -15
- package/src/runtime/routes/canned-message-complete.ts +2 -2
- package/src/runtime/routes/consolidation-routes.ts +8 -2
- package/src/runtime/routes/conversation-list-routes.ts +3 -19
- package/src/runtime/routes/conversation-management-routes.ts +1 -5
- package/src/runtime/routes/conversation-query-routes.ts +52 -8
- package/src/runtime/routes/conversation-routes.ts +36 -22
- package/src/runtime/routes/credential-request-routes.ts +0 -1
- package/src/runtime/routes/filing-routes.ts +7 -7
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
- package/src/runtime/routes/image-generation-routes.ts +12 -9
- package/src/runtime/routes/inbound-message-handler.ts +17 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
- package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
- package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/lifecycle-routes.ts +199 -0
- package/src/runtime/routes/platform-routes.ts +3 -8
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
- package/src/runtime/routes/question-routes.ts +34 -87
- package/src/runtime/routes/secret-routes.ts +11 -1
- package/src/runtime/routes/settings-routes.ts +8 -18
- package/src/runtime/routes/subagents-routes.ts +35 -8
- package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
- package/src/runtime/routes/webhook-routes.ts +89 -30
- package/src/runtime/routes/workspace-routes.test.ts +7 -4
- package/src/runtime/slack-reply-session.test.ts +12 -12
- package/src/runtime/slack-reply-session.ts +17 -17
- package/src/runtime/sync/sync-publisher.test.ts +7 -5
- package/src/runtime/tool-grant-request-helper.ts +4 -0
- package/src/schedule/schedule-store.ts +70 -0
- package/src/schedule/scheduler.ts +27 -0
- package/src/security/AGENTS.md +1 -1
- package/src/security/credential-key.ts +17 -0
- package/src/security/secret-ingress.ts +14 -105
- package/src/security/secret-patterns.ts +8 -139
- package/src/security/secret-scanner.ts +8 -3
- package/src/security/store-path-override.ts +6 -16
- package/src/sequence/store.ts +8 -0
- package/src/signals/emit-event.ts +5 -10
- package/src/signals/event-stream.ts +20 -10
- package/src/subagent/manager.ts +76 -25
- package/src/subagent/notify.ts +8 -0
- package/src/subagent/types.ts +13 -3
- package/src/telegram/__tests__/webhook-health.test.ts +442 -0
- package/src/telegram/webhook-health.ts +478 -0
- package/src/telemetry/AGENTS.md +6 -0
- package/src/telemetry/memory-corpus-size.test.ts +129 -0
- package/src/telemetry/memory-corpus-size.ts +184 -0
- package/src/telemetry/memory-tier-reporter.test.ts +67 -2
- package/src/telemetry/memory-tier-reporter.ts +30 -3
- package/src/tools/__tests__/conversation-group-tool-input-schemas.test.ts +61 -0
- package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
- package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
- package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
- package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
- package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
- package/src/tools/acp/abort.ts +21 -1
- package/src/tools/acp/context.ts +5 -5
- package/src/tools/acp/spawn.test.ts +15 -5
- package/src/tools/acp/spawn.ts +26 -3
- package/src/tools/acp/status.ts +20 -1
- package/src/tools/acp/steer.test.ts +20 -0
- package/src/tools/acp/steer.ts +23 -2
- package/src/tools/apps/resolve-app-id.ts +15 -3
- package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
- package/src/tools/ask-question/ask-question-tool.ts +68 -92
- package/src/tools/browser/browser-screencast.ts +6 -6
- package/src/tools/calls/call-end.ts +24 -3
- package/src/tools/calls/call-start.ts +35 -11
- package/src/tools/calls/call-status.ts +20 -1
- package/src/tools/conversation-groups/group_create.ts +63 -0
- package/src/tools/conversation-groups/group_list.ts +20 -0
- package/src/tools/conversation-groups/group_shared.ts +52 -0
- package/src/tools/conversation-groups/move_to_group.ts +106 -0
- package/src/tools/document/document-comment-tool.test.ts +49 -0
- package/src/tools/document/document-comment-tool.ts +45 -6
- package/src/tools/document/document-tool.ts +142 -24
- package/src/tools/executor.ts +27 -13
- package/src/tools/filesystem/edit.ts +62 -60
- package/src/tools/filesystem/list.ts +36 -29
- package/src/tools/filesystem/read.ts +56 -39
- package/src/tools/filesystem/write.ts +44 -38
- package/src/tools/followups/followup_create.ts +41 -12
- package/src/tools/followups/followup_list.ts +34 -6
- package/src/tools/followups/followup_resolve.ts +26 -4
- package/src/tools/host-filesystem/edit.ts +50 -60
- package/src/tools/host-filesystem/read.ts +45 -39
- package/src/tools/host-filesystem/write.ts +31 -36
- package/src/tools/host-terminal/host-shell.ts +76 -62
- package/src/tools/policy-context.ts +27 -10
- package/src/tools/schedule/create.ts +76 -33
- package/src/tools/schedule/delete.ts +21 -2
- package/src/tools/schedule/list.ts +25 -3
- package/src/tools/schedule/update.ts +105 -48
- package/src/tools/shared/filesystem/path-policy.ts +246 -40
- package/src/tools/shared/zod-tool-schema.ts +117 -0
- package/src/tools/subagent/abort.ts +12 -4
- package/src/tools/subagent/consult-deadline.ts +9 -3
- package/src/tools/subagent/message.ts +21 -5
- package/src/tools/subagent/notify-parent.ts +44 -23
- package/src/tools/subagent/read.ts +15 -4
- package/src/tools/subagent/resolve.ts +26 -4
- package/src/tools/subagent/spawn.ts +37 -13
- package/src/tools/subagent/status.ts +12 -4
- package/src/tools/system/request-permission.ts +35 -26
- package/src/tools/terminal/shell.ts +68 -55
- package/src/tools/tool-approval-handler.ts +327 -53
- package/src/tools/tool-input-schemas.ts +85 -0
- package/src/tools/tool-types.ts +7 -0
- package/src/tools/types.ts +8 -0
- package/src/tools/workflows/manage-workflows.ts +30 -2
- package/src/tools/workflows/run-workflow.test.ts +54 -2
- package/src/tools/workflows/run-workflow.ts +32 -4
- package/src/util/fs-symlinks.ts +30 -0
- package/src/util/log-redact.ts +7 -3
- package/src/util/platform.ts +15 -0
- package/src/vellum-assistant-namespace.d.ts +80 -0
- package/src/watcher/watcher-store.ts +8 -0
- package/src/workflows/leaf-runner.test.ts +104 -2
- package/src/workflows/leaf-runner.ts +31 -6
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
- package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
- package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
- package/src/workspace/migrations/registry.ts +4 -0
- package/tsconfig.plugin-api.json +1 -1
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/secret-patterns.test.ts +0 -27
- package/src/config/__tests__/proc-to-skills.test.ts +0 -21
- package/src/config/memory-tier.test.ts +0 -44
- package/src/daemon/message-types/acp.ts +0 -20
- package/src/daemon/message-types/apps.ts +0 -11
- package/src/daemon/message-types/background-tools.ts +0 -14
- package/src/daemon/message-types/bookmarks.ts +0 -13
- package/src/daemon/message-types/contacts.ts +0 -13
- package/src/daemon/message-types/document-comments.ts +0 -14
- package/src/daemon/message-types/documents.ts +0 -13
- package/src/daemon/message-types/home.ts +0 -15
- package/src/daemon/message-types/host-bash.ts +0 -12
- package/src/daemon/message-types/host-cu.ts +0 -10
- package/src/daemon/message-types/host-file.ts +0 -12
- package/src/daemon/message-types/host-transfer.ts +0 -12
- package/src/daemon/message-types/integrations.ts +0 -90
- package/src/daemon/message-types/memory.ts +0 -10
- package/src/daemon/message-types/schedules.ts +0 -14
- package/src/daemon/message-types/settings.ts +0 -17
- package/src/daemon/message-types/subagents.ts +0 -63
- package/src/daemon/message-types/upgrades.ts +0 -14
- package/src/daemon/message-types/workflows.ts +0 -25
- package/src/daemon/message-types/workspace.ts +0 -137
- package/src/live-voice/ack-phrases.ts +0 -58
- package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
- package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
- package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
- package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
|
@@ -3,6 +3,8 @@ import { join } from "node:path";
|
|
|
3
3
|
|
|
4
4
|
import { getConfig } from "../../../config/loader.js";
|
|
5
5
|
import {
|
|
6
|
+
isMemoryEnabled,
|
|
7
|
+
isMemoryV1Active,
|
|
6
8
|
isMemoryV3Live,
|
|
7
9
|
usesConceptPageMemory,
|
|
8
10
|
} from "../../../config/memory-v3-gate.js";
|
|
@@ -62,12 +64,15 @@ import { sweepOrphanConversationMemoryTables } from "./conversation-memory-orpha
|
|
|
62
64
|
import { getLogger } from "./logging.js";
|
|
63
65
|
import { sweepOrphanMemoryRetrospectiveConversations } from "./memory-retrospective-startup-cleanup.js";
|
|
64
66
|
import { getWorkspaceDir } from "./paths.js";
|
|
65
|
-
|
|
67
|
+
// SUBSTRATE (v2+v3) — feeds `enqueueSubstrateMaintenanceJobs`.
|
|
66
68
|
import {
|
|
67
69
|
type ConsolidationFailureKind,
|
|
68
70
|
countBufferLines,
|
|
69
71
|
readConsolidationFailureState,
|
|
70
|
-
} from "./
|
|
72
|
+
} from "./substrate/consolidation-job.js";
|
|
73
|
+
import { resolveSubstrateTuning } from "./substrate/tuning.js";
|
|
74
|
+
// V1 — delete with v1. Feeds `enqueueV1MaintenanceJobs`.
|
|
75
|
+
import { hasPkbBufferContent } from "./v1/pkb-schedule.js";
|
|
71
76
|
import { spawnMemoryWorkerProcess } from "./worker-control.js";
|
|
72
77
|
|
|
73
78
|
const log = getLogger("memory-jobs-worker");
|
|
@@ -101,17 +106,18 @@ export const MIN_BUFFER_LINES_FOR_CONSOLIDATION = 10;
|
|
|
101
106
|
|
|
102
107
|
/**
|
|
103
108
|
* V1 job types that read or write the v1 Qdrant collection via
|
|
104
|
-
* `getQdrantClient()`. While
|
|
105
|
-
* intentionally left uninitialized in `
|
|
109
|
+
* `getQdrantClient()`. While v1 is not the live tier, the v1 client is
|
|
110
|
+
* intentionally left uninitialized in `startup.ts`, so these handlers would
|
|
106
111
|
* throw `BackendUnavailableError` and accumulate as a deferred backlog. Stale
|
|
107
112
|
* rows from indexer.ts and other unguarded enqueue sites must short-circuit
|
|
108
|
-
* here for the same reason `
|
|
113
|
+
* here for the same reason the v1 graph handlers do (`isStaleV1GraphJob` in
|
|
114
|
+
* `job-handlers.ts`) — one shared condition, `isMemoryV1Active`.
|
|
109
115
|
*
|
|
110
116
|
* Completing these as a no-op in that state is safe: their live write paths
|
|
111
117
|
* keep re-enqueuing them, so nothing is lost. The one-shot
|
|
112
118
|
* `sweep_orphaned_graph_node_points` cleanup is deliberately NOT in this set —
|
|
113
119
|
* it has no re-enqueue, so `processJob` holds it pending (see
|
|
114
|
-
* {@link
|
|
120
|
+
* {@link SweepPostponedOffV1Error}) instead of losing it to a no-op
|
|
115
121
|
* completion.
|
|
116
122
|
*/
|
|
117
123
|
const V1_QDRANT_JOB_TYPES = new Set<MemoryJobType>([
|
|
@@ -128,17 +134,16 @@ const V1_QDRANT_JOB_TYPES = new Set<MemoryJobType>([
|
|
|
128
134
|
/**
|
|
129
135
|
* The one-shot cacheless graph-node sweep (migration 341) can only run against
|
|
130
136
|
* the v1 Qdrant collection. Thrown from {@link processJob} when the job is
|
|
131
|
-
* claimed while
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
137
|
+
* claimed while v1 is not the live tier, so {@link handleJobError} reschedules
|
|
138
|
+
* it — keeping it pending with no attempt or deferral spent — until v1 is
|
|
139
|
+
* active again, rather than completing it as a no-op and losing the cleanup on
|
|
140
|
+
* a later return to v1 (a rollback off the substrate, or Memory switched back
|
|
141
|
+
* on).
|
|
135
142
|
*/
|
|
136
|
-
class
|
|
143
|
+
class SweepPostponedOffV1Error extends Error {
|
|
137
144
|
constructor() {
|
|
138
|
-
super(
|
|
139
|
-
|
|
140
|
-
);
|
|
141
|
-
this.name = "SweepPostponedUnderV2Error";
|
|
145
|
+
super("Cacheless graph-node sweep postponed while v1 is not the live tier");
|
|
146
|
+
this.name = "SweepPostponedOffV1Error";
|
|
142
147
|
}
|
|
143
148
|
}
|
|
144
149
|
|
|
@@ -147,7 +152,7 @@ class SweepPostponedUnderV2Error extends Error {
|
|
|
147
152
|
* that re-checking the gate costs only a trivial claim a few times a day,
|
|
148
153
|
* short enough that a rollback to v1 runs the cleanup within the same day.
|
|
149
154
|
*/
|
|
150
|
-
const
|
|
155
|
+
const SWEEP_POSTPONE_OFF_V1_MS = 6 * 60 * 60 * 1000;
|
|
151
156
|
|
|
152
157
|
/**
|
|
153
158
|
* Job types whose handlers have been removed. Existing rows may still sit in
|
|
@@ -346,7 +351,7 @@ export async function runMemoryJobsOnce(
|
|
|
346
351
|
// types — host-owned message-search indexing that shares this queue but is
|
|
347
352
|
// not a memory feature. Every memory lane and every maintenance enqueue
|
|
348
353
|
// stays idle in that state; only the lexical types are claimable.
|
|
349
|
-
const memoryEnabled = config
|
|
354
|
+
const memoryEnabled = isMemoryEnabled(config);
|
|
350
355
|
const enableScheduledCleanup =
|
|
351
356
|
options.enableScheduledCleanup === true && memoryEnabled;
|
|
352
357
|
|
|
@@ -554,11 +559,11 @@ async function runLanePool(
|
|
|
554
559
|
// ── Job error handling ─────────────────────────────────────────────
|
|
555
560
|
|
|
556
561
|
function handleJobError(job: MemoryJob, err: unknown): void {
|
|
557
|
-
if (err instanceof
|
|
558
|
-
rescheduleMemoryJob(job.id,
|
|
562
|
+
if (err instanceof SweepPostponedOffV1Error) {
|
|
563
|
+
rescheduleMemoryJob(job.id, SWEEP_POSTPONE_OFF_V1_MS);
|
|
559
564
|
log.debug(
|
|
560
565
|
{ jobId: job.id, type: job.type },
|
|
561
|
-
"Cacheless graph-node sweep held pending while
|
|
566
|
+
"Cacheless graph-node sweep held pending while v1 is not the live tier",
|
|
562
567
|
);
|
|
563
568
|
return;
|
|
564
569
|
}
|
|
@@ -653,12 +658,18 @@ async function processJob(
|
|
|
653
658
|
job: MemoryJob,
|
|
654
659
|
config: AssistantConfig,
|
|
655
660
|
): Promise<void> {
|
|
656
|
-
|
|
661
|
+
// Dispatch-level half of the v1-staleness guard, on the same condition the
|
|
662
|
+
// handler-level half uses (`isStaleV1GraphJob` in `job-handlers.ts`): v1 work
|
|
663
|
+
// runs only while v1 is the live tier, which memory being off is not (see
|
|
664
|
+
// `isMemoryV1Active`). Memory-off jobs of these types are unclaimable
|
|
665
|
+
// upstream — `runMemoryJobsOnce` restricts the claim to the message-lexical
|
|
666
|
+
// types — so this arm is defense in depth for a hot config flip mid-batch.
|
|
667
|
+
if (!isMemoryV1Active(config)) {
|
|
657
668
|
if (V1_QDRANT_JOB_TYPES.has(job.type)) {
|
|
658
669
|
return;
|
|
659
670
|
}
|
|
660
671
|
if (job.type === "sweep_orphaned_graph_node_points") {
|
|
661
|
-
throw new
|
|
672
|
+
throw new SweepPostponedOffV1Error();
|
|
662
673
|
}
|
|
663
674
|
}
|
|
664
675
|
const handler = jobHandlers.get(job.type);
|
|
@@ -838,6 +849,7 @@ export const GRAPH_MAINTENANCE_CHECKPOINTS = {
|
|
|
838
849
|
consolidate: "graph_maintenance:consolidate:last_run",
|
|
839
850
|
patternScan: "graph_maintenance:pattern_scan:last_run",
|
|
840
851
|
narrative: "graph_maintenance:narrative:last_run",
|
|
852
|
+
// FROZEN: persisted checkpoint key — never rename the value.
|
|
841
853
|
memoryV2Consolidate: "memory_v2_consolidate_last_run",
|
|
842
854
|
memoryV3Maintain: "memory_v3_maintain_last_run",
|
|
843
855
|
pkbFiling: "pkb_filing_last_run",
|
|
@@ -874,7 +886,7 @@ export function maybeEnqueueRetrospectiveSweepJob(
|
|
|
874
886
|
config: AssistantConfig,
|
|
875
887
|
nowMs = Date.now(),
|
|
876
888
|
): boolean {
|
|
877
|
-
if (config
|
|
889
|
+
if (!isMemoryEnabled(config)) {
|
|
878
890
|
return false;
|
|
879
891
|
}
|
|
880
892
|
|
|
@@ -900,35 +912,6 @@ export function maybeEnqueueRetrospectiveSweepJob(
|
|
|
900
912
|
return true;
|
|
901
913
|
}
|
|
902
914
|
|
|
903
|
-
/**
|
|
904
|
-
* Enqueue periodic graph maintenance jobs.
|
|
905
|
-
*
|
|
906
|
-
* Mutually exclusive between v1 and concept-page memory:
|
|
907
|
-
* - concept-page memory active ({@link usesConceptPageMemory}) → only one
|
|
908
|
-
* buffer-drainer is scheduled (see below).
|
|
909
|
-
* - inactive → the four v1 entries (decay, consolidate, pattern_scan,
|
|
910
|
-
* narrative) are scheduled instead.
|
|
911
|
-
*
|
|
912
|
-
* The `memory/buffer.md` is shared, so exactly one consolidator owns the drain
|
|
913
|
-
* at a time. When concept-page memory is active, the concept-page consolidator
|
|
914
|
-
* (`memory_v2_consolidate`) is the sole buffer-drainer.
|
|
915
|
-
*
|
|
916
|
-
* Read/write paths route to concept pages when the gate is on, so v1 graph
|
|
917
|
-
* data goes unread; running v1 maintenance alongside it is wasted compute and
|
|
918
|
-
* LLM spend. The v1 code path remains live so disabling concept-page memory
|
|
919
|
-
* fully re-engages v1.
|
|
920
|
-
*
|
|
921
|
-
* Uses durable checkpoints so intervals survive daemon restarts — jobs only
|
|
922
|
-
* fire when the actual elapsed time since last run exceeds the interval.
|
|
923
|
-
* Sweep is intentionally not on this schedule: it is debounced from the
|
|
924
|
-
* live `graph_extract` trigger path (see `indexMessageNow` in `indexer.ts`)
|
|
925
|
-
* so it runs on the same idle/message-count cadence.
|
|
926
|
-
*
|
|
927
|
-
* Independently of the v1/concept-page split, a flag-gated
|
|
928
|
-
* `memory_v3_maintain` backstop is appended when a v3 path is active so the
|
|
929
|
-
* topic tree self-heals even if the primary post-consolidation follow-up
|
|
930
|
-
* enqueue is missed.
|
|
931
|
-
*/
|
|
932
915
|
/**
|
|
933
916
|
* Whether `hour` falls inside the PKB jobs' configured active window. A `null`
|
|
934
917
|
* bound on either side means no restriction. Windows may wrap midnight
|
|
@@ -1035,121 +1018,93 @@ export function consolidationBackoffRemainingMs(
|
|
|
1035
1018
|
return Math.max(0, state.lastFailureAt + backoffMs - nowMs);
|
|
1036
1019
|
}
|
|
1037
1020
|
|
|
1021
|
+
/**
|
|
1022
|
+
* Enqueue periodic graph maintenance jobs.
|
|
1023
|
+
*
|
|
1024
|
+
* Mutually exclusive between v1 and concept-page memory:
|
|
1025
|
+
* - concept-page memory active ({@link usesConceptPageMemory}) → only one
|
|
1026
|
+
* buffer-drainer is scheduled ({@link enqueueSubstrateMaintenanceJobs}).
|
|
1027
|
+
* - inactive → the four v1 entries (decay, consolidate, pattern_scan,
|
|
1028
|
+
* narrative) are scheduled instead ({@link enqueueV1MaintenanceJobs}).
|
|
1029
|
+
*
|
|
1030
|
+
* The `memory/buffer.md` is shared, so exactly one consolidator owns the drain
|
|
1031
|
+
* at a time. When concept-page memory is active, the concept-page consolidator
|
|
1032
|
+
* (`memory_v2_consolidate`) is the sole buffer-drainer.
|
|
1033
|
+
*
|
|
1034
|
+
* Read/write paths route to concept pages when the gate is on, so v1 graph
|
|
1035
|
+
* data goes unread; running v1 maintenance alongside it is wasted compute and
|
|
1036
|
+
* LLM spend. The v1 code path remains live so disabling concept-page memory
|
|
1037
|
+
* fully re-engages v1.
|
|
1038
|
+
*
|
|
1039
|
+
* Uses durable checkpoints so intervals survive daemon restarts — jobs only
|
|
1040
|
+
* fire when the actual elapsed time since last run exceeds the interval.
|
|
1041
|
+
* Sweep is intentionally not on this schedule: it is debounced from the
|
|
1042
|
+
* live `graph_extract` trigger path (see `indexMessageNow` in `indexer.ts`)
|
|
1043
|
+
* so it runs on the same idle/message-count cadence.
|
|
1044
|
+
*
|
|
1045
|
+
* Independently of the v1/concept-page split, a flag-gated
|
|
1046
|
+
* `memory_v3_maintain` backstop is scheduled when a v3 path is active so the
|
|
1047
|
+
* topic tree self-heals even if the primary post-consolidation follow-up
|
|
1048
|
+
* enqueue is missed ({@link enqueueV3BackstopJobs}).
|
|
1049
|
+
*/
|
|
1038
1050
|
export function maybeEnqueueGraphMaintenanceJobs(
|
|
1039
1051
|
config: AssistantConfig,
|
|
1040
1052
|
nowMs = Date.now(),
|
|
1041
1053
|
): void {
|
|
1042
|
-
|
|
1043
|
-
if (!memoryEnabled) {
|
|
1054
|
+
if (!isMemoryEnabled(config)) {
|
|
1044
1055
|
return;
|
|
1045
1056
|
}
|
|
1046
1057
|
|
|
1047
|
-
|
|
1058
|
+
if (usesConceptPageMemory(config.memory)) {
|
|
1059
|
+
enqueueSubstrateMaintenanceJobs(config, nowMs);
|
|
1060
|
+
} else {
|
|
1061
|
+
// V1 — delete with v1. Dropping only the banner-marked function body below
|
|
1062
|
+
// would leave this call dangling: collapse the branch to the substrate arm.
|
|
1063
|
+
enqueueV1MaintenanceJobs(config, nowMs);
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
// v3 self-maintenance backstop. Orthogonal to the mutual exclusion above:
|
|
1067
|
+
// it owns its own checkpoint and operates on the v3 topic tree. Gated on
|
|
1068
|
+
// the same config that gates the v3 plugin so it stays inert when v3 is
|
|
1069
|
+
// off. The job handler itself no-ops when v3 is off, so this guard is
|
|
1070
|
+
// belt-and-suspenders that also avoids a wasted enqueue.
|
|
1071
|
+
if (isMemoryV3Live(config)) {
|
|
1072
|
+
enqueueV3BackstopJobs(nowMs);
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
// ── SUBSTRATE (v2+v3) maintenance ─────────────────────────────────
|
|
1048
1077
|
|
|
1049
|
-
|
|
1050
|
-
|
|
1078
|
+
/**
|
|
1079
|
+
* Substrate maintenance entries; scheduled only while concept-page memory is
|
|
1080
|
+
* active. The concept-page consolidator (`memory_v2_consolidate`) is the sole
|
|
1081
|
+
* buffer-drainer, enqueued on an interval cadence plus a size-based trigger,
|
|
1082
|
+
* both gated by the consolidation failure backoff.
|
|
1083
|
+
*/
|
|
1084
|
+
function enqueueSubstrateMaintenanceJobs(
|
|
1085
|
+
config: AssistantConfig,
|
|
1086
|
+
nowMs: number,
|
|
1087
|
+
): void {
|
|
1088
|
+
const tuning = resolveSubstrateTuning(config.memory);
|
|
1089
|
+
|
|
1090
|
+
// The single buffer-drainer entry, shared by the interval cadence and the
|
|
1091
|
+
// size-based trigger below.
|
|
1051
1092
|
const consolidateEntry = {
|
|
1052
1093
|
key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV2Consolidate,
|
|
1053
|
-
intervalMs:
|
|
1094
|
+
intervalMs: tuning.consolidation_interval_hours * 60 * 60 * 1000,
|
|
1054
1095
|
jobType: "memory_v2_consolidate" as MemoryJobType,
|
|
1055
1096
|
};
|
|
1056
1097
|
|
|
1057
|
-
const
|
|
1058
|
-
key
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
}> = conceptPagesActive
|
|
1062
|
-
? [consolidateEntry]
|
|
1063
|
-
: [
|
|
1064
|
-
{
|
|
1065
|
-
key: GRAPH_MAINTENANCE_CHECKPOINTS.decay,
|
|
1066
|
-
intervalMs: GRAPH_DECAY_INTERVAL_MS,
|
|
1067
|
-
jobType: "graph_decay",
|
|
1068
|
-
},
|
|
1069
|
-
{
|
|
1070
|
-
key: GRAPH_MAINTENANCE_CHECKPOINTS.consolidate,
|
|
1071
|
-
intervalMs: GRAPH_CONSOLIDATE_INTERVAL_MS,
|
|
1072
|
-
jobType: "graph_consolidate",
|
|
1073
|
-
},
|
|
1074
|
-
{
|
|
1075
|
-
key: GRAPH_MAINTENANCE_CHECKPOINTS.patternScan,
|
|
1076
|
-
intervalMs: GRAPH_PATTERN_SCAN_INTERVAL_MS,
|
|
1077
|
-
jobType: "graph_pattern_scan",
|
|
1078
|
-
},
|
|
1079
|
-
{
|
|
1080
|
-
key: GRAPH_MAINTENANCE_CHECKPOINTS.narrative,
|
|
1081
|
-
intervalMs: GRAPH_NARRATIVE_INTERVAL_MS,
|
|
1082
|
-
jobType: "graph_narrative_refine",
|
|
1083
|
-
},
|
|
1084
|
-
];
|
|
1085
|
-
|
|
1086
|
-
// v3 self-maintenance backstop. Orthogonal to the mutual exclusion above:
|
|
1087
|
-
// it owns its own checkpoint and operates on the v3 topic tree, so it
|
|
1088
|
-
// runs under either branch. Gated on the same config that gates the v3 plugin
|
|
1089
|
-
// so it stays inert when v3 is off. The post-consolidation follow-up in
|
|
1090
|
-
// `consolidation-job.ts` remains the primary trigger; this interval only
|
|
1091
|
-
// self-heals when that follow-up is missed (failed enqueue). The job handler
|
|
1092
|
-
// itself no-ops when v3 is off, so
|
|
1093
|
-
// this guard is belt-and-suspenders that also avoids a wasted enqueue.
|
|
1094
|
-
if (isMemoryV3Live(config)) {
|
|
1095
|
-
schedule.push({
|
|
1096
|
-
key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV3Maintain,
|
|
1097
|
-
intervalMs: GRAPH_V3_MAINTAIN_INTERVAL_MS,
|
|
1098
|
-
jobType: "memory_v3_maintain",
|
|
1099
|
-
});
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1098
|
+
const lastRun = parseInt(
|
|
1099
|
+
getMemoryCheckpoint(consolidateEntry.key) ?? "0",
|
|
1100
|
+
10,
|
|
1101
|
+
);
|
|
1102
1102
|
let enqueuedConsolidate = false;
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
// The checkpoint advances so the next check fires after the regular
|
|
1109
|
-
// interval. Manual "Run now" is unaffected (routes layer, not schedule).
|
|
1110
|
-
if (jobType === consolidateEntry.jobType) {
|
|
1111
|
-
// Failure backoff: skip WITHOUT advancing the checkpoint so the
|
|
1112
|
-
// enqueue fires on the first tick after the window elapses instead
|
|
1113
|
-
// of a full interval later.
|
|
1114
|
-
const backoffRemainingMs = consolidationBackoffRemainingMs(
|
|
1115
|
-
intervalMs,
|
|
1116
|
-
nowMs,
|
|
1117
|
-
);
|
|
1118
|
-
if (backoffRemainingMs > 0) {
|
|
1119
|
-
log.debug(
|
|
1120
|
-
{ backoffRemainingMs },
|
|
1121
|
-
"Scheduled consolidation skipped: failure backoff active",
|
|
1122
|
-
);
|
|
1123
|
-
continue;
|
|
1124
|
-
}
|
|
1125
|
-
const bufferLines = memoryBufferLineCount();
|
|
1126
|
-
if (bufferLines < MIN_BUFFER_LINES_FOR_CONSOLIDATION) {
|
|
1127
|
-
// Staleness override: the minimum only defers while entries are
|
|
1128
|
-
// still arriving. Once a non-empty buffer has sat unwritten for a
|
|
1129
|
-
// full interval, drain it anyway — otherwise a buffer that never
|
|
1130
|
-
// reaches the minimum re-skips every interval forever and its
|
|
1131
|
-
// facts never become concept pages.
|
|
1132
|
-
const stale =
|
|
1133
|
-
bufferLines > 0 && memoryBufferIdleMs(nowMs) >= intervalMs;
|
|
1134
|
-
if (!stale) {
|
|
1135
|
-
log.debug(
|
|
1136
|
-
"Scheduled consolidation skipped: buffer under minimum line threshold",
|
|
1137
|
-
);
|
|
1138
|
-
setMemoryCheckpoint(key, String(nowMs));
|
|
1139
|
-
continue;
|
|
1140
|
-
}
|
|
1141
|
-
}
|
|
1142
|
-
}
|
|
1143
|
-
const payload =
|
|
1144
|
-
jobType === consolidateEntry.jobType
|
|
1145
|
-
? AUTOMATIC_CONSOLIDATION_JOB_PAYLOAD
|
|
1146
|
-
: {};
|
|
1147
|
-
enqueueMemoryJob(jobType, payload);
|
|
1148
|
-
setMemoryCheckpoint(key, String(nowMs));
|
|
1149
|
-
if (jobType === consolidateEntry.jobType) {
|
|
1150
|
-
enqueuedConsolidate = true;
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1103
|
+
if (nowMs - lastRun >= consolidateEntry.intervalMs) {
|
|
1104
|
+
enqueuedConsolidate = maybeEnqueueScheduledConsolidation(
|
|
1105
|
+
consolidateEntry,
|
|
1106
|
+
nowMs,
|
|
1107
|
+
);
|
|
1153
1108
|
}
|
|
1154
1109
|
|
|
1155
1110
|
// Size-based trigger: when the shared buffer crosses the configured line
|
|
@@ -1163,9 +1118,8 @@ export function maybeEnqueueGraphMaintenanceJobs(
|
|
|
1163
1118
|
// The failure backoff gates it too: a failed run never trims the buffer, so
|
|
1164
1119
|
// the size trigger alone would re-fire a failing run on every tick. A
|
|
1165
1120
|
// backoff skip leaves the checkpoint alone.
|
|
1166
|
-
const maxLines =
|
|
1121
|
+
const maxLines = tuning.consolidation_max_buffer_lines;
|
|
1167
1122
|
if (
|
|
1168
|
-
conceptPagesActive &&
|
|
1169
1123
|
!enqueuedConsolidate &&
|
|
1170
1124
|
maxLines !== null &&
|
|
1171
1125
|
!hasActiveJobOfType(consolidateEntry.jobType)
|
|
@@ -1189,6 +1143,103 @@ export function maybeEnqueueGraphMaintenanceJobs(
|
|
|
1189
1143
|
}
|
|
1190
1144
|
}
|
|
1191
1145
|
}
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
/**
|
|
1149
|
+
* Interval-cadence arm of the substrate consolidation schedule: enqueue the
|
|
1150
|
+
* consolidate job unless the failure backoff or the minimum-buffer-lines gate
|
|
1151
|
+
* (with its staleness override) skips it. Returns true when the job was
|
|
1152
|
+
* enqueued.
|
|
1153
|
+
*/
|
|
1154
|
+
function maybeEnqueueScheduledConsolidation(
|
|
1155
|
+
entry: { key: string; intervalMs: number; jobType: MemoryJobType },
|
|
1156
|
+
nowMs: number,
|
|
1157
|
+
): boolean {
|
|
1158
|
+
// Failure backoff: skip WITHOUT advancing the checkpoint so the enqueue
|
|
1159
|
+
// fires on the first tick after the window elapses instead of a full
|
|
1160
|
+
// interval later.
|
|
1161
|
+
const backoffRemainingMs = consolidationBackoffRemainingMs(
|
|
1162
|
+
entry.intervalMs,
|
|
1163
|
+
nowMs,
|
|
1164
|
+
);
|
|
1165
|
+
if (backoffRemainingMs > 0) {
|
|
1166
|
+
log.debug(
|
|
1167
|
+
{ backoffRemainingMs },
|
|
1168
|
+
"Scheduled consolidation skipped: failure backoff active",
|
|
1169
|
+
);
|
|
1170
|
+
return false;
|
|
1171
|
+
}
|
|
1172
|
+
// Noop scheduled consolidation when the buffer has too few entries to
|
|
1173
|
+
// justify an LLM run — mirrors the heartbeat max-consecutive-runs skip.
|
|
1174
|
+
// The checkpoint advances so the next check fires after the regular
|
|
1175
|
+
// interval. Manual "Run now" is unaffected (routes layer, not schedule).
|
|
1176
|
+
const bufferLines = memoryBufferLineCount();
|
|
1177
|
+
if (bufferLines < MIN_BUFFER_LINES_FOR_CONSOLIDATION) {
|
|
1178
|
+
// Staleness override: the minimum only defers while entries are still
|
|
1179
|
+
// arriving. Once a non-empty buffer has sat unwritten for a full
|
|
1180
|
+
// interval, drain it anyway — otherwise a buffer that never reaches the
|
|
1181
|
+
// minimum re-skips every interval forever and its facts never become
|
|
1182
|
+
// concept pages.
|
|
1183
|
+
const stale =
|
|
1184
|
+
bufferLines > 0 && memoryBufferIdleMs(nowMs) >= entry.intervalMs;
|
|
1185
|
+
if (!stale) {
|
|
1186
|
+
log.debug(
|
|
1187
|
+
"Scheduled consolidation skipped: buffer under minimum line threshold",
|
|
1188
|
+
);
|
|
1189
|
+
setMemoryCheckpoint(entry.key, String(nowMs));
|
|
1190
|
+
return false;
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
enqueueMemoryJob(entry.jobType, AUTOMATIC_CONSOLIDATION_JOB_PAYLOAD);
|
|
1194
|
+
setMemoryCheckpoint(entry.key, String(nowMs));
|
|
1195
|
+
return true;
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
// ── V1 (legacy engine) maintenance — delete with v1 ───────────────
|
|
1199
|
+
|
|
1200
|
+
/**
|
|
1201
|
+
* v1-only maintenance entries; scheduled only when the legacy graph engine is
|
|
1202
|
+
* the live memory tier. Covers the four v1 graph lifecycle jobs (decay,
|
|
1203
|
+
* consolidate, pattern_scan, narrative) and the PKB filing/compaction
|
|
1204
|
+
* schedule.
|
|
1205
|
+
*/
|
|
1206
|
+
function enqueueV1MaintenanceJobs(
|
|
1207
|
+
config: AssistantConfig,
|
|
1208
|
+
nowMs: number,
|
|
1209
|
+
): void {
|
|
1210
|
+
const schedule: Array<{
|
|
1211
|
+
key: string;
|
|
1212
|
+
intervalMs: number;
|
|
1213
|
+
jobType: MemoryJobType;
|
|
1214
|
+
}> = [
|
|
1215
|
+
{
|
|
1216
|
+
key: GRAPH_MAINTENANCE_CHECKPOINTS.decay,
|
|
1217
|
+
intervalMs: GRAPH_DECAY_INTERVAL_MS,
|
|
1218
|
+
jobType: "graph_decay",
|
|
1219
|
+
},
|
|
1220
|
+
{
|
|
1221
|
+
key: GRAPH_MAINTENANCE_CHECKPOINTS.consolidate,
|
|
1222
|
+
intervalMs: GRAPH_CONSOLIDATE_INTERVAL_MS,
|
|
1223
|
+
jobType: "graph_consolidate",
|
|
1224
|
+
},
|
|
1225
|
+
{
|
|
1226
|
+
key: GRAPH_MAINTENANCE_CHECKPOINTS.patternScan,
|
|
1227
|
+
intervalMs: GRAPH_PATTERN_SCAN_INTERVAL_MS,
|
|
1228
|
+
jobType: "graph_pattern_scan",
|
|
1229
|
+
},
|
|
1230
|
+
{
|
|
1231
|
+
key: GRAPH_MAINTENANCE_CHECKPOINTS.narrative,
|
|
1232
|
+
intervalMs: GRAPH_NARRATIVE_INTERVAL_MS,
|
|
1233
|
+
jobType: "graph_narrative_refine",
|
|
1234
|
+
},
|
|
1235
|
+
];
|
|
1236
|
+
for (const { key, intervalMs, jobType } of schedule) {
|
|
1237
|
+
const lastRun = parseInt(getMemoryCheckpoint(key) ?? "0", 10);
|
|
1238
|
+
if (nowMs - lastRun >= intervalMs) {
|
|
1239
|
+
enqueueMemoryJob(jobType, {});
|
|
1240
|
+
setMemoryCheckpoint(key, String(nowMs));
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1192
1243
|
|
|
1193
1244
|
// PKB filing/compaction — v1-only, like the v1 graph entries above (under
|
|
1194
1245
|
// concept-page memory the consolidation job owns periodic background memory
|
|
@@ -1204,60 +1255,80 @@ export function maybeEnqueueGraphMaintenanceJobs(
|
|
|
1204
1255
|
// - either PKB job already pending/running: skip WITHOUT advancing, so the
|
|
1205
1256
|
// next worker tick retries. Filing and compaction both rewrite the PKB
|
|
1206
1257
|
// tree, so at most one of the two is ever in the queue.
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
if (checkpoint === null) {
|
|
1242
|
-
setMemoryCheckpoint(key, String(nowMs));
|
|
1243
|
-
continue;
|
|
1244
|
-
}
|
|
1245
|
-
const lastRun = parseInt(checkpoint, 10);
|
|
1246
|
-
if (nowMs - lastRun < intervalMs) {
|
|
1247
|
-
continue;
|
|
1248
|
-
}
|
|
1249
|
-
if (!withinActiveHours || !hasWork()) {
|
|
1250
|
-
setMemoryCheckpoint(key, String(nowMs));
|
|
1251
|
-
continue;
|
|
1252
|
-
}
|
|
1253
|
-
if (
|
|
1254
|
-
hasActiveJobOfType("pkb_filing") ||
|
|
1255
|
-
hasActiveJobOfType("pkb_compaction")
|
|
1256
|
-
) {
|
|
1257
|
-
continue;
|
|
1258
|
-
}
|
|
1259
|
-
enqueueMemoryJob(jobType, {});
|
|
1258
|
+
const filingConfig = config.filing;
|
|
1259
|
+
const withinActiveHours = isWithinPkbActiveHours(
|
|
1260
|
+
new Date(nowMs).getHours(),
|
|
1261
|
+
filingConfig.activeHoursStart ?? null,
|
|
1262
|
+
filingConfig.activeHoursEnd ?? null,
|
|
1263
|
+
);
|
|
1264
|
+
const pkbSchedule: Array<{
|
|
1265
|
+
key: string;
|
|
1266
|
+
intervalMs: number;
|
|
1267
|
+
jobType: MemoryJobType;
|
|
1268
|
+
enabled: boolean;
|
|
1269
|
+
hasWork: () => boolean;
|
|
1270
|
+
}> = [
|
|
1271
|
+
{
|
|
1272
|
+
key: GRAPH_MAINTENANCE_CHECKPOINTS.pkbFiling,
|
|
1273
|
+
intervalMs: filingConfig.intervalMs,
|
|
1274
|
+
jobType: "pkb_filing",
|
|
1275
|
+
enabled: filingConfig.enabled,
|
|
1276
|
+
hasWork: () => hasPkbBufferContent(),
|
|
1277
|
+
},
|
|
1278
|
+
{
|
|
1279
|
+
key: GRAPH_MAINTENANCE_CHECKPOINTS.pkbCompaction,
|
|
1280
|
+
intervalMs: filingConfig.compactionIntervalMs,
|
|
1281
|
+
jobType: "pkb_compaction",
|
|
1282
|
+
enabled: filingConfig.compactionEnabled,
|
|
1283
|
+
hasWork: () => true,
|
|
1284
|
+
},
|
|
1285
|
+
];
|
|
1286
|
+
for (const { key, intervalMs, jobType, enabled, hasWork } of pkbSchedule) {
|
|
1287
|
+
if (!enabled) {
|
|
1288
|
+
continue;
|
|
1289
|
+
}
|
|
1290
|
+
const checkpoint = getMemoryCheckpoint(key);
|
|
1291
|
+
if (checkpoint === null) {
|
|
1260
1292
|
setMemoryCheckpoint(key, String(nowMs));
|
|
1293
|
+
continue;
|
|
1294
|
+
}
|
|
1295
|
+
const lastRun = parseInt(checkpoint, 10);
|
|
1296
|
+
if (nowMs - lastRun < intervalMs) {
|
|
1297
|
+
continue;
|
|
1298
|
+
}
|
|
1299
|
+
if (!withinActiveHours || !hasWork()) {
|
|
1300
|
+
setMemoryCheckpoint(key, String(nowMs));
|
|
1301
|
+
continue;
|
|
1261
1302
|
}
|
|
1303
|
+
if (
|
|
1304
|
+
hasActiveJobOfType("pkb_filing") ||
|
|
1305
|
+
hasActiveJobOfType("pkb_compaction")
|
|
1306
|
+
) {
|
|
1307
|
+
continue;
|
|
1308
|
+
}
|
|
1309
|
+
enqueueMemoryJob(jobType, {});
|
|
1310
|
+
setMemoryCheckpoint(key, String(nowMs));
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
// ── V3 backstop ───────────────────────────────────────────────────
|
|
1315
|
+
|
|
1316
|
+
/**
|
|
1317
|
+
* v3 self-maintenance backstop on its own durable checkpoint. The
|
|
1318
|
+
* post-consolidation follow-up in `consolidation-job.ts` is the primary
|
|
1319
|
+
* trigger; this interval only self-heals when that follow-up is missed
|
|
1320
|
+
* (failed enqueue).
|
|
1321
|
+
*/
|
|
1322
|
+
function enqueueV3BackstopJobs(nowMs: number): void {
|
|
1323
|
+
const lastRun = parseInt(
|
|
1324
|
+
getMemoryCheckpoint(GRAPH_MAINTENANCE_CHECKPOINTS.memoryV3Maintain) ?? "0",
|
|
1325
|
+
10,
|
|
1326
|
+
);
|
|
1327
|
+
if (nowMs - lastRun >= GRAPH_V3_MAINTAIN_INTERVAL_MS) {
|
|
1328
|
+
enqueueMemoryJob("memory_v3_maintain", {});
|
|
1329
|
+
setMemoryCheckpoint(
|
|
1330
|
+
GRAPH_MAINTENANCE_CHECKPOINTS.memoryV3Maintain,
|
|
1331
|
+
String(nowMs),
|
|
1332
|
+
);
|
|
1262
1333
|
}
|
|
1263
1334
|
}
|
|
@@ -35,7 +35,7 @@ import { type TrustClass } from "../../../runtime/actor-trust-resolver.js";
|
|
|
35
35
|
import { resolveCapabilities } from "../../../runtime/capabilities.js";
|
|
36
36
|
import { getLogger } from "./logging.js";
|
|
37
37
|
import { isMemoryRetrospectiveSource } from "./memory-retrospective-constants.js";
|
|
38
|
-
import { MEMORY_V2_CONSOLIDATION_SOURCE } from "./
|
|
38
|
+
import { MEMORY_V2_CONSOLIDATION_SOURCE } from "./substrate/constants.js";
|
|
39
39
|
|
|
40
40
|
const log = getLogger("memory-retrospective-enqueue");
|
|
41
41
|
|
|
@@ -107,7 +107,9 @@ export function isMemoryRetrospectiveConversation(
|
|
|
107
107
|
*/
|
|
108
108
|
function isLowYieldRetrospectiveSource(conversationId: string): boolean {
|
|
109
109
|
const conversation = getConversation(conversationId);
|
|
110
|
-
if (!conversation)
|
|
110
|
+
if (!conversation) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
111
113
|
return (
|
|
112
114
|
conversation.conversationType === "scheduled" ||
|
|
113
115
|
conversation.source === MEMORY_V2_CONSOLIDATION_SOURCE
|