mixdog 1.4.0 → 1.4.2
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 +3 -2
- package/scripts/build-shipped-history.mjs +115 -33
- package/scripts/check-voice-runtime-inputs.mjs +25 -0
- package/scripts/gate-local.mjs +183 -63
- package/scripts/latest-guard.mjs +21 -9
- package/scripts/lib/gate-scheduler.mjs +138 -32
- package/scripts/lib/gate-timing-reporter.mjs +16 -0
- package/scripts/lib/isolated-test-env.mjs +10 -5
- package/scripts/lib/run-node-tests.mjs +91 -66
- package/scripts/lib/scoped-temp.d.mts +16 -0
- package/scripts/lib/scoped-temp.mjs +124 -0
- package/scripts/lib/stale-temp.mjs +44 -0
- package/scripts/lib/test-failure-records.mjs +14 -1
- package/scripts/lib/test-failure-summary.mjs +16 -4
- package/scripts/lib/test-spawn-ledger.mjs +12 -3
- package/scripts/post-release-check.mjs +1 -6
- package/scripts/pptx-kit-index.mjs +17 -5
- package/scripts/suite-health.mjs +115 -24
- package/scripts/test-data-dir.mjs +10 -7
- 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/app.mjs +4 -0
- package/src/cli.mjs +7 -0
- package/src/defaults/agents.json +7 -0
- package/src/defaults/shipped-history.json +23 -2
- package/src/defaults/skills/browser-use/SKILL.md +10 -5
- 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 +16 -4
- package/src/defaults/skills/goal-management/SKILL.md +1 -1
- package/src/defaults/skills/setup/references/actions.md +12 -6
- package/src/defaults/skills/setup/references/surfaces.md +2 -2
- package/src/defaults/skills/setup-guide/SKILL.md +5 -2
- 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/rules-builder.cjs +35 -42
- package/src/output-styles/common.md +2 -2
- package/src/output-styles/simple.md +1 -1
- package/src/rules/agent/AGENT.md +5 -4
- package/src/rules/lead/LEAD.md +12 -7
- package/src/rules/shared/10-tool-workflow.md +3 -1
- package/src/rules/shared/20-research.md +3 -6
- package/src/rules/shared/40-editing.md +1 -0
- package/src/rules/shared/45-destructive.md +0 -2
- package/src/rules/shared/50-execution.md +2 -0
- package/src/rules/shared/60-verification.md +10 -9
- package/src/rules/shared/70-delivery.md +8 -9
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +156 -24
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -0
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
- package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/config.mjs +12 -7
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +8 -8
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +5 -26
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +3 -1
- package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +122 -12
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +5 -3
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +13 -2
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +152 -58
- package/src/runtime/agent/orchestrator/mcp/client.mjs +51 -18
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +88 -54
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +42 -26
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +54 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +37 -31
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
- 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-oauth-request/initial-status.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +6 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
- 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-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +3 -0
- 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/devin.mjs +3 -0
- 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/grok-oauth-login.mjs +248 -41
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
- package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
- package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
- 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-login.mjs +1 -10
- 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-chat-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +160 -31
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +22 -12
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +49 -22
- 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 +45 -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 +567 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +41 -13
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +7 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +6 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +14 -5
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
- 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/cache/scoped-cache.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +102 -12
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +160 -36
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +164 -23
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +139 -19
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +100 -22
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -6
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +9 -2
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +14 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +23 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +39 -21
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +50 -28
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +30 -13
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +63 -6
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +35 -13
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +24 -14
- 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 +10 -6
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +56 -29
- package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +30 -7
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +37 -8
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +252 -39
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +164 -4
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +61 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +46 -20
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +67 -31
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +25 -13
- package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +96 -20
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
- 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 +103 -13
- 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 +34 -10
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +28 -4
- package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -2
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
- package/src/runtime/channels/lib/whisper-port.mjs +29 -11
- package/src/runtime/channels/lib/whisper-server.mjs +10 -1
- package/src/runtime/computer-bridge/action-schema.mjs +2 -2
- package/src/runtime/computer-bridge/core-actions.mjs +2 -2
- package/src/runtime/computer-bridge/error-recovery.mjs +5 -4
- package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
- package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
- package/src/runtime/connectors/connector-accounts-mcp.mjs +236 -103
- package/src/runtime/connectors/gmail-app-password.mjs +3 -3
- package/src/runtime/explore/explorer.mjs +93 -0
- package/src/runtime/explore/tool-defs.mjs +35 -0
- package/src/runtime/explore/tool.mjs +123 -0
- package/src/runtime/local-provider/server-process.mjs +2 -1
- package/src/runtime/media/adapters/gemini-video.mjs +4 -1
- package/src/runtime/media/adapters/xai-media.mjs +2 -1
- package/src/runtime/memory/index.mjs +4 -0
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
- package/src/runtime/memory/lib/embedding-worker.mjs +10 -3
- package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
- package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
- package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
- package/src/runtime/office/design/design-art-direction.mjs +29 -27
- package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
- package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
- package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
- package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
- package/src/runtime/office/quality/assurance-structure-docx.mjs +4 -2
- package/src/runtime/office/quality/design-review.mjs +1 -5
- package/src/runtime/office/quality/document-brief.mjs +1 -5
- package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
- package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
- package/src/runtime/shared/agent-route-config.mjs +17 -2
- package/src/runtime/shared/atomic-file.mjs +103 -2
- package/src/runtime/shared/background-tasks.mjs +15 -6
- package/src/runtime/shared/bot-owned-work.mjs +56 -0
- package/src/runtime/shared/connector-accounts.mjs +5 -5
- package/src/runtime/shared/connector-catalog.d.mts +11 -4
- package/src/runtime/shared/connector-catalog.mjs +60 -52
- package/src/runtime/shared/custom-provider-keys.mjs +20 -0
- package/src/runtime/shared/defaults-separation.mjs +1 -4
- package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
- package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
- package/src/runtime/shared/file-has-data.mjs +26 -2
- package/src/runtime/shared/file-lock.mjs +13 -15
- 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/handoff-artifacts.d.mts +2 -1
- package/src/runtime/shared/handoff-artifacts.mjs +18 -8
- package/src/runtime/shared/idle-auto-clear-gate.mjs +29 -7
- package/src/runtime/shared/llm/cost.mjs +11 -2
- package/src/runtime/shared/llm/http-agent.mjs +313 -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 +452 -0
- package/src/runtime/shared/loopback-listener.mjs +25 -2
- package/src/runtime/shared/model-route-chain.d.mts +7 -2
- package/src/runtime/shared/model-route-chain.mjs +22 -4
- package/src/runtime/shared/open-url.mjs +10 -0
- package/src/runtime/shared/provider-accounts.mjs +52 -2
- package/src/runtime/shared/session-activity-signal.mjs +14 -0
- package/src/runtime/shared/session-scratch.mjs +37 -0
- 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/agent-surface.mjs +1 -3
- package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
- package/src/runtime/shared/tool-result-summary.mjs +1 -1
- package/src/runtime/shared/tool-surface.mjs +113 -36
- package/src/runtime/shared/tool-work-units.mjs +6 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
- package/src/runtime/shared/turn-worktree-snapshot.mjs +414 -54
- 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 +9 -3
- package/src/runtime/shared/worktrees/contract.mjs +4 -1
- package/src/runtime/shared/worktrees/git.mjs +72 -0
- package/src/runtime/shared/worktrees/manager.mjs +285 -168
- package/src/runtime/shared/worktrees/test-support.mjs +6 -10
- package/src/runtime/tidy/install.mjs +95 -15
- package/src/runtime/tidy/languages.mjs +17 -15
- package/src/runtime/tidy/process.mjs +7 -4
- 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 +6 -1
- package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
- package/src/runtime/web-search/index.mjs +1 -1
- package/src/session-runtime/agent-home-delivery.mjs +41 -0
- package/src/session-runtime/agent-task-sessions.mjs +458 -312
- package/src/session-runtime/agent-tool-routing.mjs +8 -41
- package/src/session-runtime/boot/tools.mjs +7 -1
- package/src/session-runtime/bot-status.mjs +107 -101
- package/src/session-runtime/bot-target.mjs +38 -0
- package/src/session-runtime/channel-config-api.mjs +6 -1
- package/src/session-runtime/connector-merge-migration.mjs +18 -15
- package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
- package/src/session-runtime/conversation-import/discovery.mjs +401 -36
- package/src/session-runtime/conversation-import/service.mjs +35 -8
- package/src/session-runtime/handoff-attachments.mjs +82 -31
- package/src/session-runtime/held-requests.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +12 -13
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +1 -0
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -0
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
- package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +145 -112
- package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
- package/src/session-runtime/lifecycle/session-catalog.mjs +9 -1
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -1
- package/src/session-runtime/lifecycle/teardown.mjs +1 -1
- package/src/session-runtime/mcp-glue/server-catalog.mjs +16 -10
- 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 +11 -2
- package/src/session-runtime/provider-auth/login.mjs +2 -2
- package/src/session-runtime/provider-catalog-cache.mjs +82 -36
- package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
- package/src/session-runtime/provider-models.mjs +4 -2
- package/src/session-runtime/resource-mcp-api.mjs +98 -35
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +44 -31
- package/src/session-runtime/resource-mcp-secrets.mjs +28 -11
- package/src/session-runtime/resource-mcp-servers.mjs +5 -4
- package/src/session-runtime/resource-recall-api.mjs +6 -1
- package/src/session-runtime/runtime-feature-gates.mjs +5 -1
- package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
- package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
- package/src/session-runtime/services/agent-tool/render.mjs +71 -17
- package/src/session-runtime/services/agent-tool/send-flow.mjs +10 -2
- 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 +4 -1
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +6 -2
- package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
- package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
- 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/memory-runtime-proxy/daemon-spawn.mjs +4 -0
- package/src/session-runtime/services/plugin-admin.mjs +10 -6
- package/src/session-runtime/services/provider-admin.mjs +283 -11
- package/src/session-runtime/session-turn-api.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +4 -1
- 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 +6 -2
- package/src/session-runtime/setup-tool/tool-defs.mjs +2 -1
- package/src/session-runtime/tool-policy/policy-stage.mjs +1 -0
- package/src/session-runtime/turn/agent-ops.mjs +23 -0
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +49 -11
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +25 -5
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
- package/src/session-runtime/workspace/activity-guards.mjs +176 -0
- 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 +108 -1041
- 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 +80 -0
- package/src/session-runtime/workspace/worktree-setup.mjs +85 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +73 -56
- package/src/standalone/daemon-desktop-runtime.mjs +2 -0
- package/src/standalone/daemon-session-control.mjs +169 -138
- package/src/standalone/daemon.mjs +7 -0
- package/src/standalone/desktop-service-registry.mjs +9 -0
- package/src/standalone/local-session-runtime.mjs +5 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +3 -0
- package/src/standalone/session-client.mjs +5 -1
- package/src/standalone/session-frame-stream.mjs +83 -11
- package/src/standalone/session-protocol.mjs +4 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
- 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/session-calls/session-action.mjs +10 -3
- package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
- package/src/standalone/session-service/stored-reader.mjs +127 -40
- package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
- package/src/tui/App.jsx +154 -164
- package/src/tui/app/app-view/floating-panel.jsx +10 -4
- package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
- package/src/tui/app/clipboard.mjs +21 -10
- package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
- package/src/tui/app/model-picker/route-selection.mjs +5 -6
- 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 +58 -21
- package/src/tui/app/provider-setup/provider-items.mjs +8 -2
- package/src/tui/app/provider-setup-picker.mjs +29 -18
- package/src/tui/app/shell-layout/row-budgets.mjs +12 -10
- package/src/tui/app/slash-commands.mjs +1 -0
- package/src/tui/app/slash-dispatch/session-commands.mjs +46 -0
- 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 +3 -2
- 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 +47 -32
- 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 +19 -5
- 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/QuestionPanel.jsx +13 -4
- package/src/tui/components/SignInUrl.jsx +68 -0
- package/src/tui/components/TextEntryPanel.jsx +76 -46
- package/src/tui/components/sign-in-url-layout.mjs +24 -0
- package/src/tui/dist/index.mjs +1963 -1361
- package/src/tui/session/goal-turn-state.mjs +6 -2
- 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/routes-agent-definitions.mjs +1 -0
- package/src/tui/session/session-api/settings.mjs +2 -2
- package/src/tui/session/session-flow/queue/take-entries.mjs +11 -0
- 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/ui/statusline-agents.mjs +1 -3
- package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
|
@@ -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(
|
|
@@ -22,7 +22,7 @@ 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 {
|
|
25
|
+
import { tryAdmitWorkspaceActivityAsync } from '../../../../shared/worktrees/activity-gate.mjs';
|
|
26
26
|
import { worktreeError } from '../../../../shared/worktrees/contract.mjs';
|
|
27
27
|
import {
|
|
28
28
|
adoptShellWorkspaceAdmission,
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
completeShellJobRecord,
|
|
31
31
|
listShellJobRecords,
|
|
32
32
|
markShellJobTerminationUnconfirmed,
|
|
33
|
+
pendingWorkspaceAdmission,
|
|
33
34
|
publishShellJobRecord,
|
|
34
35
|
recordShellJobHop,
|
|
35
36
|
registerTerminationHold,
|
|
@@ -37,9 +38,12 @@ import {
|
|
|
37
38
|
takeReleaseRequest,
|
|
38
39
|
} from './lib/shell-job-records.mjs';
|
|
39
40
|
import {
|
|
41
|
+
createContainedTreeTracker,
|
|
40
42
|
createProcessTreeTracker,
|
|
43
|
+
endWatchWhenUnconfirmable,
|
|
41
44
|
killAfterSnapshot,
|
|
42
45
|
PROCESS_TABLE_READ_BOUND_MS,
|
|
46
|
+
sweepLiveIdentities,
|
|
43
47
|
watchTermination,
|
|
44
48
|
withinBound,
|
|
45
49
|
} from '../lib/shell-descendants.mjs';
|
|
@@ -61,13 +65,33 @@ const PRE_DEADLINE_CAPTURE_MS = PROCESS_TABLE_READ_BOUND_MS + 1_000;
|
|
|
61
65
|
// the promotion baseline predates whatever the job started since (a server,
|
|
62
66
|
// an npm child); the baseline still stands when the fresh read fails. Marks
|
|
63
67
|
// the job killed, so its settle relies on this snapshot instead of an
|
|
64
|
-
// after-exit observation.
|
|
68
|
+
// after-exit observation. A job the spawn server contains needs none (true at
|
|
69
|
+
// once): its kill is verified by the server's empty-job report.
|
|
65
70
|
function prepareTrackedKill(entry) {
|
|
66
71
|
entry.killed = true;
|
|
72
|
+
if (entry.contained) return true;
|
|
67
73
|
return (entry.baseline || Promise.resolve(false)).then(() =>
|
|
68
74
|
entry.tracker.capture().catch(() => entry.tracker.complete)
|
|
69
75
|
);
|
|
70
76
|
}
|
|
77
|
+
|
|
78
|
+
const FINAL_TREE_OUTCOMES = new Set(['empty', 'unverified', 'released']);
|
|
79
|
+
|
|
80
|
+
/** The tracker of a contained job's killed or emptied tree, driven by the
|
|
81
|
+
* server's outcome (a final one latched: the task entry may expire).
|
|
82
|
+
* Survivors the server kept in the job are cancelled through it. */
|
|
83
|
+
function containedJobTracker(jobId) {
|
|
84
|
+
let final = null;
|
|
85
|
+
return createContainedTreeTracker({
|
|
86
|
+
outcome: () => {
|
|
87
|
+
if (final) return final;
|
|
88
|
+
const outcome = getNativeTask(jobId)?.treeOutcome ?? null;
|
|
89
|
+
if (FINAL_TREE_OUTCOMES.has(outcome)) final = outcome;
|
|
90
|
+
return outcome;
|
|
91
|
+
},
|
|
92
|
+
cancel: () => cancelNativeTask(jobId),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
71
95
|
import { isPidAlive } from '../../../../shared/pid-liveness.mjs';
|
|
72
96
|
import { hopOf } from '../../../../shared/bot-hops.mjs';
|
|
73
97
|
import {
|
|
@@ -110,22 +134,30 @@ function demoteBackgroundShellPriority(pid) {
|
|
|
110
134
|
// The workspace admission a job record holds is released only once the job's
|
|
111
135
|
// processes are confirmed gone — the same confirmation path a foreground run
|
|
112
136
|
// uses, not the native terminal status alone.
|
|
113
|
-
|
|
137
|
+
// Resolves once both workspace leases are written; the promoted run's own
|
|
138
|
+
// admission is released only after that (handOverLease).
|
|
139
|
+
async function trackShellJobRecord(task, options) {
|
|
114
140
|
const jobId = String(task?.jobId || '').trim();
|
|
115
141
|
if (!jobId) return;
|
|
116
|
-
publishShellJobRecord(task, options);
|
|
142
|
+
const published = publishShellJobRecord(task, options);
|
|
117
143
|
if (task?.cwd) {
|
|
118
144
|
// The record's own reader is filed under the job's root pid, which the
|
|
119
145
|
// gate drops the moment that pid dies. Survivors must keep the folder
|
|
120
146
|
// reserved, so this runtime holds it under its own live pid as well.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
adoptShellWorkspaceAdmission(jobId,
|
|
147
|
+
await published;
|
|
148
|
+
const holding = tryAdmitWorkspaceActivityAsync(options?.ownerSessionId || jobId, task.cwd, { kind: 'command' });
|
|
149
|
+
adoptShellWorkspaceAdmission(jobId, pendingWorkspaceAdmission(holding));
|
|
150
|
+
if (!(await holding)) throw worktreeError('WORKTREE_BUSY_JOBS', 'The command folder is being managed.');
|
|
124
151
|
}
|
|
125
152
|
const tracker = task?.cwd ? createProcessTreeTracker({ pid: task.pid }) : null;
|
|
153
|
+
// Killed, or emptied on its own, a contained job is confirmed by the server
|
|
154
|
+
// (containedJobTracker); the process tracker still observes the survivors a
|
|
155
|
+
// root that exited on its own leaves.
|
|
156
|
+
const contained = task?.contained === true;
|
|
126
157
|
let resolveTerminated = null;
|
|
127
158
|
const entry = {
|
|
128
159
|
tracker,
|
|
160
|
+
contained,
|
|
129
161
|
killed: false,
|
|
130
162
|
baseline: null,
|
|
131
163
|
// Settles once every process of the job is confirmed gone (or the user
|
|
@@ -150,7 +182,7 @@ function trackShellJobRecord(task, options) {
|
|
|
150
182
|
// identities of what the job started since its promotion.
|
|
151
183
|
const deadlineMs = Math.floor(Number(options?.timeoutMs) || 0);
|
|
152
184
|
const deadlineCapture =
|
|
153
|
-
tracker && deadlineMs > 0
|
|
185
|
+
tracker && !contained && deadlineMs > 0
|
|
154
186
|
? setTimeout(
|
|
155
187
|
() => {
|
|
156
188
|
if (!settled) void tracker.capture().catch(() => false);
|
|
@@ -177,31 +209,45 @@ function trackShellJobRecord(task, options) {
|
|
|
177
209
|
// settle does. A killed one relies on the snapshot taken before the kill.
|
|
178
210
|
const killed = entry.killed || detail.killed || detail.timedOut || String(detail.status) === 'cancelled';
|
|
179
211
|
if (!killed) tracker.acceptExitObservation();
|
|
212
|
+
const watched =
|
|
213
|
+
contained && (killed || detail.treeOutcome === 'empty') ? containedJobTracker(jobId) : tracker;
|
|
180
214
|
// The completion notice is already on its way (watchBackgroundShellJob);
|
|
181
215
|
// the record — and with it the workspace admission — completes only once
|
|
182
216
|
// every process is confirmed gone, or the user releases it explicitly.
|
|
217
|
+
// A force-release only drops the workspace hold (the record completes);
|
|
218
|
+
// the job stays tracked and observed until its processes are confirmed
|
|
219
|
+
// gone, and only that confirmation reports it terminated.
|
|
220
|
+
let released = null;
|
|
221
|
+
const releaseHold = () => {
|
|
222
|
+
clearTerminationHold(jobId);
|
|
223
|
+
released ??= completeShellJobRecord(jobId, normalized);
|
|
224
|
+
return released;
|
|
225
|
+
};
|
|
183
226
|
let finished = false;
|
|
184
227
|
const finish = () => {
|
|
185
228
|
if (finished) return;
|
|
186
229
|
finished = true;
|
|
187
230
|
stop();
|
|
188
|
-
clearTerminationHold(jobId);
|
|
189
231
|
if (backgroundTrackers.get(jobId) === entry) backgroundTrackers.delete(jobId);
|
|
190
232
|
resolveTerminated(true);
|
|
191
|
-
return
|
|
233
|
+
return releaseHold();
|
|
192
234
|
};
|
|
193
235
|
const stop = watchTermination({
|
|
194
|
-
tracker,
|
|
236
|
+
tracker: endWatchWhenUnconfirmable(watched, { released: () => released !== null, stop: () => stop() }),
|
|
195
237
|
// A killed job is not over while processes it started still run.
|
|
196
238
|
sweep: killed,
|
|
197
239
|
onTerminated: finish,
|
|
198
|
-
|
|
240
|
+
// A release requested from another process is the same force-release.
|
|
241
|
+
releaseRequested: () => {
|
|
242
|
+
if (takeReleaseRequest(jobId)) void releaseHold();
|
|
243
|
+
return false;
|
|
244
|
+
},
|
|
199
245
|
onUnconfirmed: () => {
|
|
200
246
|
void markShellJobTerminationUnconfirmed(jobId);
|
|
201
247
|
registerTerminationHold(jobId, {
|
|
202
248
|
ownerSessionId: options?.ownerSessionId || null,
|
|
203
249
|
cwd: task.cwd,
|
|
204
|
-
release:
|
|
250
|
+
release: releaseHold,
|
|
205
251
|
});
|
|
206
252
|
},
|
|
207
253
|
});
|
|
@@ -415,7 +461,27 @@ export function killShellJob(jobId) {
|
|
|
415
461
|
// complete, a fresh read). The kill waits for it at most the read bound
|
|
416
462
|
// and is sent regardless; without a snapshot the outcome stays unknown and
|
|
417
463
|
// the folder stays held under the observation loop.
|
|
418
|
-
|
|
464
|
+
// The kill never outruns the promotion baseline itself: a read still in
|
|
465
|
+
// flight takes its table after a kill sent beside it, finds the root gone,
|
|
466
|
+
// and the job could never be confirmed terminated. That read ends by its
|
|
467
|
+
// own enumeration deadline. A contained job is cancelled at once.
|
|
468
|
+
const snapshot = prepareTrackedKill(tracked);
|
|
469
|
+
tracked.killSent =
|
|
470
|
+
snapshot === true
|
|
471
|
+
? new Promise((resolve) => resolve(cancelNativeTask(jobId)))
|
|
472
|
+
: tracked.baseline.then(() => killAfterSnapshot(snapshot, () => cancelNativeTask(jobId)));
|
|
473
|
+
return { ...attachJobInsights(normalizeShellJobDetail(current)), killed: true };
|
|
474
|
+
}
|
|
475
|
+
if (tracked) {
|
|
476
|
+
// The root already exited but its tracked descendants run on: the stop
|
|
477
|
+
// reaches them through the tracker alone, whether or not the native task
|
|
478
|
+
// is still cached; the termination watch then releases the folder.
|
|
479
|
+
void tracked.tracker
|
|
480
|
+
.observe({ rootExited: true })
|
|
481
|
+
.then(() => sweepLiveIdentities(tracked.tracker))
|
|
482
|
+
.catch(() => {});
|
|
483
|
+
// An expired native entry says nothing about the root, so none is claimed.
|
|
484
|
+
if (!current) return { jobId, killed: true };
|
|
419
485
|
return { ...attachJobInsights(normalizeShellJobDetail(current)), killed: true };
|
|
420
486
|
}
|
|
421
487
|
const detail = cancelNativeTask(jobId);
|
|
@@ -424,6 +490,12 @@ export function killShellJob(jobId) {
|
|
|
424
490
|
return { ...attachJobInsights(normalizeShellJobDetail(detail)), killed: wasRunning };
|
|
425
491
|
}
|
|
426
492
|
|
|
493
|
+
/** Settles once the kill a stop of the tracked job queued has been sent (at
|
|
494
|
+
* once when none is pending). */
|
|
495
|
+
export function shellJobKillSent(jobId) {
|
|
496
|
+
return Promise.resolve(backgroundTrackers.get(String(jobId || ''))?.killSent).catch(() => {});
|
|
497
|
+
}
|
|
498
|
+
|
|
427
499
|
/** True once every process of a tracked background job is confirmed gone,
|
|
428
500
|
* false while any is still alive when `timeoutMs` passes. A job without a
|
|
429
501
|
* process tracker (or one already finished) has nothing left to confirm. */
|
|
@@ -572,7 +644,7 @@ export async function promoteForegroundShellJob({
|
|
|
572
644
|
}
|
|
573
645
|
// Added before tracking: the record's settlement removes it again.
|
|
574
646
|
promotedJobIds.add(native.jobId);
|
|
575
|
-
trackShellJobRecord(native, { ownerSessionId, clientHostPid, startedAtMs: started, timeoutMs });
|
|
647
|
+
await trackShellJobRecord(native, { ownerSessionId, clientHostPid, startedAtMs: started, timeoutMs });
|
|
576
648
|
return native;
|
|
577
649
|
}
|
|
578
650
|
|
|
@@ -606,8 +678,8 @@ export function publishForegroundShellRecord({
|
|
|
606
678
|
clientHostPid = null,
|
|
607
679
|
terminationUnconfirmed = false,
|
|
608
680
|
}) {
|
|
609
|
-
if (!jobId || !Number.isFinite(Number(pid)) || Number(pid) <= 0) return;
|
|
610
|
-
publishShellJobRecord(
|
|
681
|
+
if (!jobId || !Number.isFinite(Number(pid)) || Number(pid) <= 0) return Promise.resolve();
|
|
682
|
+
return publishShellJobRecord(
|
|
611
683
|
{ jobId, command, cwd, pid: Number(pid), shellType },
|
|
612
684
|
{
|
|
613
685
|
ownerSessionId,
|
|
@@ -696,8 +768,9 @@ export async function shutdownShellJobs(_reason = 'runtime-close', { scope = nul
|
|
|
696
768
|
let cancelledWatchers = 0;
|
|
697
769
|
// Identities first, as every other kill does: once a root dies, what it
|
|
698
770
|
// started outside its process group is reparented and can no longer be
|
|
699
|
-
// found. The cancel is sent at the snapshot bound regardless
|
|
700
|
-
|
|
771
|
+
// found. The cancel is sent at the snapshot bound regardless — and at once
|
|
772
|
+
// when no snapshot is pending (every tree contained, or already captured).
|
|
773
|
+
const cancelAll = () => {
|
|
701
774
|
for (const task of jobs) {
|
|
702
775
|
if (cancelBackgroundShellJobWatch(task.jobId)) cancelledWatchers += 1;
|
|
703
776
|
try {
|
|
@@ -705,7 +778,10 @@ export async function shutdownShellJobs(_reason = 'runtime-close', { scope = nul
|
|
|
705
778
|
} catch {}
|
|
706
779
|
jobNotifyCtxByJobId.delete(task.jobId);
|
|
707
780
|
}
|
|
708
|
-
}
|
|
781
|
+
};
|
|
782
|
+
const snapshots = prepareOwnedShellTreeKills(scoped ? ownerSessionId : null);
|
|
783
|
+
if (snapshots.length === 0) cancelAll();
|
|
784
|
+
else await killAfterSnapshot(Promise.all(snapshots), cancelAll);
|
|
709
785
|
const settled = await Promise.all(jobs.map((task) => waitNativeTask(task.jobId, 1_200).catch(() => null)));
|
|
710
786
|
// A process still running after the wait is not forgotten: it keeps being
|
|
711
787
|
// stopped until its exit is confirmed.
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// Generic background-task tool (status/wait/cancel).
|
|
2
2
|
import {
|
|
3
3
|
buildJobNotFoundMessage,
|
|
4
|
+
isShellJobRunning,
|
|
4
5
|
peekShellJob,
|
|
5
6
|
killShellJob,
|
|
6
7
|
otherSessionBackgroundShellJobCount,
|
|
7
8
|
cancelBackgroundShellJobWatch,
|
|
8
9
|
clearShellJobNotifyCtx,
|
|
10
|
+
shellJobKillSent,
|
|
9
11
|
shellJobPublicTaskResult,
|
|
10
12
|
shellJobTaskStatus,
|
|
11
13
|
waitForShellJob,
|
|
@@ -21,6 +23,7 @@ import {
|
|
|
21
23
|
cancelBackgroundTask,
|
|
22
24
|
completeBackgroundTask,
|
|
23
25
|
getBackgroundTask,
|
|
26
|
+
listBackgroundTasks,
|
|
24
27
|
registerBackgroundTask,
|
|
25
28
|
renderBackgroundTask,
|
|
26
29
|
renderBackgroundTaskList,
|
|
@@ -227,12 +230,16 @@ async function cancelShellTaskOutcome(task, taskId, options) {
|
|
|
227
230
|
// their shell). Remember that it WAS live so the outcome is
|
|
228
231
|
// reported as a cancellation rather than "task not found".
|
|
229
232
|
const wasRunning = task.status === 'running';
|
|
233
|
+
// A tracked tree outlives the native task's cache entry: its own
|
|
234
|
+
// termination watch, not the native task, confirms the stop.
|
|
235
|
+
const trackedTree = isShellJobRunning(taskId);
|
|
230
236
|
const job = killShellJob(taskId);
|
|
231
237
|
if (job) {
|
|
232
238
|
// Confirm the process actually terminated before reporting a
|
|
233
239
|
// terminal status. Removing the watcher on the strength of a
|
|
234
240
|
// delivered signal left a live, unmonitored process behind a
|
|
235
|
-
// false 'cancelled'.
|
|
241
|
+
// false 'cancelled'. The window opens once the kill is actually sent.
|
|
242
|
+
await shellJobKillSent(taskId);
|
|
236
243
|
const confirmed = await waitForShellJob(taskId, { timeoutMs: TASK_CANCEL_CONFIRM_MS });
|
|
237
244
|
if (confirmed && confirmed.status === 'running') {
|
|
238
245
|
// Watcher and notify context stay armed: the eventual exit
|
|
@@ -248,10 +255,10 @@ async function cancelShellTaskOutcome(task, taskId, options) {
|
|
|
248
255
|
}
|
|
249
256
|
// The root exited; what it started outside its process group is swept
|
|
250
257
|
// by the job's termination watch. Cancelled means all of it is gone.
|
|
251
|
-
if (confirmed && !(await waitShellJobTerminated(taskId, TASK_CANCEL_TREE_CONFIRM_MS))) {
|
|
258
|
+
if ((confirmed || trackedTree) && !(await waitShellJobTerminated(taskId, TASK_CANCEL_TREE_CONFIRM_MS))) {
|
|
252
259
|
return { outcome: 'unconfirmed', text: cancelPendingText(taskId) };
|
|
253
260
|
}
|
|
254
|
-
if (!confirmed) {
|
|
261
|
+
if (!confirmed && !trackedTree) {
|
|
255
262
|
// No terminal event and no observable task: absence of
|
|
256
263
|
// state is not proof of termination. Stop tracking it so it
|
|
257
264
|
// cannot hang as 'running' forever, but never claim it died.
|
|
@@ -273,7 +280,7 @@ async function cancelShellTaskOutcome(task, taskId, options) {
|
|
|
273
280
|
cancelBackgroundTask(taskId, 'cancelled by task control');
|
|
274
281
|
// A task whose own cancel hook kills (what a finished command left running)
|
|
275
282
|
// reports what that kill confirmed.
|
|
276
|
-
const hookKill =
|
|
283
|
+
const hookKill = await task.cancelOutcome;
|
|
277
284
|
if (hookKill && hookKill.terminated !== true) return { outcome: 'unconfirmed', text: cancelPendingText(taskId) };
|
|
278
285
|
return job || wasRunning
|
|
279
286
|
? {
|
|
@@ -298,22 +305,64 @@ export async function stopBackgroundShellJob(taskId, options = {}) {
|
|
|
298
305
|
const id = typeof taskId === 'string' ? taskId.trim() : '';
|
|
299
306
|
if (!id) return { stopped: false, error: 'task_id is required' };
|
|
300
307
|
const task = getBackgroundTask(id, { context: options });
|
|
301
|
-
if (
|
|
308
|
+
if (task?.surface !== 'shell') return { stopped: false, error: `task not found: ${id}` };
|
|
302
309
|
const job = peekShellJob(id);
|
|
303
310
|
const status = job ? job.status : task.status;
|
|
304
|
-
|
|
311
|
+
// A root that exited while tracked descendants run is still stoppable, and
|
|
312
|
+
// so is the survivors task of a finished command (`detached`): its own
|
|
313
|
+
// registry status, not the finished command's cached native entry, says
|
|
314
|
+
// whether anything still runs.
|
|
315
|
+
const survivors = task.detached === true && task.status === 'running';
|
|
316
|
+
if (status !== 'running' && !isShellJobRunning(id) && !survivors)
|
|
317
|
+
return { stopped: false, error: `task already ${status}: ${id}` };
|
|
305
318
|
try {
|
|
306
319
|
const { outcome, text } = await cancelShellTaskOutcome(task, id, options);
|
|
307
320
|
if (outcome === 'cancelled') return { stopped: true };
|
|
308
|
-
|
|
309
|
-
stopped: false,
|
|
310
|
-
|
|
311
|
-
};
|
|
321
|
+
if (outcome === 'unconfirmed')
|
|
322
|
+
return { stopped: false, unconfirmed: true, error: `cancellation not confirmed: ${id}` };
|
|
323
|
+
return { stopped: false, error: text.replace(/^Error:\s*/, '') };
|
|
312
324
|
} catch (error) {
|
|
313
325
|
return { stopped: false, error: error instanceof Error ? error.message : String(error) };
|
|
314
326
|
}
|
|
315
327
|
}
|
|
316
328
|
|
|
329
|
+
// The running shell tasks the caller's session owns (promoted jobs and the
|
|
330
|
+
// survivors a finished command left), including a task whose command already
|
|
331
|
+
// exited while its tracked descendants still run (what the island lists as
|
|
332
|
+
// termination unconfirmed). A foreground command holds no background task, so
|
|
333
|
+
// it never appears here.
|
|
334
|
+
function sessionShellTasks(options) {
|
|
335
|
+
const sessionId = String(options.callerSessionId || '').trim();
|
|
336
|
+
if (!sessionId) return [];
|
|
337
|
+
return listBackgroundTasks({ ...options, surface: 'shell' })
|
|
338
|
+
.filter((row) => row.status === 'running' || isShellJobRunning(row.task_id))
|
|
339
|
+
.map((row) => getBackgroundTask(row.task_id))
|
|
340
|
+
.filter((task) => task?.ownerSessionId === sessionId);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/** What `/stop` would stop: this session's running background shells. */
|
|
344
|
+
export function listStoppableShellJobs(options = {}) {
|
|
345
|
+
return sessionShellTasks(options).map((task) => ({
|
|
346
|
+
taskId: task.taskId,
|
|
347
|
+
command: String(task.input?.command || task.label || ''),
|
|
348
|
+
}));
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Stop every background shell of the caller's session, each through the same
|
|
353
|
+
* confirmed cancel as a single stop. `stopping` counts the ones whose
|
|
354
|
+
* processes are not yet confirmed gone (they keep being terminated).
|
|
355
|
+
*/
|
|
356
|
+
export async function stopBackgroundShellJobs(options = {}) {
|
|
357
|
+
const results = await Promise.all(
|
|
358
|
+
sessionShellTasks(options).map((task) => stopBackgroundShellJob(task.taskId, options))
|
|
359
|
+
);
|
|
360
|
+
return {
|
|
361
|
+
stopped: results.filter((result) => result.stopped).length,
|
|
362
|
+
stopping: results.filter((result) => result.unconfirmed).length,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
|
|
317
366
|
export async function executeTaskTool(args, options = {}) {
|
|
318
367
|
const action = typeof args.action === 'string' ? args.action.toLowerCase() : '';
|
|
319
368
|
if (!action) return 'Error: task action is required';
|
|
@@ -129,7 +129,9 @@ function federateRoots(name, args, plan, signal, options, execute) {
|
|
|
129
129
|
}
|
|
130
130
|
const runOne = async (root, nextArgs) =>
|
|
131
131
|
execute(name, nextArgs, root, signal, { ...options, excludedProjectRoots: excludedRootsFor(root, roots) });
|
|
132
|
-
const work = _runCodeGraphFederation(roots, runOne, projectArgs, options.scopedCacheOutcome).then((sections) =>
|
|
132
|
+
const work = _runCodeGraphFederation(roots, runOne, projectArgs, options.scopedCacheOutcome).then((sections) =>
|
|
133
|
+
sections.join('\n\n')
|
|
134
|
+
);
|
|
133
135
|
return raceAbort(work, signal);
|
|
134
136
|
}
|
|
135
137
|
|
|
@@ -26,7 +26,7 @@ export const CODE_GRAPH_TOOL_DEFS = [
|
|
|
26
26
|
compressibleLossless: true,
|
|
27
27
|
},
|
|
28
28
|
description:
|
|
29
|
-
'Code structure and relations from the parsed graph, no text matching. symbols → file outline rows `[export ]kind name (Lstart-end) signature`; find_symbol returns declaration/body; references adds usages
|
|
29
|
+
'Code structure and relations from the parsed graph, no text matching. symbols → file outline rows `[export ]kind name (Lstart-end) signature`; find_symbol returns declaration/body; references adds usages; callers/callees return locations; dependents/impact → importers and blast radius. Exact identifiers: find_symbol/references/callers/callees; keywords: symbol_search/search; literal text and regex belong to grep. Prefer it over read/grep for declarations and relations. symbols already outlines a file: never pair it with overview for one need.',
|
|
30
30
|
inputSchema: {
|
|
31
31
|
type: 'object',
|
|
32
32
|
properties: {
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.1.
|
|
2
|
+
"version": "0.1.35",
|
|
3
3
|
"_comment": "Synced from immutable graph-v release assets.",
|
|
4
4
|
"assets": {
|
|
5
5
|
"darwin-arm64": {
|
|
6
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
7
|
-
"sha256": "
|
|
6
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.35/mixdog-graph-darwin-arm64",
|
|
7
|
+
"sha256": "f7a6a0bf10e4a541e9f7c529388fc14401b5f1727a5e8629fbeaf17c094300b2"
|
|
8
8
|
},
|
|
9
9
|
"darwin-x64": {
|
|
10
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
11
|
-
"sha256": "
|
|
10
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.35/mixdog-graph-darwin-x64",
|
|
11
|
+
"sha256": "a0d2bc124e264f7c5699af71adae3f047ee07591ddff415274bea23935bdbb75"
|
|
12
12
|
},
|
|
13
13
|
"linux-arm64": {
|
|
14
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
15
|
-
"sha256": "
|
|
14
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.35/mixdog-graph-linux-arm64",
|
|
15
|
+
"sha256": "ed5d75b8cd3a4de5366c233cfd55b07931b56fac7dd82fadad6a7b172ced97ed"
|
|
16
16
|
},
|
|
17
17
|
"linux-x64": {
|
|
18
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
19
|
-
"sha256": "
|
|
18
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.35/mixdog-graph-linux-x64",
|
|
19
|
+
"sha256": "b9b54529264d93648c16142ad05ba706c2757304688ccbf7d89e1a46762f4c13"
|
|
20
20
|
},
|
|
21
21
|
"win32-arm64": {
|
|
22
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
23
|
-
"sha256": "
|
|
22
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.35/mixdog-graph-win32-arm64.exe",
|
|
23
|
+
"sha256": "dd9fb667ddeb366dbfeabf58b3023e8b0f40b09edccc50dc5902b33de97de233"
|
|
24
24
|
},
|
|
25
25
|
"win32-x64": {
|
|
26
|
-
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.
|
|
27
|
-
"sha256": "
|
|
26
|
+
"url": "https://github.com/tribgames/mixdog/releases/download/graph-v0.1.35/mixdog-graph-win32-x64.exe",
|
|
27
|
+
"sha256": "be2abdb0b1c28647332531ac149a4ebba17e8cfb7093b7d5694a4be8bd21e369"
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { mkdirSync
|
|
2
|
-
import { tmpdir } from 'node:os';
|
|
1
|
+
import { mkdirSync } from 'node:fs';
|
|
3
2
|
import { join } from 'node:path';
|
|
3
|
+
import { makeTempDirSync } from '../../../../../../scripts/lib/scoped-temp.mjs';
|
|
4
4
|
|
|
5
5
|
// Import before runtime modules: several paths are captured at module load.
|
|
6
|
-
|
|
6
|
+
// Removed when the importing test process exits.
|
|
7
|
+
export const fixtureRoot = makeTempDirSync('shell-fixture');
|
|
7
8
|
for (const name of [
|
|
8
9
|
'HOME',
|
|
9
10
|
'USERPROFILE',
|