@vellumai/assistant 0.8.4 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +2 -2
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/knip.json +2 -1
- package/openapi.yaml +809 -11
- package/package.json +1 -1
- package/src/__tests__/anthropic-provider.test.ts +34 -37
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
- package/src/__tests__/audit-log-rotation.test.ts +70 -16
- package/src/__tests__/background-workers-disk-pressure.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +2 -3
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-guardian.test.ts +3 -3
- package/src/__tests__/checker.test.ts +6 -15
- package/src/__tests__/compaction-events.test.ts +1 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
- package/src/__tests__/computer-use-tools.test.ts +2 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +197 -2
- package/src/__tests__/conversation-agent-loop.test.ts +163 -122
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +31 -0
- package/src/__tests__/conversation-fork-crud.test.ts +178 -15
- package/src/__tests__/conversation-lifecycle.test.ts +52 -11
- package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +13 -13
- package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
- package/src/__tests__/conversation-skill-tools.test.ts +2 -5
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-sync-tags.test.ts +99 -32
- package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/credential-vault-unit.test.ts +2 -2
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/gateway-flag-listener.test.ts +237 -0
- package/src/__tests__/gemini-provider.test.ts +78 -0
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +7 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +4 -0
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +77 -9
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/mcp-abort-signal.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/model-intents.test.ts +2 -4
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +46 -0
- package/src/__tests__/openai-responses-provider.test.ts +114 -12
- package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -2
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +2 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/registry.test.ts +2 -8
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags.test.ts +2 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
- package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/subagent-notify-parent.test.ts +1 -1
- package/src/__tests__/suggestion-routes.test.ts +1 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +145 -131
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
- package/src/__tests__/tool-executor.test.ts +9 -62
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/workspace-git-service.test.ts +6 -5
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +1 -1
- package/src/agent/loop.ts +8 -0
- package/src/api/README.md +5 -0
- package/src/api/index.ts +4 -0
- package/src/api/package.json +10 -0
- package/src/background-wake/background-wake-routes.test.ts +233 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +176 -1
- package/src/cli/commands/memory-v3-render.ts +344 -0
- package/src/cli/commands/memory-v3.ts +316 -0
- package/src/cli/program.ts +2 -0
- package/src/config/assistant-feature-flags.ts +21 -9
- package/src/config/bundled-skills/document-editor/SKILL.md +11 -2
- package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +7 -6
- package/src/config/feature-flag-registry.json +16 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +213 -1
- package/src/config/schemas/call-site-catalog.ts +21 -7
- package/src/config/schemas/llm.ts +12 -1
- package/src/config/schemas/memory-v2.ts +246 -0
- package/src/config/schemas/memory.ts +2 -1
- package/src/context/compactor.ts +52 -0
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +2 -13
- package/src/daemon/conversation-agent-loop.ts +126 -76
- package/src/daemon/conversation-error.ts +31 -1
- package/src/daemon/conversation-lifecycle.ts +27 -22
- package/src/daemon/conversation-runtime-assembly.ts +10 -9
- package/src/daemon/conversation-tool-setup.ts +63 -3
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +14 -29
- package/src/daemon/disk-pressure-guard.ts +14 -2
- package/src/daemon/handlers/config-model.test.ts +1 -0
- package/src/daemon/handlers/conversations.ts +11 -3
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +4 -4
- package/src/daemon/host-file-proxy.ts +4 -4
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +10 -10
- package/src/daemon/lifecycle.ts +23 -20
- package/src/daemon/meet-manifest-loader.ts +1 -7
- package/src/daemon/message-types/conversations.ts +6 -9
- package/src/daemon/message-types/home.ts +1 -13
- package/src/daemon/message-types/messages.ts +6 -14
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +52 -0
- package/src/daemon/tool-setup-types.ts +13 -0
- package/src/events/relationship-state-updated.ts +25 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -1
- package/src/home/home-greeting.ts +0 -9
- package/src/home/suggested-prompts.ts +0 -9
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/registries.ts +8 -12
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/memory-retrospective-job.test.ts +7 -0
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-crud.ts +71 -70
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-init.ts +10 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +55 -22
- package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
- package/src/memory/llm-request-log-source-local.ts +7 -0
- package/src/memory/llm-request-log-source.ts +9 -2
- package/src/memory/llm-request-log-store.ts +43 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-enqueue.ts +8 -1
- package/src/memory/memory-retrospective-job.ts +5 -0
- package/src/memory/memory-v2-activation-log-store.ts +15 -6
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/index.ts +17 -0
- package/src/memory/migrations/registry.ts +33 -0
- package/src/memory/schema/conversations.ts +1 -1
- package/src/memory/schema/infrastructure.ts +21 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
- package/src/memory/v2/__tests__/injection.test.ts +127 -98
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +171 -3
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +124 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +224 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +106 -0
- package/src/memory/v2/harness/trace.ts +58 -0
- package/src/memory/v2/injection.ts +21 -15
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +171 -18
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +563 -0
- package/src/memory/v3/__tests__/filter.test.ts +512 -0
- package/src/memory/v3/__tests__/gate.test.ts +574 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
- package/src/memory/v3/__tests__/loop.test.ts +530 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +440 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +469 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
- package/src/memory/v3/__tests__/validate.test.ts +245 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +249 -0
- package/src/memory/v3/filter.ts +281 -0
- package/src/memory/v3/gate.ts +334 -0
- package/src/memory/v3/index-composition.ts +113 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +382 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +420 -0
- package/src/memory/v3/shadow-middleware.ts +305 -0
- package/src/memory/v3/traversal.ts +206 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +351 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +300 -0
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/emit-signal.ts +29 -49
- package/src/permissions/prompter.ts +3 -3
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +2 -2
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +18 -11
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +11 -16
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +39 -7
- package/src/prompts/system-prompt.ts +50 -185
- package/src/prompts/templates/BOOTSTRAP.md +2 -2
- package/src/prompts/templates/system-sections.ts +230 -8
- package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +32 -66
- package/src/providers/call-site-routing.ts +14 -2
- package/src/providers/connection-model-compat.ts +38 -0
- package/src/providers/connection-resolution.ts +16 -2
- package/src/providers/gemini/client.ts +49 -6
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +43 -0
- package/src/providers/model-intents.ts +1 -1
- package/src/providers/openai/chat-completions-provider.ts +6 -3
- package/src/providers/openai/codex-models.ts +18 -0
- package/src/providers/openai/responses-provider.ts +78 -21
- package/src/providers/provider-send-message.ts +7 -1
- package/src/providers/retry.ts +34 -3
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/agent-wake.ts +1 -0
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +36 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/migrations/vbundle-builder.ts +10 -3
- package/src/runtime/pending-interactions.ts +0 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +106 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +25 -6
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +188 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +0 -6
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-list-routes.ts +12 -4
- package/src/runtime/routes/conversation-management-routes.ts +77 -20
- package/src/runtime/routes/conversation-query-routes.ts +142 -36
- package/src/runtime/routes/conversation-routes.ts +252 -410
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +24 -8
- package/src/runtime/routes/host-browser-routes.ts +10 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/index.ts +8 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +215 -5
- package/src/runtime/routes/memory-v3-routes.ts +316 -0
- package/src/runtime/routes/migration-routes.ts +21 -24
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +5 -4
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +2 -8
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
- package/src/tools/browser/browser-execution.ts +16 -3
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
- package/src/tools/browser/cdp-client/factory.ts +100 -17
- package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
- package/src/tools/browser/cdp-client/types.ts +65 -0
- package/src/tools/browser/pinned-tabs.ts +96 -40
- package/src/tools/computer-use/definitions.ts +22 -78
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-tool.ts +59 -0
- package/src/tools/execution-target.ts +21 -23
- package/src/tools/executor.ts +6 -1
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -8
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/web-fetch.ts +3 -9
- package/src/tools/network/web-search.ts +25 -32
- package/src/tools/registry.ts +7 -23
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +1 -8
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/types.ts +27 -98
- package/src/tools/ui-surface/definitions.ts +6 -22
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -2
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/daemon/query-complexity-router.ts +0 -75
- package/src/prompts/cache-boundary.ts +0 -8
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory v3 route definitions — read-only diagnostics over the hand-authored
|
|
3
|
+
* v3 tree DAG.
|
|
4
|
+
*
|
|
5
|
+
* Two operations, both side-effect-free (no LLM, no writes):
|
|
6
|
+
*
|
|
7
|
+
* - `memory_v3_validate` — returns the {@link TreeValidationReport} from
|
|
8
|
+
* `validateTree(workspaceDir)` (orphan pages, cycles, dangling refs,
|
|
9
|
+
* stale-index, unknown edge targets).
|
|
10
|
+
* - `memory_v3_tree` — returns a JSON-serializable view of
|
|
11
|
+
* `getTreeIndex(workspaceDir)`: the root id, every node id, and each
|
|
12
|
+
* node's ordered child refs. `TreeIndex` is Map-based, so the handler
|
|
13
|
+
* flattens it into arrays/objects the wire protocol can carry.
|
|
14
|
+
*
|
|
15
|
+
* The v3 tree is authored by the v2 → v3 data-migration; these routes are the
|
|
16
|
+
* on-demand inspection surface operators run while that migration is in flight.
|
|
17
|
+
* They are NOT invoked on any turn.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
|
|
22
|
+
import { loadConfig } from "../../config/loader.js";
|
|
23
|
+
import type { AssistantConfig } from "../../config/types.js";
|
|
24
|
+
import { getDb } from "../../memory/db-connection.js";
|
|
25
|
+
import type {
|
|
26
|
+
RetrievalCost,
|
|
27
|
+
RetrievalInput,
|
|
28
|
+
} from "../../memory/v2/harness/retriever.js";
|
|
29
|
+
import type { DescentTrace } from "../../memory/v2/harness/trace.js";
|
|
30
|
+
import { loadNowText } from "../../memory/v2/now-text.js";
|
|
31
|
+
import type { LlmCallRecord } from "../../memory/v3/llm-capture.js";
|
|
32
|
+
import { runRetrievalLoop } from "../../memory/v3/loop.js";
|
|
33
|
+
import { getTreeIndex } from "../../memory/v3/tree-index.js";
|
|
34
|
+
import type { TreeValidationReport } from "../../memory/v3/validate.js";
|
|
35
|
+
import { validateTree } from "../../memory/v3/validate.js";
|
|
36
|
+
import { getWorkspaceDir } from "../../util/platform.js";
|
|
37
|
+
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
38
|
+
|
|
39
|
+
// Re-export the loop trace/cost shapes so the CLI renderer can import them from
|
|
40
|
+
// this route module (type-only) without reaching across the
|
|
41
|
+
// `cli/no-daemon-internals` boundary into `memory/v2/harness/*`.
|
|
42
|
+
export type { RetrievalCost } from "../../memory/v2/harness/retriever.js";
|
|
43
|
+
export type {
|
|
44
|
+
DescentPass,
|
|
45
|
+
DescentTrace,
|
|
46
|
+
EdgeExpansion,
|
|
47
|
+
GateDecision,
|
|
48
|
+
ScoutResult,
|
|
49
|
+
TreeLevel,
|
|
50
|
+
} from "../../memory/v2/harness/trace.js";
|
|
51
|
+
export type { LlmCallRecord };
|
|
52
|
+
|
|
53
|
+
// ── Validate ────────────────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
const MemoryV3ValidateParams = z.object({}).strict();
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Wire shape for `memory_v3_validate`. Identical to the daemon-internal
|
|
59
|
+
* {@link TreeValidationReport} — every field is already serializable, so the
|
|
60
|
+
* route forwards it verbatim. Re-exported as its own type so the CLI can
|
|
61
|
+
* import it without reaching into the validator module.
|
|
62
|
+
*/
|
|
63
|
+
export type MemoryV3ValidateResult = TreeValidationReport;
|
|
64
|
+
|
|
65
|
+
async function handleValidate({
|
|
66
|
+
body = {},
|
|
67
|
+
}: RouteHandlerArgs): Promise<MemoryV3ValidateResult> {
|
|
68
|
+
// Read-only structural validation of the v3 tree. Like the v2 validate
|
|
69
|
+
// route, it is intentionally ungated: operators dry-run it while the
|
|
70
|
+
// v2 → v3 migration is mid-flight, well before any v3 flag flips.
|
|
71
|
+
MemoryV3ValidateParams.parse(body);
|
|
72
|
+
return validateTree(getWorkspaceDir());
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ── Tree ────────────────────────────────────────────────────────────────
|
|
76
|
+
|
|
77
|
+
const MemoryV3TreeParams = z.object({}).strict();
|
|
78
|
+
|
|
79
|
+
/** One node in the serialized tree view: its id and ordered child refs. */
|
|
80
|
+
export interface MemoryV3TreeNodeView {
|
|
81
|
+
id: string;
|
|
82
|
+
children: Array<{ kind: "node" | "page"; ref: string }>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* JSON-serializable projection of the {@link TreeIndex}. `TreeIndex` keys its
|
|
87
|
+
* adjacency by `Map`, which doesn't survive JSON, so the handler flattens it:
|
|
88
|
+
* `root` is the entry-point node id and `nodes` is every node with its ordered
|
|
89
|
+
* child refs. The CLI renderer walks `nodes`/`root` to print an indented tree,
|
|
90
|
+
* marking shared-DAG re-entries.
|
|
91
|
+
*/
|
|
92
|
+
export interface MemoryV3TreeResult {
|
|
93
|
+
root: string;
|
|
94
|
+
nodes: MemoryV3TreeNodeView[];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function handleTree({
|
|
98
|
+
body = {},
|
|
99
|
+
}: RouteHandlerArgs): Promise<MemoryV3TreeResult> {
|
|
100
|
+
MemoryV3TreeParams.parse(body);
|
|
101
|
+
|
|
102
|
+
const tree = await getTreeIndex(getWorkspaceDir());
|
|
103
|
+
|
|
104
|
+
const nodes: MemoryV3TreeNodeView[] = [...tree.nodes.keys()]
|
|
105
|
+
.sort()
|
|
106
|
+
.map((id) => ({
|
|
107
|
+
id,
|
|
108
|
+
children: (tree.childrenByNode.get(id) ?? []).map((child) => ({
|
|
109
|
+
kind: child.kind,
|
|
110
|
+
ref: child.ref,
|
|
111
|
+
})),
|
|
112
|
+
}));
|
|
113
|
+
|
|
114
|
+
return { root: tree.root, nodes };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ── Simulate ──────────────────────────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
/** The five v3 retrieval lanes, in fanout order. */
|
|
120
|
+
const V3_LANE_NAMES = ["hot", "sparse", "dense", "tree", "edges"] as const;
|
|
121
|
+
|
|
122
|
+
const MemoryV3SimulateParams = z
|
|
123
|
+
.object({
|
|
124
|
+
/** The ad-hoc user query to route a single synthetic turn against. */
|
|
125
|
+
query: z.string().min(1, "memory.v3.simulate query must be non-empty"),
|
|
126
|
+
/**
|
|
127
|
+
* Optional `<now>` override. When omitted the live workspace NOW.md is
|
|
128
|
+
* loaded so the run exercises production-like standing context.
|
|
129
|
+
*/
|
|
130
|
+
nowText: z.string().optional(),
|
|
131
|
+
/** Override `memory.v3.passCap` for this run only. */
|
|
132
|
+
passCap: z
|
|
133
|
+
.number()
|
|
134
|
+
.int("memory.v3.simulate passCap must be an integer")
|
|
135
|
+
.positive("memory.v3.simulate passCap must be positive")
|
|
136
|
+
.optional(),
|
|
137
|
+
/**
|
|
138
|
+
* Restrict the run to this allowlist of lanes (others forced off). Omit to
|
|
139
|
+
* inherit the live `memory.v3.lanes` toggles.
|
|
140
|
+
*/
|
|
141
|
+
lanes: z.array(z.enum(V3_LANE_NAMES)).optional(),
|
|
142
|
+
})
|
|
143
|
+
.strict();
|
|
144
|
+
|
|
145
|
+
/** The v3 lane toggle block, echoed back so the caller sees what actually ran. */
|
|
146
|
+
export interface MemoryV3SimulateLanes {
|
|
147
|
+
hot: boolean;
|
|
148
|
+
sparse: boolean;
|
|
149
|
+
dense: boolean;
|
|
150
|
+
tree: boolean;
|
|
151
|
+
edges: boolean;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Wire shape for `memory_v3_simulate`. The loop's `sourceBySlug` Map is
|
|
156
|
+
* flattened to a plain object (lane label per slug); `trace`/`cost` are already
|
|
157
|
+
* JSON-serializable. `effectiveConfig` echoes the passCap + lane toggles the
|
|
158
|
+
* run actually used after overrides were applied.
|
|
159
|
+
*/
|
|
160
|
+
export interface MemoryV3SimulateResult {
|
|
161
|
+
query: string;
|
|
162
|
+
selectedSlugs: string[];
|
|
163
|
+
/** Per-slug provenance lane: `hot` | `sparse` | `dense` | `tree` | `edge`. */
|
|
164
|
+
sourceBySlug: Record<string, string>;
|
|
165
|
+
trace: DescentTrace;
|
|
166
|
+
cost: RetrievalCost;
|
|
167
|
+
/** Non-null when the dense filter failed open on any pass. */
|
|
168
|
+
failureReason: string | null;
|
|
169
|
+
/**
|
|
170
|
+
* Every v3 LLM call made during the run (filter / each descender / gate),
|
|
171
|
+
* with full input + raw response. Empty unless capture was on (it always is
|
|
172
|
+
* for simulate). Read-only debug surface — persisted nowhere.
|
|
173
|
+
*/
|
|
174
|
+
llmCalls: LlmCallRecord[];
|
|
175
|
+
effectiveConfig: {
|
|
176
|
+
passCap: number;
|
|
177
|
+
lanes: MemoryV3SimulateLanes;
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Overlay the simulate overrides on the live config. Only the v3 passCap + lane
|
|
183
|
+
* toggles are exposed; everything else (providers, prompts, scout quotas) stays
|
|
184
|
+
* exactly as a live turn would see it. `write.coactivation` is forced off so the
|
|
185
|
+
* simulate stays strictly read-only — the loop's only persistence path is the
|
|
186
|
+
* co-activation insert, which this guarantees never fires.
|
|
187
|
+
*/
|
|
188
|
+
function applyV3SimulateOverrides(
|
|
189
|
+
live: AssistantConfig,
|
|
190
|
+
overrides: { passCap?: number; lanes?: ReadonlyArray<string> },
|
|
191
|
+
): AssistantConfig {
|
|
192
|
+
const liveV3 = live.memory.v3;
|
|
193
|
+
const lanes = overrides.lanes
|
|
194
|
+
? {
|
|
195
|
+
hot: overrides.lanes.includes("hot"),
|
|
196
|
+
sparse: overrides.lanes.includes("sparse"),
|
|
197
|
+
dense: overrides.lanes.includes("dense"),
|
|
198
|
+
tree: overrides.lanes.includes("tree"),
|
|
199
|
+
edges: overrides.lanes.includes("edges"),
|
|
200
|
+
}
|
|
201
|
+
: liveV3.lanes;
|
|
202
|
+
return {
|
|
203
|
+
...live,
|
|
204
|
+
memory: {
|
|
205
|
+
...live.memory,
|
|
206
|
+
v3: {
|
|
207
|
+
...liveV3,
|
|
208
|
+
...(overrides.passCap !== undefined
|
|
209
|
+
? { passCap: overrides.passCap }
|
|
210
|
+
: {}),
|
|
211
|
+
lanes,
|
|
212
|
+
write: { ...liveV3.write, coactivation: false },
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Run the v3 retrieval loop read-only against a single ad-hoc query and return
|
|
220
|
+
* its selection, per-lane provenance, and full descent trace. Mirrors the
|
|
221
|
+
* single-turn semantics of `memory_v2_simulate_router` (the query becomes the
|
|
222
|
+
* just-arrived `userMessage` of one synthetic turn) and the input-build of the
|
|
223
|
+
* v3 shadow middleware, but persists nothing.
|
|
224
|
+
*
|
|
225
|
+
* The loop is invoked directly — it is NOT gated by `memory.v3.enabled` /
|
|
226
|
+
* `.shadow` (those gates live in the shadow middleware), so operators can probe
|
|
227
|
+
* v3 retrieval while the flags are still off.
|
|
228
|
+
*/
|
|
229
|
+
async function handleSimulate({
|
|
230
|
+
body = {},
|
|
231
|
+
}: RouteHandlerArgs): Promise<MemoryV3SimulateResult> {
|
|
232
|
+
const {
|
|
233
|
+
query,
|
|
234
|
+
nowText: rawNowText,
|
|
235
|
+
passCap,
|
|
236
|
+
lanes,
|
|
237
|
+
} = MemoryV3SimulateParams.parse(body);
|
|
238
|
+
|
|
239
|
+
const config = applyV3SimulateOverrides(loadConfig(), { passCap, lanes });
|
|
240
|
+
|
|
241
|
+
const workspaceDir = getWorkspaceDir();
|
|
242
|
+
const nowText =
|
|
243
|
+
rawNowText !== undefined ? rawNowText : await loadNowText(workspaceDir);
|
|
244
|
+
|
|
245
|
+
const input: RetrievalInput = {
|
|
246
|
+
workspaceDir,
|
|
247
|
+
recentTurnPairs: [{ assistantMessage: "", userMessage: query }],
|
|
248
|
+
nowText,
|
|
249
|
+
priorEverInjected: [],
|
|
250
|
+
config,
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
const llmCalls: LlmCallRecord[] = [];
|
|
254
|
+
const output = await runRetrievalLoop(input, {
|
|
255
|
+
db: getDb(),
|
|
256
|
+
capture: (record) => llmCalls.push(record),
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
const sourceBySlug: Record<string, string> = {};
|
|
260
|
+
for (const [slug, lane] of output.sourceBySlug.entries()) {
|
|
261
|
+
sourceBySlug[slug] = lane;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return {
|
|
265
|
+
query,
|
|
266
|
+
selectedSlugs: output.selectedSlugs,
|
|
267
|
+
sourceBySlug,
|
|
268
|
+
trace: output.trace ?? { passes: [] },
|
|
269
|
+
cost: output.cost ?? {},
|
|
270
|
+
failureReason: output.failureReason ?? null,
|
|
271
|
+
llmCalls,
|
|
272
|
+
effectiveConfig: {
|
|
273
|
+
passCap: config.memory.v3.passCap,
|
|
274
|
+
lanes: config.memory.v3.lanes,
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// ── Route definitions ───────────────────────────────────────────────────
|
|
280
|
+
|
|
281
|
+
export const ROUTES: RouteDefinition[] = [
|
|
282
|
+
{
|
|
283
|
+
operationId: "memory_v3_validate",
|
|
284
|
+
method: "POST",
|
|
285
|
+
endpoint: "memory/v3/validate",
|
|
286
|
+
handler: handleValidate,
|
|
287
|
+
summary: "Validate the memory v3 tree structure (read-only)",
|
|
288
|
+
description:
|
|
289
|
+
"Read-only structural validation of the hand-authored v3 tree DAG. Reports dangling child refs, orphan pages, cycles, stale compositional indexes, and unknown edge targets. Writes nothing and runs no LLM — operators dry-run it while the v2 → v3 migration is in flight.",
|
|
290
|
+
tags: ["memory"],
|
|
291
|
+
requestBody: MemoryV3ValidateParams,
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
operationId: "memory_v3_tree",
|
|
295
|
+
method: "POST",
|
|
296
|
+
endpoint: "memory/v3/tree",
|
|
297
|
+
handler: handleTree,
|
|
298
|
+
summary: "Return a serializable view of the memory v3 tree DAG (read-only)",
|
|
299
|
+
description:
|
|
300
|
+
"Returns the v3 tree root id plus every node and its ordered child refs (page:/node:) as a JSON-serializable projection of the in-memory TreeIndex. Read-only; the CLI uses it to print an indented tree with shared-DAG re-entries marked.",
|
|
301
|
+
tags: ["memory"],
|
|
302
|
+
requestBody: MemoryV3TreeParams,
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
operationId: "memory_v3_simulate",
|
|
306
|
+
method: "POST",
|
|
307
|
+
endpoint: "memory/v3/simulate",
|
|
308
|
+
handler: handleSimulate,
|
|
309
|
+
summary:
|
|
310
|
+
"Dry-run the v3 retrieval loop against an ad-hoc query (read-only)",
|
|
311
|
+
description:
|
|
312
|
+
"Runs the v3 multi-lane bounded-descent retrieval loop read-only against a single synthetic turn built from the supplied query plus the live (or supplied) NOW context. Returns the selected page slugs, per-lane provenance, the full multi-pass descent trace, and accumulated cost. Optional passCap / lane-allowlist overrides apply on top of live config. Invoked directly (not gated by memory.v3.enabled/shadow) so operators can probe v3 retrieval before flipping the flags; writes nothing (co-activation persistence is forced off), though each pass still spends the loop's filter + gate LLM calls.",
|
|
313
|
+
tags: ["memory"],
|
|
314
|
+
requestBody: MemoryV3SimulateParams,
|
|
315
|
+
},
|
|
316
|
+
];
|
|
@@ -17,13 +17,13 @@
|
|
|
17
17
|
import { createReadStream } from "node:fs";
|
|
18
18
|
import { hostname } from "node:os";
|
|
19
19
|
import { PassThrough, Readable } from "node:stream";
|
|
20
|
-
import { Database } from "bun:sqlite";
|
|
21
20
|
|
|
22
21
|
import { z } from "zod";
|
|
23
22
|
|
|
24
23
|
import { getPlatformAssistantId } from "../../config/env.js";
|
|
25
24
|
import { invalidateConfigCache } from "../../config/loader.js";
|
|
26
25
|
import { getAssistantName } from "../../daemon/identity-helpers.js";
|
|
26
|
+
import { runAsyncSqlite } from "../../memory/db-async-query.js";
|
|
27
27
|
import { getDb, resetDb } from "../../memory/db-connection.js";
|
|
28
28
|
import { validateMigrationState } from "../../memory/migrations/validate-migration-state.js";
|
|
29
29
|
import { credentialKey } from "../../security/credential-key.js";
|
|
@@ -39,7 +39,6 @@ import {
|
|
|
39
39
|
} from "../../tools/credentials/metadata-store.js";
|
|
40
40
|
import { getLogger } from "../../util/logger.js";
|
|
41
41
|
import {
|
|
42
|
-
getDbPath,
|
|
43
42
|
getWorkspaceDir,
|
|
44
43
|
getWorkspaceHooksDir,
|
|
45
44
|
} from "../../util/platform.js";
|
|
@@ -356,21 +355,20 @@ export async function handleMigrationExport(
|
|
|
356
355
|
...manifestInputs,
|
|
357
356
|
secretsRedacted,
|
|
358
357
|
credentials,
|
|
359
|
-
checkpoint: () => {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
} catch (err) {
|
|
358
|
+
checkpoint: async () => {
|
|
359
|
+
// Dispatch through `runAsyncSqlite` so the WAL checkpoint runs
|
|
360
|
+
// in a sqlite3 subprocess on hosts where it's available. A WAL
|
|
361
|
+
// truncate on a multi-GB WAL file can otherwise stall the
|
|
362
|
+
// daemon's event loop for the full duration of the flush.
|
|
363
|
+
const result = await runAsyncSqlite(
|
|
364
|
+
"PRAGMA wal_checkpoint(TRUNCATE)",
|
|
365
|
+
);
|
|
366
|
+
if (!result.ok) {
|
|
369
367
|
// Best-effort: if the DB can't be checkpointed (e.g. not a valid
|
|
370
368
|
// SQLite file, missing WAL, etc.) we still proceed with the export
|
|
371
369
|
// using whatever is on disk.
|
|
372
370
|
log.warn(
|
|
373
|
-
{
|
|
371
|
+
{ error: result.error, backend: result.backend },
|
|
374
372
|
"WAL checkpoint failed — exporting without checkpoint",
|
|
375
373
|
);
|
|
376
374
|
}
|
|
@@ -582,18 +580,17 @@ export async function handleMigrationExportToGcs({ body }: RouteHandlerArgs) {
|
|
|
582
580
|
...manifestInputs,
|
|
583
581
|
secretsRedacted,
|
|
584
582
|
credentials: collected.credentials,
|
|
585
|
-
checkpoint: () => {
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
} catch (err) {
|
|
583
|
+
checkpoint: async () => {
|
|
584
|
+
// Dispatch through `runAsyncSqlite` so the WAL checkpoint runs
|
|
585
|
+
// in a sqlite3 subprocess on hosts where it's available. A
|
|
586
|
+
// WAL truncate on a multi-GB WAL file can otherwise stall the
|
|
587
|
+
// daemon's event loop for the full duration of the flush.
|
|
588
|
+
const result = await runAsyncSqlite(
|
|
589
|
+
"PRAGMA wal_checkpoint(TRUNCATE)",
|
|
590
|
+
);
|
|
591
|
+
if (!result.ok) {
|
|
595
592
|
log.warn(
|
|
596
|
-
{
|
|
593
|
+
{ error: result.error, backend: result.backend },
|
|
597
594
|
"WAL checkpoint failed — exporting without checkpoint",
|
|
598
595
|
);
|
|
599
596
|
}
|