mixdog 1.4.1 → 1.4.3
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/package.json +4 -3
- package/scripts/build-shipped-history.mjs +125 -33
- package/scripts/gate-local.mjs +220 -63
- package/scripts/graph-parity.mjs +8 -3
- package/scripts/lib/gate-scheduler.mjs +139 -32
- package/scripts/lib/gate-timing-reporter.mjs +16 -0
- package/scripts/lib/run-node-tests.mjs +71 -34
- package/scripts/lib/scoped-temp.mjs +1 -0
- package/scripts/lib/test-failure-records.mjs +14 -1
- package/scripts/lib/test-failure-summary.mjs +9 -4
- package/scripts/lib/test-spawn-ledger.mjs +43 -3
- package/scripts/post-release-check.mjs +26 -16
- package/scripts/pptx-kit-index.mjs +5 -6
- package/scripts/provider-pingpong-live.mjs +1 -1
- package/scripts/prune-embedding-runtime.mjs +3 -1
- package/scripts/release-paths.mjs +7 -1
- package/scripts/suite-health.mjs +110 -28
- package/scripts/test.mjs +9 -14
- package/src/agents/advisor/AGENT.md +4 -4
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/explore/AGENT.md +22 -0
- package/src/agents/explore/agent.json +6 -0
- package/src/cli.mjs +7 -0
- package/src/defaults/agents.json +7 -0
- package/src/defaults/shipped-history.json +38 -2
- package/src/defaults/skills/browser-use/SKILL.md +4 -1
- package/src/defaults/skills/code-tidy/SKILL.md +71 -102
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
- package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
- package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
- package/src/defaults/skills/computer-use/SKILL.md +12 -2
- package/src/defaults/skills/setup/SKILL.md +2 -2
- package/src/defaults/skills/setup/references/actions.md +28 -9
- package/src/defaults/skills/setup/references/surfaces.md +5 -2
- package/src/defaults/skills/setup-guide/SKILL.md +11 -3
- package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
- package/src/defaults/skills/skill-creator/SKILL.md +85 -190
- package/src/defaults/skills/skill-creator/references/design.md +70 -162
- package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
- package/src/defaults/skills/test-suite/SKILL.md +194 -0
- package/src/defaults/skills/test-suite/references/case-management.md +51 -0
- package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
- package/src/defaults/skills/test-suite/references/reliability.md +49 -0
- package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
- package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
- package/src/defaults/skills/visualize/SKILL.md +6 -2
- package/src/lib/instruction-text.cjs +36 -0
- package/src/lib/rules-builder.cjs +40 -50
- package/src/orchestration/balanced.md +23 -0
- package/src/orchestration/focused.md +22 -0
- package/src/orchestration/none.md +5 -0
- package/src/orchestration/swarm.md +24 -0
- package/src/rules/agent-mode/AGENT_MODE.md +3 -1
- package/src/rules/agent-mode/MIXY.md +2 -2
- package/src/rules/lead/LEAD.md +3 -3
- package/src/rules/shared/20-research.md +3 -6
- package/src/rules/shared/40-editing.md +1 -0
- package/src/rules/shared/60-verification.md +10 -9
- package/src/rules/shared/70-delivery.md +4 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
- package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
- package/src/runtime/agent/orchestrator/config.mjs +12 -7
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
- package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
- package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
- package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
- package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +43 -27
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
- package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
- package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
- package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
- package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
- package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
- package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
- package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
- package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -47
- package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
- package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +12 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
- package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
- package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +27 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
- package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +103 -50
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
- package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
- package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +48 -30
- package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +12 -6
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
- package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +42 -28
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/attachments/attachment-reference.mjs +1 -1
- package/src/runtime/attachments/pdf-extract.mjs +1 -1
- package/src/runtime/attachments/store.d.mts +1 -0
- package/src/runtime/attachments/store.mjs +2 -2
- package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
- package/src/runtime/channels/lib/scheduler.mjs +33 -0
- package/src/runtime/channels/lib/schedules-db.mjs +11 -4
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
- package/src/runtime/channels/lib/whisper-port.mjs +19 -10
- package/src/runtime/channels/lib/whisper-server.mjs +22 -13
- package/src/runtime/channels/lib/worker-main.mjs +9 -31
- package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
- package/src/runtime/connectors/connector-accounts-mcp.mjs +372 -103
- package/src/runtime/connectors/gmail-app-password.mjs +4 -4
- package/src/runtime/connectors/google-mcp.mjs +1 -1
- package/src/runtime/effort-judge/judge-client.mjs +2 -2
- package/src/runtime/effort-judge/judge-input.mjs +4 -4
- package/src/runtime/explore/explorer.mjs +88 -0
- package/src/runtime/explore/tool-defs.mjs +35 -0
- package/src/runtime/explore/tool.mjs +123 -0
- package/src/runtime/local-provider/hardware.mjs +1 -1
- package/src/runtime/media/adapters/codex-image.mjs +3 -3
- package/src/runtime/media/adapters/gemini-video.mjs +1 -1
- package/src/runtime/media/media-usage.mjs +1 -1
- package/src/runtime/media/store.mjs +1 -1
- package/src/runtime/memory/index.mjs +15 -1
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
- package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
- package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
- package/src/runtime/memory/lib/memory-embed.mjs +83 -14
- package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
- package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
- package/src/runtime/memory/lib/memory.mjs +17 -0
- package/src/runtime/memory/lib/pg/process.mjs +1 -1
- package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
- package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/capabilities.mjs +1 -1
- package/src/runtime/office/core/office-core.mjs +1 -1
- package/src/runtime/office/design/content-model.mjs +3 -3
- package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
- package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
- package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
- package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
- package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
- package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
- package/src/runtime/office/portable/portable-soffice.mjs +8 -6
- package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
- package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
- package/src/runtime/shared/agent-route-config.mjs +17 -2
- package/src/runtime/shared/atomic-file.d.mts +8 -0
- package/src/runtime/shared/atomic-file.mjs +103 -2
- package/src/runtime/shared/background-tasks.mjs +37 -10
- package/src/runtime/shared/background-wait.mjs +66 -0
- package/src/runtime/shared/child-guardian.mjs +17 -7
- package/src/runtime/shared/config.mjs +313 -16
- package/src/runtime/shared/connector-accounts.mjs +5 -5
- package/src/runtime/shared/connector-catalog.d.mts +14 -8
- package/src/runtime/shared/connector-catalog.mjs +70 -52
- package/src/runtime/shared/custom-provider-keys.mjs +20 -0
- package/src/runtime/shared/file-has-data.mjs +26 -2
- package/src/runtime/shared/file-lock.mjs +21 -18
- package/src/runtime/shared/git-launch.d.mts +9 -0
- package/src/runtime/shared/git-launch.mjs +213 -0
- package/src/runtime/shared/git-runner-worker.mjs +2 -1
- package/src/runtime/shared/git-runner.mjs +7 -2
- package/src/runtime/shared/idle-gc.mjs +30 -7
- package/src/runtime/shared/llm/cost.mjs +6 -1
- package/src/runtime/shared/llm/http-agent.mjs +316 -29
- package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
- package/src/runtime/shared/llm/model-catalog.mjs +46 -6
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
- package/src/runtime/shared/llm/system-proxy.mjs +453 -0
- package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
- package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
- package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
- package/src/runtime/shared/maintenance-schedule.mjs +109 -0
- package/src/runtime/shared/process-runner.mjs +8 -4
- package/src/runtime/shared/provider-accounts.mjs +52 -2
- package/src/runtime/shared/routine-trigger.d.mts +13 -0
- package/src/runtime/shared/routine-trigger.mjs +34 -0
- package/src/runtime/shared/run-child.d.mts +2 -1
- package/src/runtime/shared/run-child.mjs +70 -18
- package/src/runtime/shared/session-scratch.mjs +14 -2
- package/src/runtime/shared/shipped-definitions.mjs +7 -1
- package/src/runtime/shared/staged-install-worker.mjs +5 -0
- package/src/runtime/shared/staged-update.mjs +47 -2
- package/src/runtime/shared/tool-card-model.golden.json +3 -12
- package/src/runtime/shared/tool-execution-contract.mjs +2 -0
- package/src/runtime/shared/tool-surface.mjs +110 -36
- package/src/runtime/shared/tool-work-units.mjs +35 -6
- package/src/runtime/shared/turn-snapshot.mjs +26 -4
- package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
- package/src/runtime/shared/worker-requests.mjs +17 -3
- package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
- package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
- package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
- package/src/runtime/shared/worktrees/contract.mjs +16 -6
- package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
- package/src/runtime/shared/worktrees/disk.mjs +79 -2
- package/src/runtime/shared/worktrees/git.mjs +97 -7
- package/src/runtime/shared/worktrees/include.mjs +6 -4
- package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
- package/src/runtime/shared/worktrees/manager.mjs +962 -197
- package/src/runtime/shared/worktrees/settings.mjs +33 -7
- package/src/runtime/shared/worktrees/test-support.mjs +5 -1
- package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
- package/src/runtime/tidy/install.mjs +95 -15
- package/src/runtime/tidy/languages.mjs +17 -15
- package/src/runtime/tidy/process.mjs +9 -5
- package/src/runtime/tidy/resolve.mjs +19 -16
- package/src/runtime/tidy/runners/biome.mjs +3 -3
- package/src/runtime/tidy/tool.mjs +1 -1
- package/src/runtime/tidy/worktree.mjs +10 -6
- package/src/runtime/visualize-bridge/client.mjs +4 -1
- package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
- package/src/runtime/web-search/index.mjs +4 -23
- package/src/runtime/web-search/lib/web-tools.mjs +2 -2
- package/src/runtime/web-search/tool-defs.mjs +17 -26
- package/src/session-runtime/agent-profile-changes.mjs +55 -4
- package/src/session-runtime/agent-task-sessions.mjs +410 -353
- package/src/session-runtime/boot/apis.mjs +27 -4
- package/src/session-runtime/boot/begin.mjs +2 -0
- package/src/session-runtime/boot/config.mjs +10 -1
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/providers.mjs +70 -3
- package/src/session-runtime/boot/session.mjs +2 -0
- package/src/session-runtime/boot/tools.mjs +71 -25
- package/src/session-runtime/bot-status.mjs +103 -103
- package/src/session-runtime/channel-config-api.mjs +1 -0
- package/src/session-runtime/config-change-effects.mjs +179 -0
- package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
- package/src/session-runtime/config-lifecycle.mjs +160 -24
- package/src/session-runtime/connector-merge-migration.mjs +18 -15
- package/src/session-runtime/conversation-import/discovery.mjs +245 -47
- package/src/session-runtime/conversation-import/service.mjs +12 -5
- package/src/session-runtime/goal-facade-api.mjs +49 -3
- package/src/session-runtime/handoff-attachments.mjs +1 -1
- package/src/session-runtime/held-requests.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -11
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
- package/src/session-runtime/internal-tool-executor.mjs +12 -19
- package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
- package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
- package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +10 -5
- package/src/session-runtime/lifecycle/teardown.mjs +1 -1
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
- package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
- package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
- package/src/session-runtime/mixy-heartbeat.mjs +1 -1
- package/src/session-runtime/model-route/set-route.mjs +40 -7
- package/src/session-runtime/native-web-search/routes.mjs +3 -3
- package/src/session-runtime/provider-auth/login.mjs +2 -2
- package/src/session-runtime/provider-auth/refresh.mjs +6 -3
- package/src/session-runtime/provider-auth/setup.mjs +1 -1
- package/src/session-runtime/provider-readiness.mjs +53 -4
- package/src/session-runtime/resource-api.mjs +1 -1
- package/src/session-runtime/resource-extension-sync.mjs +4 -8
- package/src/session-runtime/resource-mcp-api.mjs +98 -35
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
- package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
- package/src/session-runtime/resource-mcp-servers.mjs +5 -4
- package/src/session-runtime/resource-plugins-api.mjs +4 -0
- package/src/session-runtime/routine-executor.mjs +152 -0
- package/src/session-runtime/routine-home-turn.mjs +46 -5
- package/src/session-runtime/runtime-facade.mjs +5 -0
- package/src/session-runtime/runtime-feature-gates.mjs +2 -11
- package/src/session-runtime/schedule-session-run.mjs +1 -0
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +120 -8
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
- package/src/session-runtime/services/agent-tool.mjs +51 -1
- package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
- package/src/session-runtime/services/channel-admin.mjs +18 -0
- package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
- package/src/session-runtime/services/daemon-candidate.mjs +4 -1
- package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
- package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
- package/src/session-runtime/services/plugin-admin.mjs +14 -6
- package/src/session-runtime/services/provider-admin.mjs +281 -10
- package/src/session-runtime/services/seeds.mjs +7 -0
- package/src/session-runtime/services/usage-stats-model.mjs +32 -11
- package/src/session-runtime/session-create/materialize.mjs +4 -2
- package/src/session-runtime/session-create/session-options.mjs +2 -0
- package/src/session-runtime/session-turn-api.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
- package/src/session-runtime/settings-system-api.mjs +1 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
- package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
- package/src/session-runtime/setup-tool/executor.mjs +14 -3
- package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
- package/src/session-runtime/setup-tool/tool-defs.mjs +28 -2
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
- package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
- package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
- package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
- package/src/session-runtime/tool-policy-refresh.mjs +182 -5
- package/src/session-runtime/tool-surface.mjs +38 -1
- package/src/session-runtime/turn/agent-ops.mjs +33 -2
- package/src/session-runtime/turn/session-ops.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
- package/src/session-runtime/turn/turn-run.mjs +1 -1
- package/src/session-runtime/webhook-session-run.mjs +2 -0
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +46 -11
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
- package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
- package/src/session-runtime/workflow-agents-api.mjs +2 -0
- package/src/session-runtime/workspace/activity-guards.mjs +176 -0
- package/src/session-runtime/workspace/project-branches.mjs +1 -1
- package/src/session-runtime/workspace/session-view.mjs +149 -0
- package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
- package/src/session-runtime/workspace/transition-runner.mjs +188 -0
- package/src/session-runtime/workspace/transitions.mjs +128 -1070
- package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
- package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
- package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
- package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
- package/src/standalone/daemon-agent-control.mjs +25 -8
- package/src/standalone/daemon-desktop-runtime.mjs +8 -2
- package/src/standalone/daemon-lag-profiler.mjs +7 -7
- package/src/standalone/daemon-session-control.mjs +151 -136
- package/src/standalone/daemon.mjs +61 -2
- package/src/standalone/desktop-service-registry.mjs +9 -0
- package/src/standalone/local-session-runtime.mjs +21 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
- package/src/standalone/session-client.mjs +5 -1
- package/src/standalone/session-frame-stream.mjs +83 -11
- package/src/standalone/session-protocol.mjs +15 -0
- package/src/standalone/session-service/agent-route-follow.mjs +23 -20
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
- package/src/standalone/session-service/agent-tree.mjs +45 -9
- package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
- package/src/standalone/session-service/quota-resume.mjs +9 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
- package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
- package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
- package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
- package/src/standalone/session-service/session-calls.mjs +2 -1
- package/src/standalone/session-service/stored-reader.mjs +127 -40
- package/src/tui/App.jsx +162 -164
- package/src/tui/app/app-view/floating-panel.jsx +3 -0
- package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
- package/src/tui/app/clipboard.mjs +22 -11
- package/src/tui/app/create-app-pickers.mjs +2 -0
- package/src/tui/app/doctor.mjs +2 -2
- package/src/tui/app/panel-signature.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
- package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
- package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
- package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
- package/src/tui/app/provider-setup-picker.mjs +20 -13
- package/src/tui/app/settings-picker.mjs +53 -8
- package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
- package/src/tui/app/slash-commands.mjs +2 -1
- package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
- package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
- package/src/tui/app/slash-dispatch.mjs +1 -1
- package/src/tui/app/use-btw-panel.mjs +29 -0
- package/src/tui/app/use-context-panel-refresh.mjs +31 -0
- package/src/tui/app/use-model-catalog-cache.mjs +13 -10
- package/src/tui/app/use-mouse-input.mjs +11 -0
- package/src/tui/app/use-onboarding-start.mjs +8 -3
- package/src/tui/app/use-panel-transition.mjs +10 -1
- package/src/tui/app/use-pasted-buffers.mjs +28 -20
- package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
- package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
- package/src/tui/app/use-prompt-queue-history.mjs +5 -4
- package/src/tui/app/use-selection-focus.mjs +11 -2
- package/src/tui/app/use-selection-geometry.mjs +18 -9
- package/src/tui/app/use-selection-paint.mjs +4 -4
- package/src/tui/app/use-selection-stitch.mjs +3 -3
- package/src/tui/app/use-slash-palette.mjs +62 -0
- package/src/tui/app/use-terminal-chrome.mjs +2 -2
- package/src/tui/app/use-transcript-activity.mjs +48 -33
- package/src/tui/app/use-transcript-follow.mjs +12 -4
- package/src/tui/app/use-transcript-scroll.mjs +46 -17
- package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
- package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
- package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
- package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
- package/src/tui/app/use-transcript-window.mjs +21 -11
- package/src/tui/app/use-tui-ready.mjs +18 -0
- package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
- package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
- package/src/tui/components/Picker.jsx +27 -3
- package/src/tui/components/SignInUrl.jsx +68 -0
- package/src/tui/components/TextEntryPanel.jsx +76 -46
- package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
- package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
- package/src/tui/components/question-panel-model.mjs +4 -4
- package/src/tui/components/sign-in-url-layout.mjs +24 -0
- package/src/tui/components/tool-execution/standard-card.jsx +3 -4
- package/src/tui/components/user-message-skills.mjs +1 -1
- package/src/tui/dist/index.mjs +2205 -1371
- package/src/tui/markdown/render-ansi.mjs +1 -1
- package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
- package/src/tui/session/agent-job-feed.mjs +2 -0
- package/src/tui/session/context-state.mjs +3 -0
- package/src/tui/session/goal-turn-state.mjs +6 -2
- package/src/tui/session/quota-resume.mjs +1 -1
- package/src/tui/session/session-api/controls.mjs +4 -0
- package/src/tui/session/session-api/extensions.mjs +8 -0
- package/src/tui/session/session-api/intake/abort.mjs +2 -1
- package/src/tui/session/session-api/intake.mjs +2 -0
- package/src/tui/session/session-api/integrations.mjs +2 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
- package/src/tui/session/session-api/routes-agent-definitions.mjs +6 -0
- package/src/tui/session/session-api/settings.mjs +2 -2
- package/src/tui/session/session-api/worktree.mjs +13 -1
- package/src/tui/session/session-flow/drain.mjs +11 -14
- package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
- package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
- package/src/tui/session/transcript-spill.mjs +92 -4
- package/src/tui/session/transcript-store.mjs +2 -0
- package/src/tui/session/turn-quiet.mjs +1 -1
- package/src/tui/session/turn.mjs +3 -0
- package/src/tui/session/worktree-setup-notice.mjs +1 -1
- package/src/tui/spinner-meta.mjs +3 -3
- package/src/tui/spinner-verbs.mjs +2 -2
- package/src/defaults/skills/goal-management/SKILL.md +0 -169
- package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
- package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
- package/src/session-runtime/goal-tasks.mjs +0 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// One explorer: the agent loop driven directly with one fixed system prompt
|
|
2
|
+
// and the read-only filesystem tools — no session record, rules, skills,
|
|
3
|
+
// profile context or persistence.
|
|
4
|
+
import { agentLoop } from '../agent/orchestrator/session/agent-loop.mjs';
|
|
5
|
+
import { readOnlyFilesystemTools } from '../agent/orchestrator/session/manager/tool-resolution.mjs';
|
|
6
|
+
import { sharedPrefixProviderCacheOpts } from '../agent/orchestrator/agent-runtime/cache-strategy.mjs';
|
|
7
|
+
import { partialHandoffTextFromSession } from '../agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs';
|
|
8
|
+
|
|
9
|
+
// Tool-calling responses before the explorer must answer from what it has.
|
|
10
|
+
export const EXPLORER_MAX_TOOL_ROUNDS = 10;
|
|
11
|
+
|
|
12
|
+
export const EXPLORER_SYSTEM_PROMPT = [
|
|
13
|
+
'You explore the working directory read-only to answer one question. You cannot edit, run commands or delegate.',
|
|
14
|
+
'',
|
|
15
|
+
'Search:',
|
|
16
|
+
`- You have ${EXPLORER_MAX_TOOL_ROUNDS} tool rounds: batch independent searches in one turn (parallel calls or array arguments).`,
|
|
17
|
+
"- Search the question's own nouns, and match the subsystem it names, not a similarly named one.",
|
|
18
|
+
'- Locate first, then read only that window.',
|
|
19
|
+
'- A location a tool returned is final; never reconfirm it.',
|
|
20
|
+
'- Before answering, list the parts the question asks about; each needs its own tool-returned `path:line`.',
|
|
21
|
+
'- Cite implementation, not tests, docs or changelogs, unless asked.',
|
|
22
|
+
'- A part without a `path:line`: search again with different terms, or use `code_graph` on a found symbol (definition, callers, writers). Call it missing only after that search, and name what you searched.',
|
|
23
|
+
'- Stop once every part has its location.',
|
|
24
|
+
'',
|
|
25
|
+
'Answer shape, hard limit 1,500 characters, nothing else:',
|
|
26
|
+
'- One short answer line.',
|
|
27
|
+
'- One evidence line per hop of each part (entry, callee, writer, reader), at most 10 lines: `path:line` from tool output, the exact function or symbol name there, a few words.',
|
|
28
|
+
'- No intro, summary, extra locations, notes about unread code or "Open:" lines.',
|
|
29
|
+
].join('\n');
|
|
30
|
+
|
|
31
|
+
// One list for the process: identical schema bytes for every explorer.
|
|
32
|
+
const EXPLORER_TOOLS = readOnlyFilesystemTools();
|
|
33
|
+
export const EXPLORER_TOOL_NAMES = Object.freeze(EXPLORER_TOOLS.map((tool) => tool.name));
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Answer `query` on `route` with `provider`. Resolves the answer text (on a
|
|
37
|
+
* salvage-flagged abort, the text written so far); rejects on failure.
|
|
38
|
+
*/
|
|
39
|
+
export async function runExplorer({ query, route, provider, cwd = null, signal, ownerSessionId = null }) {
|
|
40
|
+
const tools = EXPLORER_TOOLS.slice();
|
|
41
|
+
const messages = [
|
|
42
|
+
{ role: 'system', content: EXPLORER_SYSTEM_PROMPT },
|
|
43
|
+
{ role: 'user', content: query },
|
|
44
|
+
];
|
|
45
|
+
// In-memory policy only: the schema allowlist is also the execution
|
|
46
|
+
// allowlist (pre-dispatch-deny.mjs), and the owner ids attribute spend in
|
|
47
|
+
// the usage ledger. No session id, so nothing session-keyed is created.
|
|
48
|
+
const policy = {
|
|
49
|
+
provider: route.provider,
|
|
50
|
+
model: route.model,
|
|
51
|
+
cwd,
|
|
52
|
+
tools,
|
|
53
|
+
schemaAllowedTools: EXPLORER_TOOL_NAMES,
|
|
54
|
+
compaction: { auto: false },
|
|
55
|
+
ownerSessionId,
|
|
56
|
+
parentSessionId: ownerSessionId,
|
|
57
|
+
};
|
|
58
|
+
// Text of the request in flight, for salvage when the deadline cuts it.
|
|
59
|
+
let streamed = '';
|
|
60
|
+
try {
|
|
61
|
+
const response = await agentLoop(provider, messages, route.model, tools, null, cwd, {
|
|
62
|
+
signal,
|
|
63
|
+
session: policy,
|
|
64
|
+
...(route.effort ? { effort: route.effort } : {}),
|
|
65
|
+
fast: route.fast === true,
|
|
66
|
+
modelParameters: route.modelParameters || {},
|
|
67
|
+
turnLimits: { maxToolRounds: EXPLORER_MAX_TOOL_ROUNDS },
|
|
68
|
+
...sharedPrefixProviderCacheOpts(route.provider),
|
|
69
|
+
onProviderSendStarted: () => {
|
|
70
|
+
streamed = '';
|
|
71
|
+
},
|
|
72
|
+
onTextDelta: (chunk) => {
|
|
73
|
+
streamed += typeof chunk === 'string' ? chunk : '';
|
|
74
|
+
},
|
|
75
|
+
onTextReset: ({ chars } = {}) => {
|
|
76
|
+
streamed = streamed.slice(0, Math.max(0, streamed.length - (Number(chars) || 0)));
|
|
77
|
+
return true;
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
return String(response?.content || '').trim();
|
|
81
|
+
} catch (error) {
|
|
82
|
+
if (signal?.reason?.salvagePartial === true) {
|
|
83
|
+
const partial = [partialHandoffTextFromSession({ messages }, 2), streamed.trim()].filter(Boolean).join('\n\n');
|
|
84
|
+
if (partial) return partial;
|
|
85
|
+
}
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { TOOL_SYNC_EXECUTION_CONTRACT } from '../shared/tool-execution-contract.mjs';
|
|
2
|
+
|
|
3
|
+
export const EXPLORE_MAX_QUERIES = 8;
|
|
4
|
+
|
|
5
|
+
export const TOOL_DEFS = [
|
|
6
|
+
{
|
|
7
|
+
name: 'explore',
|
|
8
|
+
title: 'Explore',
|
|
9
|
+
annotations: {
|
|
10
|
+
title: 'Explore',
|
|
11
|
+
readOnlyHint: true,
|
|
12
|
+
destructiveHint: false,
|
|
13
|
+
idempotentHint: true,
|
|
14
|
+
openWorldHint: false,
|
|
15
|
+
},
|
|
16
|
+
description:
|
|
17
|
+
'Read-only code search in parallel explorers outside your context; returns one merged answer with path:line evidence. ' +
|
|
18
|
+
'Use when locating needs 3+ searches, spans 2+ files or areas, or covers independent questions; a known file or one lookup: read/grep. ' +
|
|
19
|
+
TOOL_SYNC_EXECUTION_CONTRACT,
|
|
20
|
+
inputSchema: {
|
|
21
|
+
type: 'object',
|
|
22
|
+
properties: {
|
|
23
|
+
query: {
|
|
24
|
+
anyOf: [
|
|
25
|
+
{ type: 'string', minLength: 1 },
|
|
26
|
+
{ type: 'array', items: { type: 'string', minLength: 1 }, minItems: 1, maxItems: EXPLORE_MAX_QUERIES },
|
|
27
|
+
],
|
|
28
|
+
description: 'One self-contained question, or an array of independent ones (one explorer each).',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
required: ['query'],
|
|
32
|
+
additionalProperties: false,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
];
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// The explore tool: one read-only explorer loop per query (explorer.mjs), all
|
|
2
|
+
// in parallel, merged into one bounded answer within the same tool call.
|
|
3
|
+
import { resolveMaintenanceRoute } from '../agent/orchestrator/agent-runtime/maintenance-route.mjs';
|
|
4
|
+
import { loadConfig } from '../agent/orchestrator/config.mjs';
|
|
5
|
+
import { getProvider, initProviders } from '../agent/orchestrator/providers/registry.mjs';
|
|
6
|
+
import { EXPLORE_MAX_QUERIES } from './tool-defs.mjs';
|
|
7
|
+
import { runExplorer } from './explorer.mjs';
|
|
8
|
+
|
|
9
|
+
// Hidden ids are reserved from user agents, so this one keeps the `-agent`
|
|
10
|
+
// suffix: a plain `explorer` would hide a user's own Explorer agent.
|
|
11
|
+
const EXPLORER_AGENT = 'explore-agent';
|
|
12
|
+
const EXPLORE_TIMEOUT_MS = 120_000;
|
|
13
|
+
export const EXPLORE_OUTPUT_CAP = 24_000;
|
|
14
|
+
const TRUNCATED = '\n[explore: answer truncated]';
|
|
15
|
+
|
|
16
|
+
function result(text, isError = false) {
|
|
17
|
+
return { content: [{ type: 'text', text }], ...(isError ? { isError: true } : {}) };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function normalizeExploreQueries(raw) {
|
|
21
|
+
const list = Array.isArray(raw) ? raw : [raw];
|
|
22
|
+
return list.map((q) => (typeof q === 'string' ? q.trim() : '')).filter(Boolean);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function capped(text, budget) {
|
|
26
|
+
return text.length <= budget ? text : text.slice(0, Math.max(0, budget - TRUNCATED.length)) + TRUNCATED;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Headings and error lines are labels, not answers: the truncation marker
|
|
30
|
+
// would tell the caller that evidence was lost when none was.
|
|
31
|
+
function shortened(text, max) {
|
|
32
|
+
return text.length <= max ? text : `${text.slice(0, max - 1)}…`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param {{ query: string|string[] }} args
|
|
37
|
+
* @param {{ cwd?: string, signal?: AbortSignal, callerSessionId?: string }} ctx
|
|
38
|
+
* @param {object} [deps] injectable for tests
|
|
39
|
+
*/
|
|
40
|
+
export async function runExplore(args = {}, ctx = {}, deps = {}) {
|
|
41
|
+
const {
|
|
42
|
+
load = () => loadConfig({ secrets: false }),
|
|
43
|
+
initialize = initProviders,
|
|
44
|
+
providerFor = getProvider,
|
|
45
|
+
timeoutMs = EXPLORE_TIMEOUT_MS,
|
|
46
|
+
} = deps;
|
|
47
|
+
const queries = normalizeExploreQueries(args.query);
|
|
48
|
+
if (!queries.length) return result('[explore error] query is required', true);
|
|
49
|
+
if (queries.length > EXPLORE_MAX_QUERIES) {
|
|
50
|
+
return result(`[explore error] at most ${EXPLORE_MAX_QUERIES} queries per call`, true);
|
|
51
|
+
}
|
|
52
|
+
const config = load();
|
|
53
|
+
const route = resolveMaintenanceRoute({ agent: EXPLORER_AGENT, config, includeDefault: false });
|
|
54
|
+
if (!route || typeof route !== 'object') {
|
|
55
|
+
return result('[explore error] Explore has no model; pick one under Workflows → Built-in agents → Explore', true);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// One controller per call: caller cancellation and the deadline both abort
|
|
59
|
+
// every explorer, and the call waits for each loop to settle.
|
|
60
|
+
const controller = new AbortController();
|
|
61
|
+
const parent = ctx.signal;
|
|
62
|
+
const onParentAbort = () => controller.abort(parent.reason);
|
|
63
|
+
if (parent?.aborted) return result('[explore error] cancelled', true);
|
|
64
|
+
parent?.addEventListener('abort', onParentAbort, { once: true });
|
|
65
|
+
let timedOut = false;
|
|
66
|
+
const timer = setTimeout(() => {
|
|
67
|
+
timedOut = true;
|
|
68
|
+
const reason = new Error(`explore timed out after ${Math.round(timeoutMs / 1000)}s`);
|
|
69
|
+
// Lets an explorer return the answer text it already wrote.
|
|
70
|
+
reason.salvagePartial = true;
|
|
71
|
+
controller.abort(reason);
|
|
72
|
+
}, timeoutMs);
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
await initialize(config.providers || {}, { signal: controller.signal });
|
|
76
|
+
const provider = providerFor(route.provider);
|
|
77
|
+
if (!provider || typeof provider.send !== 'function') {
|
|
78
|
+
return result(`[explore error] provider "${route.provider}" is not ready`, true);
|
|
79
|
+
}
|
|
80
|
+
const settled = await Promise.all(
|
|
81
|
+
queries.map((query) =>
|
|
82
|
+
runExplorer({
|
|
83
|
+
query,
|
|
84
|
+
route,
|
|
85
|
+
provider,
|
|
86
|
+
cwd: ctx.cwd || null,
|
|
87
|
+
signal: controller.signal,
|
|
88
|
+
ownerSessionId: ctx.callerSessionId || null,
|
|
89
|
+
}).then(
|
|
90
|
+
(text) => {
|
|
91
|
+
const answer = String(text || '').trim();
|
|
92
|
+
return { ok: Boolean(answer), text: answer, late: timedOut };
|
|
93
|
+
},
|
|
94
|
+
(error) => ({ ok: false, error, late: timedOut })
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
);
|
|
98
|
+
if (parent?.aborted) return result('[explore error] cancelled', true);
|
|
99
|
+
const budget = Math.floor(EXPLORE_OUTPUT_CAP / queries.length);
|
|
100
|
+
const bodies = settled.map((entry) => {
|
|
101
|
+
if (entry.ok) return capped(entry.late ? `${entry.text}\n[explore: partial, timed out]` : entry.text, budget);
|
|
102
|
+
if (entry.late) return `[explore error] timed out after ${Math.round(timeoutMs / 1000)}s with no answer`;
|
|
103
|
+
if (entry.error) return `[explore error] ${shortened(String(entry.error?.message || entry.error), 500)}`;
|
|
104
|
+
return '[explore error] explorer returned no answer';
|
|
105
|
+
});
|
|
106
|
+
const text =
|
|
107
|
+
queries.length === 1
|
|
108
|
+
? bodies[0]
|
|
109
|
+
: bodies
|
|
110
|
+
.map((body, i) => `## Q${i + 1}: ${shortened(queries[i].replace(/\s+/g, ' '), 100)}\n${body}`)
|
|
111
|
+
.join('\n\n');
|
|
112
|
+
return result(
|
|
113
|
+
text,
|
|
114
|
+
settled.every((entry) => !entry.ok)
|
|
115
|
+
);
|
|
116
|
+
} catch (error) {
|
|
117
|
+
if (parent?.aborted) return result('[explore error] cancelled', true);
|
|
118
|
+
return result(`[explore error] ${error?.message || error}`, true);
|
|
119
|
+
} finally {
|
|
120
|
+
clearTimeout(timer);
|
|
121
|
+
parent?.removeEventListener('abort', onParentAbort);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -19,7 +19,7 @@ export function localProviderPlatformKey(platform = process.platform, arch = pro
|
|
|
19
19
|
* RAM — exactly what llama.cpp's Metal backend reports on a 16 GB M4; larger
|
|
20
20
|
* Macs may allow more, which this leaves unused. Metal reports that whole
|
|
21
21
|
* working set as free, so free equals total here as it does in llama.cpp. */
|
|
22
|
-
|
|
22
|
+
function appleSiliconGpu({ name, totalBytes, wiredLimitMb }) {
|
|
23
23
|
const memoryBytes = wiredLimitMb > 0 ? wiredLimitMb * 1024 ** 2 : Math.floor((totalBytes * 2) / 3);
|
|
24
24
|
return { index: 0, uuid: 'MTL0', vendor: 'Apple', name, memoryBytes, freeMemoryBytes: memoryBytes };
|
|
25
25
|
}
|
|
@@ -32,9 +32,9 @@ import {
|
|
|
32
32
|
|
|
33
33
|
const REQUEST_TIMEOUT_MS = 400_000;
|
|
34
34
|
const LABEL = 'ChatGPT image';
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
const CODEX_IMAGE_MODEL = 'gpt-image-2';
|
|
36
|
+
const CODEX_IMAGES_GENERATIONS_URL = new URL('images/generations', CODEX_RESPONSES_URL).href;
|
|
37
|
+
const CODEX_IMAGES_EDITS_URL = new URL('images/edits', CODEX_RESPONSES_URL).href;
|
|
38
38
|
const BACKGROUNDS = new Set(['transparent', 'opaque', 'auto']);
|
|
39
39
|
|
|
40
40
|
const dataUrl = (ref) => `data:${ref.mime || 'image/png'};base64,${ref.base64}`;
|
|
@@ -83,7 +83,7 @@ async function generateViaVeo({ model, prompt, options, references = [], signal,
|
|
|
83
83
|
if ([4, 6, 8].includes(duration)) parameters.durationSeconds = duration;
|
|
84
84
|
|
|
85
85
|
// The budget starts at submission, not after it: a hung predictLongRunning
|
|
86
|
-
// POST
|
|
86
|
+
// POST would otherwise run without any ceiling of its own.
|
|
87
87
|
const deadline = Date.now() + TOTAL_TIMEOUT_MS;
|
|
88
88
|
const started = await fetch(`${BASE_URL}/models/${encodeURIComponent(model)}:predictLongRunning`, {
|
|
89
89
|
method: 'POST',
|
|
@@ -91,7 +91,7 @@ export function imageApiUsage(body) {
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
/** True when the provider reported something billable for the request. */
|
|
94
|
-
|
|
94
|
+
function hasReportedUsage(usage) {
|
|
95
95
|
if (!usage) return false;
|
|
96
96
|
// Seconds are only attached once a video generation completed (billed per second).
|
|
97
97
|
return (
|
|
@@ -231,7 +231,7 @@ export function saveMediaAsset({ kind, lane, model, prompt, options = {}, mime,
|
|
|
231
231
|
// whose bytes are all NUL.
|
|
232
232
|
writeFileAtomicSync(path, bytes);
|
|
233
233
|
entry.file = file;
|
|
234
|
-
// The gallery is NOT capped (user). An entry-count trim
|
|
234
|
+
// The gallery is NOT capped (user). An entry-count trim would unlink the
|
|
235
235
|
// oldest files here, which is data loss nobody asked for: a generated asset
|
|
236
236
|
// leaves this store only through an explicit delete.
|
|
237
237
|
mutateIndex((assets) => [entry, ...assets]);
|
|
@@ -59,7 +59,8 @@ import {
|
|
|
59
59
|
resolveCoalesceMaxRetries,
|
|
60
60
|
scheduleCoalescedCycleRetry,
|
|
61
61
|
} from './lib/memory-cycle-requests.mjs';
|
|
62
|
-
import { drainEmbeddingReindex } from './lib/embedding-reindex.mjs';
|
|
62
|
+
import { drainEmbeddingReindex, runRootEmbedSweep } from './lib/embedding-reindex.mjs';
|
|
63
|
+
import { sweepRootEmbedText } from './lib/memory-embed.mjs';
|
|
63
64
|
import { refreshCoreMemoryFile } from './lib/core-memory-file.mjs';
|
|
64
65
|
import { resolveProjectId, resolveProjectScope } from './lib/project-id-resolver.mjs';
|
|
65
66
|
import {
|
|
@@ -71,6 +72,7 @@ import {
|
|
|
71
72
|
} from './lib/trace-store.mjs';
|
|
72
73
|
import { writeJsonAtomicSync } from '../shared/atomic-file.mjs';
|
|
73
74
|
import { safeIpcSend } from '../shared/safe-ipc-send.mjs';
|
|
75
|
+
import { adoptSystemProxy } from '../shared/llm/system-proxy.mjs';
|
|
74
76
|
import { resolvePluginData, mixdogHome } from '../shared/plugin-paths.mjs';
|
|
75
77
|
import { scheduledCycle1Signature } from './lib/cycle-signatures.mjs';
|
|
76
78
|
import { createTranscriptIngest } from './lib/transcript-ingest.mjs';
|
|
@@ -96,6 +98,9 @@ import {
|
|
|
96
98
|
} from './lib/memory-config-flags.mjs';
|
|
97
99
|
const IS_MEMORY_ENTRY = !!process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
|
|
98
100
|
if (IS_MEMORY_ENTRY) {
|
|
101
|
+
// Runtime and model downloads follow the system proxy the launching daemon
|
|
102
|
+
// handed over (removed from this env so child processes never see it).
|
|
103
|
+
adoptSystemProxy();
|
|
99
104
|
// Node's own warning printer stays off in this runtime, but a listener leak
|
|
100
105
|
// is still logged, with the stack that names its source.
|
|
101
106
|
process.removeAllListeners('warning');
|
|
@@ -428,6 +433,15 @@ function _startEmbeddingReindex() {
|
|
|
428
433
|
`ok=${summary.succeeded} failed=${summary.failed}\n`
|
|
429
434
|
);
|
|
430
435
|
}
|
|
436
|
+
return runRootEmbedSweep({
|
|
437
|
+
sweepStep: ({ signal }) => sweepRootEmbedText(db, { signal }),
|
|
438
|
+
signal: controller.signal,
|
|
439
|
+
});
|
|
440
|
+
})
|
|
441
|
+
.then((sweep) => {
|
|
442
|
+
if (sweep.replaced > 0) {
|
|
443
|
+
__mixdogMemoryLog(`[memory-service] root text sweep steps=${sweep.steps} replaced=${sweep.replaced}\n`);
|
|
444
|
+
}
|
|
431
445
|
})
|
|
432
446
|
.catch((error) => {
|
|
433
447
|
if (!controller.signal.aborted) {
|
|
@@ -12,6 +12,7 @@ import { writeProfilePoint } from './model-profile.mjs';
|
|
|
12
12
|
import { createCompactVectorCache } from './compact-vector-cache.mjs';
|
|
13
13
|
import { EMBED_KEEP_WARM_MS } from './embedding-idle-lease.mjs';
|
|
14
14
|
import { workerExecArgv } from '../../shared/worker-exec-argv.mjs';
|
|
15
|
+
import { systemProxyHandoffEnv } from '../../shared/llm/system-proxy.mjs';
|
|
15
16
|
import {
|
|
16
17
|
getConfiguredEmbeddingModelId,
|
|
17
18
|
getDefaultEmbeddingDtype,
|
|
@@ -69,7 +70,9 @@ function ensureWorker() {
|
|
|
69
70
|
_lastRestartMs = now;
|
|
70
71
|
const execArgv = embeddingWorkerExecArgv();
|
|
71
72
|
const created = new Worker(WORKER_PATH, {
|
|
72
|
-
|
|
73
|
+
// The model download runs in this worker: it gets the system proxy
|
|
74
|
+
// decision explicitly (and removes it from its own env on start).
|
|
75
|
+
env: { ...process.env, ...systemProxyHandoffEnv() },
|
|
73
76
|
execArgv,
|
|
74
77
|
workerData: { dtype: _configuredDtype },
|
|
75
78
|
});
|
|
@@ -46,3 +46,30 @@ export async function drainEmbeddingReindex({
|
|
|
46
46
|
|
|
47
47
|
return { passes, attempted, succeeded, failed };
|
|
48
48
|
}
|
|
49
|
+
|
|
50
|
+
// The root-text sweep replaces vectors that still work, so it has no urgency:
|
|
51
|
+
// small steps with long rests keep a ~62k-root backfill in the background of a
|
|
52
|
+
// working session instead of competing with it.
|
|
53
|
+
const ROOT_SWEEP_PAUSE_MS = 4_000;
|
|
54
|
+
|
|
55
|
+
export async function runRootEmbedSweep({
|
|
56
|
+
sweepStep,
|
|
57
|
+
signal,
|
|
58
|
+
pauseMs = ROOT_SWEEP_PAUSE_MS,
|
|
59
|
+
wait = waitForNextPass,
|
|
60
|
+
} = {}) {
|
|
61
|
+
if (typeof sweepStep !== 'function') {
|
|
62
|
+
throw new TypeError('runRootEmbedSweep: sweepStep required');
|
|
63
|
+
}
|
|
64
|
+
let steps = 0;
|
|
65
|
+
let replaced = 0;
|
|
66
|
+
while (true) {
|
|
67
|
+
throwIfAborted(signal);
|
|
68
|
+
const result = await sweepStep({ signal });
|
|
69
|
+
steps += 1;
|
|
70
|
+
replaced += Number(result?.replaced ?? 0);
|
|
71
|
+
if (result?.done) break;
|
|
72
|
+
await wait(pauseMs, signal);
|
|
73
|
+
}
|
|
74
|
+
return { steps, replaced };
|
|
75
|
+
}
|
|
@@ -8,6 +8,7 @@ import os from 'node:os';
|
|
|
8
8
|
import { execFile } from 'node:child_process';
|
|
9
9
|
import { promisify } from 'node:util';
|
|
10
10
|
import { resolvePluginData } from '../../shared/plugin-paths.mjs';
|
|
11
|
+
import { adoptSystemProxy } from '../../shared/llm/system-proxy.mjs';
|
|
11
12
|
import { compressEmbeddingModelCache } from './embedding-model-cache-compression.mjs';
|
|
12
13
|
import { createIdleLease } from './embedding-idle-lease.mjs';
|
|
13
14
|
import { ensureModelFile, ensureModelGraph } from './embedding-model-files.mjs';
|
|
@@ -24,6 +25,9 @@ import {
|
|
|
24
25
|
prepareEmbeddingInput,
|
|
25
26
|
} from './embedding-model-config.mjs';
|
|
26
27
|
|
|
28
|
+
// The model download goes through the system proxy the parent handed over.
|
|
29
|
+
adoptSystemProxy();
|
|
30
|
+
|
|
27
31
|
const MODEL_ID = getConfiguredEmbeddingModelId();
|
|
28
32
|
|
|
29
33
|
// Reroute ALL worker-thread stdio through parentPort. Without stdout:true/
|
|
@@ -2,7 +2,7 @@ import { __mixdogMemoryLog } from './memory-log.mjs';
|
|
|
2
2
|
|
|
3
3
|
import { embedTexts, getEmbeddingModelId, holdEmbeddingWarm } from './embedding-provider.mjs';
|
|
4
4
|
import { onnxRuntimeSupported } from '../../shared/onnx-runtime-support.mjs';
|
|
5
|
-
import { embeddingToSql } from './memory.mjs';
|
|
5
|
+
import { embeddingToSql, ROOT_EMBED_SWEEP_META_KEY } from './memory.mjs';
|
|
6
6
|
import { createHash } from 'node:crypto';
|
|
7
7
|
import { pruneEmbeddingCache, resolveEmbeddingCacheMaxRows } from './embedding-cache-retention.mjs';
|
|
8
8
|
import { throwIfAborted, markStoreFault } from './memory-cycle-shared.mjs';
|
|
@@ -524,6 +524,18 @@ async function syncRawBatchEmbeddings(db, ids, options = {}) {
|
|
|
524
524
|
return writtenIds;
|
|
525
525
|
}
|
|
526
526
|
|
|
527
|
+
// A chunk root is also the chunk's first message: cycle1 promotes that raw row
|
|
528
|
+
// in place, and every other member keeps its own content vector. Embedding only
|
|
529
|
+
// element/summary left the first message's own words with no vector, so its
|
|
530
|
+
// details were reachable only through the lossy summary. The summary leads so a
|
|
531
|
+
// long message truncated at the model window still keeps it.
|
|
532
|
+
export function rootEmbedText(row) {
|
|
533
|
+
const head = [row?.element, row?.summary].filter(Boolean).join(' — ').trim();
|
|
534
|
+
if (!head) return '';
|
|
535
|
+
const content = isRawEmbeddable(row?.role, row?.content) ? row.content.trim() : '';
|
|
536
|
+
return content ? `${head}\n\n${content}` : head;
|
|
537
|
+
}
|
|
538
|
+
|
|
527
539
|
// Batch-embed all ids in one DB round-trip for fetching, one API call per unique text,
|
|
528
540
|
// then one VALUES UPDATE for all results.
|
|
529
541
|
// Returns the list of ids that were actually UPDATEd with a fresh embedding.
|
|
@@ -535,9 +547,10 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
|
|
|
535
547
|
throwIfAborted(signal);
|
|
536
548
|
if (!onnxRuntimeSupported()) return [];
|
|
537
549
|
const rows = (
|
|
538
|
-
await db.query(
|
|
539
|
-
|
|
540
|
-
|
|
550
|
+
await db.query(
|
|
551
|
+
`SELECT id, element, summary, content, role FROM memory.entries WHERE id = ANY($1::bigint[]) AND is_root = 1`,
|
|
552
|
+
[ids]
|
|
553
|
+
)
|
|
541
554
|
).rows;
|
|
542
555
|
throwIfAborted(signal);
|
|
543
556
|
if (rows.length === 0) return [];
|
|
@@ -546,8 +559,9 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
|
|
|
546
559
|
throwIfAborted(signal);
|
|
547
560
|
const expected = Number(dimsRow?.value ?? 0);
|
|
548
561
|
|
|
549
|
-
const texts = rows.map(
|
|
550
|
-
const
|
|
562
|
+
const texts = rows.map(rootEmbedText);
|
|
563
|
+
const embedBatch = options.embedBatch ?? cachedEmbedTextBatch;
|
|
564
|
+
const vectors = await embedBatch(db, texts.filter(Boolean), { signal });
|
|
551
565
|
throwIfAborted(signal);
|
|
552
566
|
// Re-map: only non-empty texts were passed to cachedEmbedTextBatch
|
|
553
567
|
let vecIdx = 0;
|
|
@@ -562,28 +576,29 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
|
|
|
562
576
|
__mixdogMemoryLog(`[embed] dim mismatch (id=${row.id} got=${vector.length} expected=${expected})\n`);
|
|
563
577
|
continue;
|
|
564
578
|
}
|
|
565
|
-
updates.push({ id: Number(row.id), element: row.element, summary: row.summary, vector });
|
|
579
|
+
updates.push({ id: Number(row.id), element: row.element, summary: row.summary, content: row.content, vector });
|
|
566
580
|
}
|
|
567
581
|
|
|
568
582
|
if (updates.length === 0) return [];
|
|
569
583
|
|
|
570
584
|
// The VALUES update is one SQL batch; do not split it with an abort checkpoint.
|
|
571
585
|
const valClauses = updates.map((_u, i) => {
|
|
572
|
-
const base = i *
|
|
573
|
-
return `($${base + 1}::bigint, $${base + 2}::halfvec, $${base + 3}::text, $${base + 4}::text)`;
|
|
586
|
+
const base = i * 5;
|
|
587
|
+
return `($${base + 1}::bigint, $${base + 2}::halfvec, $${base + 3}::text, $${base + 4}::text, $${base + 5}::text)`;
|
|
574
588
|
});
|
|
575
589
|
const params = [];
|
|
576
590
|
for (const u of updates) {
|
|
577
|
-
params.push(u.id, embeddingToSql(u.vector), u.element, u.summary);
|
|
591
|
+
params.push(u.id, embeddingToSql(u.vector), u.element, u.summary, u.content);
|
|
578
592
|
}
|
|
579
593
|
const res = await db.query(
|
|
580
594
|
`UPDATE memory.entries AS e
|
|
581
595
|
SET embedding = t.vector
|
|
582
|
-
FROM (VALUES ${valClauses.join(',')}) AS t(id, vector, element, summary)
|
|
596
|
+
FROM (VALUES ${valClauses.join(',')}) AS t(id, vector, element, summary, content)
|
|
583
597
|
WHERE e.id = t.id AND e.is_root = 1
|
|
584
|
-
AND e.embedding IS NULL
|
|
598
|
+
AND e.embedding IS ${options.replace ? 'NOT ' : ''}NULL
|
|
585
599
|
AND e.element IS NOT DISTINCT FROM t.element
|
|
586
600
|
AND e.summary IS NOT DISTINCT FROM t.summary
|
|
601
|
+
AND e.content IS NOT DISTINCT FROM t.content
|
|
587
602
|
RETURNING e.id`,
|
|
588
603
|
params
|
|
589
604
|
);
|
|
@@ -596,7 +611,7 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
|
|
|
596
611
|
const curRows = missedIds.length
|
|
597
612
|
? (
|
|
598
613
|
await db.query(
|
|
599
|
-
`SELECT id, embedding IS NOT NULL AS has_embedding, element, summary
|
|
614
|
+
`SELECT id, embedding IS NOT NULL AS has_embedding, element, summary, content
|
|
600
615
|
FROM memory.entries WHERE id = ANY($1::bigint[]) AND is_root = 1`,
|
|
601
616
|
[missedIds]
|
|
602
617
|
)
|
|
@@ -610,7 +625,8 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
|
|
|
610
625
|
if (!cur) continue;
|
|
611
626
|
const textUnchanged =
|
|
612
627
|
(cur.element === u.element || (cur.element == null && u.element == null)) &&
|
|
613
|
-
(cur.summary === u.summary || (cur.summary == null && u.summary == null))
|
|
628
|
+
(cur.summary === u.summary || (cur.summary == null && u.summary == null)) &&
|
|
629
|
+
(cur.content === u.content || (cur.content == null && u.content == null));
|
|
614
630
|
if (!textUnchanged) {
|
|
615
631
|
staleSkips++;
|
|
616
632
|
continue;
|
|
@@ -631,6 +647,59 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
|
|
|
631
647
|
return writtenIds;
|
|
632
648
|
}
|
|
633
649
|
|
|
650
|
+
// One paced step of the root-text sweep (startRootEmbedSweep in memory.mjs).
|
|
651
|
+
// Existing vectors stay searchable until replaced: the step claims the next
|
|
652
|
+
// roots below the stored cursor that still HAVE a vector, embeds their current
|
|
653
|
+
// text, replaces each vector only where the text is unchanged, and advances the
|
|
654
|
+
// cursor in the same transaction. The meta row lock serializes concurrent
|
|
655
|
+
// sweepers; any failure rolls back both vectors and cursor. Roots without a
|
|
656
|
+
// vector are left to the ordinary flush, which already uses the new text.
|
|
657
|
+
const ROOT_SWEEP_BATCH = 8;
|
|
658
|
+
export async function sweepRootEmbedText(db, options = {}) {
|
|
659
|
+
const { batchSize = ROOT_SWEEP_BATCH, signal, embedBatch } = options;
|
|
660
|
+
throwIfAborted(signal);
|
|
661
|
+
if (!onnxRuntimeSupported()) return { claimed: 0, replaced: 0, done: true };
|
|
662
|
+
await ensureEmbCacheTable(db);
|
|
663
|
+
const client = await db._pool.connect();
|
|
664
|
+
let committed = false;
|
|
665
|
+
try {
|
|
666
|
+
await client.query('BEGIN');
|
|
667
|
+
const state = await client.query(`SELECT value FROM memory.meta WHERE key = $1 FOR UPDATE`, [
|
|
668
|
+
ROOT_EMBED_SWEEP_META_KEY,
|
|
669
|
+
]);
|
|
670
|
+
const value = state.rows[0]?.value;
|
|
671
|
+
const cursor = Number(value?.cursor);
|
|
672
|
+
if (!value || value.done === true || !Number.isFinite(cursor)) {
|
|
673
|
+
await client.query('COMMIT');
|
|
674
|
+
committed = true;
|
|
675
|
+
return { claimed: 0, replaced: 0, done: true };
|
|
676
|
+
}
|
|
677
|
+
const claim = await client.query(
|
|
678
|
+
`SELECT id FROM memory.entries
|
|
679
|
+
WHERE is_root = 1 AND id < $1 AND embedding IS NOT NULL
|
|
680
|
+
AND (element IS NOT NULL OR summary IS NOT NULL)
|
|
681
|
+
ORDER BY id DESC
|
|
682
|
+
LIMIT $2
|
|
683
|
+
FOR UPDATE`,
|
|
684
|
+
[cursor, batchSize]
|
|
685
|
+
);
|
|
686
|
+
const ids = claim.rows.map((r) => Number(r.id));
|
|
687
|
+
throwIfAborted(signal);
|
|
688
|
+
const written = ids.length ? await syncBatchEmbeddings(client, ids, { signal, replace: true, embedBatch }) : [];
|
|
689
|
+
const done = ids.length < batchSize;
|
|
690
|
+
await client.query(
|
|
691
|
+
`UPDATE memory.meta SET value = jsonb_build_object('cursor', $2::bigint, 'done', $3::boolean) WHERE key = $1`,
|
|
692
|
+
[ROOT_EMBED_SWEEP_META_KEY, ids.length ? Math.min(...ids) : cursor, done]
|
|
693
|
+
);
|
|
694
|
+
await client.query('COMMIT');
|
|
695
|
+
committed = true;
|
|
696
|
+
return { claimed: ids.length, replaced: written.length, done };
|
|
697
|
+
} finally {
|
|
698
|
+
if (!committed) await client.query('ROLLBACK').catch(() => {});
|
|
699
|
+
client.release();
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
634
703
|
// Explicit maintenance must propagate partial failures and caller cancellation,
|
|
635
704
|
// including callers sharing a flush that was started without their signal.
|
|
636
705
|
export async function flushSearchEmbeddings(db, options = {}) {
|