mixdog 1.2.3 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/scripts/gate-local.mjs +6 -4
- package/scripts/lib/gate-scheduler.mjs +29 -11
- package/scripts/mobile-release.mjs +5 -4
- package/scripts/probe-provider-catalog.mjs +31 -0
- package/scripts/provider-pingpong-live.mjs +128 -38
- package/scripts/session-sweep.mjs +5 -25
- package/src/agents/maintainer/AGENT.md +1 -1
- package/src/agents/maintainer/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +2 -4
- package/src/agents/security/AGENT.md +1 -2
- package/src/agents/writer/AGENT.md +2 -3
- package/src/defaults/shipped-history.json +7 -1
- package/src/defaults/skills/image/SKILL.md +21 -23
- package/src/lib/keychain-cjs.cjs +13 -11
- package/src/output-styles/common.md +2 -1
- package/src/rules/agent/AGENT.md +7 -5
- package/src/rules/lead/LEAD.md +13 -13
- package/src/rules/shared/45-destructive.md +4 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2 -5
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +81 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +109 -5
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +107 -37
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
- package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +41 -11
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +67 -5
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +14 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +14 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +9 -6
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -2
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +26 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +12 -6
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +14 -6
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +22 -10
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +33 -7
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +11 -2
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +9 -5
- package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +60 -16
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +11 -13
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +30 -19
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +42 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +13 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +1 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +18 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +36 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +11 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +1 -4
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +0 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +7 -6
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +5 -4
- package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +14 -4
- package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +15 -3
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +6 -2
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +10 -10
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +46 -8
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
- package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -11
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +28 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +2 -4
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +0 -27
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +3 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +21 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +38 -13
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +19 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
- package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
- package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +29 -8
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
- package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +32 -14
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +17 -33
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/side-question.mjs +12 -7
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +5 -12
- package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
- package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +5 -11
- package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -32
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +160 -212
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +50 -116
- package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
- package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +7 -8
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
- package/src/runtime/agent/orchestrator/session/store.mjs +3 -16
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +11 -12
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +37 -13
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
- package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +204 -10
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
- package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
- package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +200 -17
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
- package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
- package/src/runtime/attachments/store.d.mts +9 -0
- package/src/runtime/attachments/store.mjs +80 -9
- package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
- package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
- package/src/runtime/computer-bridge/action-schema.mjs +178 -178
- package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
- package/src/runtime/effort-judge/judge-client.mjs +21 -4
- package/src/runtime/effort-judge/judge-worker.mjs +4 -1
- package/src/runtime/github/tool.mjs +118 -17
- package/src/runtime/media/adapters/codex-image.mjs +140 -21
- package/src/runtime/media/catalog.mjs +4 -4
- package/src/runtime/media/chatgpt-usage.mjs +55 -0
- package/src/runtime/media/defaults.mjs +37 -0
- package/src/runtime/media/jobs.mjs +12 -2
- package/src/runtime/media/lanes.mjs +12 -0
- package/src/runtime/media/tool-defs.mjs +15 -4
- package/src/runtime/media/tool.mjs +41 -12
- package/src/runtime/media/upstream-error.mjs +72 -6
- package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
- package/src/runtime/memory/lib/pg/process.mjs +5 -7
- package/src/runtime/memory/lib/pg/supervisor.mjs +4 -1
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/html-browser.mjs +18 -8
- package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-html-measure.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/core/office-write-ledger.mjs +1 -5
- package/src/runtime/office/index.mjs +2 -3
- package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
- package/src/runtime/session-search/session-search-ingest.mjs +1 -1
- package/src/runtime/shared/agent-reap-state.mjs +13 -0
- package/src/runtime/shared/atomic-file.d.mts +1 -1
- package/src/runtime/shared/background-tasks.mjs +6 -1
- package/src/runtime/shared/bounded-line-diff.mjs +11 -2
- package/src/runtime/shared/browser-launch.mjs +15 -0
- package/src/runtime/shared/err-text.mjs +42 -4
- package/src/runtime/shared/file-lock.mjs +6 -5
- package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
- package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
- package/src/runtime/shared/model-route-chain.d.mts +8 -0
- package/src/runtime/shared/model-route-chain.mjs +48 -0
- package/src/runtime/shared/model-route-fallback.mjs +22 -0
- package/src/runtime/shared/pid-liveness.mjs +12 -0
- package/src/runtime/shared/provider-api-key.mjs +6 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
- package/src/runtime/shared/quiet-progress.d.mts +35 -0
- package/src/runtime/shared/quiet-progress.mjs +101 -0
- package/src/runtime/shared/quota-resume-store.mjs +32 -1
- package/src/runtime/shared/read-row-numbers.mjs +44 -0
- package/src/runtime/shared/remote-intent.mjs +2 -42
- package/src/runtime/shared/slow-span.mjs +8 -1
- package/src/runtime/shared/statusline/statusline-segments.mjs +24 -2
- package/src/runtime/shared/tool-card-model/card-header.mjs +2 -1
- package/src/runtime/shared/tool-output-budget.mjs +2 -0
- package/src/runtime/shared/tool-result-summary.mjs +16 -2
- package/src/runtime/shared/tool-status.mjs +3 -2
- package/src/runtime/shared/tool-surface.mjs +2 -3
- package/src/runtime/shared/tool-work-units.mjs +22 -15
- package/src/runtime/shared/transcript-metadata.mjs +49 -1
- package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
- package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
- package/src/runtime/shared/transcript-writer.mjs +14 -4
- package/src/runtime/shared/turn-changes.mjs +2 -1
- package/src/runtime/shared/turn-snapshot.mjs +11 -3
- package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
- package/src/runtime/shared/worktrees/carry.mjs +6 -4
- package/src/runtime/shared/worktrees/contract.mjs +27 -1
- package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +29 -13
- package/src/runtime/shared/worktrees/git-head.mjs +22 -13
- package/src/runtime/shared/worktrees/include.mjs +125 -7
- package/src/runtime/shared/worktrees/lock.mjs +1 -1
- package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
- package/src/runtime/shared/worktrees/manager.mjs +378 -32
- package/src/runtime/shared/worktrees/owner.mjs +2 -1
- package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
- package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
- package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
- package/src/runtime/terminal-bridge/client.mjs +14 -10
- package/src/session-runtime/boot/apis.mjs +7 -1
- package/src/session-runtime/boot/config.mjs +2 -0
- package/src/session-runtime/boot/facade.mjs +3 -0
- package/src/session-runtime/boot/session.mjs +3 -2
- package/src/session-runtime/boot/tools.mjs +3 -0
- package/src/session-runtime/conversation-import/service.mjs +1 -1
- package/src/session-runtime/goal-facade-api.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +44 -18
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +22 -8
- package/src/session-runtime/internal-tool-executor.mjs +2 -0
- package/src/session-runtime/lifecycle/cold-heir.mjs +0 -1
- package/src/session-runtime/lifecycle/session-catalog.mjs +14 -16
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +18 -53
- package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
- package/src/session-runtime/lifecycle/shared.mjs +5 -6
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
- package/src/session-runtime/lifecycle/teardown.mjs +7 -16
- package/src/session-runtime/media-api.mjs +8 -0
- package/src/session-runtime/model-route/route-ownership.mjs +60 -0
- package/src/session-runtime/model-route/route-persist.mjs +3 -2
- package/src/session-runtime/model-route/set-route.mjs +114 -34
- package/src/session-runtime/model-route/web-search-route.mjs +7 -2
- package/src/session-runtime/model-route-api.mjs +4 -2
- package/src/session-runtime/native-web-search/routes.mjs +37 -24
- package/src/session-runtime/native-web-search.mjs +9 -8
- package/src/session-runtime/provider-auth/setup.mjs +4 -0
- package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
- package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
- package/src/session-runtime/provider-models.mjs +1 -0
- package/src/session-runtime/provider-usage.mjs +4 -0
- package/src/session-runtime/route-resolution.mjs +3 -1
- package/src/session-runtime/runtime-core.mjs +4 -0
- package/src/session-runtime/runtime-facade.mjs +6 -0
- package/src/session-runtime/services/agent-task-status.mjs +2 -0
- package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
- package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
- package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
- package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
- package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
- package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
- package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +9 -6
- package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
- package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
- package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -9
- package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
- package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
- package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
- package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
- package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
- package/src/session-runtime/services/agent-tool/worker-index.mjs +28 -8
- package/src/session-runtime/services/agent-tool.mjs +4 -0
- package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
- package/src/session-runtime/services/provider-admin.mjs +77 -0
- package/src/session-runtime/session-create/session-options.mjs +7 -5
- package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
- package/src/session-runtime/session-transcript.mjs +4 -5
- package/src/session-runtime/session-turn-api.mjs +3 -9
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -6
- package/src/session-runtime/setup-tool/executor.mjs +23 -5
- package/src/session-runtime/setup-tool/extended-actions.mjs +6 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +7 -2
- package/src/session-runtime/setup-tool/tool-defs.mjs +13 -1
- package/src/session-runtime/tool-policy-refresh.mjs +83 -32
- package/src/session-runtime/turn/agent-ops.mjs +49 -2
- package/src/session-runtime/turn/side-question-ops.mjs +1 -4
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +4 -0
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +8 -2
- package/src/session-runtime/turn/turn-run.mjs +1 -36
- package/src/session-runtime/usage-stats-api.mjs +4 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
- package/src/session-runtime/workspace/admission-gate.mjs +44 -15
- package/src/session-runtime/workspace/project-branches.mjs +28 -36
- package/src/session-runtime/workspace/transition-steps.mjs +96 -95
- package/src/session-runtime/workspace/transitions.mjs +248 -68
- package/src/standalone/channel-transport.mjs +3 -4
- package/src/standalone/daemon-desktop-runtime.mjs +32 -1
- package/src/standalone/daemon-pg-stop.mjs +1 -3
- package/src/standalone/daemon-session-control.mjs +88 -0
- package/src/standalone/daemon-stored-session-views.mjs +23 -3
- package/src/standalone/daemon.mjs +2 -0
- package/src/standalone/desktop-service-registry.mjs +32 -5
- package/src/standalone/local-session-runtime.mjs +11 -12
- package/src/standalone/session-protocol.mjs +7 -0
- package/src/standalone/session-runtime-inline-host.mjs +2 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
- package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
- package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
- package/src/standalone/session-service/agent-tree.mjs +28 -2
- package/src/standalone/session-service/entries/session-loads.mjs +16 -5
- package/src/standalone/session-service/entries.mjs +1 -0
- package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
- package/src/standalone/session-service/quota-resume.mjs +28 -13
- package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
- package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
- package/src/standalone/session-tool-output.mjs +82 -0
- package/src/tui/app/app-view.jsx +2 -1
- package/src/tui/app/provider-setup/provider-items.mjs +8 -0
- package/src/tui/app/provider-setup-picker.mjs +15 -3
- package/src/tui/app/slash-commands.mjs +6 -0
- package/src/tui/app/slash-dispatch/session-commands.mjs +49 -0
- package/src/tui/components/Spinner.jsx +4 -0
- package/src/tui/components/SpinnerByline.jsx +21 -2
- package/src/tui/components/status-line/local-line.mjs +10 -2
- package/src/tui/dist/index.mjs +529 -270
- package/src/tui/session/active-tool-summary.mjs +1 -1
- package/src/tui/session/context-state.mjs +0 -3
- package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
- package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
- package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
- package/src/tui/session/quota-resume.mjs +140 -61
- package/src/tui/session/session-api/commands.mjs +4 -10
- package/src/tui/session/session-api/controls.mjs +12 -0
- package/src/tui/session/session-api/lifecycle/dispose.mjs +2 -9
- package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
- package/src/tui/session/session-api/lifecycle.mjs +13 -11
- package/src/tui/session/session-api/media.mjs +2 -0
- package/src/tui/session/session-api/routes.mjs +81 -57
- package/src/tui/session/session-api/settings.mjs +3 -3
- package/src/tui/session/session-api/worktree.mjs +3 -2
- package/src/tui/session/session-flow/auto-clear.mjs +1 -3
- package/src/tui/session/session-flow/drain.mjs +6 -4
- package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
- package/src/tui/session/session-flow/queue.mjs +1 -1
- package/src/tui/session/tool-approval.mjs +17 -8
- package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
- package/src/tui/session/tui-steering-persist.mjs +3 -5
- package/src/tui/session/turn-quiet.mjs +53 -0
- package/src/tui/session/turn-stream.mjs +5 -1
- package/src/tui/session/turn.mjs +38 -31
- package/src/tui/session/worktree-setup-notice.mjs +38 -0
- package/src/tui/spinner-meta.mjs +10 -0
- package/src/tui/spinner-verbs.mjs +3 -0
- package/src/ui/statusline.mjs +13 -3
- package/src/ui/streaming-markdown-heal.mjs +70 -18
- package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
- package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
- package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -302
- package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
- package/src/session-runtime/turn/share-ops.mjs +0 -77
- package/src/tui/session/cross-surface-share.mjs +0 -406
- package/src/tui/session/live-share/delta.mjs +0 -153
- package/src/tui/session/live-share/mirror.mjs +0 -106
- package/src/tui/session/live-share/owner.mjs +0 -254
- package/src/tui/session/live-share/retry.mjs +0 -54
- package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
- package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
- package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
- package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
- package/src/tui/session/live-share/viewer.mjs +0 -99
- package/src/tui/session/live-share/wire.mjs +0 -44
- package/src/tui/session/live-share.mjs +0 -154
- package/src/tui/session/shared-dir-watch.mjs +0 -69
|
@@ -22,12 +22,36 @@ import {
|
|
|
22
22
|
waitNativeTask,
|
|
23
23
|
} from '../lib/native-spawn-client.mjs';
|
|
24
24
|
import { attachJobInsights, shellJobPublicTaskResult } from './lib/shell-job-insights.mjs';
|
|
25
|
+
import { tryAdmitWorkspaceActivity } from '../../../../shared/worktrees/activity-gate.mjs';
|
|
26
|
+
import { worktreeError } from '../../../../shared/worktrees/contract.mjs';
|
|
25
27
|
import {
|
|
28
|
+
adoptShellWorkspaceAdmission,
|
|
29
|
+
clearTerminationHold,
|
|
26
30
|
completeShellJobRecord,
|
|
27
31
|
listShellJobRecords,
|
|
32
|
+
markShellJobTerminationUnconfirmed,
|
|
28
33
|
publishShellJobRecord,
|
|
34
|
+
registerTerminationHold,
|
|
29
35
|
retireShellJobRecord,
|
|
36
|
+
takeReleaseRequest,
|
|
30
37
|
} from './lib/shell-job-records.mjs';
|
|
38
|
+
import { createProcessTreeTracker, killAfterSnapshot, watchTermination } from '../lib/shell-descendants.mjs';
|
|
39
|
+
import {
|
|
40
|
+
flushPendingOwnerCancels,
|
|
41
|
+
registerOwnedShellTree,
|
|
42
|
+
unregisterOwnedShellTree,
|
|
43
|
+
} from '../lib/owned-shell-trees.mjs';
|
|
44
|
+
|
|
45
|
+
// Pre-kill snapshot of a tracked background job: the promotion baseline, or a
|
|
46
|
+
// fresh read when that did not complete. Marks the job killed, so its settle
|
|
47
|
+
// relies on this snapshot instead of an after-exit observation.
|
|
48
|
+
function prepareTrackedKill(entry) {
|
|
49
|
+
entry.killed = true;
|
|
50
|
+
if (entry.tracker.complete) return true;
|
|
51
|
+
return (entry.baseline || Promise.resolve(false)).then(
|
|
52
|
+
(complete) => complete || entry.tracker.capture().catch(() => false)
|
|
53
|
+
);
|
|
54
|
+
}
|
|
31
55
|
import { isPidAlive } from '../../../../shared/pid-liveness.mjs';
|
|
32
56
|
import {
|
|
33
57
|
renderShellCompletionEnvelope,
|
|
@@ -50,6 +74,8 @@ export function buildJobNotFoundMessage(jobId) {
|
|
|
50
74
|
const promotedJobIds = new Set();
|
|
51
75
|
const backgroundShellJobWatchers = new Map();
|
|
52
76
|
const jobNotifyCtxByJobId = new Map();
|
|
77
|
+
// jobId -> process-tree tracker of a published background job.
|
|
78
|
+
const backgroundTrackers = new Map();
|
|
53
79
|
|
|
54
80
|
function demoteBackgroundShellPriority(pid) {
|
|
55
81
|
if (process.env.MIXDOG_BG_PRIORITY === '0') return;
|
|
@@ -63,18 +89,76 @@ function demoteBackgroundShellPriority(pid) {
|
|
|
63
89
|
// also publishes a disk record for the out-of-process shell-count readers
|
|
64
90
|
// (desktop pane chip, CLI statusline). The record is retired the moment the job
|
|
65
91
|
// settles — completed, timed out, or killed.
|
|
92
|
+
// The workspace admission a job record holds is released only once the job's
|
|
93
|
+
// processes are confirmed gone — the same confirmation path a foreground run
|
|
94
|
+
// uses, not the native terminal status alone.
|
|
66
95
|
function trackShellJobRecord(task, options) {
|
|
67
96
|
const jobId = String(task?.jobId || '').trim();
|
|
68
97
|
if (!jobId) return;
|
|
69
98
|
publishShellJobRecord(task, options);
|
|
99
|
+
if (task?.cwd) {
|
|
100
|
+
// The record's own reader is filed under the job's root pid, which the
|
|
101
|
+
// gate drops the moment that pid dies. Survivors must keep the folder
|
|
102
|
+
// reserved, so this runtime holds it under its own live pid as well.
|
|
103
|
+
const hold = tryAdmitWorkspaceActivity(options?.ownerSessionId || jobId, task.cwd, { kind: 'command' });
|
|
104
|
+
if (!hold) throw worktreeError('WORKTREE_BUSY_JOBS', 'The command folder is being managed.');
|
|
105
|
+
adoptShellWorkspaceAdmission(jobId, hold);
|
|
106
|
+
}
|
|
107
|
+
const tracker = task?.cwd ? createProcessTreeTracker({ pid: task.pid }) : null;
|
|
108
|
+
const entry = { tracker, killed: false, baseline: null };
|
|
109
|
+
if (tracker) {
|
|
110
|
+
backgroundTrackers.set(jobId, entry);
|
|
111
|
+
// Baseline identities while the promoted root is known to run, so a later
|
|
112
|
+
// kill (ours or the native timeout) has a pre-kill snapshot without
|
|
113
|
+
// waiting for one.
|
|
114
|
+
entry.baseline = tracker.capture().catch(() => false);
|
|
115
|
+
entry.owned = { ownerSessionId: options?.ownerSessionId || null, prepareKill: () => prepareTrackedKill(entry) };
|
|
116
|
+
registerOwnedShellTree(jobId, entry.owned);
|
|
117
|
+
}
|
|
70
118
|
let unsubscribe = null;
|
|
119
|
+
let settled = false;
|
|
71
120
|
const settle = (detail) => {
|
|
72
|
-
if (!detail || detail.status === 'running') return;
|
|
121
|
+
if (settled || !detail || detail.status === 'running') return;
|
|
122
|
+
settled = true;
|
|
73
123
|
try {
|
|
74
124
|
unsubscribe?.();
|
|
75
125
|
} catch {}
|
|
76
126
|
promotedJobIds.delete(jobId);
|
|
77
|
-
|
|
127
|
+
if (entry.owned) unregisterOwnedShellTree(jobId, entry.owned);
|
|
128
|
+
const normalized = normalizeShellJobDetail(detail);
|
|
129
|
+
if (!tracker) {
|
|
130
|
+
void completeShellJobRecord(jobId, normalized);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// A root that exited on its own is observed after exit, as a foreground
|
|
134
|
+
// settle does. A killed one relies on the snapshot taken before the kill.
|
|
135
|
+
const killed = entry.killed || detail.killed || detail.timedOut || String(detail.status) === 'cancelled';
|
|
136
|
+
if (!killed) tracker.acceptExitObservation();
|
|
137
|
+
// The completion notice is already on its way (watchBackgroundShellJob);
|
|
138
|
+
// the record — and with it the workspace admission — completes only once
|
|
139
|
+
// every process is confirmed gone, or the user releases it explicitly.
|
|
140
|
+
let finished = false;
|
|
141
|
+
const finish = () => {
|
|
142
|
+
if (finished) return;
|
|
143
|
+
finished = true;
|
|
144
|
+
stop();
|
|
145
|
+
clearTerminationHold(jobId);
|
|
146
|
+
if (backgroundTrackers.get(jobId) === entry) backgroundTrackers.delete(jobId);
|
|
147
|
+
return completeShellJobRecord(jobId, normalized);
|
|
148
|
+
};
|
|
149
|
+
const stop = watchTermination({
|
|
150
|
+
tracker,
|
|
151
|
+
onTerminated: finish,
|
|
152
|
+
releaseRequested: () => takeReleaseRequest(jobId),
|
|
153
|
+
onUnconfirmed: () => {
|
|
154
|
+
void markShellJobTerminationUnconfirmed(jobId);
|
|
155
|
+
registerTerminationHold(jobId, {
|
|
156
|
+
ownerSessionId: options?.ownerSessionId || null,
|
|
157
|
+
cwd: task.cwd,
|
|
158
|
+
release: finish,
|
|
159
|
+
});
|
|
160
|
+
},
|
|
161
|
+
});
|
|
78
162
|
};
|
|
79
163
|
unsubscribe = subscribeNativeTask(jobId, settle);
|
|
80
164
|
settle(getNativeTask(jobId) || task);
|
|
@@ -243,6 +327,16 @@ export function refreshShellJob(jobId) {
|
|
|
243
327
|
}
|
|
244
328
|
|
|
245
329
|
export function killShellJob(jobId) {
|
|
330
|
+
const tracked = backgroundTrackers.get(String(jobId || ''));
|
|
331
|
+
const current = tracked ? getNativeTask(jobId) : null;
|
|
332
|
+
if (current?.status === 'running') {
|
|
333
|
+
// The pre-kill snapshot is the promotion baseline (or, when that did not
|
|
334
|
+
// complete, a fresh read). The kill waits for it at most the read bound
|
|
335
|
+
// and is sent regardless; without a snapshot the outcome stays unknown and
|
|
336
|
+
// the folder stays held under the observation loop.
|
|
337
|
+
void killAfterSnapshot(prepareTrackedKill(tracked), () => cancelNativeTask(jobId));
|
|
338
|
+
return { ...attachJobInsights(normalizeShellJobDetail(current)), killed: true };
|
|
339
|
+
}
|
|
246
340
|
const detail = cancelNativeTask(jobId);
|
|
247
341
|
if (!detail) return null;
|
|
248
342
|
const wasRunning = detail.status === 'running';
|
|
@@ -409,6 +503,7 @@ export function publishForegroundShellRecord({
|
|
|
409
503
|
startedAtMs = 0,
|
|
410
504
|
ownerSessionId = null,
|
|
411
505
|
clientHostPid = null,
|
|
506
|
+
terminationUnconfirmed = false,
|
|
412
507
|
}) {
|
|
413
508
|
if (!jobId || !Number.isFinite(Number(pid)) || Number(pid) <= 0) return;
|
|
414
509
|
publishShellJobRecord(
|
|
@@ -418,6 +513,7 @@ export function publishForegroundShellRecord({
|
|
|
418
513
|
clientHostPid,
|
|
419
514
|
startedAtMs,
|
|
420
515
|
foreground: true,
|
|
516
|
+
terminationUnconfirmed,
|
|
421
517
|
}
|
|
422
518
|
);
|
|
423
519
|
}
|
|
@@ -486,6 +582,9 @@ export async function reconcileRecoveredShellJobCompletions() {
|
|
|
486
582
|
|
|
487
583
|
export async function shutdownShellJobs(_reason = 'runtime-close', { scope = null } = {}) {
|
|
488
584
|
const scoped = Boolean(scope);
|
|
585
|
+
// Runtime shutdown: a session-close cancel still waiting for its snapshot
|
|
586
|
+
// is sent now, before the process can go away with it.
|
|
587
|
+
if (!scoped) flushPendingOwnerCancels();
|
|
489
588
|
const ownerSessionId = scoped ? String(scope.ownerSessionId || '') : '';
|
|
490
589
|
if (scoped && !ownerSessionId) {
|
|
491
590
|
return { killed: 0, cancelledJobs: 0, cancelledWatchers: 0 };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Code-graph prewarm worker. Runs the heavy CPU/sync-fs traversal in a
|
|
2
2
|
// dedicated worker thread so the main event loop (Claude stream readers,
|
|
3
|
-
// MCP socket pumps,
|
|
3
|
+
// MCP socket pumps, aiWrapped worker startup) is never starved
|
|
4
4
|
// by a cold build (~3s typical, 90s outlier observed in PG telemetry).
|
|
5
5
|
//
|
|
6
6
|
// Contract:
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Owner-wide shell cancellation (session close) with the same pre-kill
|
|
2
|
+
// identity snapshot every other kill takes. Each live shell tree — a
|
|
3
|
+
// foreground run or a promoted background job — registers how to prepare its
|
|
4
|
+
// kill; the owner cancel prepares them all, waits for their snapshots at most
|
|
5
|
+
// PROCESS_TABLE_READ_BOUND_MS, and then sends the kill whether or not they
|
|
6
|
+
// arrived. A missing snapshot leaves the outcome unknown, so the workspace
|
|
7
|
+
// stays held under the observation loop instead of being released blind.
|
|
8
|
+
import { cancelNativeTasks } from './native-spawn-client.mjs';
|
|
9
|
+
import { killAfterSnapshot } from './shell-descendants.mjs';
|
|
10
|
+
|
|
11
|
+
// jobId -> { ownerSessionId, prepareKill }. prepareKill() marks the tree as
|
|
12
|
+
// killed by its owner and returns true when its snapshot is already complete,
|
|
13
|
+
// otherwise a promise for it.
|
|
14
|
+
const ownedTrees = new Map();
|
|
15
|
+
// owner -> send(): cancels still waiting for their snapshots. Runtime
|
|
16
|
+
// shutdown sends them at once — a kill is never lost to an exit.
|
|
17
|
+
const pendingCancels = new Map();
|
|
18
|
+
|
|
19
|
+
export function registerOwnedShellTree(jobId, entry) {
|
|
20
|
+
const key = String(jobId || '').trim();
|
|
21
|
+
if (key && typeof entry?.prepareKill === 'function') ownedTrees.set(key, entry);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Drops `entry` only while it is still the registered one for the job. */
|
|
25
|
+
export function unregisterOwnedShellTree(jobId, entry) {
|
|
26
|
+
const key = String(jobId || '').trim();
|
|
27
|
+
if (ownedTrees.get(key) === entry) ownedTrees.delete(key);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Cancel every shell tree of one owner session. Synchronous (the native
|
|
31
|
+
* cancel's own result) when every snapshot is already complete; otherwise a
|
|
32
|
+
* promise that sends the cancel once the snapshots land or the bound passes. */
|
|
33
|
+
export function cancelOwnedShellTrees(ownerSessionId) {
|
|
34
|
+
const owner = String(ownerSessionId || '').trim();
|
|
35
|
+
const pending = [];
|
|
36
|
+
for (const [jobId, entry] of [...ownedTrees]) {
|
|
37
|
+
if (String(entry.ownerSessionId || '') !== owner) continue;
|
|
38
|
+
let ready;
|
|
39
|
+
try {
|
|
40
|
+
ready = entry.prepareKill();
|
|
41
|
+
} catch {
|
|
42
|
+
ready = false;
|
|
43
|
+
}
|
|
44
|
+
if (ready !== true) pending.push(Promise.resolve(ready).catch(() => false));
|
|
45
|
+
unregisterOwnedShellTree(jobId, entry);
|
|
46
|
+
}
|
|
47
|
+
if (pending.length === 0) return cancelNativeTasks({ ownerSessionId: owner });
|
|
48
|
+
let result = null;
|
|
49
|
+
const send = () => {
|
|
50
|
+
if (pendingCancels.get(owner) === send) pendingCancels.delete(owner);
|
|
51
|
+
result = result ?? cancelNativeTasks({ ownerSessionId: owner });
|
|
52
|
+
return result;
|
|
53
|
+
};
|
|
54
|
+
pendingCancels.set(owner, send);
|
|
55
|
+
return killAfterSnapshot(Promise.all(pending), send);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Send every owner cancel still waiting for its snapshot, now (runtime
|
|
59
|
+
* shutdown). A snapshot that has not landed leaves that outcome unknown. */
|
|
60
|
+
export function flushPendingOwnerCancels() {
|
|
61
|
+
let sent = 0;
|
|
62
|
+
for (const send of [...pendingCancels.values()]) {
|
|
63
|
+
send();
|
|
64
|
+
sent += 1;
|
|
65
|
+
}
|
|
66
|
+
return sent;
|
|
67
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Test support: a scripted process table standing in for mcp/child-tree.mjs.
|
|
2
|
+
// Each row is one process identity; `state.next()` answers every table read
|
|
3
|
+
// (throw from it to model a failed enumeration).
|
|
4
|
+
|
|
5
|
+
export function processTable(rows = []) {
|
|
6
|
+
const table = { childrenOf: new Map(), tokenOf: new Map(), nameOf: new Map(), pgidOf: new Map() };
|
|
7
|
+
for (const { pid, ppid = 1, token = `created-${pid}`, name = 'node.exe', pgid } of rows) {
|
|
8
|
+
if (!table.childrenOf.has(ppid)) table.childrenOf.set(ppid, []);
|
|
9
|
+
table.childrenOf.get(ppid).push(pid);
|
|
10
|
+
table.tokenOf.set(pid, token);
|
|
11
|
+
table.nameOf.set(pid, name);
|
|
12
|
+
if (pgid) table.pgidOf.set(pid, pgid);
|
|
13
|
+
}
|
|
14
|
+
return table;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function descendantsOf(table, root) {
|
|
18
|
+
const out = [];
|
|
19
|
+
const stack = [root];
|
|
20
|
+
const seen = new Set(stack);
|
|
21
|
+
while (stack.length) {
|
|
22
|
+
for (const pid of table.childrenOf.get(stack.pop()) ?? []) {
|
|
23
|
+
if (seen.has(pid)) continue;
|
|
24
|
+
seen.add(pid);
|
|
25
|
+
stack.push(pid);
|
|
26
|
+
out.push({ pid, name: table.nameOf.get(pid), token: table.tokenOf.get(pid) });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function scriptedChildTree() {
|
|
33
|
+
const state = { reads: 0, kills: [], next: () => processTable() };
|
|
34
|
+
const read = async () => {
|
|
35
|
+
state.reads += 1;
|
|
36
|
+
return state.next();
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
state,
|
|
40
|
+
namedExports: {
|
|
41
|
+
readProcessTable: read,
|
|
42
|
+
collectDescendantProcesses: async (root) => descendantsOf(await read(), root),
|
|
43
|
+
killProcessTrees: async (pids) => {
|
|
44
|
+
state.kills.push(...pids);
|
|
45
|
+
},
|
|
46
|
+
killStdioChildTreeFast: () => false,
|
|
47
|
+
shutdownStdioChild: async () => false,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|