@opengsd/gsd-pi 1.2.0-dev.9ad8ae33 → 1.2.0-dev.a6376d75

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.
Files changed (264) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +1 -18
  4. package/dist/loader.js +6 -4
  5. package/dist/register-agent-bundles.d.ts +11 -2
  6. package/dist/register-agent-bundles.js +18 -4
  7. package/dist/resources/.managed-resources-content-hash +1 -1
  8. package/dist/resources/extensions/ask-user-questions.js +3 -2
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  10. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  11. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  12. package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
  13. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  14. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  15. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  16. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  17. package/dist/resources/extensions/gsd/auto/orchestrator.js +85 -15
  18. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  19. package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
  20. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  21. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  23. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  24. package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
  25. package/dist/resources/extensions/gsd/auto.js +15 -1
  26. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  27. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  28. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  29. package/dist/resources/extensions/gsd/db/queries.js +30 -0
  30. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  31. package/dist/resources/extensions/gsd/guided-flow.js +88 -2
  32. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  33. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  34. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  35. package/dist/resources/extensions/gsd/notifications.js +12 -7
  36. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  37. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -1
  38. package/dist/resources/extensions/gsd/prompts/run-uat.md +2 -0
  39. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  40. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  41. package/dist/resources/extensions/gsd/state.js +6 -2
  42. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  43. package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
  44. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  45. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  46. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  47. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  48. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  49. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  50. package/dist/runtime-checks.d.ts +10 -0
  51. package/dist/runtime-checks.js +27 -0
  52. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  53. package/dist/web/standalone/.next/BUILD_ID +1 -1
  54. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  55. package/dist/web/standalone/.next/build-manifest.json +2 -2
  56. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  57. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  58. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  66. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/index.html +1 -1
  74. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  81. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  83. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  84. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  85. package/package.json +2 -2
  86. package/packages/cloud-mcp-gateway/package.json +2 -2
  87. package/packages/contracts/package.json +1 -1
  88. package/packages/daemon/package.json +4 -4
  89. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  90. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  91. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  92. package/packages/gsd-agent-core/package.json +5 -5
  93. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  94. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  95. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  96. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  97. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  98. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  99. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +50 -6
  100. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  101. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  102. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  103. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  104. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  105. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  106. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  107. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  108. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  109. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  110. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  111. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  112. package/packages/gsd-agent-modes/package.json +7 -7
  113. package/packages/mcp-server/README.md +12 -3
  114. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  115. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  116. package/packages/mcp-server/dist/cli-runner.js +137 -0
  117. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  118. package/packages/mcp-server/dist/cli.js +2 -58
  119. package/packages/mcp-server/dist/cli.js.map +1 -1
  120. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  121. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  122. package/packages/mcp-server/dist/pid-registry.js +452 -0
  123. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  124. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  125. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  126. package/packages/mcp-server/dist/probe-mode.js +10 -0
  127. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  128. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  129. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  130. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  131. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  132. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  133. package/packages/mcp-server/dist/workflow-tools.js +62 -43
  134. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  135. package/packages/mcp-server/package.json +5 -5
  136. package/packages/native/package.json +1 -1
  137. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  138. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  139. package/packages/pi-agent-core/package.json +1 -1
  140. package/packages/pi-ai/package.json +1 -1
  141. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  142. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  143. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  144. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  145. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  146. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  147. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  148. package/packages/pi-coding-agent/package.json +7 -7
  149. package/packages/pi-tui/dist/index.d.ts +1 -1
  150. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  151. package/packages/pi-tui/dist/index.js +1 -1
  152. package/packages/pi-tui/dist/index.js.map +1 -1
  153. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  154. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  155. package/packages/pi-tui/dist/terminal-image.js +54 -2
  156. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  157. package/packages/pi-tui/dist/tui.d.ts +8 -0
  158. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  159. package/packages/pi-tui/dist/tui.js +63 -18
  160. package/packages/pi-tui/dist/tui.js.map +1 -1
  161. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  162. package/packages/pi-tui/dist/utils.js +110 -36
  163. package/packages/pi-tui/dist/utils.js.map +1 -1
  164. package/packages/pi-tui/package.json +2 -2
  165. package/packages/rpc-client/package.json +2 -2
  166. package/pkg/dist/theme/theme.d.ts.map +1 -1
  167. package/pkg/dist/theme/theme.js +45 -17
  168. package/pkg/dist/theme/theme.js.map +1 -1
  169. package/pkg/package.json +1 -1
  170. package/src/resources/extensions/ask-user-questions.ts +7 -2
  171. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  172. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  173. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  174. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  175. package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
  176. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  177. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  178. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  179. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  180. package/src/resources/extensions/gsd/auto/orchestrator.ts +95 -15
  181. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  182. package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
  183. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  184. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  185. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  186. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  187. package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
  188. package/src/resources/extensions/gsd/auto.ts +20 -1
  189. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  190. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  191. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  192. package/src/resources/extensions/gsd/db/queries.ts +29 -0
  193. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  194. package/src/resources/extensions/gsd/guided-flow.ts +128 -2
  195. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  196. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  197. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  198. package/src/resources/extensions/gsd/notifications.ts +13 -6
  199. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  200. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -1
  201. package/src/resources/extensions/gsd/prompts/run-uat.md +2 -0
  202. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  203. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  204. package/src/resources/extensions/gsd/state.ts +7 -1
  205. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  206. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  207. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  208. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +76 -12
  209. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  210. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  211. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  212. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  213. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  214. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
  215. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  216. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
  217. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  218. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  219. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  220. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
  221. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  222. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  223. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
  224. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  225. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  226. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  227. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  228. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  229. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  230. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  231. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  232. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  233. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
  234. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  235. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +1 -1
  236. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  237. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  238. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  239. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  240. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
  241. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  242. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  243. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  244. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  245. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  246. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  247. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  248. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  249. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  250. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  251. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  252. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  253. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  254. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  255. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  256. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  257. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  258. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  259. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  260. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  261. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  262. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  263. /package/dist/web/standalone/.next/static/{FBNo5cT_chy7YNoAQsU3o → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
  264. /package/dist/web/standalone/.next/static/{FBNo5cT_chy7YNoAQsU3o → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
@@ -1,7 +1,7 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: Unit dispatch contract adapter for auto-mode loop.
3
3
  import { ExecutionGraphScheduler } from "../uok/execution-graph.js";
4
- import { runUnitPhase } from "./phases.js";
4
+ import { runUnitPhase } from "./unit-phase.js";
5
5
  import { decideDispatchNodeKind } from "./workflow-kernel.js";
6
6
  export async function runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem, deps) {
7
7
  if (dispatchContract === "legacy-direct") {
@@ -0,0 +1,125 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Worktree-safety helpers shared across auto-loop phase modules.
3
+ import { classifyProject } from "../detection.js";
4
+ import { resolveEffectiveUnitIsolationMode } from "../preferences.js";
5
+ import { createWorktreeSafetyModule } from "../worktree-safety.js";
6
+ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
7
+ import { resolveManifest } from "../unit-context-manifest.js";
8
+ import { debugLog } from "../debug-logger.js";
9
+ import { isSamePathLocal } from "./phase-helpers.js";
10
+ import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
11
+ export function shouldDegradeEmptyWorktreeToProjectRoot(worktreeClassification, projectRootClassification) {
12
+ return (worktreeClassification.kind === "greenfield" &&
13
+ projectRootClassification.kind !== "greenfield" &&
14
+ projectRootClassification.kind !== "invalid-repo");
15
+ }
16
+ export function unitWritesSource(unitType) {
17
+ if (unitType.startsWith("hook/"))
18
+ return false;
19
+ // Backward compatibility: sidecar queues from older builds may persist
20
+ // prefixed unit types (e.g. "sidecar/quick-task").
21
+ const normalizedUnitType = unitType.startsWith("sidecar/")
22
+ ? unitType.slice("sidecar/".length)
23
+ : unitType;
24
+ const manifest = resolveManifest(normalizedUnitType);
25
+ if (!manifest)
26
+ return null;
27
+ return manifest.tools.mode === "all" || manifest.tools.mode === "docs";
28
+ }
29
+ export function formatWorktreeSafetyFailure(result) {
30
+ return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
31
+ }
32
+ export function formatWorktreeSafetyStopReason(result) {
33
+ if (result.kind === "empty-worktree-with-project-content") {
34
+ return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
35
+ }
36
+ return `Worktree Safety failed (${result.kind}).`;
37
+ }
38
+ export function resolveEmptyWorktreeWithProjectContent(unitRoot, projectRoot) {
39
+ if (isSamePathLocal(unitRoot, projectRoot))
40
+ return false;
41
+ const worktreeClassification = classifyProject(unitRoot);
42
+ if (worktreeClassification.kind !== "greenfield")
43
+ return false;
44
+ const projectRootClassification = classifyProject(projectRoot);
45
+ return shouldDegradeEmptyWorktreeToProjectRoot(worktreeClassification, projectRootClassification);
46
+ }
47
+ export async function validateSourceWriteWorktreeSafety(ic, unitType, unitId, milestoneId, phase) {
48
+ const { ctx, pi, s, deps } = ic;
49
+ if (!s.basePath)
50
+ return null;
51
+ // Custom engine workflows (graph-driven, registered via run dirs) define
52
+ // their own step ids that are not in the GSD UnitContextManifest. Don't
53
+ // fail closed for those — the custom engine owns its own dispatch
54
+ // contract. The fail-closed safety check applies only to built-in GSD
55
+ // units whose Tool Contract is registered in the manifest. Use a truthy
56
+ // check so undefined (test sessions that never set the field) routes
57
+ // through the safety check, matching the regression test contract.
58
+ if (s.activeEngineId)
59
+ return null;
60
+ const writesSource = unitWritesSource(unitType);
61
+ if (writesSource === null) {
62
+ const msg = `Worktree Safety failed (missing-tool-contract): missing Tool Contract for ${unitType}. Add a UnitContextManifest entry before dispatching this Unit.`;
63
+ debugLog("worktreeSafety", {
64
+ phase,
65
+ unitType,
66
+ unitId,
67
+ milestoneId,
68
+ result: { ok: false, kind: "missing-tool-contract", reason: msg },
69
+ basePath: s.basePath,
70
+ });
71
+ ctx.ui.notify(msg, "error");
72
+ await deps.stopAuto(ctx, pi, msg);
73
+ return { action: "break", reason: "missing-tool-contract" };
74
+ }
75
+ if (!writesSource)
76
+ return null;
77
+ const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
78
+ // A degraded session already fell back to the milestone branch in the
79
+ // project root — validating against the canonical worktree root there
80
+ // would fail every dispatch with a false invalid-root. The same applies
81
+ // to a stranded-recovery session that adopted the milestone branch.
82
+ const isolationMode = resolveEffectiveUnitIsolationMode(deps.getIsolationMode(projectRoot), s.isolationDegraded, s.strandedRecoveryIsolationMode);
83
+ reclaimMissingMilestoneLease(s, milestoneId, isolationMode, phase);
84
+ const safety = createWorktreeSafetyModule();
85
+ const result = safety.validateUnitRoot({
86
+ unitType,
87
+ unitId,
88
+ writeScope: "source-writing",
89
+ projectRoot,
90
+ unitRoot: s.basePath,
91
+ milestoneId,
92
+ isolationMode,
93
+ expectedBranch: isolationMode !== "none" && milestoneId ? deps.autoWorktreeBranch(milestoneId) : null,
94
+ emptyWorktreeWithProjectContent: resolveEmptyWorktreeWithProjectContent(s.basePath, projectRoot),
95
+ // The milestone lease coordinates concurrent workers on an isolated
96
+ // milestone worktree/branch, which is established by enterMilestone in
97
+ // worktree/branch modes. `none` mode has no per-milestone isolation and
98
+ // does not reliably claim a lease (e.g. a fresh headless resume of an
99
+ // already-active milestone never re-enters it), so requiring a held lease
100
+ // there would falsely fail dispatch. Enforce the lease only in isolated
101
+ // modes; none-mode safety still validates the unit root.
102
+ lease: s.workerId
103
+ ? {
104
+ required: isolationMode !== "none",
105
+ held: hasHeldMilestoneLease(s, milestoneId),
106
+ owner: s.workerId,
107
+ }
108
+ : undefined,
109
+ });
110
+ if (result.ok)
111
+ return null;
112
+ const msg = formatWorktreeSafetyFailure(result);
113
+ debugLog("worktreeSafety", {
114
+ phase,
115
+ unitType,
116
+ unitId,
117
+ milestoneId,
118
+ result,
119
+ basePath: s.basePath,
120
+ projectRoot,
121
+ });
122
+ ctx.ui.notify(msg, "error");
123
+ await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
124
+ return { action: "break", reason: result.kind };
125
+ }
@@ -1041,7 +1041,7 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
1041
1041
  * still works after process restart when module state has been reset.
1042
1042
  */
1043
1043
  export function isInAutoWorktree(basePath) {
1044
- const targetPath = isGsdWorktreePath(basePath) ? basePath : process.cwd();
1044
+ const targetPath = isGsdWorktreePath(basePath) ? basePath : safeCwd("");
1045
1045
  if (!isGsdWorktreePath(targetPath))
1046
1046
  return false;
1047
1047
  const storedBase = getAutoWorktreeOriginalBase();
@@ -512,6 +512,16 @@ export function _warnIfWorktreeMissingForTest(worktreePath, milestoneId) {
512
512
  }
513
513
  return false;
514
514
  }
515
+ export function anchorProcessCwdForAutoResume(basePath) {
516
+ try {
517
+ process.chdir(basePath);
518
+ return true;
519
+ }
520
+ catch (err) {
521
+ logWarning("session", `resume cwd anchor failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts", basePath });
522
+ return false;
523
+ }
524
+ }
515
525
  export function isAutoPaused() {
516
526
  return s.paused;
517
527
  }
@@ -751,6 +761,9 @@ function pauseAutoUnitIdentityMatches(expected) {
751
761
  s.currentUnit.id === expected.id &&
752
762
  s.currentUnit.startedAt === expected.startedAt;
753
763
  }
764
+ function shouldPreserveCoordinationForPause(errorContext) {
765
+ return errorContext?.category === "provider" && errorContext.isTransient === true;
766
+ }
754
767
  function setLifecycleOutcome(ctx, input) {
755
768
  if (!ctx?.hasUI)
756
769
  return;
@@ -1585,7 +1598,7 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
1585
1598
  releaseSessionLock(lockBase());
1586
1599
  clearLock(lockBase());
1587
1600
  }
1588
- if (s.workerId) {
1601
+ if (s.workerId && !shouldPreserveCoordinationForPause(_errorContext)) {
1589
1602
  try {
1590
1603
  if (s.currentMilestoneId && s.milestoneLeaseToken) {
1591
1604
  releaseMilestoneLease(s.workerId, s.currentMilestoneId, s.milestoneLeaseToken);
@@ -2030,6 +2043,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
2030
2043
  }
2031
2044
  // ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
2032
2045
  buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
2046
+ anchorProcessCwdForAutoResume(s.basePath || base);
2033
2047
  // Rebuild scope now that s.basePath reflects the actual worktree (or project root).
2034
2048
  rebuildScope(s.basePath, s.currentMilestoneId);
2035
2049
  // Ensure the workflow-logger audit log is pinned to the project root
@@ -5,7 +5,7 @@ import { homedir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
7
7
  import { logWarning } from "../workflow-logger.js";
8
- import { openWorkflowDatabase } from "../db-workspace.js";
8
+ import { getWorkflowDatabaseStatus, openWorkflowDatabase, } from "../db-workspace.js";
9
9
  import { getAutoWorktreePath } from "../auto-worktree.js";
10
10
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
11
11
  import { worktreesDirs } from "../worktree-placement.js";
@@ -61,16 +61,46 @@ export function resolveWorkflowToolBasePath(ctx, scope) {
61
61
  return cwd;
62
62
  }
63
63
  export { resolveProjectRootDbPath } from "../db-workspace.js";
64
+ function sqliteProviderHint(status, nodeVersion) {
65
+ if (status.provider)
66
+ return `Provider: ${status.provider}.`;
67
+ const major = Number.parseInt(nodeVersion.split(".")[0] ?? "", 10);
68
+ if (Number.isFinite(major) && major < 22) {
69
+ return (`No SQLite provider available. Upgrade Node to >= 22.0.0 (current: v${nodeVersion}), ` +
70
+ "use the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
71
+ }
72
+ return ("No SQLite provider available. Use a Node build with node:sqlite enabled, " +
73
+ "run the packaged GSD runtime, or install/restore better-sqlite3 in this runtime.");
74
+ }
75
+ function dbOpenPhaseHint(status) {
76
+ if (status.lastPhase === "open")
77
+ return "The database file could not be opened";
78
+ if (status.lastPhase === "initSchema")
79
+ return "The database schema could not be initialized";
80
+ if (status.lastPhase === "vacuum-recovery")
81
+ return "Corruption recovery (VACUUM) failed";
82
+ if (status.attempted)
83
+ return "The database could not be opened";
84
+ return "The database provider could not be loaded";
85
+ }
86
+ export function formatWorkflowDatabaseOpenFailure(result, status, nodeVersion = process.versions.node) {
87
+ if (result.reason === "missing-gsd-dir") {
88
+ return `ensureDbOpen failed — no .gsd directory found at ${result.location.projectGsd}`;
89
+ }
90
+ if (result.reason === "missing-database") {
91
+ return `ensureDbOpen failed — no GSD database found at ${result.location.projectDb}`;
92
+ }
93
+ const resolvedStatus = status ?? getWorkflowDatabaseStatus();
94
+ const detail = result.error?.message ?? resolvedStatus.lastError?.message ?? "";
95
+ const detailSuffix = detail ? ` (${detail})` : "";
96
+ return (`ensureDbOpen failed for ${result.location.projectDb}: ` +
97
+ `${dbOpenPhaseHint(resolvedStatus)}${detailSuffix}. ${sqliteProviderHint(resolvedStatus, nodeVersion)}`);
98
+ }
64
99
  export async function ensureDbOpen(basePath = safeWorkspaceCwd()) {
65
100
  const result = openWorkflowDatabase(basePath);
66
101
  if (result.ok)
67
102
  return true;
68
- if (result.reason === "missing-gsd-dir") {
69
- logWarning("bootstrap", "ensureDbOpen failed — no .gsd directory found");
70
- }
71
- else {
72
- logWarning("bootstrap", `ensureDbOpen failed: ${result.error?.message ?? "open failed"}`);
73
- }
103
+ logWarning("bootstrap", formatWorkflowDatabaseOpenFailure(result));
74
104
  return false;
75
105
  }
76
106
  export function registerDynamicTools(pi) {
@@ -59,7 +59,7 @@ export function formatMcpStatusReport(servers) {
59
59
  : s.connected
60
60
  ? `connected — ${s.toolCount} tools`
61
61
  : s.available
62
- ? `available — ${s.toolCount} tools`
62
+ ? `probe available — ${s.toolCount} tools`
63
63
  : "disconnected";
64
64
  const warningText = s.envWarnings?.length ? ` — ${s.envWarnings.length} warning(s)` : "";
65
65
  lines.push(` ${icon} ${s.name} (${s.transport}) — ${status}${warningText}`);
@@ -83,7 +83,7 @@ export function formatMcpServerDetail(server) {
83
83
  lines.push(` Error: ${server.error}`);
84
84
  }
85
85
  else if (server.connected || server.available) {
86
- lines.push(` Status: ${server.connected ? "connected" : "available"}`);
86
+ lines.push(` Status: ${server.connected ? "connected" : "probe available"}`);
87
87
  lines.push(` Tools: ${server.toolCount}`);
88
88
  if (server.tools.length > 0) {
89
89
  lines.push("");
@@ -59,6 +59,13 @@ function datePrefix() {
59
59
  const dd = String(d.getDate()).padStart(2, "0");
60
60
  return `${yy}${mm}${dd}`;
61
61
  }
62
+ export function isWorkflowStateComplete(state) {
63
+ if (state.completedAt)
64
+ return true;
65
+ return Array.isArray(state.phases) &&
66
+ state.phases.length > 0 &&
67
+ state.phases.every((phase) => phase.status === "completed");
68
+ }
62
69
  /**
63
70
  * Write a STATE.json file to track workflow execution state.
64
71
  */
@@ -85,7 +92,7 @@ function writeWorkflowState(artifactDir, templateId, templateName, phases, descr
85
92
  * Scan all workflow artifact directories for in-progress STATE.json files.
86
93
  * Returns workflows that were started but not completed.
87
94
  */
88
- function findInProgressWorkflows(basePath) {
95
+ export function findInProgressWorkflows(basePath) {
89
96
  const workflowsRoot = join(gsdRoot(basePath), "workflows");
90
97
  if (!existsSync(workflowsRoot))
91
98
  return [];
@@ -105,7 +112,7 @@ function findInProgressWorkflows(basePath) {
105
112
  try {
106
113
  const raw = readFileSync(statePath, "utf-8");
107
114
  const state = JSON.parse(raw);
108
- if (!state.completedAt) {
115
+ if (!isWorkflowStateComplete(state)) {
109
116
  results.push(state);
110
117
  }
111
118
  }
@@ -218,6 +218,36 @@ export function getMilestoneSlices(milestoneId) {
218
218
  const rows = getDbOrNull().prepare("SELECT * FROM slices WHERE milestone_id = :mid ORDER BY sequence, id").all({ ":mid": milestoneId });
219
219
  return rows.map(rowToSlice);
220
220
  }
221
+ /**
222
+ * Load slices for many milestones in a single query. Returns a Map keyed by
223
+ * milestone_id, preserving `ORDER BY sequence, id` within each bucket.
224
+ */
225
+ export function getSlicesByMilestoneIds(milestoneIds) {
226
+ const db = getDbOrNull();
227
+ if (!db || milestoneIds.length === 0)
228
+ return new Map();
229
+ const idList = [...milestoneIds];
230
+ const placeholders = idList.map((_, i) => `:mid${i}`).join(",");
231
+ const params = {};
232
+ idList.forEach((id, i) => {
233
+ params[`:mid${i}`] = id;
234
+ });
235
+ const rows = db
236
+ .prepare(`SELECT * FROM slices WHERE milestone_id IN (${placeholders}) ORDER BY milestone_id, sequence, id`)
237
+ .all(params);
238
+ const byMilestone = new Map();
239
+ for (const row of rows) {
240
+ const slice = rowToSlice(row);
241
+ const bucket = byMilestone.get(slice.milestone_id);
242
+ if (bucket) {
243
+ bucket.push(slice);
244
+ }
245
+ else {
246
+ byMilestone.set(slice.milestone_id, [slice]);
247
+ }
248
+ }
249
+ return byMilestone;
250
+ }
221
251
  /**
222
252
  * Consolidated DB read for dispatch/gate/completion decisions (ADR-017).
223
253
  * `done` uses the canonical closed-status predicate (`isClosedStatus`) — the