@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
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// Memory
|
|
2
|
+
// Memory substrate — `assistant` CLI subcommands → embedded capability entries
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
//
|
|
5
|
+
// Shared by the v2 injection engine and memory-v3; active whenever
|
|
6
|
+
// `usesConceptPageMemory()` holds.
|
|
7
|
+
//
|
|
5
8
|
// Enumerate the top-level `assistant` CLI commands from their declarative help
|
|
6
9
|
// (`CLI_COMMAND_HELP`, exposed via `@vellumai/plugin-api`), render each as a
|
|
7
10
|
// prose capability statement, embed dense + sparse, and upsert into
|
|
@@ -26,11 +29,11 @@
|
|
|
26
29
|
|
|
27
30
|
import { CLI_COMMAND_HELP } from "@vellumai/plugin-api";
|
|
28
31
|
|
|
29
|
-
import { getConfig } from "
|
|
30
|
-
import { generateSparseEmbedding } from "
|
|
31
|
-
import { applyCorrectionIfCalibrated } from "
|
|
32
|
-
import { embedWithBackend } from "
|
|
33
|
-
import { getLogger } from "
|
|
32
|
+
import { getConfig } from "../../../../config/loader.js";
|
|
33
|
+
import { generateSparseEmbedding } from "../../../../persistence/embeddings/embedding-backend.js";
|
|
34
|
+
import { applyCorrectionIfCalibrated } from "../anisotropy.js";
|
|
35
|
+
import { embedWithBackend } from "../embeddings.js";
|
|
36
|
+
import { getLogger } from "../logging.js";
|
|
34
37
|
import { buildCliCommandHelpContent } from "./cli-command-content.js";
|
|
35
38
|
import { invalidatePageIndex } from "./page-index.js";
|
|
36
39
|
import {
|
|
@@ -42,6 +45,7 @@ import {
|
|
|
42
45
|
generateBm25DocEmbedding,
|
|
43
46
|
getConceptPageCorpusStats,
|
|
44
47
|
} from "./sparse-bm25.js";
|
|
48
|
+
import { resolveSubstrateTuning } from "./tuning.js";
|
|
45
49
|
import type { CliCommandEntry } from "./types.js";
|
|
46
50
|
|
|
47
51
|
const log = getLogger("memory-v2-cli-command-store");
|
|
@@ -185,11 +189,12 @@ async function runSeedV2CliCommandEntries(generation: number): Promise<void> {
|
|
|
185
189
|
// start window before corpus stats finish building — same rationale as
|
|
186
190
|
// the skill-store path.
|
|
187
191
|
const corpusStats = getConceptPageCorpusStats();
|
|
192
|
+
const { bm25_k1, bm25_b } = resolveSubstrateTuning(config.memory);
|
|
188
193
|
encodeSparse = (input: string) =>
|
|
189
194
|
corpusStats
|
|
190
195
|
? generateBm25DocEmbedding(input, corpusStats, {
|
|
191
|
-
k1:
|
|
192
|
-
b:
|
|
196
|
+
k1: bm25_k1,
|
|
197
|
+
b: bm25_b,
|
|
193
198
|
})
|
|
194
199
|
: generateSparseEmbedding(input);
|
|
195
200
|
try {
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memory
|
|
2
|
+
* Memory substrate — `memory_v2_consolidate` job handler.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the v2 injection engine and memory-v3; active whenever
|
|
5
|
+
* `usesConceptPageMemory()` holds.
|
|
3
6
|
*
|
|
4
7
|
* The consolidation job is the centerpiece of v2: an hourly background pass
|
|
5
8
|
* that routes accumulated `memory/buffer.md` entries into concept pages,
|
|
@@ -80,27 +83,28 @@ import { dirname, join } from "node:path";
|
|
|
80
83
|
import {
|
|
81
84
|
isMemoryV3Live,
|
|
82
85
|
usesConceptPageMemory,
|
|
83
|
-
} from "
|
|
84
|
-
import type { AssistantConfig } from "
|
|
86
|
+
} from "../../../../config/memory-v3-gate.js";
|
|
87
|
+
import type { AssistantConfig } from "../../../../config/types.js";
|
|
85
88
|
import {
|
|
86
89
|
deleteMemoryCheckpoint,
|
|
87
90
|
getMemoryCheckpoint,
|
|
88
91
|
setMemoryCheckpoint,
|
|
89
|
-
} from "
|
|
92
|
+
} from "../../../../persistence/checkpoints.js";
|
|
90
93
|
import {
|
|
91
94
|
enqueueMemoryJob,
|
|
92
95
|
hasPendingJobOfType,
|
|
93
96
|
type MemoryJob,
|
|
94
97
|
type MemoryJobType,
|
|
95
|
-
} from "
|
|
96
|
-
import { runBackgroundJob } from "
|
|
97
|
-
import { formatBufferTimestamp } from "
|
|
98
|
-
import { isProcessAlive } from "
|
|
99
|
-
import { getLogger } from "
|
|
100
|
-
import { getWorkspaceDir } from "
|
|
98
|
+
} from "../../../../persistence/jobs-store.js";
|
|
99
|
+
import { runBackgroundJob } from "../../../../runtime/background-job-runner.js";
|
|
100
|
+
import { formatBufferTimestamp } from "../graph/tool-handlers.js";
|
|
101
|
+
import { isProcessAlive } from "../host-utils.js";
|
|
102
|
+
import { getLogger } from "../logging.js";
|
|
103
|
+
import { getWorkspaceDir } from "../paths.js";
|
|
101
104
|
import { MEMORY_V2_CONSOLIDATION_SOURCE } from "./constants.js";
|
|
102
105
|
import { getPageIndex, type PageParseFailure } from "./page-index.js";
|
|
103
106
|
import { resolveConsolidationPrompt } from "./prompts/consolidation.js";
|
|
107
|
+
import { resolveSubstrateTuning } from "./tuning.js";
|
|
104
108
|
|
|
105
109
|
const log = getLogger("memory-v2-consolidate");
|
|
106
110
|
|
|
@@ -195,6 +199,7 @@ const STALE_LOCK_TTL_MS = 4 * CONSOLIDATION_TIMEOUT_MS;
|
|
|
195
199
|
*
|
|
196
200
|
* Value is JSON: `{ consecutiveFailures, lastFailureAt, kind }`.
|
|
197
201
|
*/
|
|
202
|
+
// FROZEN: persisted checkpoint key — never rename the value.
|
|
198
203
|
export const CONSOLIDATION_FAILURE_CHECKPOINT_KEY =
|
|
199
204
|
"memory_v2_consolidate_failure_state";
|
|
200
205
|
|
|
@@ -323,17 +328,17 @@ export async function memoryV2ConsolidateJob(
|
|
|
323
328
|
_job: MemoryJob,
|
|
324
329
|
config: AssistantConfig,
|
|
325
330
|
): Promise<ConsolidationOutcome> {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
+
// One gate, not two: `usesConceptPageMemory` already returns false on an
|
|
332
|
+
// explicit `memory.enabled === false`, so the memory-off case lands here
|
|
333
|
+
// with the same `"disabled"` outcome a separate early return would have
|
|
334
|
+
// produced.
|
|
331
335
|
if (!usesConceptPageMemory(config.memory)) {
|
|
332
336
|
log.debug("concept-page memory is not active; consolidation skipped");
|
|
333
337
|
return { kind: "disabled" };
|
|
334
338
|
}
|
|
335
339
|
|
|
336
340
|
const memoryDir = join(getWorkspaceDir(), "memory");
|
|
341
|
+
// FROZEN: `memory/.v2-state/` is a persisted workspace path — never rename.
|
|
337
342
|
const lockPath = join(memoryDir, ".v2-state", "consolidation.lock");
|
|
338
343
|
const bufferPath = join(memoryDir, "buffer.md");
|
|
339
344
|
|
|
@@ -381,7 +386,8 @@ export async function memoryV2ConsolidateJob(
|
|
|
381
386
|
// lines belong to the preceding entry, not the count.
|
|
382
387
|
let cutoff = formatBufferTimestamp(new Date());
|
|
383
388
|
let deferredEntries = 0;
|
|
384
|
-
const
|
|
389
|
+
const tuning = resolveSubstrateTuning(config.memory);
|
|
390
|
+
const maxEntries = tuning.consolidation_max_entries_per_run;
|
|
385
391
|
if (maxEntries != null) {
|
|
386
392
|
const entryTimestamps = bufferContent
|
|
387
393
|
.split("\n")
|
|
@@ -430,7 +436,7 @@ export async function memoryV2ConsolidateJob(
|
|
|
430
436
|
// Sentry-side reporting is unchanged.
|
|
431
437
|
//
|
|
432
438
|
// The prompt body comes from `resolveConsolidationPrompt`, which honors
|
|
433
|
-
// the `
|
|
439
|
+
// the `consolidation_prompt_path` substrate tunable but bounds
|
|
434
440
|
// it to a regular file under 1 MiB before substitution so a stray path
|
|
435
441
|
// (or a `/dev/zero`-style pseudo-file) cannot exfiltrate megabytes of
|
|
436
442
|
// bytes through the wake hint. The core-pages curation section and the
|
|
@@ -453,7 +459,7 @@ export async function memoryV2ConsolidateJob(
|
|
|
453
459
|
);
|
|
454
460
|
}
|
|
455
461
|
const prompt = resolveConsolidationPrompt(
|
|
456
|
-
|
|
462
|
+
tuning.consolidation_prompt_path,
|
|
457
463
|
cutoff,
|
|
458
464
|
{
|
|
459
465
|
includeCorePagesSection: memoryV3Live,
|
|
@@ -612,7 +618,9 @@ function readBufferContent(bufferPath: string): string {
|
|
|
612
618
|
try {
|
|
613
619
|
return readFileSync(bufferPath, "utf-8");
|
|
614
620
|
} catch (err) {
|
|
615
|
-
if ((err as NodeJS.ErrnoException).code === "ENOENT")
|
|
621
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") {
|
|
622
|
+
return "";
|
|
623
|
+
}
|
|
616
624
|
throw err;
|
|
617
625
|
}
|
|
618
626
|
}
|
|
@@ -685,9 +693,13 @@ function tryAcquireLock(lockPath: string): string | null {
|
|
|
685
693
|
mkdirSync(dirname(lockPath), { recursive: true });
|
|
686
694
|
|
|
687
695
|
const firstHolder = tryCreate(lockPath);
|
|
688
|
-
if (firstHolder === null)
|
|
696
|
+
if (firstHolder === null) {
|
|
697
|
+
return null;
|
|
698
|
+
}
|
|
689
699
|
const staleReason = holderStaleReason(firstHolder);
|
|
690
|
-
if (staleReason === null)
|
|
700
|
+
if (staleReason === null) {
|
|
701
|
+
return firstHolder;
|
|
702
|
+
}
|
|
691
703
|
|
|
692
704
|
log.info(
|
|
693
705
|
{ lockPath, holder: firstHolder, reason: staleReason },
|
|
@@ -721,7 +733,9 @@ function tryCreate(lockPath: string): string | null {
|
|
|
721
733
|
try {
|
|
722
734
|
fd = openSync(lockPath, "wx");
|
|
723
735
|
} catch (err) {
|
|
724
|
-
if ((err as NodeJS.ErrnoException).code !== "EEXIST")
|
|
736
|
+
if ((err as NodeJS.ErrnoException).code !== "EEXIST") {
|
|
737
|
+
throw err;
|
|
738
|
+
}
|
|
725
739
|
try {
|
|
726
740
|
return readFileSync(lockPath, "utf-8").trim() || "unknown";
|
|
727
741
|
} catch {
|
|
@@ -760,9 +774,13 @@ function parseHolder(
|
|
|
760
774
|
holder: string,
|
|
761
775
|
): { pid: number; timestamp: number | null } | null {
|
|
762
776
|
const match = /^(\d+)(?:\s+(\d+))?/.exec(holder);
|
|
763
|
-
if (!match)
|
|
777
|
+
if (!match) {
|
|
778
|
+
return null;
|
|
779
|
+
}
|
|
764
780
|
const pid = Number.parseInt(match[1], 10);
|
|
765
|
-
if (!Number.isFinite(pid) || pid <= 0)
|
|
781
|
+
if (!Number.isFinite(pid) || pid <= 0) {
|
|
782
|
+
return null;
|
|
783
|
+
}
|
|
766
784
|
const timestamp =
|
|
767
785
|
match[2] !== undefined ? Number.parseInt(match[2], 10) : null;
|
|
768
786
|
return {
|
|
@@ -790,8 +808,12 @@ function parseHolder(
|
|
|
790
808
|
*/
|
|
791
809
|
function holderStaleReason(holder: string): StaleReason | null {
|
|
792
810
|
const parsed = parseHolder(holder);
|
|
793
|
-
if (parsed === null)
|
|
794
|
-
|
|
811
|
+
if (parsed === null) {
|
|
812
|
+
return "unparseable";
|
|
813
|
+
}
|
|
814
|
+
if (!isProcessAlive(parsed.pid)) {
|
|
815
|
+
return "pid_dead";
|
|
816
|
+
}
|
|
795
817
|
if (
|
|
796
818
|
parsed.timestamp !== null &&
|
|
797
819
|
Date.now() - parsed.timestamp > STALE_LOCK_TTL_MS
|
|
@@ -812,7 +834,9 @@ function releaseLock(lockPath: string): void {
|
|
|
812
834
|
unlinkSync(lockPath);
|
|
813
835
|
} catch (err) {
|
|
814
836
|
const code = (err as NodeJS.ErrnoException).code;
|
|
815
|
-
if (code === "ENOENT")
|
|
837
|
+
if (code === "ENOENT") {
|
|
838
|
+
return;
|
|
839
|
+
}
|
|
816
840
|
log.warn(
|
|
817
841
|
{ err, lockPath },
|
|
818
842
|
"consolidation: failed to release lock (best-effort)",
|
|
@@ -4,4 +4,5 @@
|
|
|
4
4
|
* recognize consolidation conversations without importing the consolidation
|
|
5
5
|
* job (which pulls in agent-wake + bootstrap dependencies).
|
|
6
6
|
*/
|
|
7
|
+
// FROZEN: persisted `conversations.source` value — never rename it.
|
|
7
8
|
export const MEMORY_V2_CONSOLIDATION_SOURCE = "memory_v2_consolidation";
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memory
|
|
2
|
+
* Memory substrate — In-memory directed edge index, derived from concept-page
|
|
3
3
|
* frontmatter.
|
|
4
4
|
*
|
|
5
|
+
* Shared by the v2 injection engine and memory-v3; active whenever
|
|
6
|
+
* `usesConceptPageMemory()` holds.
|
|
7
|
+
*
|
|
5
8
|
* Each concept page's `edges:` frontmatter list is the canonical source of
|
|
6
9
|
* truth for that page's *outgoing* edges. Edges are directed: an entry of
|
|
7
10
|
* `B` in A's `edges:` means "activating A pulls in B" — activation flows
|
|
@@ -78,13 +81,19 @@ export async function getEdgeIndex(workspaceDir: string): Promise<EdgeIndex> {
|
|
|
78
81
|
} catch {
|
|
79
82
|
return;
|
|
80
83
|
}
|
|
81
|
-
if (!page)
|
|
84
|
+
if (!page) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
82
87
|
const out = new Set<string>();
|
|
83
88
|
for (const target of page.frontmatter.edges) {
|
|
84
|
-
if (target === slug)
|
|
89
|
+
if (target === slug) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
85
92
|
out.add(target);
|
|
86
93
|
}
|
|
87
|
-
if (out.size > 0)
|
|
94
|
+
if (out.size > 0) {
|
|
95
|
+
outgoing.set(slug, out);
|
|
96
|
+
}
|
|
88
97
|
for (const target of out) {
|
|
89
98
|
ensureSet(incoming, target).add(slug);
|
|
90
99
|
}
|
|
@@ -102,7 +111,9 @@ export async function getEdgeIndex(workspaceDir: string): Promise<EdgeIndex> {
|
|
|
102
111
|
* workspaces); omit it to clear unconditionally.
|
|
103
112
|
*/
|
|
104
113
|
export function invalidateEdgeIndex(workspaceDir?: string): void {
|
|
105
|
-
if (!cache)
|
|
114
|
+
if (!cache) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
106
117
|
if (workspaceDir === undefined || cache.workspaceDir === workspaceDir) {
|
|
107
118
|
cache = null;
|
|
108
119
|
}
|
|
@@ -125,7 +136,9 @@ export function getReachable(
|
|
|
125
136
|
direction: EdgeDirection,
|
|
126
137
|
): Set<string> {
|
|
127
138
|
const result = new Set<string>();
|
|
128
|
-
if (hops <= 0)
|
|
139
|
+
if (hops <= 0) {
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
129
142
|
|
|
130
143
|
const adjacency = direction === "out" ? index.outgoing : index.incoming;
|
|
131
144
|
const visited = new Set<string>([slug]);
|
|
@@ -135,9 +148,13 @@ export function getReachable(
|
|
|
135
148
|
const next: string[] = [];
|
|
136
149
|
for (const node of frontier) {
|
|
137
150
|
const neighbors = adjacency.get(node);
|
|
138
|
-
if (!neighbors)
|
|
151
|
+
if (!neighbors) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
139
154
|
for (const neighbor of neighbors) {
|
|
140
|
-
if (visited.has(neighbor))
|
|
155
|
+
if (visited.has(neighbor)) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
141
158
|
visited.add(neighbor);
|
|
142
159
|
result.add(neighbor);
|
|
143
160
|
next.push(neighbor);
|
|
@@ -172,7 +189,9 @@ export function validateEdgeTargets(
|
|
|
172
189
|
for (const from of sources) {
|
|
173
190
|
const targets = [...(index.outgoing.get(from) ?? [])].sort();
|
|
174
191
|
for (const to of targets) {
|
|
175
|
-
if (!knownSlugs.has(to))
|
|
192
|
+
if (!knownSlugs.has(to)) {
|
|
193
|
+
missing.push({ from, to });
|
|
194
|
+
}
|
|
176
195
|
}
|
|
177
196
|
}
|
|
178
197
|
return { ok: missing.length === 0, missing };
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// Memory
|
|
2
|
+
// Memory substrate — Concept page frontmatter sweep
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
//
|
|
5
|
+
// Shared by the v2 injection engine and memory-v3; active whenever
|
|
6
|
+
// `usesConceptPageMemory()` holds.
|
|
7
|
+
//
|
|
5
8
|
// At daemon startup, walk every concept page on disk and validate its
|
|
6
9
|
// frontmatter against `ConceptPageFrontmatterSchema`. The schema is
|
|
7
10
|
// `.passthrough()`, so unknown keys are tolerated; what this sweep catches is
|
|
@@ -23,10 +26,10 @@ import { join } from "node:path";
|
|
|
23
26
|
|
|
24
27
|
import { parse as parseYaml } from "yaml";
|
|
25
28
|
|
|
26
|
-
import { usesConceptPageMemory } from "
|
|
27
|
-
import type { AssistantConfig } from "
|
|
28
|
-
import { FRONTMATTER_REGEX } from "
|
|
29
|
-
import { getLogger } from "
|
|
29
|
+
import { usesConceptPageMemory } from "../../../../config/memory-v3-gate.js";
|
|
30
|
+
import type { AssistantConfig } from "../../../../config/schema.js";
|
|
31
|
+
import { FRONTMATTER_REGEX } from "../frontmatter.js";
|
|
32
|
+
import { getLogger } from "../logging.js";
|
|
30
33
|
import { listPages } from "./page-store.js";
|
|
31
34
|
import { ConceptPageFrontmatterSchema } from "./types.js";
|
|
32
35
|
|
|
@@ -43,7 +46,9 @@ export async function sweepConceptPageFrontmatter(
|
|
|
43
46
|
config: AssistantConfig,
|
|
44
47
|
workspaceDir: string,
|
|
45
48
|
): Promise<void> {
|
|
46
|
-
if (!usesConceptPageMemory(config.memory))
|
|
49
|
+
if (!usesConceptPageMemory(config.memory)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
47
52
|
|
|
48
53
|
let slugs: string[];
|
|
49
54
|
try {
|
|
@@ -81,7 +86,9 @@ export async function sweepConceptPageFrontmatter(
|
|
|
81
86
|
}
|
|
82
87
|
|
|
83
88
|
const result = ConceptPageFrontmatterSchema.safeParse(parsed);
|
|
84
|
-
if (result.success)
|
|
89
|
+
if (result.success) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
85
92
|
|
|
86
93
|
for (const issue of result.error.issues) {
|
|
87
94
|
log.warn(
|
|
@@ -44,7 +44,9 @@ export function extractInjectedConceptSlugs(block: string): string[] {
|
|
|
44
44
|
const seen = new Set<string>();
|
|
45
45
|
for (const match of block.matchAll(INJECTED_CONCEPT_HEADER_REGEX)) {
|
|
46
46
|
const slug = match[1]!;
|
|
47
|
-
if (seen.has(slug))
|
|
47
|
+
if (seen.has(slug)) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
48
50
|
seen.add(slug);
|
|
49
51
|
slugs.push(slug);
|
|
50
52
|
}
|
|
@@ -65,12 +67,16 @@ export function readInjectedBlock(
|
|
|
65
67
|
metadata: string | null | undefined,
|
|
66
68
|
key: string,
|
|
67
69
|
): string | null {
|
|
68
|
-
if (!metadata)
|
|
70
|
+
if (!metadata) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
69
73
|
try {
|
|
70
74
|
const parsed: unknown = JSON.parse(metadata);
|
|
71
75
|
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
72
76
|
const block = (parsed as Record<string, unknown>)[key];
|
|
73
|
-
if (typeof block === "string")
|
|
77
|
+
if (typeof block === "string") {
|
|
78
|
+
return block;
|
|
79
|
+
}
|
|
74
80
|
}
|
|
75
81
|
} catch {
|
|
76
82
|
// Malformed metadata — treat as no block.
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memory
|
|
2
|
+
* Memory substrate — Numbered page index for the router prompt.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the v2 injection engine and memory-v3; active whenever
|
|
5
|
+
* `usesConceptPageMemory()` holds.
|
|
3
6
|
*
|
|
4
7
|
* Renders a compact catalog of every concept page plus every seeded skill
|
|
5
8
|
* entry, sorted by slug ASCII for deterministic IDs, with each entry's
|
|
@@ -16,7 +19,7 @@
|
|
|
16
19
|
* concept pages or seeded skill entries change.
|
|
17
20
|
*/
|
|
18
21
|
|
|
19
|
-
import { getLogger } from "
|
|
22
|
+
import { getLogger } from "../logging.js";
|
|
20
23
|
import { getPageMtimeMs, listPages, readPage } from "./page-store.js";
|
|
21
24
|
|
|
22
25
|
// Dynamic import for `./skill-store.js` happens inside `getPageIndex` so that
|
|
@@ -186,7 +189,9 @@ export async function getPageIndex(workspaceDir: string): Promise<PageIndex> {
|
|
|
186
189
|
continue;
|
|
187
190
|
}
|
|
188
191
|
const { page, mtimeMs } = result.value;
|
|
189
|
-
if (!page)
|
|
192
|
+
if (!page) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
190
195
|
if (page.parseWarning !== undefined) {
|
|
191
196
|
parseFailures.push({ slug, error: page.parseWarning, dropped: false });
|
|
192
197
|
}
|
|
@@ -260,7 +265,9 @@ export async function getPageIndex(workspaceDir: string): Promise<PageIndex> {
|
|
|
260
265
|
const resolved: number[] = [];
|
|
261
266
|
for (const targetSlug of draft.outgoingSlugs) {
|
|
262
267
|
const target = bySlug.get(targetSlug);
|
|
263
|
-
if (target)
|
|
268
|
+
if (target) {
|
|
269
|
+
resolved.push(target.id);
|
|
270
|
+
}
|
|
264
271
|
}
|
|
265
272
|
resolved.sort((a, b) => a - b);
|
|
266
273
|
entries[i].edges = resolved;
|
|
@@ -290,7 +297,9 @@ function firstErrorLine(reason: unknown): string {
|
|
|
290
297
|
* specific cache entry; omit it to clear unconditionally.
|
|
291
298
|
*/
|
|
292
299
|
export function invalidatePageIndex(workspaceDir?: string): void {
|
|
293
|
-
if (!cache)
|
|
300
|
+
if (!cache) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
294
303
|
if (workspaceDir === undefined || cache.workspaceDir === workspaceDir) {
|
|
295
304
|
cache = null;
|
|
296
305
|
}
|
|
@@ -305,7 +314,9 @@ export function invalidatePageIndex(workspaceDir?: string): void {
|
|
|
305
314
|
function renderIndex(entries: readonly PageIndexEntry[]): string {
|
|
306
315
|
const lines = entries.map((entry) => {
|
|
307
316
|
const head = `[${entry.id}] ${entry.slug} — ${entry.summary}`;
|
|
308
|
-
if (entry.edges.length === 0)
|
|
317
|
+
if (entry.edges.length === 0) {
|
|
318
|
+
return head;
|
|
319
|
+
}
|
|
309
320
|
return `${head} (edges: ${entry.edges.join(", ")})`;
|
|
310
321
|
});
|
|
311
322
|
return lines.length > 0 ? `${lines.join("\n")}\n` : "";
|
|
@@ -389,9 +400,13 @@ function buildLocalPageIndex(
|
|
|
389
400
|
const localEdges: number[] = [];
|
|
390
401
|
for (const globalEdgeId of entries[i].edges) {
|
|
391
402
|
const target = source.byId.get(globalEdgeId);
|
|
392
|
-
if (!target)
|
|
403
|
+
if (!target) {
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
393
406
|
const localTarget = localBySlug.get(target.slug);
|
|
394
|
-
if (localTarget)
|
|
407
|
+
if (localTarget) {
|
|
408
|
+
localEdges.push(localTarget.id);
|
|
409
|
+
}
|
|
395
410
|
}
|
|
396
411
|
localEdges.sort((a, b) => a - b);
|
|
397
412
|
localEntries[i].edges = localEdges;
|
|
@@ -431,7 +446,9 @@ export function splitTier1(
|
|
|
431
446
|
return { tier1: null, rest: pageIndex };
|
|
432
447
|
}
|
|
433
448
|
const sortedByRecency = [...pageIndex.entries].sort((a, b) => {
|
|
434
|
-
if (a.modifiedAt !== b.modifiedAt)
|
|
449
|
+
if (a.modifiedAt !== b.modifiedAt) {
|
|
450
|
+
return b.modifiedAt - a.modifiedAt;
|
|
451
|
+
}
|
|
435
452
|
return a.slug < b.slug ? -1 : a.slug > b.slug ? 1 : 0;
|
|
436
453
|
});
|
|
437
454
|
const tier1Entries = sortedByRecency.slice(0, tier1Size);
|
|
@@ -471,7 +488,9 @@ export function splitTier2(
|
|
|
471
488
|
.map((entry) => ({ entry, score: scores.get(entry.slug) ?? 0 }))
|
|
472
489
|
.filter((x) => x.score > 0)
|
|
473
490
|
.sort((a, b) => {
|
|
474
|
-
if (a.score !== b.score)
|
|
491
|
+
if (a.score !== b.score) {
|
|
492
|
+
return b.score - a.score;
|
|
493
|
+
}
|
|
475
494
|
return a.entry.slug < b.entry.slug
|
|
476
495
|
? -1
|
|
477
496
|
: a.entry.slug > b.entry.slug
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memory
|
|
2
|
+
* Memory substrate — Concept page store.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the v2 injection engine and memory-v3; active whenever
|
|
5
|
+
* `usesConceptPageMemory()` holds.
|
|
3
6
|
*
|
|
4
7
|
* Owns the on-disk read/write contract for `memory/concepts/<slug>.md`.
|
|
5
8
|
* Pages may live directly under `memory/concepts/` or nested in subdirectories
|
|
@@ -31,7 +34,7 @@ import { dirname, join, relative, sep } from "node:path";
|
|
|
31
34
|
|
|
32
35
|
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
33
36
|
|
|
34
|
-
import { FRONTMATTER_REGEX } from "
|
|
37
|
+
import { FRONTMATTER_REGEX } from "../frontmatter.js";
|
|
35
38
|
import { invalidateEdgeIndex } from "./edge-index.js";
|
|
36
39
|
import { invalidatePageIndex } from "./page-index.js";
|
|
37
40
|
import { type ConceptPage, ConceptPageFrontmatterSchema } from "./types.js";
|
|
@@ -356,23 +359,33 @@ export async function listPages(workspaceDir: string): Promise<string[]> {
|
|
|
356
359
|
if ((err as NodeJS.ErrnoException).code === "ENOENT") {
|
|
357
360
|
// Root missing → return []. Nested missing dir is impossible mid-walk
|
|
358
361
|
// (we only enqueue what readdir surfaced) but treat the same defensively.
|
|
359
|
-
if (dir === root)
|
|
362
|
+
if (dir === root) {
|
|
363
|
+
return [];
|
|
364
|
+
}
|
|
360
365
|
continue;
|
|
361
366
|
}
|
|
362
367
|
throw err;
|
|
363
368
|
}
|
|
364
369
|
|
|
365
370
|
for (const entry of entries) {
|
|
366
|
-
if (entry.name.startsWith("."))
|
|
371
|
+
if (entry.name.startsWith(".")) {
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
367
374
|
const fullPath = join(dir, entry.name);
|
|
368
375
|
if (entry.isDirectory()) {
|
|
369
376
|
queue.push(fullPath);
|
|
370
377
|
continue;
|
|
371
378
|
}
|
|
372
|
-
if (!entry.isFile())
|
|
373
|
-
|
|
379
|
+
if (!entry.isFile()) {
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
if (!entry.name.endsWith(PAGE_EXTENSION)) {
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
374
385
|
// Skip orphaned temp files left behind by a crashed atomic write.
|
|
375
|
-
if (entry.name.includes(".tmp."))
|
|
386
|
+
if (entry.name.includes(".tmp.")) {
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
376
389
|
slugs.push(slugFromConceptPath(root, fullPath));
|
|
377
390
|
}
|
|
378
391
|
}
|
|
@@ -398,21 +411,31 @@ export async function hasConceptPages(workspaceDir: string): Promise<boolean> {
|
|
|
398
411
|
entries = await readdir(dir, { withFileTypes: true });
|
|
399
412
|
} catch (err) {
|
|
400
413
|
if ((err as NodeJS.ErrnoException).code === "ENOENT") {
|
|
401
|
-
if (dir === root)
|
|
414
|
+
if (dir === root) {
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
402
417
|
continue;
|
|
403
418
|
}
|
|
404
419
|
throw err;
|
|
405
420
|
}
|
|
406
421
|
|
|
407
422
|
for (const entry of entries) {
|
|
408
|
-
if (entry.name.startsWith("."))
|
|
423
|
+
if (entry.name.startsWith(".")) {
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
409
426
|
if (entry.isDirectory()) {
|
|
410
427
|
queue.push(join(dir, entry.name));
|
|
411
428
|
continue;
|
|
412
429
|
}
|
|
413
|
-
if (!entry.isFile())
|
|
414
|
-
|
|
415
|
-
|
|
430
|
+
if (!entry.isFile()) {
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
if (!entry.name.endsWith(PAGE_EXTENSION)) {
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
if (entry.name.includes(".tmp.")) {
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
416
439
|
return true;
|
|
417
440
|
}
|
|
418
441
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memory
|
|
2
|
+
* Memory substrate — consolidation prompt template.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the v2 injection engine and memory-v3; active whenever
|
|
5
|
+
* `usesConceptPageMemory()` holds.
|
|
3
6
|
*
|
|
4
7
|
* Body adapted from the live-mode form of the workspace consolidation prompt.
|
|
5
8
|
* The consolidation job calls `wakeAgentForOpportunity()` so the assistant
|
|
@@ -18,10 +21,10 @@
|
|
|
18
21
|
* the convention established for the sweep prompt.
|
|
19
22
|
*/
|
|
20
23
|
|
|
21
|
-
import { truncate } from "
|
|
22
|
-
import { getLogger } from "
|
|
23
|
-
import { getWorkspaceDir } from "
|
|
24
|
-
import { loadPromptOverride } from "
|
|
24
|
+
import { truncate } from "../../host-utils.js";
|
|
25
|
+
import { getLogger } from "../../logging.js";
|
|
26
|
+
import { getWorkspaceDir } from "../../paths.js";
|
|
27
|
+
import { loadPromptOverride } from "../../prompt-override.js";
|
|
25
28
|
import type { PageParseFailure } from "../page-index.js";
|
|
26
29
|
|
|
27
30
|
const log = getLogger("memory-v2-consolidate-prompt");
|
|
@@ -111,7 +114,7 @@ export const CORE_PAGES_PLACEHOLDER = "{{CORE_PAGES_SECTION}}";
|
|
|
111
114
|
|
|
112
115
|
/**
|
|
113
116
|
* Legacy placeholder kept only for backward compatibility. A custom
|
|
114
|
-
* `
|
|
117
|
+
* `consolidation_prompt_path` override copied from an older bundled
|
|
115
118
|
* prompt may still contain `{{PROC_TO_SKILLS_SECTION}}`; it is always replaced
|
|
116
119
|
* with an empty string so the raw token never reaches the consolidation LLM.
|
|
117
120
|
*/
|
|
@@ -929,7 +932,8 @@ export function renderConsolidationPrompt(
|
|
|
929
932
|
|
|
930
933
|
/**
|
|
931
934
|
* Load the consolidation prompt template, optionally overridden from the file
|
|
932
|
-
* referenced by `
|
|
935
|
+
* referenced by the `consolidation_prompt_path` substrate tunable, then
|
|
936
|
+
* substitute
|
|
933
937
|
* `{{CUTOFF}}`. File loading (path resolution, size guard, and the permissive
|
|
934
938
|
* fall-back to the bundled prompt on a missing/unreadable/empty/oversized
|
|
935
939
|
* override) is handled by the shared {@link loadPromptOverride}.
|
|
@@ -958,7 +962,9 @@ export function resolveConsolidationPrompt(
|
|
|
958
962
|
log,
|
|
959
963
|
label: "consolidation prompt",
|
|
960
964
|
});
|
|
961
|
-
if (override === null)
|
|
965
|
+
if (override === null) {
|
|
966
|
+
return renderConsolidationPrompt(cutoff, options);
|
|
967
|
+
}
|
|
962
968
|
|
|
963
969
|
const substituted = substitutePlaceholders(override, cutoff, options);
|
|
964
970
|
if (override.includes(PARSE_FAILURES_PLACEHOLDER)) {
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memory
|
|
2
|
+
* Memory substrate — sweep prompt template.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the v2 injection engine and memory-v3; active whenever
|
|
5
|
+
* `usesConceptPageMemory()` holds.
|
|
3
6
|
*
|
|
4
7
|
* Body taken from §9 of the design doc (`memoized-spinning-wadler.md`). The
|
|
5
8
|
* template uses two placeholders that the sweep job substitutes at runtime:
|