@vellumai/assistant 0.8.8 → 0.8.9-dev.202606091853.fbaa2ae
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +6 -6
- package/bun.lock +2 -2
- package/docs/activation-funnel-telemetry.md +310 -0
- package/examples/plugins/echo/README.md +61 -60
- package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
- package/examples/plugins/echo/hooks/stop.ts +16 -0
- package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
- package/examples/plugins/echo/package.json +1 -2
- package/examples/plugins/echo/src/emit.ts +19 -0
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
- package/openapi.yaml +263 -121
- package/package.json +2 -2
- package/src/__tests__/activation-early-marking.test.ts +120 -0
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
- package/src/__tests__/agent-loop-exit-reason.test.ts +204 -144
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
- package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
- package/src/__tests__/agent-loop-thinking.test.ts +36 -20
- package/src/__tests__/agent-loop.test.ts +441 -96
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
- package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
- package/src/__tests__/anthropic-provider.test.ts +23 -8
- package/src/__tests__/app-builder-tool-scripts.test.ts +21 -0
- package/src/__tests__/app-control-flow.test.ts +1 -1
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +132 -0
- package/src/__tests__/approval-cascade.test.ts +6 -5
- package/src/__tests__/approval-routes-http.test.ts +4 -1
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/compaction-circuit.test.ts +258 -0
- package/src/__tests__/compaction-direct.test.ts +146 -0
- package/src/__tests__/compaction-events.test.ts +7 -7
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/compactor-web-search-strip.test.ts +213 -0
- package/src/__tests__/context-overflow-reducer.test.ts +265 -125
- package/src/__tests__/context-window-manager-compact-retry.test.ts +121 -15
- package/src/__tests__/conversation-abort-tool-results.test.ts +7 -5
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +78 -119
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +158 -234
- package/src/__tests__/conversation-agent-loop.test.ts +342 -623
- package/src/__tests__/conversation-clean-command.test.ts +5 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -5
- package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
- package/src/__tests__/conversation-error.test.ts +15 -1
- package/src/__tests__/conversation-history-web-search.test.ts +6 -1
- package/src/__tests__/conversation-media-retry.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +44 -4
- package/src/__tests__/conversation-process-callsite.test.ts +15 -15
- package/src/__tests__/conversation-provider-retry-repair.test.ts +66 -65
- package/src/__tests__/conversation-queue.test.ts +10 -10
- package/src/__tests__/conversation-runtime-assembly.test.ts +1059 -231
- package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
- package/src/__tests__/conversation-slash-queue.test.ts +7 -5
- package/src/__tests__/conversation-slash-unknown.test.ts +7 -5
- package/src/__tests__/conversation-speed-override.test.ts +11 -10
- package/src/__tests__/conversation-starter-routes.test.ts +14 -6
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +395 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +48 -1
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +73 -4
- package/src/__tests__/conversation-undo.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +24 -21
- package/src/__tests__/conversation-workspace-injection.test.ts +69 -7
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +15 -12
- package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
- package/src/__tests__/corrected-target.test.ts +93 -0
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/cu-unified-flow.test.ts +36 -0
- package/src/__tests__/db-acp-history.test.ts +101 -0
- package/src/__tests__/dynamic-page-surface.test.ts +31 -0
- package/src/__tests__/empty-response-hook.test.ts +1 -1
- package/src/__tests__/file-write-tool.test.ts +63 -0
- package/src/__tests__/gateway-only-guard.test.ts +17 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +93 -4
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/history-repair-hook.test.ts +5 -1
- package/src/__tests__/host-app-control-proxy.test.ts +45 -0
- package/src/__tests__/host-app-control-routes.test.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
- package/src/__tests__/inference-profile-reaper.test.ts +62 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
- package/src/__tests__/injector-background-turn.test.ts +13 -23
- package/src/__tests__/injector-chain.test.ts +268 -44
- package/src/__tests__/injector-disk-pressure.test.ts +210 -52
- package/src/__tests__/injector-document-comments.test.ts +97 -114
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-v3-suppression.test.ts +4 -4
- package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
- package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
- package/src/__tests__/llm-resolver.test.ts +73 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +156 -38
- package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
- package/src/__tests__/notification-decision-strategy.test.ts +3 -3
- package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +145 -0
- package/src/__tests__/persist-unsendable-image.test.ts +97 -1
- package/src/__tests__/plugin-api-shim.test.ts +6 -9
- package/src/__tests__/plugin-bootstrap.test.ts +91 -81
- package/src/__tests__/plugin-registry.test.ts +3 -49
- package/src/__tests__/plugin-skill-contribution.test.ts +15 -14
- package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
- package/src/__tests__/plugin-types.test.ts +0 -70
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +69 -0
- package/src/__tests__/pre-model-call-sanitize.test.ts +109 -0
- package/src/__tests__/published-app-updater.test.ts +138 -0
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +4 -1
- package/src/__tests__/skill-feature-flags-integration.test.ts +31 -0
- package/src/__tests__/steer-tool-repair.test.ts +1 -1
- package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
- package/src/__tests__/subagent-detail.test.ts +25 -7
- package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
- package/src/__tests__/subagent-manager-notify.test.ts +1 -3
- package/src/__tests__/subagent-notify-parent.test.ts +1 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
- package/src/__tests__/title-generate-hook.test.ts +5 -1
- package/src/__tests__/tool-error-hook.test.ts +1 -1
- package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
- package/src/__tests__/user-plugin-loader.test.ts +54 -286
- package/src/__tests__/web-fetch.test.ts +45 -0
- package/src/acp/__tests__/agent-process.test.ts +161 -0
- package/src/acp/__tests__/client-handler.test.ts +40 -0
- package/src/acp/__tests__/helpers/acp-config-stub.ts +0 -2
- package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
- package/src/acp/__tests__/helpers/exec-file-stub.ts +106 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +97 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
- package/src/acp/__tests__/session-manager-resume.test.ts +888 -0
- package/src/acp/agent-process.ts +61 -1
- package/src/acp/auto-install.test.ts +280 -0
- package/src/acp/auto-install.ts +232 -0
- package/src/acp/client-handler.ts +31 -0
- package/src/acp/prepare-agent-env.ts +80 -27
- package/src/acp/resolve-agent.test.ts +188 -28
- package/src/acp/resolve-agent.ts +119 -42
- package/src/acp/resume-hint.ts +23 -0
- package/src/acp/session-manager.ts +507 -73
- package/src/agent/compaction-circuit.ts +60 -102
- package/src/agent/loop.ts +403 -251
- package/src/api/responses/conversation-message.ts +22 -2
- package/src/api/responses/memory-v3-selection-log.ts +19 -10
- package/src/approvals/guardian-request-resolvers.ts +27 -1
- package/src/background-wake/next-wake.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3.test.ts +191 -210
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
- package/src/cli/commands/memory-v3.ts +57 -199
- package/src/cli/commands/plugins.ts +43 -37
- package/src/cli/lib/__tests__/install-from-github.test.ts +790 -111
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
- package/src/cli/lib/__tests__/plugin-details.test.ts +381 -0
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +270 -0
- package/src/cli/lib/__tests__/search-plugins.test.ts +233 -32
- package/src/cli/lib/install-from-github.ts +797 -60
- package/src/cli/lib/plugin-catalog-cache.ts +84 -0
- package/src/cli/lib/plugin-details.ts +416 -0
- package/src/cli/lib/plugin-marketplace.ts +215 -0
- package/src/cli/lib/search-plugins.ts +201 -29
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/acp-defaults.test.ts +10 -0
- package/src/config/acp-defaults.ts +9 -3
- package/src/config/acp-schema.ts +1 -7
- package/src/config/bundled-skills/acp/SKILL.md +80 -41
- package/src/config/bundled-skills/acp/TOOLS.json +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
- package/src/config/bundled-skills/app-builder/TOOLS.json +72 -2
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
- package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +18 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
- package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
- package/src/config/bundled-tool-registry.ts +4 -0
- package/src/config/call-site-defaults.ts +0 -3
- package/src/config/feature-flag-registry.json +10 -16
- package/src/config/llm-resolver.ts +39 -7
- package/src/config/schemas/__tests__/memory-v3.test.ts +25 -9
- package/src/config/schemas/call-site-catalog.ts +0 -21
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm.ts +17 -3
- package/src/config/schemas/memory-v3.ts +58 -8
- package/src/config/seed-inference-profiles.ts +18 -0
- package/src/context/compactor.ts +22 -4
- package/src/context/post-turn-tool-result-truncation.ts +39 -1
- package/src/context/strip-injections.ts +8 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +18 -36
- package/src/daemon/conversation-agent-loop.ts +308 -1297
- package/src/daemon/conversation-error.ts +31 -4
- package/src/daemon/conversation-history.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +11 -255
- package/src/daemon/conversation-media-retry.ts +19 -6
- package/src/daemon/conversation-messaging.ts +17 -0
- package/src/daemon/conversation-process.ts +22 -141
- package/src/daemon/conversation-queue-manager.ts +8 -0
- package/src/daemon/conversation-registry.ts +159 -0
- package/src/daemon/conversation-runtime-assembly.ts +361 -393
- package/src/daemon/conversation-store.ts +9 -90
- package/src/daemon/conversation-surfaces.ts +165 -11
- package/src/daemon/conversation-workspace.ts +17 -0
- package/src/daemon/conversation.ts +444 -62
- package/src/daemon/disk-pressure-policy.ts +0 -1
- package/src/daemon/external-plugins-bootstrap.ts +36 -46
- package/src/daemon/handlers/config-channels.ts +11 -2
- package/src/daemon/handlers/conversations.ts +3 -1
- package/src/daemon/handlers/skills.ts +4 -1
- package/src/daemon/host-app-control-proxy.ts +72 -57
- package/src/daemon/host-proxy-preactivation.ts +1 -3
- package/src/daemon/lifecycle.ts +21 -7
- package/src/daemon/persist-unsendable-image.ts +62 -25
- package/src/daemon/process-message.ts +1 -1
- package/src/daemon/server.ts +2 -0
- package/src/daemon/tool-side-effects.ts +15 -0
- package/src/daemon/wake-conversation-ops.ts +269 -0
- package/src/embedded/plugin-api.ts +2 -2
- package/src/export/__tests__/transcript-formatter.test.ts +5 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
- package/src/heartbeat/heartbeat-run-store.ts +23 -1
- package/src/heartbeat/heartbeat-service.ts +26 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
- package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
- package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
- package/src/ipc/skill-routes/memory.ts +4 -2
- package/src/memory/__tests__/activation-session-store.test.ts +41 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
- package/src/memory/__tests__/onboarding-events-store.test.ts +80 -0
- package/src/memory/activation-session-store.ts +43 -0
- package/src/memory/conversation-crud.ts +29 -19
- package/src/memory/conversation-starter-checkpoints.ts +1 -0
- package/src/memory/db-init.ts +6 -0
- package/src/memory/job-handlers/conversation-starters.ts +13 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
- package/src/memory/jobs-worker.ts +25 -1
- package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
- package/src/memory/migrations/273-onboarding-events-funnel-columns.ts +46 -0
- package/src/memory/migrations/274-create-activation-sessions.ts +15 -0
- package/src/memory/migrations/index.ts +3 -0
- package/src/memory/onboarding-events-store.ts +66 -18
- package/src/memory/schema/acp.ts +4 -0
- package/src/memory/schema/infrastructure.ts +13 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +4 -97
- package/src/memory/v2/__tests__/page-store.test.ts +22 -0
- package/src/memory/v2/consolidation-job.ts +2 -63
- package/src/memory/v2/types.ts +5 -0
- package/src/messaging/providers/telegram-bot/api.ts +14 -5
- package/src/notifications/__tests__/copy-composer.test.ts +244 -0
- package/src/notifications/access-request-copy.ts +298 -0
- package/src/notifications/adapters/slack.ts +3 -3
- package/src/notifications/adapters/telegram.ts +9 -2
- package/src/notifications/copy-composer.ts +49 -267
- package/src/notifications/decision-engine.ts +16 -35
- package/src/notifications/home-feed-side-effect.ts +1 -6
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +40 -11
- package/src/plugin-api/types.ts +108 -0
- package/src/plugins/defaults/compaction/compact.ts +106 -0
- package/src/{daemon → plugins/defaults/compaction}/context-overflow-reducer.ts +250 -42
- package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
- package/src/plugins/defaults/compaction/manager-store.ts +57 -0
- package/src/plugins/defaults/compaction/package.json +1 -2
- package/src/{context → plugins/defaults/compaction}/window-manager.ts +95 -25
- package/src/plugins/defaults/empty-response/package.json +0 -1
- package/src/plugins/defaults/history-repair/package.json +0 -1
- package/src/plugins/defaults/index.ts +156 -26
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +100 -52
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +285 -0
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
- package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
- package/src/plugins/defaults/memory-retrieval/package.json +14 -0
- package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +71 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/dense.test.ts +181 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/edge.test.ts +247 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +147 -134
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +456 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +662 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +306 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +91 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +402 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-needle.test.ts +135 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/sections.test.ts +125 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +74 -19
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +446 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +592 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -24
- package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +91 -0
- package/src/plugins/defaults/memory-v3-shadow/dense.ts +97 -0
- package/src/plugins/defaults/memory-v3-shadow/edge.ts +252 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +76 -0
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +555 -0
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +266 -0
- package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +71 -0
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +204 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +16 -8
- package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +236 -0
- package/src/plugins/defaults/memory-v3-shadow/section-needle.ts +200 -0
- package/src/plugins/defaults/memory-v3-shadow/sections.ts +115 -0
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +156 -0
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +382 -0
- package/src/plugins/defaults/memory-v3-shadow/types.ts +92 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +4 -1
- package/src/plugins/defaults/title-generate/package.json +0 -1
- package/src/plugins/defaults/tool-error/package.json +0 -1
- package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
- package/src/plugins/external-api.ts +12 -2
- package/src/plugins/pipeline.ts +6 -293
- package/src/plugins/registry.ts +9 -37
- package/src/plugins/types.ts +76 -381
- package/src/plugins/user-loader.ts +30 -127
- package/src/prompts/__tests__/system-prompt.test.ts +6 -0
- package/src/prompts/system-prompt.ts +61 -10
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +71 -4
- package/src/providers/anthropic/client.ts +9 -10
- package/src/providers/inference/kimi-cjk-token-ids.ts +493 -0
- package/src/providers/inference/logit-bias.ts +55 -0
- package/src/providers/model-catalog.ts +34 -0
- package/src/providers/openai/__tests__/vision-not-supported.test.ts +75 -0
- package/src/providers/openai/chat-completions-provider.ts +44 -1
- package/src/providers/retry.ts +22 -0
- package/src/providers/types.ts +6 -0
- package/src/runtime/__tests__/agent-wake.test.ts +555 -691
- package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
- package/src/runtime/agent-wake.ts +108 -209
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/channel-approvals.ts +1 -1
- package/src/runtime/interactive-ui.ts +1 -1
- package/src/runtime/routes/__tests__/acp-routes.test.ts +466 -55
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +423 -73
- package/src/runtime/routes/__tests__/stt-routes.test.ts +112 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
- package/src/runtime/routes/acp-routes.test.ts +185 -32
- package/src/runtime/routes/acp-routes.ts +328 -30
- package/src/runtime/routes/app-management-routes.ts +3 -0
- package/src/runtime/routes/approval-routes.ts +1 -1
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/browser-tabs-routes.ts +6 -10
- package/src/runtime/routes/channel-verification-routes.ts +14 -5
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-list-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +1 -1
- package/src/runtime/routes/conversation-routes.ts +30 -2
- package/src/runtime/routes/conversation-starter-routes.ts +13 -7
- package/src/runtime/routes/conversations-import-routes.ts +24 -7
- package/src/runtime/routes/host-app-control-routes.ts +1 -1
- package/src/runtime/routes/host-cu-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +18 -3
- package/src/runtime/routes/inbound-message-handler.ts +1 -1
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
- package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
- package/src/runtime/routes/memory-v3-routes.ts +65 -305
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +337 -35
- package/src/runtime/routes/stt-routes.ts +45 -12
- package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
- package/src/runtime/routes/work-items-routes.ts +2 -4
- package/src/runtime/routes/workspace-routes.ts +50 -15
- package/src/runtime/services/conversation-serializer.ts +1 -1
- package/src/runtime/verification-outbound-actions.ts +147 -2
- package/src/runtime/verification-templates.ts +29 -3
- package/src/services/published-app-updater.ts +30 -8
- package/src/signals/cancel.ts +2 -4
- package/src/subagent/manager.ts +21 -5
- package/src/telemetry/__tests__/activation-funnel.test.ts +95 -0
- package/src/telemetry/activation-funnel.ts +167 -0
- package/src/telemetry/types.ts +13 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +154 -0
- package/src/telemetry/usage-telemetry-reporter.ts +26 -1
- package/src/tools/acp/context.ts +20 -0
- package/src/tools/acp/list-agents.test.ts +9 -19
- package/src/tools/acp/list-agents.ts +3 -15
- package/src/tools/acp/spawn.test.ts +173 -202
- package/src/tools/acp/spawn.ts +37 -172
- package/src/tools/acp/steer.test.ts +105 -8
- package/src/tools/acp/steer.ts +48 -17
- package/src/tools/apps/executors.ts +166 -50
- package/src/tools/browser/browser-execution.ts +12 -2
- package/src/tools/filesystem/write.ts +34 -0
- package/src/tools/network/web-fetch.ts +65 -24
- package/src/tools/skills/load.ts +1 -1
- package/src/tools/subagent/spawn.ts +2 -4
- package/src/tools/ui-surface/definitions.ts +32 -5
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
- package/docs/plugins.md +0 -832
- package/examples/plugins/echo/register.ts +0 -143
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
- package/src/__tests__/compaction-pipeline.test.ts +0 -210
- package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
- package/src/__tests__/pipeline-runner.test.ts +0 -554
- package/src/daemon/wake-target-adapter.ts +0 -253
- package/src/memory/v3/__tests__/assign.test.ts +0 -242
- package/src/memory/v3/__tests__/capabilities.test.ts +0 -118
- package/src/memory/v3/__tests__/core.test.ts +0 -39
- package/src/memory/v3/__tests__/health.test.ts +0 -219
- package/src/memory/v3/__tests__/maintain-job.test.ts +0 -288
- package/src/memory/v3/__tests__/needle.test.ts +0 -107
- package/src/memory/v3/__tests__/orchestrate.test.ts +0 -436
- package/src/memory/v3/__tests__/provider-blocks.test.ts +0 -13
- package/src/memory/v3/__tests__/reconcile.test.ts +0 -274
- package/src/memory/v3/__tests__/render-injection.test.ts +0 -61
- package/src/memory/v3/__tests__/router.test.ts +0 -332
- package/src/memory/v3/__tests__/selector.test.ts +0 -470
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +0 -432
- package/src/memory/v3/__tests__/snapshot.test.ts +0 -168
- package/src/memory/v3/__tests__/tree.test.ts +0 -192
- package/src/memory/v3/assign.ts +0 -268
- package/src/memory/v3/capabilities.ts +0 -124
- package/src/memory/v3/core.ts +0 -26
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +0 -314
- package/src/memory/v3/needle.ts +0 -115
- package/src/memory/v3/orchestrate.ts +0 -126
- package/src/memory/v3/page-content.ts +0 -34
- package/src/memory/v3/provider-blocks.ts +0 -26
- package/src/memory/v3/reconcile.ts +0 -523
- package/src/memory/v3/router.ts +0 -190
- package/src/memory/v3/selection-log-store.ts +0 -84
- package/src/memory/v3/selector.ts +0 -226
- package/src/memory/v3/shadow-plugin.ts +0 -411
- package/src/memory/v3/snapshot.ts +0 -209
- package/src/memory/v3/tree.ts +0 -174
- package/src/memory/v3/types.ts +0 -59
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
- package/src/plugins/defaults/circuit-breaker/package.json +0 -15
- package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
- package/src/plugins/defaults/compaction/register.ts +0 -35
- package/src/plugins/defaults/compaction/terminal.ts +0 -73
- package/src/plugins/defaults/empty-response/register.ts +0 -23
- package/src/plugins/defaults/history-repair/register.ts +0 -24
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +0 -216
- package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
- package/src/plugins/defaults/overflow-reduce/package.json +0 -15
- package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
- package/src/plugins/defaults/title-generate/register.ts +0 -35
- package/src/plugins/defaults/tool-error/register.ts +0 -23
- package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
- package/src/proactive-artifact/aux-message-injector.ts +0 -97
- package/src/proactive-artifact/decision.test.ts +0 -226
- package/src/proactive-artifact/decision.ts +0 -165
- package/src/proactive-artifact/index.ts +0 -7
- package/src/proactive-artifact/job.test.ts +0 -962
- package/src/proactive-artifact/job.ts +0 -372
- package/src/proactive-artifact/message-copy.ts +0 -58
- package/src/proactive-artifact/trigger-state.test.ts +0 -286
- package/src/proactive-artifact/trigger-state.ts +0 -123
- package/src/util/map-limit.ts +0 -27
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
|
@@ -1,268 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memory v3 route definitions —
|
|
3
|
-
*
|
|
2
|
+
* Memory v3 route definitions — live-lane maintenance operations for the
|
|
3
|
+
* section-lane memory model.
|
|
4
4
|
*
|
|
5
|
-
* The daemon owns the live
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* write. The read-only `health` report and the `set-core` cost preview also
|
|
9
|
-
* route through the daemon so it stays the single source of truth for the live
|
|
10
|
-
* workspace tree.
|
|
5
|
+
* The daemon owns the live shadow lanes, so the maintenance verbs run here,
|
|
6
|
+
* inside the daemon process, where the in-memory lanes can be invalidated or
|
|
7
|
+
* rebuilt after a write:
|
|
11
8
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
9
|
+
* - `rebuild-index` — drop the cached lanes so the next turn rebuilds.
|
|
10
|
+
* - `backfill-sections` — one-time full embed of every page's sections into
|
|
11
|
+
* the dense store, advancing the maintain high-water mark.
|
|
12
|
+
*
|
|
13
|
+
* Each route's behavior lives in a small DI-friendly `handle*` function (with an
|
|
14
|
+
* injectable config seam) so tests can drive it without mocking module globals.
|
|
15
|
+
* The exported `RouteDefinition`s are thin adapters over those handlers.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import { writeFile } from "node:fs/promises";
|
|
19
|
-
import { join } from "node:path";
|
|
20
|
-
|
|
21
18
|
import { z } from "zod";
|
|
22
19
|
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import { invalidateLanes } from "../../memory/v3/shadow-plugin.js";
|
|
28
|
-
import {
|
|
29
|
-
coreSlugs,
|
|
30
|
-
loadLeafTree,
|
|
31
|
-
resolveDataDir,
|
|
32
|
-
} from "../../memory/v3/tree.js";
|
|
33
|
-
import type { LeafPath, LeafTree, Slug } from "../../memory/v3/types.js";
|
|
20
|
+
import { getConfig } from "../../config/loader.js";
|
|
21
|
+
import type { AssistantConfig } from "../../config/types.js";
|
|
22
|
+
import { backfillAllSections } from "../../plugins/defaults/memory-v3-shadow/maintain-job.js";
|
|
23
|
+
import { invalidateLanes } from "../../plugins/defaults/memory-v3-shadow/shadow-plugin.js";
|
|
34
24
|
import { getLogger } from "../../util/logger.js";
|
|
35
|
-
import { getWorkspaceDir } from "../../util/platform.js";
|
|
36
25
|
import { ACTOR_PRINCIPALS, type RoutePolicy } from "../auth/route-policy.js";
|
|
37
|
-
import {
|
|
38
|
-
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
26
|
+
import type { RouteDefinition } from "./types.js";
|
|
39
27
|
|
|
40
28
|
const log = getLogger("memory-v3-routes");
|
|
41
29
|
|
|
42
|
-
/**
|
|
43
|
-
* Filesystem location overrides. Production callers omit these and the handlers
|
|
44
|
-
* resolve the live workspace; tests inject a temp workspace + data dir to
|
|
45
|
-
* exercise the handlers without mocking module globals.
|
|
46
|
-
*/
|
|
47
|
-
export interface MemoryV3Deps {
|
|
48
|
-
dataDir?: string;
|
|
49
|
-
workspaceDir?: string;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// ---------------------------------------------------------------------------
|
|
53
|
-
// Shared loading helpers
|
|
54
|
-
// ---------------------------------------------------------------------------
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Load the live leaf tree + its full slug universe.
|
|
58
|
-
*
|
|
59
|
-
* Page `leaves:` frontmatter is the authoritative source of page→leaf
|
|
60
|
-
* membership: we build a `pageLeaves` map from the page index and union it over
|
|
61
|
-
* `assignments.json` via `loadLeafTree(dataDir, pageLeaves)`, and derive the
|
|
62
|
-
* slug universe (`allSlugs`) from the page index itself. This mirrors
|
|
63
|
-
* `maybePrependV3Health` in `memory/v2/consolidation-job.ts` so the CLI
|
|
64
|
-
* `health` / `set-core` cost computations agree with the consolidation-injected
|
|
65
|
-
* health block instead of disagreeing by reading stale assignments.json only.
|
|
66
|
-
*/
|
|
67
|
-
async function loadTreeAndSlugs(deps?: MemoryV3Deps): Promise<{
|
|
68
|
-
dataDir: string;
|
|
69
|
-
tree: LeafTree;
|
|
70
|
-
allSlugs: Slug[];
|
|
71
|
-
}> {
|
|
72
|
-
const workspaceDir = deps?.workspaceDir ?? getWorkspaceDir();
|
|
73
|
-
const dataDir = deps?.dataDir ?? resolveDataDir();
|
|
74
|
-
|
|
75
|
-
// Each page contributes its `leaves:` frontmatter as the authoritative leaf
|
|
76
|
-
// set for that slug; the slug universe is every page the index knows about.
|
|
77
|
-
const pageIndex = await getPageIndex(workspaceDir);
|
|
78
|
-
const pageLeaves = new Map<Slug, LeafPath[]>();
|
|
79
|
-
const allSlugs: Slug[] = [];
|
|
80
|
-
for (const entry of pageIndex.entries) {
|
|
81
|
-
pageLeaves.set(entry.slug, entry.leaves);
|
|
82
|
-
allSlugs.push(entry.slug);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const tree = await loadLeafTree(dataDir, pageLeaves);
|
|
86
|
-
return { dataDir, tree, allSlugs };
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ---------------------------------------------------------------------------
|
|
90
|
-
// health
|
|
91
|
-
// ---------------------------------------------------------------------------
|
|
92
|
-
|
|
93
|
-
const MemoryV3HealthResultSchema = z.object({
|
|
94
|
-
/** Pre-rendered, human-readable report. Empty string when all-green. */
|
|
95
|
-
rendered: z.string(),
|
|
96
|
-
/** The structural counts, for `--json` consumers. */
|
|
97
|
-
counts: z.object({
|
|
98
|
-
unassigned: z.number(),
|
|
99
|
-
danglingRefs: z.number(),
|
|
100
|
-
novelClusters: z.number(),
|
|
101
|
-
oversizedLeaves: z.number(),
|
|
102
|
-
tinyLeaves: z.number(),
|
|
103
|
-
}),
|
|
104
|
-
});
|
|
105
|
-
export type MemoryV3HealthResult = z.infer<typeof MemoryV3HealthResultSchema>;
|
|
106
|
-
|
|
107
|
-
export async function handleMemoryV3Health(
|
|
108
|
-
deps?: MemoryV3Deps,
|
|
109
|
-
): Promise<MemoryV3HealthResult> {
|
|
110
|
-
const { dataDir, tree, allSlugs } = await loadTreeAndSlugs(deps);
|
|
111
|
-
const core = await loadCore(dataDir);
|
|
112
|
-
const report = computeV3Health({ tree, allSlugs, core });
|
|
113
|
-
return {
|
|
114
|
-
rendered: renderV3Health(report),
|
|
115
|
-
counts: {
|
|
116
|
-
unassigned: report.unassigned.length,
|
|
117
|
-
danglingRefs: report.danglingRefs.length,
|
|
118
|
-
novelClusters: report.novelClusters.length,
|
|
119
|
-
oversizedLeaves: report.oversizedLeaves.length,
|
|
120
|
-
tinyLeaves: report.tinyLeaves.length,
|
|
121
|
-
},
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// ---------------------------------------------------------------------------
|
|
126
|
-
// set-core
|
|
127
|
-
// ---------------------------------------------------------------------------
|
|
128
|
-
|
|
129
|
-
const MemoryV3SetCoreBodySchema = z.object({
|
|
130
|
-
/** Leaves to add to the always-on core set. */
|
|
131
|
-
add: z.array(z.string()).optional(),
|
|
132
|
-
/** Leaves to remove from the always-on core set. */
|
|
133
|
-
remove: z.array(z.string()).optional(),
|
|
134
|
-
/**
|
|
135
|
-
* When true, persist the new core to `core.json` and invalidate the lanes.
|
|
136
|
-
* When false (default), compute the preview WITHOUT writing.
|
|
137
|
-
*/
|
|
138
|
-
write: z.boolean().optional(),
|
|
139
|
-
});
|
|
140
|
-
export type MemoryV3SetCoreBody = z.infer<typeof MemoryV3SetCoreBodySchema>;
|
|
141
|
-
|
|
142
|
-
const MemoryV3SetCoreResultSchema = z.object({
|
|
143
|
-
/** The core leaf set that would result (or did result, when `write`). */
|
|
144
|
-
nextCore: z.array(z.string()),
|
|
145
|
-
/** Number of unique page slugs the new core set pins always-on. */
|
|
146
|
-
alwaysOnPageCount: z.number(),
|
|
147
|
-
/** Whether `core.json` was written. */
|
|
148
|
-
written: z.boolean(),
|
|
149
|
-
});
|
|
150
|
-
export type MemoryV3SetCoreResult = z.infer<typeof MemoryV3SetCoreResultSchema>;
|
|
151
|
-
|
|
152
|
-
/** Wire-format error code for a `set-core` add referencing an unknown leaf. */
|
|
153
|
-
export const MEMORY_V3_UNKNOWN_LEAF_CODE = "MEMORY_V3_UNKNOWN_LEAF";
|
|
154
|
-
|
|
155
|
-
/** Thrown when a `set-core` add entry does not exist in the live tree. */
|
|
156
|
-
export class UnknownLeafError extends Error {
|
|
157
|
-
constructor(public readonly unknown: LeafPath[]) {
|
|
158
|
-
super(
|
|
159
|
-
`Unknown leaf path(s) — not present in the tree: ${unknown.join(", ")}`,
|
|
160
|
-
);
|
|
161
|
-
this.name = "UnknownLeafError";
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/** Persist the always-on core set back to `<dataDir>/core.json`. */
|
|
166
|
-
async function writeCore(dataDir: string, alwaysOn: LeafPath[]): Promise<void> {
|
|
167
|
-
await writeFile(
|
|
168
|
-
join(dataDir, "core.json"),
|
|
169
|
-
`${JSON.stringify({ alwaysOn }, null, 2)}\n`,
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
export async function handleMemoryV3SetCore(
|
|
174
|
-
body: MemoryV3SetCoreBody,
|
|
175
|
-
deps?: MemoryV3Deps,
|
|
176
|
-
): Promise<MemoryV3SetCoreResult> {
|
|
177
|
-
const add = body.add ?? [];
|
|
178
|
-
const remove = body.remove ?? [];
|
|
179
|
-
const { dataDir, tree } = await loadTreeAndSlugs(deps);
|
|
180
|
-
|
|
181
|
-
// Validate every ADD entry exists in the live tree. Removing an entry that is
|
|
182
|
-
// already absent is a no-op (idempotent), so only adds are validated.
|
|
183
|
-
const unknown = add.filter((leaf) => !tree.leaves.has(leaf));
|
|
184
|
-
if (unknown.length > 0) throw new UnknownLeafError(unknown);
|
|
185
|
-
|
|
186
|
-
const core = await loadCore(dataDir);
|
|
187
|
-
for (const leaf of remove) core.delete(leaf);
|
|
188
|
-
for (const leaf of add) core.add(leaf);
|
|
189
|
-
|
|
190
|
-
// Drop any pre-existing core entry that no longer maps to a live leaf, so the
|
|
191
|
-
// preview reflects what the tree can actually pin. Sorted for stable output.
|
|
192
|
-
const nextCore = [...core].filter((leaf) => tree.leaves.has(leaf)).sort();
|
|
193
|
-
const nextCoreSet = new Set<LeafPath>(nextCore);
|
|
194
|
-
|
|
195
|
-
// Cost preview: the number of UNIQUE page slugs the new core pins always-on.
|
|
196
|
-
const alwaysOnPageCount = coreSlugs(tree, nextCoreSet).size;
|
|
197
|
-
|
|
198
|
-
if (body.write === true) {
|
|
199
|
-
await writeCore(dataDir, nextCore);
|
|
200
|
-
invalidateLanes();
|
|
201
|
-
log.info(
|
|
202
|
-
{ coreSize: nextCore.length, alwaysOnPageCount },
|
|
203
|
-
"memory-v3 core updated",
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
return { nextCore, alwaysOnPageCount, written: body.write === true };
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// ---------------------------------------------------------------------------
|
|
211
|
-
// reconcile
|
|
212
|
-
// ---------------------------------------------------------------------------
|
|
213
|
-
|
|
214
|
-
const MemoryV3ReconcileResultSchema = z.object({
|
|
215
|
-
renames: z.array(
|
|
216
|
-
z.object({
|
|
217
|
-
id: z.string().optional(),
|
|
218
|
-
oldPath: z.string(),
|
|
219
|
-
newPath: z.string(),
|
|
220
|
-
}),
|
|
221
|
-
),
|
|
222
|
-
deleted: z.array(z.string()),
|
|
223
|
-
prunedCore: z.array(z.string()),
|
|
224
|
-
});
|
|
225
|
-
export type MemoryV3ReconcileResult = z.infer<
|
|
226
|
-
typeof MemoryV3ReconcileResultSchema
|
|
227
|
-
>;
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Reconcile page + core references against the live on-disk tree.
|
|
231
|
-
*
|
|
232
|
-
* `prevLeaves` describes the tree as it was BEFORE the maintainer's on-disk
|
|
233
|
-
* restructuring. We derive it from the current leaf set, which makes reconcile
|
|
234
|
-
* a safe convergence pass: renames/deletes already applied on disk diff to
|
|
235
|
-
* nothing, while it still rewrites any page/core ref left dangling and prunes
|
|
236
|
-
* stale core entries (and fail-closed restores on a residual dangling ref).
|
|
237
|
-
* `reconcileTree` snapshots, applies, validates, and invalidates the lanes.
|
|
238
|
-
*/
|
|
239
|
-
export async function handleMemoryV3Reconcile(
|
|
240
|
-
deps?: MemoryV3Deps,
|
|
241
|
-
): Promise<MemoryV3ReconcileResult> {
|
|
242
|
-
const workspaceDir = deps?.workspaceDir ?? getWorkspaceDir();
|
|
243
|
-
const dataDir = deps?.dataDir ?? resolveDataDir();
|
|
244
|
-
// v1: prev == current is intentional. Without a captured prior leaf snapshot
|
|
245
|
-
// we cannot detect renames/moves/splits, so this runs as a convergence /
|
|
246
|
-
// dangling-ref prune pass. Full rename detection is a follow-up.
|
|
247
|
-
const prevLeaves = await loadPrevLeaves(dataDir);
|
|
248
|
-
|
|
249
|
-
const result = await reconcileTree({ prevLeaves, dataDir, workspaceDir });
|
|
250
|
-
return {
|
|
251
|
-
renames: result.renames,
|
|
252
|
-
deleted: result.deleted,
|
|
253
|
-
prunedCore: result.prunedCore,
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/** The current leaf set as `LeafRef`s (path + stable id when present). */
|
|
258
|
-
async function loadPrevLeaves(dataDir: string): Promise<LeafRef[]> {
|
|
259
|
-
const tree = await loadLeafTree(dataDir);
|
|
260
|
-
return [...tree.leaves.values()].map((node) => ({
|
|
261
|
-
path: node.path,
|
|
262
|
-
...(node.frontmatter.id ? { id: node.frontmatter.id } : {}),
|
|
263
|
-
}));
|
|
264
|
-
}
|
|
265
|
-
|
|
266
30
|
// ---------------------------------------------------------------------------
|
|
267
31
|
// rebuild-index
|
|
268
32
|
// ---------------------------------------------------------------------------
|
|
@@ -275,7 +39,7 @@ export type MemoryV3RebuildIndexResult = z.infer<
|
|
|
275
39
|
>;
|
|
276
40
|
|
|
277
41
|
/**
|
|
278
|
-
* Invalidate the v3 shadow lanes so the next turn rebuilds the
|
|
42
|
+
* Invalidate the v3 shadow lanes so the next turn rebuilds the section index
|
|
279
43
|
* from the current on-disk state. Runs in-daemon so it acts on the live
|
|
280
44
|
* process's cached lanes (an in-CLI call would invalidate nothing).
|
|
281
45
|
*/
|
|
@@ -286,21 +50,47 @@ export async function handleMemoryV3RebuildIndex(): Promise<MemoryV3RebuildIndex
|
|
|
286
50
|
}
|
|
287
51
|
|
|
288
52
|
// ---------------------------------------------------------------------------
|
|
289
|
-
//
|
|
53
|
+
// backfill-sections
|
|
290
54
|
// ---------------------------------------------------------------------------
|
|
291
55
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
56
|
+
const MemoryV3BackfillSectionsResultSchema = z.object({
|
|
57
|
+
/** Pages whose sections were embedded this pass. */
|
|
58
|
+
articles: z.number(),
|
|
59
|
+
/** Total section points upserted across all articles. */
|
|
60
|
+
sections: z.number(),
|
|
61
|
+
/** Pages whose embed threw (and was contained). */
|
|
62
|
+
failures: z.number(),
|
|
63
|
+
});
|
|
64
|
+
export type MemoryV3BackfillSectionsResult = z.infer<
|
|
65
|
+
typeof MemoryV3BackfillSectionsResultSchema
|
|
66
|
+
>;
|
|
297
67
|
|
|
298
68
|
/**
|
|
299
|
-
*
|
|
300
|
-
*
|
|
301
|
-
*
|
|
302
|
-
*
|
|
303
|
-
*
|
|
69
|
+
* One-time full backfill of the section dense store: embed EVERY page in the
|
|
70
|
+
* index — including synthetic skill/CLI rows the incremental maintain pass
|
|
71
|
+
* skips — into the `memory_v3_sections` collection, then advance the maintain
|
|
72
|
+
* high-water mark so the next incremental run deltas from here. Runs in-daemon
|
|
73
|
+
* so it uses the live config and so the maintain checkpoint it advances is the
|
|
74
|
+
* one the daemon's incremental pass reads.
|
|
75
|
+
*
|
|
76
|
+
* `config` is injectable for tests; production resolves the live config.
|
|
77
|
+
*/
|
|
78
|
+
export async function handleMemoryV3BackfillSections(
|
|
79
|
+
config: AssistantConfig = getConfig(),
|
|
80
|
+
): Promise<MemoryV3BackfillSectionsResult> {
|
|
81
|
+
const outcome = await backfillAllSections(config);
|
|
82
|
+
log.info(outcome, "memory-v3 section backfill complete (route)");
|
|
83
|
+
return outcome;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Route definitions (RouteHandlerArgs adapters over the handlers above)
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Mutating verbs require `settings.write`. `rebuild-index` invalidates the live
|
|
92
|
+
* lanes and `backfill-sections` writes the dense store + advances the maintain
|
|
93
|
+
* checkpoint, so a `settings.read`-only principal must not reach them.
|
|
304
94
|
*/
|
|
305
95
|
const WRITE_POLICY: RoutePolicy = {
|
|
306
96
|
requiredScopes: ["settings.write"],
|
|
@@ -309,54 +99,24 @@ const WRITE_POLICY: RoutePolicy = {
|
|
|
309
99
|
|
|
310
100
|
export const ROUTES: RouteDefinition[] = [
|
|
311
101
|
{
|
|
312
|
-
operationId: "
|
|
313
|
-
method: "POST",
|
|
314
|
-
policy: READ_POLICY,
|
|
315
|
-
endpoint: "memory/v3/health",
|
|
316
|
-
handler: () => handleMemoryV3Health(),
|
|
317
|
-
summary: "Print the v3 structural health report (read-only)",
|
|
318
|
-
tags: ["memory"],
|
|
319
|
-
responseBody: MemoryV3HealthResultSchema,
|
|
320
|
-
},
|
|
321
|
-
{
|
|
322
|
-
operationId: "memory_v3_set_core",
|
|
102
|
+
operationId: "memory_v3_rebuild_index",
|
|
323
103
|
method: "POST",
|
|
324
104
|
policy: WRITE_POLICY,
|
|
325
|
-
endpoint: "memory/v3/
|
|
326
|
-
handler:
|
|
327
|
-
|
|
328
|
-
return await handleMemoryV3SetCore(body as MemoryV3SetCoreBody);
|
|
329
|
-
} catch (err) {
|
|
330
|
-
if (err instanceof UnknownLeafError) {
|
|
331
|
-
throw new RouteError(err.message, MEMORY_V3_UNKNOWN_LEAF_CODE, 422);
|
|
332
|
-
}
|
|
333
|
-
throw err;
|
|
334
|
-
}
|
|
335
|
-
},
|
|
336
|
-
summary: "Add/remove always-on core leaves (validates + previews cost)",
|
|
105
|
+
endpoint: "memory/v3/rebuild-index",
|
|
106
|
+
handler: () => handleMemoryV3RebuildIndex(),
|
|
107
|
+
summary: "Invalidate the v3 lanes so the next turn rebuilds",
|
|
337
108
|
tags: ["memory"],
|
|
338
|
-
|
|
339
|
-
responseBody: MemoryV3SetCoreResultSchema,
|
|
109
|
+
responseBody: MemoryV3RebuildIndexResultSchema,
|
|
340
110
|
},
|
|
341
111
|
{
|
|
342
|
-
operationId: "
|
|
112
|
+
operationId: "memory_v3_backfill_sections",
|
|
343
113
|
method: "POST",
|
|
344
114
|
policy: WRITE_POLICY,
|
|
345
|
-
endpoint: "memory/v3/
|
|
346
|
-
handler: () =>
|
|
115
|
+
endpoint: "memory/v3/backfill-sections",
|
|
116
|
+
handler: () => handleMemoryV3BackfillSections(),
|
|
347
117
|
summary:
|
|
348
|
-
"
|
|
118
|
+
"One-time: embed every page's sections (incl synthetic skill/CLI rows) into the dense store",
|
|
349
119
|
tags: ["memory"],
|
|
350
|
-
responseBody:
|
|
351
|
-
},
|
|
352
|
-
{
|
|
353
|
-
operationId: "memory_v3_rebuild_index",
|
|
354
|
-
method: "POST",
|
|
355
|
-
policy: WRITE_POLICY,
|
|
356
|
-
endpoint: "memory/v3/rebuild-index",
|
|
357
|
-
handler: () => handleMemoryV3RebuildIndex(),
|
|
358
|
-
summary: "Invalidate the v3 lanes so the next turn rebuilds",
|
|
359
|
-
tags: ["memory"],
|
|
360
|
-
responseBody: MemoryV3RebuildIndexResultSchema,
|
|
120
|
+
responseBody: MemoryV3BackfillSectionsResultSchema,
|
|
361
121
|
},
|
|
362
122
|
];
|
|
@@ -18,8 +18,8 @@ mock.module("../helpers.js", () => ({
|
|
|
18
18
|
addPlaygroundMessage: async () => ({ id: "msg-test" }),
|
|
19
19
|
}));
|
|
20
20
|
|
|
21
|
-
import type { ContextWindowResult } from "../../../../context/window-manager.js";
|
|
22
21
|
import type { Conversation } from "../../../../daemon/conversation.js";
|
|
22
|
+
import type { ContextWindowResult } from "../../../../plugins/defaults/compaction/window-manager.js";
|
|
23
23
|
import type { Message } from "../../../../providers/types.js";
|
|
24
24
|
import { RouteError } from "../../errors.js";
|
|
25
25
|
import { ROUTES } from "../index.js";
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type { Conversation } from "../../../daemon/conversation.js";
|
|
10
|
+
import { findConversation } from "../../../daemon/conversation-registry.js";
|
|
10
11
|
import {
|
|
11
12
|
destroyActiveConversation,
|
|
12
|
-
findConversation,
|
|
13
13
|
getOrCreateConversation,
|
|
14
14
|
} from "../../../daemon/conversation-store.js";
|
|
15
15
|
import {
|