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
|
@@ -9,11 +9,12 @@ import { withBuiltinPathLocks } from './path-locks.mjs';
|
|
|
9
9
|
import { withAdvisoryLocks } from './advisory-lock.mjs';
|
|
10
10
|
import { gitRepoLockKey, withGitWorktreeWriteLock } from './git-repo-rw-lock.mjs';
|
|
11
11
|
import { invalidateBuiltinResultCache } from './cache-layers.mjs';
|
|
12
|
-
import {
|
|
12
|
+
import { tryAdmitWorkspaceActivityAsync } from '../../../../shared/worktrees/activity-gate.mjs';
|
|
13
13
|
import { WORKTREE_SNAPSHOT_KIND } from '../../../../shared/worktrees/contract.mjs';
|
|
14
14
|
import { isWithin } from '../../../../shared/worktrees/paths.mjs';
|
|
15
15
|
import { readRegistrySync } from '../../../../shared/worktrees/registry.mjs';
|
|
16
16
|
import { runAbortable } from '../../../../shared/abort-race.mjs';
|
|
17
|
+
import { startGit } from '../../../../shared/git-launch.mjs';
|
|
17
18
|
import { sleep } from '../../../../shared/sleep.mjs';
|
|
18
19
|
import { capMarker } from '../../../../shared/tool-output-marker.mjs';
|
|
19
20
|
import { drainCodeGraphCache } from '../code-graph-state.mjs';
|
|
@@ -97,7 +98,7 @@ export const GIT_TOOL_DEF = {
|
|
|
97
98
|
openWorldHint: true,
|
|
98
99
|
compressible: true,
|
|
99
100
|
},
|
|
100
|
-
description: `${GIT_DESCRIPTION_HEAD} Worktrees are managed only: action:worktree; git worktree add/remove/list/prune map to managed operations (add -b keeps the session in place; add --detach makes a read-only snapshot worktree, removed when its turn ends; list --porcelain stays raw git; move/lock/unlock/repair are refused). Merge or remove only when the user asks.`,
|
|
101
|
+
description: `${GIT_DESCRIPTION_HEAD} Worktrees are managed only: action:worktree; git worktree add/remove/list/prune map to managed operations (add -b keeps the session in place; add --detach makes a read-only snapshot worktree, removed when its turn ends, and is the one add a delegated worker may run; list --porcelain stays raw git; move/lock/unlock/repair are refused). Merge or remove only when the user asks.`,
|
|
101
102
|
inputSchema: {
|
|
102
103
|
type: 'object',
|
|
103
104
|
properties: {
|
|
@@ -143,7 +144,10 @@ export const GIT_TOOL_DEF = {
|
|
|
143
144
|
description: 'enter/return/merge/remove: another session (it must be idle); default the caller.',
|
|
144
145
|
},
|
|
145
146
|
name: { type: 'string', description: 'enter: the new worktree name (branch <prefix><name>).' },
|
|
146
|
-
branch: {
|
|
147
|
+
branch: {
|
|
148
|
+
type: 'string',
|
|
149
|
+
description: "enter: use the worktree of this branch instead. remove: this session's worktree of that branch.",
|
|
150
|
+
},
|
|
147
151
|
create: { type: 'boolean', description: 'enter with branch: create that branch.' },
|
|
148
152
|
carry: {
|
|
149
153
|
type: 'string',
|
|
@@ -437,7 +441,24 @@ function parseCommand(rawCommand, workDir) {
|
|
|
437
441
|
return { command: String(command), cwd, globalArgs, operation, args };
|
|
438
442
|
}
|
|
439
443
|
|
|
440
|
-
|
|
444
|
+
function gitToolEnvironment(optionalLocks) {
|
|
445
|
+
return {
|
|
446
|
+
...process.env,
|
|
447
|
+
GIT_TERMINAL_PROMPT: '0',
|
|
448
|
+
GIT_PAGER: 'cat',
|
|
449
|
+
GIT_EDITOR: 'true',
|
|
450
|
+
GIT_SEQUENCE_EDITOR: 'true',
|
|
451
|
+
LC_ALL: 'C',
|
|
452
|
+
// Reads run beside writes without a lock (git-repo-rw-lock.mjs).
|
|
453
|
+
// With optional locks off `git status` never takes index.lock to
|
|
454
|
+
// write back a refreshed index, so it cannot fail a concurrent
|
|
455
|
+
// write on that lock. (`git diff` ignores the setting and may still
|
|
456
|
+
// refresh the index briefly; the write retry absorbs that.)
|
|
457
|
+
...(optionalLocks ? {} : { GIT_OPTIONAL_LOCKS: '0' }),
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
async function runProcess(program, argv, { cwd, signal, maxBytes = MAX_CAPTURE_BYTES, env } = {}) {
|
|
441
462
|
let child;
|
|
442
463
|
try {
|
|
443
464
|
await ensureNativeSpawnServer();
|
|
@@ -446,20 +467,7 @@ async function runProcess(program, argv, { cwd, signal, maxBytes = MAX_CAPTURE_B
|
|
|
446
467
|
argv,
|
|
447
468
|
spawnOptions: {
|
|
448
469
|
cwd,
|
|
449
|
-
env
|
|
450
|
-
...process.env,
|
|
451
|
-
GIT_TERMINAL_PROMPT: '0',
|
|
452
|
-
GIT_PAGER: 'cat',
|
|
453
|
-
GIT_EDITOR: 'true',
|
|
454
|
-
GIT_SEQUENCE_EDITOR: 'true',
|
|
455
|
-
LC_ALL: 'C',
|
|
456
|
-
// Reads run beside writes without a lock (git-repo-rw-lock.mjs).
|
|
457
|
-
// With optional locks off `git status` never takes index.lock to
|
|
458
|
-
// write back a refreshed index, so it cannot fail a concurrent
|
|
459
|
-
// write on that lock. (`git diff` ignores the setting and may still
|
|
460
|
-
// refresh the index briefly; the write retry absorbs that.)
|
|
461
|
-
...(optionalLocks ? {} : { GIT_OPTIONAL_LOCKS: '0' }),
|
|
462
|
-
},
|
|
470
|
+
env,
|
|
463
471
|
outputLimit: maxBytes,
|
|
464
472
|
// Bytes as git wrote them, decoded once by the caller: a multibyte
|
|
465
473
|
// character split across two pipe reads must not become U+FFFD.
|
|
@@ -573,11 +581,12 @@ function commandFailure(plan, result, limit = GIT_OUTPUT_LINES_DEFAULT) {
|
|
|
573
581
|
}
|
|
574
582
|
|
|
575
583
|
function runGit(plan, argv, options = {}) {
|
|
576
|
-
return
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
584
|
+
return startGit(
|
|
585
|
+
gitToolEnvironment(!options.readOnly),
|
|
586
|
+
(command, env) =>
|
|
587
|
+
runProcess(command, [...plan.globalArgs, ...argv], { cwd: plan.cwd, signal: options.signal, env }),
|
|
588
|
+
(result) => result.error
|
|
589
|
+
);
|
|
581
590
|
}
|
|
582
591
|
|
|
583
592
|
// Another process (an editor, a terminal, an IDE) holding one of git's lock
|
|
@@ -585,6 +594,10 @@ function runGit(plan, argv, options = {}) {
|
|
|
585
594
|
// config.lock. Commands take that lock before changing anything, so a brief
|
|
586
595
|
// retry with backoff turns the collision into a short wait; a command that had
|
|
587
596
|
// already done part of its work reports its own state on the retry.
|
|
597
|
+
// Git reports lock contention only as text: lockfile.c's "Unable to create
|
|
598
|
+
// '<path>.lock': File exists" (and config.c's "could not lock config file"),
|
|
599
|
+
// stable English because runProcess pins LC_ALL=C. The delays are a bounded
|
|
600
|
+
// backoff (3.1 s in all), a policy choice rather than anything git reports.
|
|
588
601
|
const GIT_LOCK_CONTENTION_RE =
|
|
589
602
|
/Unable to create '[^'\n]*\.lock': File exists|could not lock config file [^\n]*: File exists/;
|
|
590
603
|
const GIT_LOCK_RETRY_DELAYS_MS = [100, 200, 400, 800, 1600];
|
|
@@ -884,12 +897,13 @@ function snapshotContaining(repo) {
|
|
|
884
897
|
// lease it holds (activity-gate, the same as a background shell's) keeps the
|
|
885
898
|
// snapshot from being removed in any process until it ends, and a snapshot
|
|
886
899
|
// whose removal is under way refuses it. Returns the release.
|
|
887
|
-
function admitSnapshotCommand(repo, sessionId) {
|
|
900
|
+
async function admitSnapshotCommand(repo, sessionId) {
|
|
888
901
|
const snapshot = snapshotContaining(repo);
|
|
889
902
|
if (!snapshot) return () => {};
|
|
890
|
-
const leave =
|
|
903
|
+
const leave = await tryAdmitWorkspaceActivityAsync(sessionId || 'git-tool', repo, { kind: 'command' });
|
|
891
904
|
if (!leave) throw new Error(`the snapshot worktree ${snapshot.path} is being removed; nothing ran`);
|
|
892
|
-
|
|
905
|
+
// Fails only when workspace admission stopped (reported there), which keeps the snapshot held.
|
|
906
|
+
return () => leave().catch(() => {});
|
|
893
907
|
}
|
|
894
908
|
|
|
895
909
|
function invalidateAfterGitMutation() {
|
|
@@ -1057,14 +1071,14 @@ async function executeSingleGitTool(input, workDir, options = {}) {
|
|
|
1057
1071
|
// under it, and a snapshot being removed refuses it.
|
|
1058
1072
|
let leaveSnapshot;
|
|
1059
1073
|
try {
|
|
1060
|
-
leaveSnapshot = admitSnapshotCommand(repo, options.sessionId);
|
|
1074
|
+
leaveSnapshot = await admitSnapshotCommand(repo, options.sessionId);
|
|
1061
1075
|
} catch (error) {
|
|
1062
1076
|
return rejected(error.message);
|
|
1063
1077
|
}
|
|
1064
1078
|
try {
|
|
1065
1079
|
return await runInRepository(input, plan, { repo, lockKey, limit, signal, workDir });
|
|
1066
1080
|
} finally {
|
|
1067
|
-
leaveSnapshot();
|
|
1081
|
+
await leaveSnapshot();
|
|
1068
1082
|
}
|
|
1069
1083
|
}
|
|
1070
1084
|
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
*
|
|
16
16
|
* Every operation but `list` belongs to the Lead: the session runtime that
|
|
17
17
|
* hosts the caller registers its host (shared/worktrees/tool-host.mjs); a
|
|
18
|
-
* caller no host claims (a delegated worker) is refused
|
|
18
|
+
* caller no host claims (a delegated worker) is refused, except for a
|
|
19
|
+
* read-only `add --detach` snapshot held by its own session and removed when
|
|
20
|
+
* its turn settles (shared/worktrees/worker-snapshots.mjs).
|
|
19
21
|
*/
|
|
20
22
|
import { basename, resolve } from 'node:path';
|
|
21
23
|
import { isPlainObject } from '../../../../shared/object.mjs';
|
|
@@ -23,6 +25,7 @@ import { WORKTREE_REFUSAL_REASONS } from '../../../../shared/worktrees/contract.
|
|
|
23
25
|
import { firstLine, listWorktrees, runGit } from '../../../../shared/worktrees/git.mjs';
|
|
24
26
|
import { canonicalPath, samePath } from '../../../../shared/worktrees/paths.mjs';
|
|
25
27
|
import { worktreeToolHost } from '../../../../shared/worktrees/tool-host.mjs';
|
|
28
|
+
import { createWorkerSnapshot } from '../../../../shared/worktrees/worker-snapshots.mjs';
|
|
26
29
|
|
|
27
30
|
export const WORKTREE_TOOL_ACTIONS = Object.freeze(['enter', 'return', 'merge', 'remove', 'list', 'prune']);
|
|
28
31
|
const CARRY_CHOICES = ['leave', 'carry'];
|
|
@@ -327,26 +330,34 @@ async function rawAdd(plan, input, options) {
|
|
|
327
330
|
const [path, commitish = null] = positional;
|
|
328
331
|
if (!path || positional.length > 2) throw new Error('git worktree add requires <path> [<commit-ish>]');
|
|
329
332
|
if (detach && branch) throw new Error('git worktree add: --detach excludes -b/-B');
|
|
330
|
-
const host =
|
|
333
|
+
const host = worktreeToolHost(options?.sessionId);
|
|
334
|
+
if (!host && !detach) {
|
|
335
|
+
throw new Error(
|
|
336
|
+
'git worktree add belongs to the Lead session; a delegated worker may only make a read-only snapshot: git worktree add --detach <path> [<commit>]'
|
|
337
|
+
);
|
|
338
|
+
}
|
|
331
339
|
const repo = await repositoryAt(plan.cwd);
|
|
332
340
|
if (!repo) throw new Error(`git worktree add: ${plan.cwd} is not a git repository`);
|
|
333
341
|
const confirmLarge = input.confirm_large === true;
|
|
334
342
|
const txId = txIdOf(options, plan.command);
|
|
335
343
|
const mapped = { mapped: plan.command, requestedPath: resolve(plan.cwd, path) };
|
|
336
344
|
// A detached checkout, or a commit-ish that names no local branch: a snapshot.
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
? commitish
|
|
341
|
-
: null;
|
|
345
|
+
let snapshotCommit = null;
|
|
346
|
+
if (detach) snapshotCommit = commitish ?? 'HEAD';
|
|
347
|
+
else if (!branch && commitish && !(await localBranchExists(plan.cwd, commitish))) snapshotCommit = commitish;
|
|
342
348
|
if (snapshotCommit) {
|
|
343
349
|
const commit = await commitIn(plan.cwd, snapshotCommit);
|
|
344
350
|
if (!commit) throw new Error(`git worktree add: ${snapshotCommit} is not a commit`);
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
{ op: 'snapshot', commit, confirmLarge, txId, repoCommonDir: repo.repoCommonDir },
|
|
348
|
-
|
|
349
|
-
|
|
351
|
+
// A delegated worker's snapshot is held by its own session and removed when its turn settles.
|
|
352
|
+
const entry = host
|
|
353
|
+
? await runOn(host, { op: 'snapshot', commit, confirmLarge, txId, repoCommonDir: repo.repoCommonDir }, options)
|
|
354
|
+
: await createWorkerSnapshot({
|
|
355
|
+
sessionId: options?.sessionId,
|
|
356
|
+
projectPath: plan.cwd,
|
|
357
|
+
commit,
|
|
358
|
+
txId,
|
|
359
|
+
confirmLarge,
|
|
360
|
+
});
|
|
350
361
|
return okJson({
|
|
351
362
|
...mapped,
|
|
352
363
|
snapshot: true,
|
|
@@ -514,7 +525,7 @@ function worktreeInputError(input) {
|
|
|
514
525
|
const misplaced =
|
|
515
526
|
only('session_id', ['enter', 'return', 'merge', 'remove']) ||
|
|
516
527
|
only('name', ['enter']) ||
|
|
517
|
-
only('branch', ['enter']) ||
|
|
528
|
+
only('branch', ['enter', 'remove']) ||
|
|
518
529
|
only('create', ['enter']) ||
|
|
519
530
|
only('carry', ['enter']) ||
|
|
520
531
|
only('confirm_large', ['enter']) ||
|
|
@@ -531,6 +542,9 @@ function worktreeInputError(input) {
|
|
|
531
542
|
return 'branch excludes name and carry (the branch names the worktree; changes stay in the project folder)';
|
|
532
543
|
}
|
|
533
544
|
if (input.carry !== undefined && !CARRY_CHOICES.includes(input.carry)) return 'carry must be leave or carry';
|
|
545
|
+
if (action === 'remove' && input.branch !== undefined && input.session_id !== undefined) {
|
|
546
|
+
return "branch names one of this session's own worktrees; it excludes session_id";
|
|
547
|
+
}
|
|
534
548
|
return null;
|
|
535
549
|
}
|
|
536
550
|
|
|
@@ -556,7 +570,9 @@ export async function executeWorktreeAction(input, workDir, options = {}) {
|
|
|
556
570
|
confirmLarge: input.confirm_large === true,
|
|
557
571
|
}
|
|
558
572
|
: {}),
|
|
559
|
-
...(action === 'remove'
|
|
573
|
+
...(action === 'remove'
|
|
574
|
+
? { force: input.force === true, ...(input.branch?.trim() ? { branch: input.branch.trim() } : {}) }
|
|
575
|
+
: {}),
|
|
560
576
|
...(action === 'prune'
|
|
561
577
|
? { repoCommonDir: (await repositoryAt(resolve(workDir || process.cwd())))?.repoCommonDir ?? null }
|
|
562
578
|
: {}),
|
|
@@ -34,7 +34,7 @@ export function uniqueStrings(values) {
|
|
|
34
34
|
return Array.from(new Set(values.filter((value) => typeof value === 'string' && value)));
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
function coerceNonNegInt(value) {
|
|
38
38
|
if (value === undefined || value === null || value === '') return null;
|
|
39
39
|
const n = Number(value);
|
|
40
40
|
if (!Number.isFinite(n) || n < 0) return NaN;
|
|
@@ -49,7 +49,7 @@ export function stringList(value) {
|
|
|
49
49
|
|
|
50
50
|
// head_limit shared by the single-path flow and the path[] fan-out:
|
|
51
51
|
// absent → the default cap, 0 → unlimited, otherwise the coerced integer.
|
|
52
|
-
|
|
52
|
+
function resolveHeadLimit(coerced, defaultLimit) {
|
|
53
53
|
if (coerced === null) return defaultLimit;
|
|
54
54
|
return coerced === 0 ? Infinity : coerced;
|
|
55
55
|
}
|
|
@@ -27,24 +27,40 @@ import { join } from 'node:path';
|
|
|
27
27
|
import { holdsNoData, writeJsonAtomicAsync } from '../../../../../shared/atomic-file.mjs';
|
|
28
28
|
import { isPidAlive } from '../../../../../shared/pid-liveness.mjs';
|
|
29
29
|
import { displayShellCommand } from '../../../../../shared/shell-display.mjs';
|
|
30
|
-
import {
|
|
30
|
+
import { tryAdmitWorkspaceActivityAsync } from '../../../../../shared/worktrees/activity-gate.mjs';
|
|
31
31
|
import { worktreeError } from '../../../../../shared/worktrees/contract.mjs';
|
|
32
32
|
import { workspaceSees } from '../../../../../shared/worktrees/workspace-visibility.mjs';
|
|
33
33
|
|
|
34
34
|
const workspaceLeases = new Map();
|
|
35
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Calls both releases in order; settles once both did. Never goes unhandled
|
|
38
|
+
* (an asynchronous release rejects only when workspace admission stopped).
|
|
39
|
+
*/
|
|
40
|
+
export function bothReleased(first, second) {
|
|
41
|
+
const both = Promise.all([first(), second()]);
|
|
42
|
+
both.catch(() => {});
|
|
43
|
+
return both;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* A workspace grant requested now, for a release handle needed before it is
|
|
48
|
+
* answered: the release, whenever called, follows the grant (and releases
|
|
49
|
+
* nothing if it was refused or failed).
|
|
50
|
+
*/
|
|
51
|
+
export function pendingWorkspaceAdmission(granting) {
|
|
52
|
+
granting.catch(() => {});
|
|
53
|
+
return () =>
|
|
54
|
+
granting.then(
|
|
55
|
+
(leave) => leave?.(),
|
|
56
|
+
() => {}
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
36
60
|
/** Transfer a foreground reader to a surviving-descendant task without a lease gap. */
|
|
37
61
|
export function adoptShellWorkspaceAdmission(jobId, leave) {
|
|
38
62
|
const prior = workspaceLeases.get(jobId);
|
|
39
|
-
workspaceLeases.set(
|
|
40
|
-
jobId,
|
|
41
|
-
prior
|
|
42
|
-
? () => {
|
|
43
|
-
prior();
|
|
44
|
-
leave();
|
|
45
|
-
}
|
|
46
|
-
: leave
|
|
47
|
-
);
|
|
63
|
+
workspaceLeases.set(jobId, prior ? () => bothReleased(prior, leave) : leave);
|
|
48
64
|
}
|
|
49
65
|
|
|
50
66
|
// A record whose owner process is gone is garbage. Age alone never deletes a
|
|
@@ -88,8 +104,13 @@ function validJobId(jobId) {
|
|
|
88
104
|
|
|
89
105
|
function terminalRecord(base, detail) {
|
|
90
106
|
const finishedAt = detail?.finishedAt || new Date().toISOString();
|
|
107
|
+
// A completed record no longer claims an unconfirmed termination: it is
|
|
108
|
+
// written once the processes are confirmed gone, or explicitly released.
|
|
109
|
+
// A completed record no longer claims an unconfirmed termination: it is
|
|
110
|
+
// written once the processes are confirmed gone, or explicitly released.
|
|
111
|
+
const { terminationUnconfirmed: _held, ...open } = base || {};
|
|
91
112
|
return {
|
|
92
|
-
...
|
|
113
|
+
...open,
|
|
93
114
|
jobId: String(detail?.jobId || base?.jobId || ''),
|
|
94
115
|
kind: 'bash',
|
|
95
116
|
status: String(detail?.status || 'failed'),
|
|
@@ -172,7 +193,14 @@ async function sweepOrphanRecords(dir) {
|
|
|
172
193
|
}
|
|
173
194
|
}
|
|
174
195
|
|
|
175
|
-
/**
|
|
196
|
+
/**
|
|
197
|
+
* Publish the record for a job that has just started or been promoted. Its
|
|
198
|
+
* workspace lease (under the job's pid) is requested at the call and adopted
|
|
199
|
+
* under the job id at once, so a later release of the job — or of a
|
|
200
|
+
* predecessor's lease — is ordered after it. Resolves once the lease is in
|
|
201
|
+
* both ledger copies; rejects (and writes no record) when it is refused or
|
|
202
|
+
* cannot be written. The returned promise never goes unhandled.
|
|
203
|
+
*/
|
|
176
204
|
export function publishShellJobRecord(
|
|
177
205
|
task,
|
|
178
206
|
{
|
|
@@ -184,16 +212,20 @@ export function publishShellJobRecord(
|
|
|
184
212
|
} = {}
|
|
185
213
|
) {
|
|
186
214
|
const jobId = String(task?.jobId || '').trim();
|
|
187
|
-
if (!jobId) return;
|
|
215
|
+
if (!jobId) return Promise.resolve();
|
|
216
|
+
let admitted = Promise.resolve();
|
|
188
217
|
if (task?.cwd) {
|
|
189
|
-
const
|
|
218
|
+
const granting = tryAdmitWorkspaceActivityAsync(ownerSessionId || jobId, task.cwd, {
|
|
190
219
|
pid: Number(task.pid) || process.pid,
|
|
191
220
|
kind: 'command',
|
|
192
221
|
});
|
|
193
|
-
|
|
222
|
+
admitted = granting.then((leave) => {
|
|
223
|
+
if (!leave) throw worktreeError('WORKTREE_BUSY_JOBS', 'The command folder is being managed.');
|
|
224
|
+
});
|
|
225
|
+
admitted.catch(() => {});
|
|
194
226
|
// A descendant handoff can reuse the job id with a different live pid.
|
|
195
|
-
//
|
|
196
|
-
adoptShellWorkspaceAdmission(jobId,
|
|
227
|
+
// Its reader is requested before any predecessor's admission is released.
|
|
228
|
+
adoptShellWorkspaceAdmission(jobId, pendingWorkspaceAdmission(granting));
|
|
197
229
|
}
|
|
198
230
|
const ownerPid = Number(clientHostPid ?? task?.clientHostPid) || process.pid;
|
|
199
231
|
const dir = jobsDir();
|
|
@@ -202,6 +234,8 @@ export function publishShellJobRecord(
|
|
|
202
234
|
paths.set(jobId, [jsonPath, ownerPath]);
|
|
203
235
|
void enqueue(jobId, async () => {
|
|
204
236
|
try {
|
|
237
|
+
// No record for a job whose workspace lease was not granted.
|
|
238
|
+
await admitted;
|
|
205
239
|
await mkdir(dir, { recursive: true });
|
|
206
240
|
if (!sweepStarted) {
|
|
207
241
|
sweepStarted = true;
|
|
@@ -244,6 +278,7 @@ export function publishShellJobRecord(
|
|
|
244
278
|
/* the record is presentation only; never fail a job for it */
|
|
245
279
|
}
|
|
246
280
|
});
|
|
281
|
+
return admitted;
|
|
247
282
|
}
|
|
248
283
|
|
|
249
284
|
/** Preserve a bounded terminal snapshot for manual recovery after restart. */
|
|
@@ -335,8 +370,9 @@ export function releaseShellJobWorkspace(jobId) {
|
|
|
335
370
|
const key = String(jobId || '').trim();
|
|
336
371
|
const leave = workspaceLeases.get(key);
|
|
337
372
|
if (!leave) return;
|
|
338
|
-
leave();
|
|
373
|
+
const released = leave();
|
|
339
374
|
if (workspaceLeases.get(key) === leave) workspaceLeases.delete(key);
|
|
375
|
+
return released;
|
|
340
376
|
}
|
|
341
377
|
|
|
342
378
|
/** Flag a still-open job record as "termination unconfirmed" for the readouts. */
|
|
@@ -390,8 +426,10 @@ export function completeShellJobRecord(jobId, detail) {
|
|
|
390
426
|
// Callers complete a record only once its processes are confirmed gone
|
|
391
427
|
// (or explicitly released): the workspace admission follows that, not
|
|
392
428
|
// the record write, so a failed write cannot strand it with no handle.
|
|
393
|
-
leaveWorkspace?.();
|
|
429
|
+
const released = leaveWorkspace?.();
|
|
394
430
|
if (workspaceLeases.get(key) === leaveWorkspace) workspaceLeases.delete(key);
|
|
431
|
+
// Fails only when workspace admission stopped (reported there), which keeps the folder held.
|
|
432
|
+
await Promise.resolve(released).catch(() => {});
|
|
395
433
|
}
|
|
396
434
|
await removePaths(ownerPaths);
|
|
397
435
|
paths.set(key, [jsonPath, donePath]);
|
|
@@ -486,6 +524,6 @@ export function retireShellJobRecord(jobId) {
|
|
|
486
524
|
records.delete(key);
|
|
487
525
|
incarnations.delete(key);
|
|
488
526
|
await removePaths(list);
|
|
489
|
-
leaveWorkspace?.();
|
|
527
|
+
await leaveWorkspace?.();
|
|
490
528
|
});
|
|
491
529
|
}
|
|
@@ -293,7 +293,7 @@ function requestReadRangeIndexPersist(key, job) {
|
|
|
293
293
|
})();
|
|
294
294
|
}
|
|
295
295
|
|
|
296
|
-
|
|
296
|
+
function scheduleReadRangeIndexPersist(index) {
|
|
297
297
|
if (!READ_RANGE_INDEX_DISK_DIR || !currentReadRangeIndex(index)) return;
|
|
298
298
|
const key = canonicalCachePath(index.fullPath);
|
|
299
299
|
const inflight = READ_RANGE_INDEX_INFLIGHT.get(key);
|
|
@@ -11,7 +11,6 @@ import { invalidateBuiltinResultCache } from './cache-layers.mjs';
|
|
|
11
11
|
import { getReadSnapshot } from './read-snapshot-runtime.mjs';
|
|
12
12
|
import { snapshotCoversFullFile, statMatchesSnapshot } from './snapshot-helpers.mjs';
|
|
13
13
|
import { canCacheReadFile, READ_PREFIX_HASH_BYTES } from './read-cache-policy.mjs';
|
|
14
|
-
export { READ_PREFIX_HASH_BYTES } from './read-cache-policy.mjs';
|
|
15
14
|
|
|
16
15
|
// A mutation snapshot claims the full file because it knows the bytes it
|
|
17
16
|
// wrote; it proves the session holds the body only when bodyDelivered says so.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
2
2
|
import { spawnSync } from 'node:child_process';
|
|
3
3
|
import { readdir as readdirAsync } from 'node:fs/promises';
|
|
4
|
+
import { startGitSync } from '../../../../shared/git-launch.mjs';
|
|
4
5
|
import { runGitOffThread } from '../../../../shared/git-runner.mjs';
|
|
5
6
|
import { findPathExecutable } from '../../../../shared/path-executable.mjs';
|
|
6
7
|
import { dirname as pathDirname, join as pathJoin, resolve as pathResolveAbsolute } from 'node:path';
|
|
@@ -161,13 +162,15 @@ function _changeStateArgs(root) {
|
|
|
161
162
|
|
|
162
163
|
function _probeRepositoryChangeStateSync(root) {
|
|
163
164
|
try {
|
|
164
|
-
const result =
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
165
|
+
const result = startGitSync({ ...process.env, GIT_OPTIONAL_LOCKS: '0' }, (command, env) =>
|
|
166
|
+
spawnSync(command, _changeStateArgs(root), {
|
|
167
|
+
encoding: 'utf8',
|
|
168
|
+
env,
|
|
169
|
+
maxBuffer: 64 * 1024,
|
|
170
|
+
timeout: 1500,
|
|
171
|
+
windowsHide: true,
|
|
172
|
+
})
|
|
173
|
+
);
|
|
171
174
|
const output = String(result.stdout || '').trim();
|
|
172
175
|
if (result.status === 0) return output ? 'changes present' : 'clean';
|
|
173
176
|
if (result.error?.code === 'ENOBUFS' && output) return 'changes present';
|
|
@@ -271,14 +274,16 @@ function _checkIgnoreArgs(directory) {
|
|
|
271
274
|
|
|
272
275
|
function _probeGitIgnoredEntriesSync(directory, names) {
|
|
273
276
|
try {
|
|
274
|
-
const result =
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
277
|
+
const result = startGitSync({ ...process.env, GIT_OPTIONAL_LOCKS: '0' }, (command, env) =>
|
|
278
|
+
spawnSync(command, _checkIgnoreArgs(directory), {
|
|
279
|
+
encoding: 'utf8',
|
|
280
|
+
input: `${names.join('\0')}\0`,
|
|
281
|
+
env,
|
|
282
|
+
maxBuffer: 1024 * 1024,
|
|
283
|
+
timeout: 1500,
|
|
284
|
+
windowsHide: true,
|
|
285
|
+
})
|
|
286
|
+
);
|
|
282
287
|
// Exit 1 is "nothing ignored", not a failure.
|
|
283
288
|
if (result.status !== 0 && result.status !== 1) return new Set();
|
|
284
289
|
return new Set(
|
|
@@ -1,12 +1,2 @@
|
|
|
1
|
-
export {
|
|
2
|
-
_suggestIndexedPaths,
|
|
3
|
-
basePathDiagnostic,
|
|
4
|
-
buildNotFoundHint,
|
|
5
|
-
isUncOrSmbPath,
|
|
6
|
-
relativePathPrefix,
|
|
7
|
-
relativeSearchResultPath,
|
|
8
|
-
resolveSearchScope,
|
|
9
|
-
uncRefusalMessage,
|
|
10
|
-
} from './search-path-diagnostics.mjs';
|
|
11
1
|
export { executeGrepTool } from './search-grep-tool.mjs';
|
|
12
2
|
export { executeGlobTool } from './search-glob-tool.mjs';
|