gsd-pi 2.80.0-dev.fbe7c8c6f → 2.81.0-dev.3cddbbba2
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/README.md +47 -59
- package/dist/claude-cli-check.d.ts +30 -0
- package/dist/claude-cli-check.js +18 -7
- package/dist/cli.js +0 -19
- package/dist/headless-query.d.ts +10 -0
- package/dist/headless-query.js +6 -4
- package/dist/loader-entrypoint.d.ts +8 -0
- package/dist/loader-entrypoint.js +27 -0
- package/dist/loader.js +2 -11
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +6 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
- package/dist/resources/extensions/gsd/auto/loop.js +214 -17
- package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
- package/dist/resources/extensions/gsd/auto/phases.js +372 -134
- package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +88 -33
- package/dist/resources/extensions/gsd/auto/session.js +18 -1
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +199 -177
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +30 -11
- package/dist/resources/extensions/gsd/auto-post-unit.js +119 -79
- package/dist/resources/extensions/gsd/auto-prompts.js +103 -16
- package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
- package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
- package/dist/resources/extensions/gsd/auto-start.js +251 -16
- package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
- package/dist/resources/extensions/gsd/auto-verification.js +12 -6
- package/dist/resources/extensions/gsd/auto-worktree.js +237 -336
- package/dist/resources/extensions/gsd/auto.js +493 -129
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +133 -12
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +337 -55
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
- package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-config.js +1 -1
- package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/context-budget.js +37 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
- package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +75 -6
- package/dist/resources/extensions/gsd/gsd-db.js +46 -13
- package/dist/resources/extensions/gsd/guided-flow.js +119 -42
- package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
- package/dist/resources/extensions/gsd/health-widget.js +6 -9
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/memory-store.js +69 -12
- package/dist/resources/extensions/gsd/migrate/command.js +40 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +46 -22
- package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/dist/resources/extensions/gsd/quick.js +34 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
- package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
- package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
- package/dist/resources/extensions/gsd/tool-contract.js +50 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
- package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
- package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
- package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
- package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
- package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
- package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +1364 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
- package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
- package/dist/welcome-screen.d.ts +2 -7
- package/dist/welcome-screen.js +68 -75
- package/package.json +3 -3
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -17
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
- package/packages/mcp-server/src/workflow-tools.ts +30 -16
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +9 -2
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +43 -11
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +31 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +52 -11
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +26 -10
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +9 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
- package/packages/pi-ai/src/providers/anthropic.ts +22 -9
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
- package/packages/pi-ai/src/types.ts +3 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +6 -2
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +6 -6
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +5 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
- package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
- package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +161 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -73
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +31 -6
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
- package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +5 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
- package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
- package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
- package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
- package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
- package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
- package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
- package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
- package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
- package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +228 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +247 -94
- package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +39 -8
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.js +9 -6
- package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +18 -8
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
- package/packages/pi-tui/src/overlay-layout.ts +10 -7
- package/packages/pi-tui/src/tui.ts +20 -8
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +7 -0
- package/packages/rpc-client/package.json +1 -1
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +105 -1
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +27 -26
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
- package/src/resources/extensions/github-sync/sync.ts +8 -1
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
- package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +19 -16
- package/src/resources/extensions/gsd/auto/loop.ts +247 -25
- package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
- package/src/resources/extensions/gsd/auto/phases.ts +512 -202
- package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +97 -34
- package/src/resources/extensions/gsd/auto/session.ts +19 -1
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +249 -182
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +31 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +131 -81
- package/src/resources/extensions/gsd/auto-prompts.ts +112 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
- package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
- package/src/resources/extensions/gsd/auto-start.ts +321 -21
- package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
- package/src/resources/extensions/gsd/auto-verification.ts +12 -6
- package/src/resources/extensions/gsd/auto-worktree.ts +267 -360
- package/src/resources/extensions/gsd/auto.ts +578 -126
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +166 -12
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +384 -55
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
- package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
- package/src/resources/extensions/gsd/commands-config.ts +1 -1
- package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/context-budget.ts +44 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
- package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +89 -10
- package/src/resources/extensions/gsd/gsd-db.ts +50 -13
- package/src/resources/extensions/gsd/guided-flow.ts +148 -49
- package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
- package/src/resources/extensions/gsd/health-widget.ts +8 -9
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/journal.ts +2 -0
- package/src/resources/extensions/gsd/memory-store.ts +77 -12
- package/src/resources/extensions/gsd/migrate/command.ts +47 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +53 -19
- package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
- package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/src/resources/extensions/gsd/quick.ts +37 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
- package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
- package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +134 -9
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1125 -215
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +363 -18
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +160 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
- package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
- package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +46 -11
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +24 -11
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +100 -38
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
- package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -11
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +77 -12
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
- package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -182
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
- package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +36 -164
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -77
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +65 -56
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +295 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +330 -0
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -57
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +197 -78
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +888 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tool-contract.ts +82 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
- package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
- package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
- package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
- package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
- package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
- package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
- package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
- package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
- package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1882 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
- package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1247
- package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
- /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → F5x9E6H9k_52fjqyql93y}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → F5x9E6H9k_52fjqyql93y}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Auto-loop pipeline phases, merge closeout, and finalize handling.
|
|
1
3
|
/**
|
|
2
4
|
* auto/phases.ts — Pipeline phases for the auto-loop.
|
|
3
5
|
*
|
|
@@ -50,13 +52,14 @@ import {
|
|
|
50
52
|
} from "../workflow-logger.js";
|
|
51
53
|
import { gsdRoot } from "../paths.js";
|
|
52
54
|
import { atomicWriteSync } from "../atomic-write.js";
|
|
53
|
-
import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps } from "../auto-recovery.js";
|
|
55
|
+
import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps, refreshRecoveryDbForArtifact } from "../auto-recovery.js";
|
|
54
56
|
import { writeUnitRuntimeRecord } from "../unit-runtime.js";
|
|
55
57
|
import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
|
|
56
58
|
import { getEligibleSlices } from "../slice-parallel-eligibility.js";
|
|
57
59
|
import { startSliceParallel } from "../slice-parallel-orchestrator.js";
|
|
58
|
-
import { isDbAvailable, getMilestoneSlices
|
|
60
|
+
import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
|
|
59
61
|
import type { MinimalModelRegistry } from "../context-budget.js";
|
|
62
|
+
import type { PostflightResult, PreflightResult } from "../clean-root-preflight.js";
|
|
60
63
|
import { ensurePlanV2Graph, isEmptyPlanV2GraphResult, isMissingFinalizedContextResult } from "../uok/plan-v2.js";
|
|
61
64
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
62
65
|
import { UokGateRunner } from "../uok/gate-runner.js";
|
|
@@ -69,6 +72,10 @@ import {
|
|
|
69
72
|
getRequiredWorkflowToolsForAutoUnit,
|
|
70
73
|
supportsStructuredQuestions,
|
|
71
74
|
} from "../workflow-mcp.js";
|
|
75
|
+
import { resolveManifest } from "../unit-context-manifest.js";
|
|
76
|
+
import { createWorktreeSafetyModule, type WorktreeSafetyResult } from "../worktree-safety.js";
|
|
77
|
+
import { isSuspiciousGhostCompletion } from "../auto-unit-closeout.js";
|
|
78
|
+
import { decideVerificationRetry, verificationRetryKey } from "./verification-retry-policy.js";
|
|
72
79
|
|
|
73
80
|
// ─── Path Comparison Helper ───────────────────────────────────────────────
|
|
74
81
|
/** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
|
|
@@ -76,10 +83,161 @@ function isSamePathLocal(a: string, b: string): boolean {
|
|
|
76
83
|
return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
|
|
77
84
|
}
|
|
78
85
|
|
|
79
|
-
function
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
86
|
+
async function applyVerificationRetryPolicy(
|
|
87
|
+
ic: IterationContext,
|
|
88
|
+
unitType: string | undefined,
|
|
89
|
+
phase: "artifact-verification-retry" | "verification-retry",
|
|
90
|
+
): Promise<PhaseResult | null> {
|
|
91
|
+
const { ctx, pi, s, deps } = ic;
|
|
92
|
+
const retryInfo = s.pendingVerificationRetry;
|
|
93
|
+
const key = unitType && retryInfo
|
|
94
|
+
? verificationRetryKey(unitType, retryInfo.unitId)
|
|
95
|
+
: undefined;
|
|
96
|
+
const decision = decideVerificationRetry({
|
|
97
|
+
unitType,
|
|
98
|
+
retryInfo,
|
|
99
|
+
previousFailureHash: key ? s.verificationRetryFailureHashes.get(key) : undefined,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
if (decision.action === "pause") {
|
|
103
|
+
s.pendingVerificationRetry = null;
|
|
104
|
+
debugLog("autoLoop", {
|
|
105
|
+
phase: `${phase}-paused`,
|
|
106
|
+
reason: decision.reason,
|
|
107
|
+
unitType,
|
|
108
|
+
unitId: retryInfo?.unitId,
|
|
109
|
+
failureHash: decision.failureHash,
|
|
110
|
+
});
|
|
111
|
+
ctx.ui.notify(
|
|
112
|
+
decision.reason === "duplicate-failure-context"
|
|
113
|
+
? `Verification retry for ${unitType ?? "unit"} ${retryInfo?.unitId ?? "unknown"} produced the same failure context. Pausing auto-mode instead of re-dispatching.`
|
|
114
|
+
: "Verification retry requested without retry context. Pausing auto-mode instead of re-dispatching.",
|
|
115
|
+
"warning",
|
|
116
|
+
);
|
|
117
|
+
await deps.pauseAuto(ctx, pi);
|
|
118
|
+
return { action: "break", reason: decision.reason };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
s.verificationRetryFailureHashes.set(decision.key, decision.failureHash);
|
|
122
|
+
debugLog("autoLoop", {
|
|
123
|
+
phase: `${phase}-backoff`,
|
|
124
|
+
iteration: ic.iteration,
|
|
125
|
+
unitType,
|
|
126
|
+
unitId: retryInfo?.unitId,
|
|
127
|
+
attempt: retryInfo?.attempt,
|
|
128
|
+
delayMs: decision.delayMs,
|
|
129
|
+
baseDelayMs: decision.baseDelayMs,
|
|
130
|
+
failureHash: decision.failureHash,
|
|
131
|
+
});
|
|
132
|
+
await new Promise<void>((resolve) => setTimeout(resolve, decision.delayMs));
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function shouldDegradeEmptyWorktreeToProjectRoot(
|
|
137
|
+
worktreeClassification: ReturnType<typeof classifyProject>,
|
|
138
|
+
projectRootClassification: ReturnType<typeof classifyProject>,
|
|
139
|
+
): boolean {
|
|
140
|
+
return (
|
|
141
|
+
worktreeClassification.kind === "greenfield" &&
|
|
142
|
+
projectRootClassification.kind !== "greenfield" &&
|
|
143
|
+
projectRootClassification.kind !== "invalid-repo"
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function unitWritesSource(unitType: string): boolean | null {
|
|
148
|
+
const manifest = resolveManifest(unitType);
|
|
149
|
+
if (!manifest) return null;
|
|
150
|
+
return manifest.tools.mode === "all" || manifest.tools.mode === "docs";
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function formatWorktreeSafetyFailure(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
|
|
154
|
+
return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function resolveEmptyWorktreeWithProjectContent(
|
|
158
|
+
unitRoot: string,
|
|
159
|
+
projectRoot: string,
|
|
160
|
+
): boolean {
|
|
161
|
+
if (isSamePathLocal(unitRoot, projectRoot)) return false;
|
|
162
|
+
const worktreeClassification = classifyProject(unitRoot);
|
|
163
|
+
if (worktreeClassification.kind !== "greenfield") return false;
|
|
164
|
+
const projectRootClassification = classifyProject(projectRoot);
|
|
165
|
+
return shouldDegradeEmptyWorktreeToProjectRoot(worktreeClassification, projectRootClassification);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async function validateSourceWriteWorktreeSafety(
|
|
169
|
+
ic: IterationContext,
|
|
170
|
+
unitType: string,
|
|
171
|
+
unitId: string,
|
|
172
|
+
milestoneId: string | undefined,
|
|
173
|
+
phase: string,
|
|
174
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
175
|
+
const { ctx, pi, s, deps } = ic;
|
|
176
|
+
if (!s.basePath) return null;
|
|
177
|
+
|
|
178
|
+
// Custom engine workflows (graph-driven, registered via run dirs) define
|
|
179
|
+
// their own step ids that are not in the GSD UnitContextManifest. Don't
|
|
180
|
+
// fail closed for those — the custom engine owns its own dispatch
|
|
181
|
+
// contract. The fail-closed safety check applies only to built-in GSD
|
|
182
|
+
// units whose Tool Contract is registered in the manifest. Use a truthy
|
|
183
|
+
// check so undefined (test sessions that never set the field) routes
|
|
184
|
+
// through the safety check, matching the regression test contract.
|
|
185
|
+
if (s.activeEngineId) return null;
|
|
186
|
+
|
|
187
|
+
const writesSource = unitWritesSource(unitType);
|
|
188
|
+
if (writesSource === null) {
|
|
189
|
+
const msg = `Worktree Safety failed (missing-tool-contract): missing Tool Contract for ${unitType}. Add a UnitContextManifest entry before dispatching this Unit.`;
|
|
190
|
+
debugLog("worktreeSafety", {
|
|
191
|
+
phase,
|
|
192
|
+
unitType,
|
|
193
|
+
unitId,
|
|
194
|
+
milestoneId,
|
|
195
|
+
result: { ok: false, kind: "missing-tool-contract", reason: msg },
|
|
196
|
+
basePath: s.basePath,
|
|
197
|
+
});
|
|
198
|
+
ctx.ui.notify(msg, "error");
|
|
199
|
+
await deps.stopAuto(ctx, pi, msg);
|
|
200
|
+
return { action: "break", reason: "missing-tool-contract" };
|
|
201
|
+
}
|
|
202
|
+
if (!writesSource) return null;
|
|
203
|
+
|
|
204
|
+
const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
205
|
+
if (deps.getIsolationMode(projectRoot) !== "worktree") return null;
|
|
206
|
+
|
|
207
|
+
const safety = createWorktreeSafetyModule();
|
|
208
|
+
const result = safety.validateUnitRoot({
|
|
209
|
+
unitType,
|
|
210
|
+
unitId,
|
|
211
|
+
writeScope: "source-writing",
|
|
212
|
+
projectRoot,
|
|
213
|
+
unitRoot: s.basePath,
|
|
214
|
+
milestoneId,
|
|
215
|
+
expectedBranch: milestoneId ? deps.autoWorktreeBranch(milestoneId) : null,
|
|
216
|
+
emptyWorktreeWithProjectContent: resolveEmptyWorktreeWithProjectContent(s.basePath, projectRoot),
|
|
217
|
+
lease: s.workerId
|
|
218
|
+
? {
|
|
219
|
+
required: true,
|
|
220
|
+
held: s.currentMilestoneId === milestoneId && s.milestoneLeaseToken !== null,
|
|
221
|
+
owner: s.workerId,
|
|
222
|
+
}
|
|
223
|
+
: undefined,
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
if (result.ok) return null;
|
|
227
|
+
|
|
228
|
+
const msg = formatWorktreeSafetyFailure(result);
|
|
229
|
+
debugLog("worktreeSafety", {
|
|
230
|
+
phase,
|
|
231
|
+
unitType,
|
|
232
|
+
unitId,
|
|
233
|
+
milestoneId,
|
|
234
|
+
result,
|
|
235
|
+
basePath: s.basePath,
|
|
236
|
+
projectRoot,
|
|
237
|
+
});
|
|
238
|
+
ctx.ui.notify(msg, "error");
|
|
239
|
+
await deps.stopAuto(ctx, pi, msg);
|
|
240
|
+
return { action: "break", reason: result.kind };
|
|
83
241
|
}
|
|
84
242
|
|
|
85
243
|
// ─── Session timeout auto-resume state ────────────────────────────────────────
|
|
@@ -120,10 +278,23 @@ const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
|
|
|
120
278
|
"completing-milestone",
|
|
121
279
|
]);
|
|
122
280
|
|
|
123
|
-
function shouldRunPlanV2Gate(phase: Phase): boolean {
|
|
281
|
+
export function shouldRunPlanV2Gate(phase: Phase): boolean {
|
|
124
282
|
return PLAN_V2_GATE_PHASES.has(phase);
|
|
125
283
|
}
|
|
126
284
|
|
|
285
|
+
export function _shouldProceedWithInvalidRepoClassificationForTest(
|
|
286
|
+
reason: string | undefined,
|
|
287
|
+
hasGit: boolean,
|
|
288
|
+
): boolean {
|
|
289
|
+
return reason === "missing .git" && hasGit;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export function _resolveCurrentUnitStartedAtForTest(
|
|
293
|
+
currentUnit: { startedAt: number } | null | undefined,
|
|
294
|
+
): number | undefined {
|
|
295
|
+
return currentUnit?.startedAt;
|
|
296
|
+
}
|
|
297
|
+
|
|
127
298
|
/**
|
|
128
299
|
* Generate and write an HTML milestone report snapshot.
|
|
129
300
|
* Extracted from the milestone-transition block in autoLoop.
|
|
@@ -215,6 +386,136 @@ async function closeoutAndStop(
|
|
|
215
386
|
await deps.stopAuto(ctx, pi, reason);
|
|
216
387
|
}
|
|
217
388
|
|
|
389
|
+
async function stopOnPostflightRecoveryNeeded(
|
|
390
|
+
ic: IterationContext,
|
|
391
|
+
result: PostflightResult,
|
|
392
|
+
milestoneId: string,
|
|
393
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
394
|
+
if (!result.needsManualRecovery) return null;
|
|
395
|
+
const { ctx, pi, deps } = ic;
|
|
396
|
+
const reason = `Post-merge stash restore failed for milestone ${milestoneId}`;
|
|
397
|
+
ctx.ui.notify(
|
|
398
|
+
`${reason}. Resolve the working tree before resuming auto-mode. ${result.message}`,
|
|
399
|
+
"error",
|
|
400
|
+
);
|
|
401
|
+
await deps.stopAuto(ctx, pi, reason);
|
|
402
|
+
return { action: "break", reason: "postflight-stash-restore-failed" };
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
async function restorePreflightStashOrStop(
|
|
406
|
+
ic: IterationContext,
|
|
407
|
+
preflight: PreflightResult,
|
|
408
|
+
milestoneId: string,
|
|
409
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
410
|
+
if (!preflight.stashPushed) return null;
|
|
411
|
+
const { ctx, s, deps } = ic;
|
|
412
|
+
const result = deps.postflightPopStash(
|
|
413
|
+
s.originalBasePath || s.basePath,
|
|
414
|
+
milestoneId,
|
|
415
|
+
preflight.stashMarker,
|
|
416
|
+
ctx.ui.notify.bind(ctx.ui),
|
|
417
|
+
);
|
|
418
|
+
return stopOnPostflightRecoveryNeeded(ic, result, milestoneId);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Run a milestone merge surrounded by preflight stash + always-on postflight
|
|
423
|
+
* pop. The previous code popped the stash only after a successful merge, which
|
|
424
|
+
* leaked `gsd-preflight-stash:M00x:*` entries whenever `mergeAndExit` threw —
|
|
425
|
+
* leaving the user's pre-merge working tree silently stashed away after a
|
|
426
|
+
* merge-conflict or other merge error. This helper restores the stash on
|
|
427
|
+
* every exit path, then surfaces the merge or stash failure (in priority
|
|
428
|
+
* order) as the loop's stop reason.
|
|
429
|
+
*
|
|
430
|
+
* Returns a `break` action when auto-mode must stop, or `null` when the merge
|
|
431
|
+
* succeeded and the stash (if any) was restored cleanly.
|
|
432
|
+
*/
|
|
433
|
+
export async function _runMilestoneMergeWithStashRestore(
|
|
434
|
+
ic: IterationContext,
|
|
435
|
+
milestoneId: string,
|
|
436
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
437
|
+
const { ctx, pi, s, deps } = ic;
|
|
438
|
+
|
|
439
|
+
const preflight = deps.preflightCleanRoot(
|
|
440
|
+
s.originalBasePath || s.basePath,
|
|
441
|
+
milestoneId,
|
|
442
|
+
ctx.ui.notify.bind(ctx.ui),
|
|
443
|
+
);
|
|
444
|
+
|
|
445
|
+
let mergeError: unknown = null;
|
|
446
|
+
const exitResult = deps.lifecycle.exitMilestone(
|
|
447
|
+
milestoneId,
|
|
448
|
+
{ merge: true },
|
|
449
|
+
ctx.ui,
|
|
450
|
+
);
|
|
451
|
+
if (exitResult.ok) {
|
|
452
|
+
s.milestoneMergedInPhases = true;
|
|
453
|
+
} else {
|
|
454
|
+
mergeError = exitResult.cause ?? new Error(`exit ${exitResult.reason}`);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Always attempt to restore the stashed working tree, even on merge error.
|
|
458
|
+
// postflightPopStash itself does not throw; failures surface via the
|
|
459
|
+
// PostflightResult.needsManualRecovery flag.
|
|
460
|
+
let stashResult: PostflightResult | null = null;
|
|
461
|
+
if (preflight.stashPushed) {
|
|
462
|
+
stashResult = deps.postflightPopStash(
|
|
463
|
+
s.originalBasePath || s.basePath,
|
|
464
|
+
milestoneId,
|
|
465
|
+
preflight.stashMarker,
|
|
466
|
+
ctx.ui.notify.bind(ctx.ui),
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Merge failure takes priority over stash recovery — the merge is the
|
|
471
|
+
// authoritative gate. If the stash also needed manual recovery, the user
|
|
472
|
+
// already saw the postflightPopStash notify above.
|
|
473
|
+
if (mergeError) {
|
|
474
|
+
if (mergeError instanceof MergeConflictError) {
|
|
475
|
+
ctx.ui.notify(
|
|
476
|
+
`Merge conflict: ${mergeError.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
477
|
+
"error",
|
|
478
|
+
);
|
|
479
|
+
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${milestoneId}`);
|
|
480
|
+
return { action: "break", reason: "merge-conflict" };
|
|
481
|
+
}
|
|
482
|
+
logError("engine", "Milestone merge failed with non-conflict error", {
|
|
483
|
+
milestone: milestoneId,
|
|
484
|
+
error: String(mergeError),
|
|
485
|
+
});
|
|
486
|
+
ctx.ui.notify(
|
|
487
|
+
`Merge failed: ${mergeError instanceof Error ? mergeError.message : String(mergeError)}. Resolve and run /gsd auto to resume.`,
|
|
488
|
+
"error",
|
|
489
|
+
);
|
|
490
|
+
await deps.stopAuto(
|
|
491
|
+
ctx,
|
|
492
|
+
pi,
|
|
493
|
+
`Merge error on milestone ${milestoneId}: ${String(mergeError)}`,
|
|
494
|
+
);
|
|
495
|
+
return { action: "break", reason: "merge-failed" };
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
if (stashResult) {
|
|
499
|
+
return stopOnPostflightRecoveryNeeded(ic, stashResult, milestoneId);
|
|
500
|
+
}
|
|
501
|
+
return null;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
export async function _runMilestoneMergeOnceWithStashRestore(
|
|
505
|
+
ic: IterationContext,
|
|
506
|
+
milestoneId: string,
|
|
507
|
+
): Promise<{ action: "break"; reason: string } | null> {
|
|
508
|
+
if (ic.s.milestoneMergedInPhases) {
|
|
509
|
+
debugLog("autoLoop", {
|
|
510
|
+
phase: "milestone-merge-skip",
|
|
511
|
+
reason: "already-merged-in-phases",
|
|
512
|
+
milestoneId,
|
|
513
|
+
});
|
|
514
|
+
return null;
|
|
515
|
+
}
|
|
516
|
+
return _runMilestoneMergeWithStashRestore(ic, milestoneId);
|
|
517
|
+
}
|
|
518
|
+
|
|
218
519
|
async function emitCancelledUnitEnd(
|
|
219
520
|
ic: IterationContext,
|
|
220
521
|
unitType: string,
|
|
@@ -442,13 +743,10 @@ export async function runPreDispatch(
|
|
|
442
743
|
if (
|
|
443
744
|
s.originalBasePath &&
|
|
444
745
|
!isSamePathLocal(s.basePath, s.originalBasePath) &&
|
|
445
|
-
s.currentMilestoneId
|
|
746
|
+
s.currentMilestoneId &&
|
|
747
|
+
s.scope
|
|
446
748
|
) {
|
|
447
|
-
deps.
|
|
448
|
-
s.originalBasePath,
|
|
449
|
-
s.basePath,
|
|
450
|
-
s.currentMilestoneId,
|
|
451
|
-
);
|
|
749
|
+
deps.worktreeProjection.projectRootToWorktree(s.scope);
|
|
452
750
|
}
|
|
453
751
|
|
|
454
752
|
// Derive state — use canonical project root so the cache key is stable
|
|
@@ -651,42 +949,11 @@ export async function runPreDispatch(
|
|
|
651
949
|
loopState.recentUnits.length = 0;
|
|
652
950
|
loopState.stuckRecoveryAttempts = 0;
|
|
653
951
|
|
|
654
|
-
// Worktree lifecycle on milestone transition — merge current, enter next
|
|
655
|
-
// #2909: preflight
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
660
|
-
);
|
|
661
|
-
try {
|
|
662
|
-
deps.resolver.mergeAndExit(s.currentMilestoneId!, ctx.ui);
|
|
663
|
-
} catch (mergeErr) {
|
|
664
|
-
if (mergeErr instanceof MergeConflictError) {
|
|
665
|
-
// Real code conflicts — stop the loop instead of retrying forever (#2330)
|
|
666
|
-
ctx.ui.notify(
|
|
667
|
-
`Merge conflict: ${mergeErr.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
668
|
-
"error",
|
|
669
|
-
);
|
|
670
|
-
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${s.currentMilestoneId}`);
|
|
671
|
-
return { action: "break", reason: "merge-conflict" };
|
|
672
|
-
}
|
|
673
|
-
// Non-conflict merge errors — stop auto to avoid advancing with unmerged work
|
|
674
|
-
logError("engine", "Milestone merge failed with non-conflict error", { milestone: s.currentMilestoneId!, error: String(mergeErr) });
|
|
675
|
-
ctx.ui.notify(
|
|
676
|
-
`Merge failed: ${mergeErr instanceof Error ? mergeErr.message : String(mergeErr)}. Resolve and run /gsd auto to resume.`,
|
|
677
|
-
"error",
|
|
678
|
-
);
|
|
679
|
-
await deps.stopAuto(ctx, pi, `Merge error on milestone ${s.currentMilestoneId}: ${String(mergeErr)}`);
|
|
680
|
-
return { action: "break", reason: "merge-failed" };
|
|
681
|
-
}
|
|
682
|
-
// #2909: postflight — restore stashed changes after successful merge
|
|
683
|
-
if (preflightTransition.stashPushed) {
|
|
684
|
-
deps.postflightPopStash(
|
|
685
|
-
s.originalBasePath || s.basePath,
|
|
686
|
-
s.currentMilestoneId!,
|
|
687
|
-
preflightTransition.stashMarker,
|
|
688
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
689
|
-
);
|
|
952
|
+
// Worktree lifecycle on milestone transition — merge current, enter next.
|
|
953
|
+
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
954
|
+
{
|
|
955
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId!);
|
|
956
|
+
if (stop) return stop;
|
|
690
957
|
}
|
|
691
958
|
|
|
692
959
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
@@ -701,7 +968,17 @@ export async function runPreDispatch(
|
|
|
701
968
|
if (deps.getIsolationMode(s.basePath) !== "none") {
|
|
702
969
|
deps.captureIntegrationBranch(s.basePath, mid);
|
|
703
970
|
}
|
|
704
|
-
deps.
|
|
971
|
+
const enterResult = deps.lifecycle.enterMilestone(mid, ctx.ui);
|
|
972
|
+
if (!enterResult.ok) {
|
|
973
|
+
ctx.ui.notify(
|
|
974
|
+
`Milestone transition stopped: failed to enter ${mid} (${enterResult.reason}).`,
|
|
975
|
+
"error",
|
|
976
|
+
);
|
|
977
|
+
if (enterResult.reason === "lease-conflict") {
|
|
978
|
+
await deps.pauseAuto(ctx, pi);
|
|
979
|
+
}
|
|
980
|
+
return { action: "break", reason: "milestone-enter-failed" };
|
|
981
|
+
}
|
|
705
982
|
} else {
|
|
706
983
|
// mid is undefined — no milestone to capture integration branch for
|
|
707
984
|
}
|
|
@@ -764,45 +1041,11 @@ export async function runPreDispatch(
|
|
|
764
1041
|
m.status !== "complete" && m.status !== "parked",
|
|
765
1042
|
);
|
|
766
1043
|
if (incomplete.length === 0 && state.registry.length > 0) {
|
|
767
|
-
// All milestones complete — merge milestone branch before stopping
|
|
1044
|
+
// All milestones complete — merge milestone branch before stopping.
|
|
768
1045
|
if (s.currentMilestoneId) {
|
|
769
|
-
// #2909: preflight
|
|
770
|
-
const
|
|
771
|
-
|
|
772
|
-
s.currentMilestoneId,
|
|
773
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
774
|
-
);
|
|
775
|
-
try {
|
|
776
|
-
deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
|
|
777
|
-
// Prevent stopAuto from attempting the same merge (#2645)
|
|
778
|
-
s.milestoneMergedInPhases = true;
|
|
779
|
-
} catch (mergeErr) {
|
|
780
|
-
if (mergeErr instanceof MergeConflictError) {
|
|
781
|
-
ctx.ui.notify(
|
|
782
|
-
`Merge conflict: ${mergeErr.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
783
|
-
"error",
|
|
784
|
-
);
|
|
785
|
-
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${s.currentMilestoneId}`);
|
|
786
|
-
return { action: "break", reason: "merge-conflict" };
|
|
787
|
-
}
|
|
788
|
-
logError("engine", "Milestone merge failed with non-conflict error", { milestone: s.currentMilestoneId!, error: String(mergeErr) });
|
|
789
|
-
ctx.ui.notify(
|
|
790
|
-
`Merge failed: ${mergeErr instanceof Error ? mergeErr.message : String(mergeErr)}. Resolve and run /gsd auto to resume.`,
|
|
791
|
-
"error",
|
|
792
|
-
);
|
|
793
|
-
await deps.stopAuto(ctx, pi, `Merge error on milestone ${s.currentMilestoneId}: ${String(mergeErr)}`);
|
|
794
|
-
return { action: "break", reason: "merge-failed" };
|
|
795
|
-
}
|
|
796
|
-
// #2909: postflight — restore stashed changes after successful merge
|
|
797
|
-
if (preflightAllComplete.stashPushed) {
|
|
798
|
-
deps.postflightPopStash(
|
|
799
|
-
s.originalBasePath || s.basePath,
|
|
800
|
-
s.currentMilestoneId,
|
|
801
|
-
preflightAllComplete.stashMarker,
|
|
802
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
803
|
-
);
|
|
804
|
-
}
|
|
805
|
-
|
|
1046
|
+
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
1047
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
1048
|
+
if (stop) return stop;
|
|
806
1049
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
807
1050
|
}
|
|
808
1051
|
deps.sendDesktopNotification(
|
|
@@ -817,7 +1060,13 @@ export async function runPreDispatch(
|
|
|
817
1060
|
"All milestones complete.",
|
|
818
1061
|
"success",
|
|
819
1062
|
);
|
|
820
|
-
await deps.stopAuto(ctx, pi, "All milestones complete"
|
|
1063
|
+
await deps.stopAuto(ctx, pi, "All milestones complete", {
|
|
1064
|
+
completionWidget: {
|
|
1065
|
+
milestoneId: s.currentMilestoneId,
|
|
1066
|
+
milestoneTitle: midTitle,
|
|
1067
|
+
allMilestonesComplete: true,
|
|
1068
|
+
},
|
|
1069
|
+
});
|
|
821
1070
|
} else if (incomplete.length === 0 && state.registry.length === 0) {
|
|
822
1071
|
// Empty registry — no milestones visible, likely a path resolution bug
|
|
823
1072
|
const diag = `basePath=${s.basePath}, phase=${state.phase}`;
|
|
@@ -893,45 +1142,11 @@ export async function runPreDispatch(
|
|
|
893
1142
|
|
|
894
1143
|
// Terminal: complete
|
|
895
1144
|
if (state.phase === "complete") {
|
|
896
|
-
// Milestone merge on complete (before closeout so branch state is clean)
|
|
1145
|
+
// Milestone merge on complete (before closeout so branch state is clean).
|
|
897
1146
|
if (s.currentMilestoneId) {
|
|
898
|
-
// #2909: preflight
|
|
899
|
-
const
|
|
900
|
-
|
|
901
|
-
s.currentMilestoneId,
|
|
902
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
903
|
-
);
|
|
904
|
-
try {
|
|
905
|
-
deps.resolver.mergeAndExit(s.currentMilestoneId, ctx.ui);
|
|
906
|
-
// Prevent stopAuto from attempting the same merge (#2645)
|
|
907
|
-
s.milestoneMergedInPhases = true;
|
|
908
|
-
} catch (mergeErr) {
|
|
909
|
-
if (mergeErr instanceof MergeConflictError) {
|
|
910
|
-
ctx.ui.notify(
|
|
911
|
-
`Merge conflict: ${mergeErr.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`,
|
|
912
|
-
"error",
|
|
913
|
-
);
|
|
914
|
-
await deps.stopAuto(ctx, pi, `Merge conflict on milestone ${s.currentMilestoneId}`);
|
|
915
|
-
return { action: "break", reason: "merge-conflict" };
|
|
916
|
-
}
|
|
917
|
-
logError("engine", "Milestone merge failed with non-conflict error", { milestone: s.currentMilestoneId!, error: String(mergeErr) });
|
|
918
|
-
ctx.ui.notify(
|
|
919
|
-
`Merge failed: ${mergeErr instanceof Error ? mergeErr.message : String(mergeErr)}. Resolve and run /gsd auto to resume.`,
|
|
920
|
-
"error",
|
|
921
|
-
);
|
|
922
|
-
await deps.stopAuto(ctx, pi, `Merge error on milestone ${s.currentMilestoneId}: ${String(mergeErr)}`);
|
|
923
|
-
return { action: "break", reason: "merge-failed" };
|
|
924
|
-
}
|
|
925
|
-
// #2909: postflight — restore stashed changes after successful merge
|
|
926
|
-
if (preflightComplete.stashPushed) {
|
|
927
|
-
deps.postflightPopStash(
|
|
928
|
-
s.originalBasePath || s.basePath,
|
|
929
|
-
s.currentMilestoneId,
|
|
930
|
-
preflightComplete.stashMarker,
|
|
931
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
932
|
-
);
|
|
933
|
-
}
|
|
934
|
-
|
|
1147
|
+
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
1148
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
1149
|
+
if (stop) return stop;
|
|
935
1150
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
936
1151
|
}
|
|
937
1152
|
deps.sendDesktopNotification(
|
|
@@ -946,7 +1161,23 @@ export async function runPreDispatch(
|
|
|
946
1161
|
`Milestone ${mid} complete.`,
|
|
947
1162
|
"success",
|
|
948
1163
|
);
|
|
949
|
-
|
|
1164
|
+
if (s.currentUnit) {
|
|
1165
|
+
await deps.closeoutUnit(
|
|
1166
|
+
ctx,
|
|
1167
|
+
s.basePath,
|
|
1168
|
+
s.currentUnit.type,
|
|
1169
|
+
s.currentUnit.id,
|
|
1170
|
+
s.currentUnit.startedAt,
|
|
1171
|
+
deps.buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id),
|
|
1172
|
+
);
|
|
1173
|
+
s.currentUnit = null;
|
|
1174
|
+
}
|
|
1175
|
+
await deps.stopAuto(ctx, pi, `Milestone ${mid} complete`, {
|
|
1176
|
+
completionWidget: {
|
|
1177
|
+
milestoneId: mid,
|
|
1178
|
+
milestoneTitle: midTitle,
|
|
1179
|
+
},
|
|
1180
|
+
});
|
|
950
1181
|
debugLog("autoLoop", { phase: "exit", reason: "milestone-complete" });
|
|
951
1182
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "milestone-complete", milestoneId: mid } });
|
|
952
1183
|
return { action: "break", reason: "milestone-complete" };
|
|
@@ -1054,6 +1285,58 @@ export async function runDispatch(
|
|
|
1054
1285
|
let prompt = dispatchResult.prompt;
|
|
1055
1286
|
const pauseAfterUatDispatch = dispatchResult.pauseAfterDispatch ?? false;
|
|
1056
1287
|
|
|
1288
|
+
// Resolve hooks and prior-slice gating before health/stuck accounting so
|
|
1289
|
+
// those checks run against the final dispatch unit.
|
|
1290
|
+
const preDispatchResult = deps.runPreDispatchHooks(
|
|
1291
|
+
unitType,
|
|
1292
|
+
unitId,
|
|
1293
|
+
prompt,
|
|
1294
|
+
s.basePath,
|
|
1295
|
+
);
|
|
1296
|
+
if (preDispatchResult.firedHooks.length > 0) {
|
|
1297
|
+
ctx.ui.notify(
|
|
1298
|
+
`Pre-dispatch hook${preDispatchResult.firedHooks.length > 1 ? "s" : ""}: ${preDispatchResult.firedHooks.join(", ")}`,
|
|
1299
|
+
"info",
|
|
1300
|
+
);
|
|
1301
|
+
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "pre-dispatch-hook", data: { firedHooks: preDispatchResult.firedHooks, action: preDispatchResult.action } });
|
|
1302
|
+
}
|
|
1303
|
+
if (preDispatchResult.action === "skip") {
|
|
1304
|
+
ctx.ui.notify(
|
|
1305
|
+
`Skipping ${unitType} ${unitId} (pre-dispatch hook).`,
|
|
1306
|
+
"info",
|
|
1307
|
+
);
|
|
1308
|
+
await new Promise((r) => setImmediate(r));
|
|
1309
|
+
return { action: "continue" };
|
|
1310
|
+
}
|
|
1311
|
+
if (preDispatchResult.action === "replace") {
|
|
1312
|
+
prompt = preDispatchResult.prompt ?? prompt;
|
|
1313
|
+
if (preDispatchResult.unitType) unitType = preDispatchResult.unitType;
|
|
1314
|
+
} else if (preDispatchResult.prompt) {
|
|
1315
|
+
prompt = preDispatchResult.prompt;
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
const guardBasePath = _resolveDispatchGuardBasePath(s);
|
|
1319
|
+
const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
|
|
1320
|
+
guardBasePath,
|
|
1321
|
+
deps.getMainBranch(guardBasePath),
|
|
1322
|
+
unitType,
|
|
1323
|
+
unitId,
|
|
1324
|
+
);
|
|
1325
|
+
if (priorSliceBlocker) {
|
|
1326
|
+
await deps.stopAuto(ctx, pi, priorSliceBlocker);
|
|
1327
|
+
debugLog("autoLoop", { phase: "exit", reason: "prior-slice-blocker" });
|
|
1328
|
+
return { action: "break", reason: "prior-slice-blocker" };
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
|
|
1332
|
+
ic,
|
|
1333
|
+
unitType,
|
|
1334
|
+
unitId,
|
|
1335
|
+
mid,
|
|
1336
|
+
"pre-dispatch",
|
|
1337
|
+
);
|
|
1338
|
+
if (worktreeSafetyBlock) return worktreeSafetyBlock;
|
|
1339
|
+
|
|
1057
1340
|
// ── Sliding-window stuck detection with graduated recovery ──
|
|
1058
1341
|
const derivedKey = `${unitType}/${unitId}`;
|
|
1059
1342
|
|
|
@@ -1100,17 +1383,24 @@ export async function runDispatch(
|
|
|
1100
1383
|
level: 1,
|
|
1101
1384
|
action: "artifact-found",
|
|
1102
1385
|
});
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
"info",
|
|
1106
|
-
);
|
|
1107
|
-
if (!refreshPlanSliceRecoveryDbIfNeeded(unitType)) {
|
|
1386
|
+
const recoveryDb = refreshRecoveryDbForArtifact(unitType, unitId);
|
|
1387
|
+
if (!recoveryDb.ok) {
|
|
1108
1388
|
ctx.ui.notify(
|
|
1109
|
-
|
|
1389
|
+
recoveryDb.fatal
|
|
1390
|
+
? `${recoveryDb.message} Pausing auto-mode for manual recovery.`
|
|
1391
|
+
: `${recoveryDb.message} Keeping stuck state for retry.`,
|
|
1110
1392
|
"warning",
|
|
1111
1393
|
);
|
|
1394
|
+
if (recoveryDb.fatal) {
|
|
1395
|
+
await deps.pauseAuto(ctx, pi);
|
|
1396
|
+
return { action: "break", reason: recoveryDb.reason };
|
|
1397
|
+
}
|
|
1112
1398
|
return { action: "continue" };
|
|
1113
1399
|
}
|
|
1400
|
+
ctx.ui.notify(
|
|
1401
|
+
`Stuck recovery: artifact for ${unitType} ${unitId} found on disk. Invalidating caches.`,
|
|
1402
|
+
"info",
|
|
1403
|
+
);
|
|
1114
1404
|
deps.invalidateAllCaches();
|
|
1115
1405
|
loopState.recentUnits.length = 0;
|
|
1116
1406
|
loopState.stuckRecoveryAttempts = 0;
|
|
@@ -1135,19 +1425,26 @@ export async function runDispatch(
|
|
|
1135
1425
|
level: 2,
|
|
1136
1426
|
action: "artifact-found",
|
|
1137
1427
|
});
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1428
|
+
const recoveryDb = refreshRecoveryDbForArtifact(unitType, unitId);
|
|
1429
|
+
if (recoveryDb.ok) {
|
|
1430
|
+
ctx.ui.notify(
|
|
1431
|
+
`Stuck recovery: artifact for ${unitType} ${unitId} found on disk after cache invalidation. Continuing.`,
|
|
1432
|
+
"info",
|
|
1433
|
+
);
|
|
1143
1434
|
loopState.recentUnits.length = 0;
|
|
1144
1435
|
loopState.stuckRecoveryAttempts = 0;
|
|
1145
1436
|
return { action: "continue" };
|
|
1146
1437
|
}
|
|
1147
1438
|
ctx.ui.notify(
|
|
1148
|
-
|
|
1439
|
+
recoveryDb.fatal
|
|
1440
|
+
? `${recoveryDb.message} Pausing auto-mode for manual recovery.`
|
|
1441
|
+
: `${recoveryDb.message} Stopping for manual recovery.`,
|
|
1149
1442
|
"warning",
|
|
1150
1443
|
);
|
|
1444
|
+
if (recoveryDb.fatal) {
|
|
1445
|
+
await deps.pauseAuto(ctx, pi);
|
|
1446
|
+
return { action: "break", reason: recoveryDb.reason };
|
|
1447
|
+
}
|
|
1151
1448
|
}
|
|
1152
1449
|
debugLog("autoLoop", {
|
|
1153
1450
|
phase: "stuck-detected",
|
|
@@ -1181,48 +1478,6 @@ export async function runDispatch(
|
|
|
1181
1478
|
}
|
|
1182
1479
|
}
|
|
1183
1480
|
|
|
1184
|
-
// Pre-dispatch hooks
|
|
1185
|
-
const preDispatchResult = deps.runPreDispatchHooks(
|
|
1186
|
-
unitType,
|
|
1187
|
-
unitId,
|
|
1188
|
-
prompt,
|
|
1189
|
-
s.basePath,
|
|
1190
|
-
);
|
|
1191
|
-
if (preDispatchResult.firedHooks.length > 0) {
|
|
1192
|
-
ctx.ui.notify(
|
|
1193
|
-
`Pre-dispatch hook${preDispatchResult.firedHooks.length > 1 ? "s" : ""}: ${preDispatchResult.firedHooks.join(", ")}`,
|
|
1194
|
-
"info",
|
|
1195
|
-
);
|
|
1196
|
-
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "pre-dispatch-hook", data: { firedHooks: preDispatchResult.firedHooks, action: preDispatchResult.action } });
|
|
1197
|
-
}
|
|
1198
|
-
if (preDispatchResult.action === "skip") {
|
|
1199
|
-
ctx.ui.notify(
|
|
1200
|
-
`Skipping ${unitType} ${unitId} (pre-dispatch hook).`,
|
|
1201
|
-
"info",
|
|
1202
|
-
);
|
|
1203
|
-
await new Promise((r) => setImmediate(r));
|
|
1204
|
-
return { action: "continue" };
|
|
1205
|
-
}
|
|
1206
|
-
if (preDispatchResult.action === "replace") {
|
|
1207
|
-
prompt = preDispatchResult.prompt ?? prompt;
|
|
1208
|
-
if (preDispatchResult.unitType) unitType = preDispatchResult.unitType;
|
|
1209
|
-
} else if (preDispatchResult.prompt) {
|
|
1210
|
-
prompt = preDispatchResult.prompt;
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
const guardBasePath = _resolveDispatchGuardBasePath(s);
|
|
1214
|
-
const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
|
|
1215
|
-
guardBasePath,
|
|
1216
|
-
deps.getMainBranch(guardBasePath),
|
|
1217
|
-
unitType,
|
|
1218
|
-
unitId,
|
|
1219
|
-
);
|
|
1220
|
-
if (priorSliceBlocker) {
|
|
1221
|
-
await deps.stopAuto(ctx, pi, priorSliceBlocker);
|
|
1222
|
-
debugLog("autoLoop", { phase: "exit", reason: "prior-slice-blocker" });
|
|
1223
|
-
return { action: "break", reason: "prior-slice-blocker" };
|
|
1224
|
-
}
|
|
1225
|
-
|
|
1226
1481
|
return {
|
|
1227
1482
|
action: "next",
|
|
1228
1483
|
data: {
|
|
@@ -1483,28 +1738,26 @@ export async function runUnitPhase(
|
|
|
1483
1738
|
unitId,
|
|
1484
1739
|
});
|
|
1485
1740
|
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1741
|
+
const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
|
|
1742
|
+
ic,
|
|
1743
|
+
unitType,
|
|
1744
|
+
unitId,
|
|
1745
|
+
mid,
|
|
1746
|
+
"unit-execution",
|
|
1747
|
+
);
|
|
1748
|
+
if (worktreeSafetyBlock) return worktreeSafetyBlock;
|
|
1749
|
+
|
|
1750
|
+
// ── Project classification notice (#1833, #1843) ─────────────────────
|
|
1751
|
+
// Worktree Safety owns source-write root validity. Classification now only
|
|
1752
|
+
// shapes user/model guidance for valid roots.
|
|
1492
1753
|
let projectClassification: ReturnType<typeof classifyProject> | null = null;
|
|
1493
1754
|
if (s.basePath && unitType === "execute-task") {
|
|
1494
|
-
const gitMarker = join(s.basePath, ".git");
|
|
1495
|
-
const hasGit = deps.existsSync(gitMarker);
|
|
1496
|
-
if (!hasGit) {
|
|
1497
|
-
const msg = `Worktree health check failed: ${s.basePath} has no .git — refusing to dispatch ${unitType} ${unitId}`;
|
|
1498
|
-
debugLog("runUnitPhase", { phase: "worktree-health-fail", basePath: s.basePath, hasGit });
|
|
1499
|
-
ctx.ui.notify(msg, "error");
|
|
1500
|
-
await deps.stopAuto(ctx, pi, msg);
|
|
1501
|
-
return { action: "break", reason: "worktree-invalid" };
|
|
1502
|
-
}
|
|
1503
1755
|
projectClassification = classifyProject(s.basePath);
|
|
1504
1756
|
if (projectClassification.kind === "invalid-repo") {
|
|
1505
1757
|
const msg = `Worktree health check failed: ${s.basePath} classified as invalid-repo (${projectClassification.reason}) — refusing to dispatch ${unitType} ${unitId}`;
|
|
1506
1758
|
debugLog("runUnitPhase", { phase: "worktree-health-invalid-repo", basePath: s.basePath, classification: projectClassification });
|
|
1507
|
-
|
|
1759
|
+
const hasGit = deps.existsSync(join(s.basePath, ".git"));
|
|
1760
|
+
if (_shouldProceedWithInvalidRepoClassificationForTest(projectClassification.reason, hasGit)) {
|
|
1508
1761
|
ctx.ui.notify(
|
|
1509
1762
|
`Warning: ${s.basePath} project classification could not confirm .git; assuming it has no project content yet — proceeding as greenfield project because worktree health reported .git present`,
|
|
1510
1763
|
"warning",
|
|
@@ -1514,7 +1767,9 @@ export async function runUnitPhase(
|
|
|
1514
1767
|
await deps.stopAuto(ctx, pi, msg);
|
|
1515
1768
|
return { action: "break", reason: "worktree-invalid" };
|
|
1516
1769
|
}
|
|
1517
|
-
}
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
if (projectClassification.kind === "greenfield") {
|
|
1518
1773
|
debugLog("runUnitPhase", { phase: "worktree-health-greenfield", basePath: s.basePath, classification: projectClassification });
|
|
1519
1774
|
ctx.ui.notify(`Warning: ${s.basePath} has no project content yet — proceeding as greenfield project`, "warning");
|
|
1520
1775
|
} else if (projectClassification.kind === "untyped-existing") {
|
|
@@ -1803,6 +2058,33 @@ export async function runUnitPhase(
|
|
|
1803
2058
|
status: unitResult.status,
|
|
1804
2059
|
});
|
|
1805
2060
|
|
|
2061
|
+
if (
|
|
2062
|
+
unitResult.status === "completed" &&
|
|
2063
|
+
s.currentUnit &&
|
|
2064
|
+
(unitResult.event?.messages?.length ?? 0) === 0 &&
|
|
2065
|
+
isSuspiciousGhostCompletion(ctx, unitResult.requestDispatchedAt ?? s.currentUnit.startedAt)
|
|
2066
|
+
) {
|
|
2067
|
+
const message =
|
|
2068
|
+
`${unitType} ${unitId} completed without assistant output or tool calls; treating as a stale ghost completion.`;
|
|
2069
|
+
debugLog("autoLoop", {
|
|
2070
|
+
phase: "ghost-completion",
|
|
2071
|
+
iteration: ic.iteration,
|
|
2072
|
+
unitType,
|
|
2073
|
+
unitId,
|
|
2074
|
+
elapsedMs: Date.now() - (unitResult.requestDispatchedAt ?? s.currentUnit.startedAt),
|
|
2075
|
+
});
|
|
2076
|
+
logWarning("engine", message);
|
|
2077
|
+
ctx.ui.notify(`${message} Pausing auto-mode before closeout side effects.`, "warning");
|
|
2078
|
+
await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, {
|
|
2079
|
+
message,
|
|
2080
|
+
category: "unknown",
|
|
2081
|
+
isTransient: true,
|
|
2082
|
+
});
|
|
2083
|
+
s.currentUnit = null;
|
|
2084
|
+
await deps.pauseAuto(ctx, pi);
|
|
2085
|
+
return { action: "break", reason: "ghost-completion" };
|
|
2086
|
+
}
|
|
2087
|
+
|
|
1806
2088
|
// Now that runUnit has called newSession(), the session file path is correct.
|
|
1807
2089
|
const sessionFile = deps.getSessionFile(ctx);
|
|
1808
2090
|
deps.updateSessionLock(
|
|
@@ -1996,7 +2278,7 @@ export async function runUnitPhase(
|
|
|
1996
2278
|
const currentLedger = deps.getLedger() as { units: Array<{ type: string; id: string; startedAt: number; toolCalls: number }> } | null;
|
|
1997
2279
|
if (currentLedger?.units) {
|
|
1998
2280
|
const lastUnit = [...currentLedger.units].reverse().find(
|
|
1999
|
-
(u: { type: string; id: string; startedAt: number; toolCalls: number }) => u.type === unitType && u.id === unitId && u.startedAt === s.currentUnit
|
|
2281
|
+
(u: { type: string; id: string; startedAt: number; toolCalls: number }) => u.type === unitType && u.id === unitId && u.startedAt === _resolveCurrentUnitStartedAtForTest(s.currentUnit),
|
|
2000
2282
|
);
|
|
2001
2283
|
if (lastUnit && lastUnit.toolCalls === 0) {
|
|
2002
2284
|
if (USER_DRIVEN_DEEP_UNITS.has(unitType) && isAwaitingUserInput(s.lastUnitAgentEndMessages ?? undefined)) {
|
|
@@ -2018,7 +2300,7 @@ export async function runUnitPhase(
|
|
|
2018
2300
|
);
|
|
2019
2301
|
// Fall through to next iteration where dispatch will re-derive
|
|
2020
2302
|
// and re-dispatch this unit.
|
|
2021
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit
|
|
2303
|
+
return { action: "next", data: { unitStartedAt: _resolveCurrentUnitStartedAtForTest(s.currentUnit), requestDispatchedAt: unitResult.requestDispatchedAt } };
|
|
2022
2304
|
}
|
|
2023
2305
|
}
|
|
2024
2306
|
}
|
|
@@ -2083,7 +2365,7 @@ export async function runUnitPhase(
|
|
|
2083
2365
|
s.checkpointSha = null;
|
|
2084
2366
|
}
|
|
2085
2367
|
|
|
2086
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit
|
|
2368
|
+
return { action: "next", data: { unitStartedAt: _resolveCurrentUnitStartedAtForTest(s.currentUnit), requestDispatchedAt: unitResult.requestDispatchedAt } };
|
|
2087
2369
|
}
|
|
2088
2370
|
|
|
2089
2371
|
// ─── runFinalize ──────────────────────────────────────────────────────────────
|
|
@@ -2183,6 +2465,14 @@ export async function runFinalize(
|
|
|
2183
2465
|
attempt: retryInfo?.attempt,
|
|
2184
2466
|
},
|
|
2185
2467
|
});
|
|
2468
|
+
const retryPolicyResult = await applyVerificationRetryPolicy(
|
|
2469
|
+
ic,
|
|
2470
|
+
preUnitSnapshot?.type,
|
|
2471
|
+
"artifact-verification-retry",
|
|
2472
|
+
);
|
|
2473
|
+
if (retryPolicyResult) {
|
|
2474
|
+
return retryPolicyResult;
|
|
2475
|
+
}
|
|
2186
2476
|
// Continue the loop — next iteration will inject the retry context into the prompt.
|
|
2187
2477
|
debugLog("autoLoop", { phase: "artifact-verification-retry", iteration: ic.iteration });
|
|
2188
2478
|
return { action: "continue" };
|
|
@@ -2220,6 +2510,14 @@ export async function runFinalize(
|
|
|
2220
2510
|
debugLog("autoLoop", { phase: "sidecar-verification-retry-skipped", iteration: ic.iteration });
|
|
2221
2511
|
} else {
|
|
2222
2512
|
// s.pendingVerificationRetry was set by runPostUnitVerification.
|
|
2513
|
+
const retryPolicyResult = await applyVerificationRetryPolicy(
|
|
2514
|
+
ic,
|
|
2515
|
+
iterData.unitType,
|
|
2516
|
+
"verification-retry",
|
|
2517
|
+
);
|
|
2518
|
+
if (retryPolicyResult) {
|
|
2519
|
+
return retryPolicyResult;
|
|
2520
|
+
}
|
|
2223
2521
|
// Continue the loop — next iteration will inject the retry context into the prompt.
|
|
2224
2522
|
debugLog("autoLoop", { phase: "verification-retry", iteration: ic.iteration });
|
|
2225
2523
|
return { action: "continue" };
|
|
@@ -2263,8 +2561,20 @@ export async function runFinalize(
|
|
|
2263
2561
|
return { action: "break", reason: "step-wizard" };
|
|
2264
2562
|
}
|
|
2265
2563
|
|
|
2564
|
+
if (preUnitSnapshot?.type === "complete-milestone" && s.currentMilestoneId) {
|
|
2565
|
+
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
2566
|
+
if (stop) return stop;
|
|
2567
|
+
}
|
|
2568
|
+
|
|
2266
2569
|
// Both pre and post verification completed without timeout — reset counter
|
|
2267
2570
|
loopState.consecutiveFinalizeTimeouts = 0;
|
|
2571
|
+
if (preUnitSnapshot) {
|
|
2572
|
+
writeUnitRuntimeRecord(s.basePath, preUnitSnapshot.type, preUnitSnapshot.id, preUnitSnapshot.startedAt, {
|
|
2573
|
+
phase: "finalized",
|
|
2574
|
+
lastProgressAt: Date.now(),
|
|
2575
|
+
lastProgressKind: "finalize-success",
|
|
2576
|
+
});
|
|
2577
|
+
}
|
|
2268
2578
|
s.currentUnit = null;
|
|
2269
2579
|
clearCurrentPhase();
|
|
2270
2580
|
|