@opengsd/gsd-pi 1.0.0

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 (2880) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +96 -0
  3. package/package.json +171 -0
  4. package/packages/contracts/dist/index.d.ts +3 -0
  5. package/packages/contracts/dist/index.d.ts.map +1 -0
  6. package/packages/contracts/dist/index.js +5 -0
  7. package/packages/contracts/dist/index.js.map +1 -0
  8. package/packages/contracts/dist/rpc.d.ts +549 -0
  9. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  10. package/packages/contracts/dist/rpc.js +53 -0
  11. package/packages/contracts/dist/rpc.js.map +1 -0
  12. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  13. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  14. package/packages/contracts/dist/rpc.test.js +54 -0
  15. package/packages/contracts/dist/rpc.test.js.map +1 -0
  16. package/packages/contracts/dist/workflow.d.ts +201 -0
  17. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  18. package/packages/contracts/dist/workflow.js +225 -0
  19. package/packages/contracts/dist/workflow.js.map +1 -0
  20. package/packages/contracts/package.json +39 -0
  21. package/packages/contracts/src/index.ts +5 -0
  22. package/packages/contracts/src/rpc.test.ts +80 -0
  23. package/packages/contracts/src/rpc.ts +286 -0
  24. package/packages/contracts/src/workflow.ts +237 -0
  25. package/packages/contracts/tsconfig.json +25 -0
  26. package/packages/daemon/package.json +49 -0
  27. package/packages/daemon/src/channel-manager.ts +223 -0
  28. package/packages/daemon/src/cli.ts +96 -0
  29. package/packages/daemon/src/commands.ts +110 -0
  30. package/packages/daemon/src/config.ts +137 -0
  31. package/packages/daemon/src/daemon.test.ts +763 -0
  32. package/packages/daemon/src/daemon.ts +199 -0
  33. package/packages/daemon/src/discord-bot.test.ts +792 -0
  34. package/packages/daemon/src/discord-bot.ts +491 -0
  35. package/packages/daemon/src/event-bridge.test.ts +620 -0
  36. package/packages/daemon/src/event-bridge.ts +494 -0
  37. package/packages/daemon/src/event-formatter.test.ts +401 -0
  38. package/packages/daemon/src/event-formatter.ts +413 -0
  39. package/packages/daemon/src/index.ts +55 -0
  40. package/packages/daemon/src/launchd.test.ts +356 -0
  41. package/packages/daemon/src/launchd.ts +242 -0
  42. package/packages/daemon/src/logger.ts +89 -0
  43. package/packages/daemon/src/message-batcher.test.ts +308 -0
  44. package/packages/daemon/src/message-batcher.ts +216 -0
  45. package/packages/daemon/src/orchestrator.test.ts +584 -0
  46. package/packages/daemon/src/orchestrator.ts +469 -0
  47. package/packages/daemon/src/project-scanner.test.ts +235 -0
  48. package/packages/daemon/src/project-scanner.ts +99 -0
  49. package/packages/daemon/src/session-manager.test.ts +822 -0
  50. package/packages/daemon/src/session-manager.ts +400 -0
  51. package/packages/daemon/src/types.ts +184 -0
  52. package/packages/daemon/src/verbosity.test.ts +171 -0
  53. package/packages/daemon/src/verbosity.ts +101 -0
  54. package/packages/daemon/tsconfig.json +24 -0
  55. package/packages/mcp-server/README.md +275 -0
  56. package/packages/mcp-server/package.json +53 -0
  57. package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
  58. package/packages/mcp-server/src/alias-telemetry.ts +30 -0
  59. package/packages/mcp-server/src/cli.ts +70 -0
  60. package/packages/mcp-server/src/env-writer.test.ts +433 -0
  61. package/packages/mcp-server/src/env-writer.ts +292 -0
  62. package/packages/mcp-server/src/import-candidates.test.ts +53 -0
  63. package/packages/mcp-server/src/index.ts +43 -0
  64. package/packages/mcp-server/src/mcp-server.test.ts +1395 -0
  65. package/packages/mcp-server/src/parse-workflow-args.test.ts +80 -0
  66. package/packages/mcp-server/src/readers/captures.ts +119 -0
  67. package/packages/mcp-server/src/readers/doctor-lite.ts +225 -0
  68. package/packages/mcp-server/src/readers/graph.test.ts +679 -0
  69. package/packages/mcp-server/src/readers/graph.ts +863 -0
  70. package/packages/mcp-server/src/readers/index.ts +28 -0
  71. package/packages/mcp-server/src/readers/knowledge.ts +111 -0
  72. package/packages/mcp-server/src/readers/metrics.ts +118 -0
  73. package/packages/mcp-server/src/readers/paths.test.ts +67 -0
  74. package/packages/mcp-server/src/readers/paths.ts +334 -0
  75. package/packages/mcp-server/src/readers/readers.test.ts +513 -0
  76. package/packages/mcp-server/src/readers/roadmap.ts +263 -0
  77. package/packages/mcp-server/src/readers/state.ts +223 -0
  78. package/packages/mcp-server/src/remote-questions.test.ts +397 -0
  79. package/packages/mcp-server/src/remote-questions.ts +967 -0
  80. package/packages/mcp-server/src/secure-env-collect.test.ts +260 -0
  81. package/packages/mcp-server/src/server.ts +1342 -0
  82. package/packages/mcp-server/src/session-manager.ts +404 -0
  83. package/packages/mcp-server/src/tool-credentials.test.ts +95 -0
  84. package/packages/mcp-server/src/tool-credentials.ts +97 -0
  85. package/packages/mcp-server/src/types.ts +96 -0
  86. package/packages/mcp-server/src/workflow-tools-parity.test.ts +257 -0
  87. package/packages/mcp-server/src/workflow-tools.test.ts +2350 -0
  88. package/packages/mcp-server/src/workflow-tools.ts +2257 -0
  89. package/packages/mcp-server/tsconfig.json +25 -0
  90. package/packages/mcp-server/tsconfig.test.json +19 -0
  91. package/packages/native/dist/ast/index.d.ts +4 -0
  92. package/packages/native/dist/ast/index.js +11 -0
  93. package/packages/native/dist/ast/types.d.ts +69 -0
  94. package/packages/native/dist/ast/types.js +2 -0
  95. package/packages/native/dist/clipboard/index.d.ts +28 -0
  96. package/packages/native/dist/clipboard/index.js +38 -0
  97. package/packages/native/dist/clipboard/types.d.ts +7 -0
  98. package/packages/native/dist/clipboard/types.js +2 -0
  99. package/packages/native/dist/diff/index.d.ts +33 -0
  100. package/packages/native/dist/diff/index.js +43 -0
  101. package/packages/native/dist/diff/types.d.ts +23 -0
  102. package/packages/native/dist/diff/types.js +2 -0
  103. package/packages/native/dist/fd/index.d.ts +26 -0
  104. package/packages/native/dist/fd/index.js +30 -0
  105. package/packages/native/dist/fd/types.d.ts +29 -0
  106. package/packages/native/dist/fd/types.js +2 -0
  107. package/packages/native/dist/glob/index.d.ts +28 -0
  108. package/packages/native/dist/glob/index.js +35 -0
  109. package/packages/native/dist/glob/types.d.ts +50 -0
  110. package/packages/native/dist/glob/types.js +2 -0
  111. package/packages/native/dist/grep/index.d.ts +21 -0
  112. package/packages/native/dist/grep/index.js +28 -0
  113. package/packages/native/dist/grep/types.d.ts +99 -0
  114. package/packages/native/dist/grep/types.js +2 -0
  115. package/packages/native/dist/gsd-parser/index.d.ts +45 -0
  116. package/packages/native/dist/gsd-parser/index.js +61 -0
  117. package/packages/native/dist/gsd-parser/types.d.ts +55 -0
  118. package/packages/native/dist/gsd-parser/types.js +8 -0
  119. package/packages/native/dist/highlight/index.d.ts +28 -0
  120. package/packages/native/dist/highlight/index.js +38 -0
  121. package/packages/native/dist/highlight/types.d.ts +25 -0
  122. package/packages/native/dist/highlight/types.js +2 -0
  123. package/packages/native/dist/html/index.d.ts +15 -0
  124. package/packages/native/dist/html/index.js +19 -0
  125. package/packages/native/dist/html/types.d.ts +7 -0
  126. package/packages/native/dist/html/types.js +2 -0
  127. package/packages/native/dist/image/index.d.ts +15 -0
  128. package/packages/native/dist/image/index.js +23 -0
  129. package/packages/native/dist/image/types.d.ts +35 -0
  130. package/packages/native/dist/image/types.js +29 -0
  131. package/packages/native/dist/index.d.ts +46 -0
  132. package/packages/native/dist/index.js +85 -0
  133. package/packages/native/dist/json-parse/index.d.ts +23 -0
  134. package/packages/native/dist/json-parse/index.js +78 -0
  135. package/packages/native/dist/native.d.ts +57 -0
  136. package/packages/native/dist/native.js +113 -0
  137. package/packages/native/dist/ps/index.d.ts +38 -0
  138. package/packages/native/dist/ps/index.js +53 -0
  139. package/packages/native/dist/stream-process/index.d.ts +35 -0
  140. package/packages/native/dist/stream-process/index.js +254 -0
  141. package/packages/native/dist/text/index.d.ts +55 -0
  142. package/packages/native/dist/text/index.js +76 -0
  143. package/packages/native/dist/text/types.d.ts +27 -0
  144. package/packages/native/dist/text/types.js +13 -0
  145. package/packages/native/dist/truncate/index.d.ts +29 -0
  146. package/packages/native/dist/truncate/index.js +30 -0
  147. package/packages/native/dist/ttsr/index.d.ts +27 -0
  148. package/packages/native/dist/ttsr/index.js +37 -0
  149. package/packages/native/dist/ttsr/types.d.ts +9 -0
  150. package/packages/native/dist/ttsr/types.js +2 -0
  151. package/packages/native/dist/xxhash/index.d.ts +22 -0
  152. package/packages/native/dist/xxhash/index.js +89 -0
  153. package/packages/native/package.json +97 -0
  154. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  155. package/packages/native/src/__tests__/clipboard.test.mjs +126 -0
  156. package/packages/native/src/__tests__/diff.test.mjs +189 -0
  157. package/packages/native/src/__tests__/fd.test.mjs +199 -0
  158. package/packages/native/src/__tests__/glob.test.mjs +237 -0
  159. package/packages/native/src/__tests__/grep.test.mjs +179 -0
  160. package/packages/native/src/__tests__/highlight.test.mjs +156 -0
  161. package/packages/native/src/__tests__/html.test.mjs +98 -0
  162. package/packages/native/src/__tests__/image.test.mjs +137 -0
  163. package/packages/native/src/__tests__/json-parse.test.mjs +158 -0
  164. package/packages/native/src/__tests__/module-compat.test.mjs +123 -0
  165. package/packages/native/src/__tests__/ps.test.mjs +115 -0
  166. package/packages/native/src/__tests__/stream-process.test.mjs +108 -0
  167. package/packages/native/src/__tests__/text.test.mjs +295 -0
  168. package/packages/native/src/__tests__/truncate.test.mjs +160 -0
  169. package/packages/native/src/__tests__/ttsr.test.mjs +135 -0
  170. package/packages/native/src/__tests__/xxhash.test.mjs +122 -0
  171. package/packages/native/src/ast/index.ts +12 -0
  172. package/packages/native/src/ast/types.ts +75 -0
  173. package/packages/native/src/clipboard/index.ts +40 -0
  174. package/packages/native/src/clipboard/types.ts +7 -0
  175. package/packages/native/src/diff/index.ts +61 -0
  176. package/packages/native/src/diff/types.ts +24 -0
  177. package/packages/native/src/fd/index.ts +36 -0
  178. package/packages/native/src/fd/types.ts +31 -0
  179. package/packages/native/src/glob/index.ts +44 -0
  180. package/packages/native/src/glob/types.ts +53 -0
  181. package/packages/native/src/grep/index.ts +49 -0
  182. package/packages/native/src/grep/types.ts +105 -0
  183. package/packages/native/src/gsd-parser/index.ts +98 -0
  184. package/packages/native/src/gsd-parser/types.ts +62 -0
  185. package/packages/native/src/highlight/index.ts +44 -0
  186. package/packages/native/src/highlight/types.ts +25 -0
  187. package/packages/native/src/html/index.ts +24 -0
  188. package/packages/native/src/html/types.ts +7 -0
  189. package/packages/native/src/image/index.ts +28 -0
  190. package/packages/native/src/image/types.ts +41 -0
  191. package/packages/native/src/index.ts +128 -0
  192. package/packages/native/src/json-parse/index.ts +76 -0
  193. package/packages/native/src/native.ts +154 -0
  194. package/packages/native/src/ps/index.ts +52 -0
  195. package/packages/native/src/stream-process/index.ts +313 -0
  196. package/packages/native/src/text/index.ts +125 -0
  197. package/packages/native/src/text/types.ts +29 -0
  198. package/packages/native/src/truncate/index.ts +50 -0
  199. package/packages/native/src/ttsr/index.ts +39 -0
  200. package/packages/native/src/ttsr/types.ts +10 -0
  201. package/packages/native/src/xxhash/index.ts +98 -0
  202. package/packages/native/tsconfig.json +9 -0
  203. package/packages/native/tsconfig.tsbuildinfo +1 -0
  204. package/packages/pi-agent-core/package.json +23 -0
  205. package/packages/pi-agent-core/src/agent-loop.test.ts +733 -0
  206. package/packages/pi-agent-core/src/agent-loop.ts +851 -0
  207. package/packages/pi-agent-core/src/agent.test.ts +129 -0
  208. package/packages/pi-agent-core/src/agent.ts +668 -0
  209. package/packages/pi-agent-core/src/index.ts +10 -0
  210. package/packages/pi-agent-core/src/proxy.ts +334 -0
  211. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  212. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  213. package/packages/pi-agent-core/src/types.ts +358 -0
  214. package/packages/pi-agent-core/tsconfig.json +28 -0
  215. package/packages/pi-ai/bedrock-provider.d.ts +1 -0
  216. package/packages/pi-ai/bedrock-provider.js +1 -0
  217. package/packages/pi-ai/package.json +48 -0
  218. package/packages/pi-ai/scripts/generate-models.ts +1671 -0
  219. package/packages/pi-ai/src/api-registry.ts +86 -0
  220. package/packages/pi-ai/src/bedrock-provider.ts +6 -0
  221. package/packages/pi-ai/src/cli.ts +133 -0
  222. package/packages/pi-ai/src/env-api-keys.ts +148 -0
  223. package/packages/pi-ai/src/index.ts +36 -0
  224. package/packages/pi-ai/src/models/capability-patches.ts +51 -0
  225. package/packages/pi-ai/src/models/custom.ts +337 -0
  226. package/packages/pi-ai/src/models/fake-model.ts +30 -0
  227. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1554 -0
  228. package/packages/pi-ai/src/models/generated/anthropic.ts +398 -0
  229. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  230. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  231. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  232. package/packages/pi-ai/src/models/generated/google-antigravity.ts +177 -0
  233. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  234. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  235. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  236. package/packages/pi-ai/src/models/generated/groq.ts +160 -0
  237. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  238. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  239. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  240. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  241. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  242. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  243. package/packages/pi-ai/src/models/generated/openai-codex.ts +177 -0
  244. package/packages/pi-ai/src/models/generated/openai.ts +721 -0
  245. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  246. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  247. package/packages/pi-ai/src/models/generated/openrouter.ts +4291 -0
  248. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  249. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  250. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  251. package/packages/pi-ai/src/models/index.ts +115 -0
  252. package/packages/pi-ai/src/models.generated.test.ts +362 -0
  253. package/packages/pi-ai/src/models.test.ts +404 -0
  254. package/packages/pi-ai/src/models.ts +3 -0
  255. package/packages/pi-ai/src/oauth.ts +1 -0
  256. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  257. package/packages/pi-ai/src/providers/amazon-bedrock.ts +797 -0
  258. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +92 -0
  259. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +36 -0
  260. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
  261. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +134 -0
  262. package/packages/pi-ai/src/providers/anthropic-shared.ts +899 -0
  263. package/packages/pi-ai/src/providers/anthropic-vertex.ts +130 -0
  264. package/packages/pi-ai/src/providers/anthropic.ts +240 -0
  265. package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
  266. package/packages/pi-ai/src/providers/api-family.ts +57 -0
  267. package/packages/pi-ai/src/providers/azure-openai-responses.ts +248 -0
  268. package/packages/pi-ai/src/providers/fake.ts +376 -0
  269. package/packages/pi-ai/src/providers/github-copilot-headers.ts +37 -0
  270. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +90 -0
  271. package/packages/pi-ai/src/providers/google-gemini-cli.ts +982 -0
  272. package/packages/pi-ai/src/providers/google-shared.test.ts +137 -0
  273. package/packages/pi-ai/src/providers/google-shared.ts +364 -0
  274. package/packages/pi-ai/src/providers/google-vertex.ts +500 -0
  275. package/packages/pi-ai/src/providers/google.ts +467 -0
  276. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +118 -0
  277. package/packages/pi-ai/src/providers/mistral.ts +597 -0
  278. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  279. package/packages/pi-ai/src/providers/openai-codex-responses.ts +1007 -0
  280. package/packages/pi-ai/src/providers/openai-completions.test.ts +75 -0
  281. package/packages/pi-ai/src/providers/openai-completions.ts +830 -0
  282. package/packages/pi-ai/src/providers/openai-responses-shared.ts +496 -0
  283. package/packages/pi-ai/src/providers/openai-responses.ts +205 -0
  284. package/packages/pi-ai/src/providers/openai-shared.ts +193 -0
  285. package/packages/pi-ai/src/providers/provider-capabilities.test.ts +174 -0
  286. package/packages/pi-ai/src/providers/provider-capabilities.ts +215 -0
  287. package/packages/pi-ai/src/providers/register-builtins.ts +216 -0
  288. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  289. package/packages/pi-ai/src/providers/simple-options.ts +61 -0
  290. package/packages/pi-ai/src/providers/think-tag-parser.test.ts +44 -0
  291. package/packages/pi-ai/src/providers/think-tag-parser.ts +94 -0
  292. package/packages/pi-ai/src/providers/transform-messages-report.test.ts +189 -0
  293. package/packages/pi-ai/src/providers/transform-messages.ts +289 -0
  294. package/packages/pi-ai/src/stream.ts +59 -0
  295. package/packages/pi-ai/src/types.ts +413 -0
  296. package/packages/pi-ai/src/utils/event-stream.ts +87 -0
  297. package/packages/pi-ai/src/utils/hash.ts +13 -0
  298. package/packages/pi-ai/src/utils/json-parse.ts +51 -0
  299. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +282 -0
  300. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +470 -0
  301. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +80 -0
  302. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +323 -0
  303. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +80 -0
  304. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +468 -0
  305. package/packages/pi-ai/src/utils/oauth/google-oauth-utils.ts +201 -0
  306. package/packages/pi-ai/src/utils/oauth/index.ts +134 -0
  307. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +472 -0
  308. package/packages/pi-ai/src/utils/oauth/pkce.ts +34 -0
  309. package/packages/pi-ai/src/utils/oauth/types.ts +49 -0
  310. package/packages/pi-ai/src/utils/overflow.ts +129 -0
  311. package/packages/pi-ai/src/utils/repair-tool-json.ts +241 -0
  312. package/packages/pi-ai/src/utils/sanitize-unicode.ts +25 -0
  313. package/packages/pi-ai/src/utils/tests/json-parse.test.ts +17 -0
  314. package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
  315. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +240 -0
  316. package/packages/pi-ai/src/utils/typebox-helpers.ts +24 -0
  317. package/packages/pi-ai/src/utils/validation.ts +69 -0
  318. package/packages/pi-ai/src/web-runtime-env-api-keys.ts +86 -0
  319. package/packages/pi-ai/src/web-runtime-oauth.ts +9 -0
  320. package/packages/pi-ai/tsconfig.json +28 -0
  321. package/packages/pi-coding-agent/package.json +52 -0
  322. package/packages/pi-coding-agent/scripts/copy-assets.cjs +55 -0
  323. package/packages/pi-coding-agent/src/cli/abort-signal-timeout.test.ts +73 -0
  324. package/packages/pi-coding-agent/src/cli/abort-signal-timeout.ts +18 -0
  325. package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
  326. package/packages/pi-coding-agent/src/cli/args.ts +357 -0
  327. package/packages/pi-coding-agent/src/cli/config-selector.ts +52 -0
  328. package/packages/pi-coding-agent/src/cli/file-processor.ts +96 -0
  329. package/packages/pi-coding-agent/src/cli/list-models.ts +164 -0
  330. package/packages/pi-coding-agent/src/cli/session-picker.ts +51 -0
  331. package/packages/pi-coding-agent/src/cli.ts +20 -0
  332. package/packages/pi-coding-agent/src/config.ts +245 -0
  333. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +491 -0
  334. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +93 -0
  335. package/packages/pi-coding-agent/src/core/agent-session-renderable-tools.test.ts +70 -0
  336. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  337. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +172 -0
  338. package/packages/pi-coding-agent/src/core/agent-session.ts +3150 -0
  339. package/packages/pi-coding-agent/src/core/artifact-manager.ts +125 -0
  340. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +654 -0
  341. package/packages/pi-coding-agent/src/core/auth-storage.ts +925 -0
  342. package/packages/pi-coding-agent/src/core/bash-executor.ts +316 -0
  343. package/packages/pi-coding-agent/src/core/blob-store.ts +154 -0
  344. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +1571 -0
  345. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +307 -0
  346. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +598 -0
  347. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +986 -0
  348. package/packages/pi-coding-agent/src/core/compaction/index.ts +7 -0
  349. package/packages/pi-coding-agent/src/core/compaction/utils.ts +368 -0
  350. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  351. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +440 -0
  352. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  353. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +117 -0
  354. package/packages/pi-coding-agent/src/core/constants.ts +59 -0
  355. package/packages/pi-coding-agent/src/core/contextual-tips.test.ts +259 -0
  356. package/packages/pi-coding-agent/src/core/contextual-tips.ts +232 -0
  357. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  358. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  359. package/packages/pi-coding-agent/src/core/defaults.ts +3 -0
  360. package/packages/pi-coding-agent/src/core/diagnostics.ts +15 -0
  361. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +163 -0
  362. package/packages/pi-coding-agent/src/core/discovery-cache.ts +104 -0
  363. package/packages/pi-coding-agent/src/core/event-bus.ts +33 -0
  364. package/packages/pi-coding-agent/src/core/exec.ts +106 -0
  365. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +258 -0
  366. package/packages/pi-coding-agent/src/core/export-html/index.ts +306 -0
  367. package/packages/pi-coding-agent/src/core/export-html/template.css +971 -0
  368. package/packages/pi-coding-agent/src/core/export-html/template.html +54 -0
  369. package/packages/pi-coding-agent/src/core/export-html/template.js +1583 -0
  370. package/packages/pi-coding-agent/src/core/export-html/tool-renderer.ts +114 -0
  371. package/packages/pi-coding-agent/src/core/export-html/vendor/highlight.min.js +1213 -0
  372. package/packages/pi-coding-agent/src/core/export-html/vendor/marked.min.js +6 -0
  373. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  374. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  375. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  376. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  377. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  378. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  379. package/packages/pi-coding-agent/src/core/extensions/index.ts +186 -0
  380. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +275 -0
  381. package/packages/pi-coding-agent/src/core/extensions/loader.ts +1139 -0
  382. package/packages/pi-coding-agent/src/core/extensions/project-trust.ts +51 -0
  383. package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +81 -0
  384. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +282 -0
  385. package/packages/pi-coding-agent/src/core/extensions/runner.ts +1241 -0
  386. package/packages/pi-coding-agent/src/core/extensions/types.ts +1872 -0
  387. package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +127 -0
  388. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +242 -0
  389. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +164 -0
  390. package/packages/pi-coding-agent/src/core/footer-data-provider.ts +144 -0
  391. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +54 -0
  392. package/packages/pi-coding-agent/src/core/fs-utils.ts +12 -0
  393. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +271 -0
  394. package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
  395. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  396. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  397. package/packages/pi-coding-agent/src/core/index.ts +80 -0
  398. package/packages/pi-coding-agent/src/core/keybindings.ts +211 -0
  399. package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
  400. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +280 -0
  401. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  402. package/packages/pi-coding-agent/src/core/lock-utils.ts +113 -0
  403. package/packages/pi-coding-agent/src/core/lsp/client.ts +968 -0
  404. package/packages/pi-coding-agent/src/core/lsp/config.ts +356 -0
  405. package/packages/pi-coding-agent/src/core/lsp/defaults.json +456 -0
  406. package/packages/pi-coding-agent/src/core/lsp/edits.ts +109 -0
  407. package/packages/pi-coding-agent/src/core/lsp/helpers.ts +54 -0
  408. package/packages/pi-coding-agent/src/core/lsp/index.ts +1065 -0
  409. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +451 -0
  410. package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +70 -0
  411. package/packages/pi-coding-agent/src/core/lsp/lsp.md +39 -0
  412. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +190 -0
  413. package/packages/pi-coding-agent/src/core/lsp/types.ts +445 -0
  414. package/packages/pi-coding-agent/src/core/lsp/utils.ts +706 -0
  415. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  416. package/packages/pi-coding-agent/src/core/messages.ts +226 -0
  417. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +144 -0
  418. package/packages/pi-coding-agent/src/core/model-discovery.ts +318 -0
  419. package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
  420. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +730 -0
  421. package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
  422. package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +210 -0
  423. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  424. package/packages/pi-coding-agent/src/core/model-registry.ts +1053 -0
  425. package/packages/pi-coding-agent/src/core/model-resolver-initial-model-auth.test.ts +78 -0
  426. package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
  427. package/packages/pi-coding-agent/src/core/model-resolver.ts +511 -0
  428. package/packages/pi-coding-agent/src/core/models-json-writer.test.ts +145 -0
  429. package/packages/pi-coding-agent/src/core/models-json-writer.ts +188 -0
  430. package/packages/pi-coding-agent/src/core/package-commands.test.ts +262 -0
  431. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  432. package/packages/pi-coding-agent/src/core/package-manager.ts +1845 -0
  433. package/packages/pi-coding-agent/src/core/prompt-templates.ts +299 -0
  434. package/packages/pi-coding-agent/src/core/redact-secrets.test.ts +86 -0
  435. package/packages/pi-coding-agent/src/core/redact-secrets.ts +58 -0
  436. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +295 -0
  437. package/packages/pi-coding-agent/src/core/resolve-config-value.ts +118 -0
  438. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +107 -0
  439. package/packages/pi-coding-agent/src/core/resource-loader.ts +929 -0
  440. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +518 -0
  441. package/packages/pi-coding-agent/src/core/retry-handler.ts +576 -0
  442. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  443. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  444. package/packages/pi-coding-agent/src/core/sdk.test.ts +113 -0
  445. package/packages/pi-coding-agent/src/core/sdk.ts +688 -0
  446. package/packages/pi-coding-agent/src/core/session-manager.test.ts +129 -0
  447. package/packages/pi-coding-agent/src/core/session-manager.ts +1646 -0
  448. package/packages/pi-coding-agent/src/core/settings-manager-security.test.ts +102 -0
  449. package/packages/pi-coding-agent/src/core/settings-manager.ts +1247 -0
  450. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +117 -0
  451. package/packages/pi-coding-agent/src/core/skills.ts +490 -0
  452. package/packages/pi-coding-agent/src/core/slash-commands.ts +43 -0
  453. package/packages/pi-coding-agent/src/core/system-prompt.ts +296 -0
  454. package/packages/pi-coding-agent/src/core/timings.ts +25 -0
  455. package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
  456. package/packages/pi-coding-agent/src/core/tools/bash-background.test.ts +91 -0
  457. package/packages/pi-coding-agent/src/core/tools/bash-interceptor.test.ts +198 -0
  458. package/packages/pi-coding-agent/src/core/tools/bash-interceptor.ts +115 -0
  459. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +77 -0
  460. package/packages/pi-coding-agent/src/core/tools/bash.ts +478 -0
  461. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +85 -0
  462. package/packages/pi-coding-agent/src/core/tools/edit-diff.ts +402 -0
  463. package/packages/pi-coding-agent/src/core/tools/edit.ts +242 -0
  464. package/packages/pi-coding-agent/src/core/tools/find.ts +209 -0
  465. package/packages/pi-coding-agent/src/core/tools/grep.ts +356 -0
  466. package/packages/pi-coding-agent/src/core/tools/hashline-edit.ts +318 -0
  467. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +207 -0
  468. package/packages/pi-coding-agent/src/core/tools/hashline.test.ts +456 -0
  469. package/packages/pi-coding-agent/src/core/tools/hashline.ts +525 -0
  470. package/packages/pi-coding-agent/src/core/tools/index.ts +226 -0
  471. package/packages/pi-coding-agent/src/core/tools/ls.ts +178 -0
  472. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +67 -0
  473. package/packages/pi-coding-agent/src/core/tools/path-utils.ts +106 -0
  474. package/packages/pi-coding-agent/src/core/tools/read.ts +235 -0
  475. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +31 -0
  476. package/packages/pi-coding-agent/src/core/tools/tool-compatibility-registry.ts +83 -0
  477. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  478. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  479. package/packages/pi-coding-agent/src/core/tools/truncate.ts +267 -0
  480. package/packages/pi-coding-agent/src/core/tools/write.ts +133 -0
  481. package/packages/pi-coding-agent/src/index.ts +422 -0
  482. package/packages/pi-coding-agent/src/main.ts +649 -0
  483. package/packages/pi-coding-agent/src/migrations.ts +295 -0
  484. package/packages/pi-coding-agent/src/modes/index.ts +16 -0
  485. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +128 -0
  486. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +93 -0
  487. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/collapsible-message.test.ts +111 -0
  488. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
  489. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +28 -0
  490. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +41 -0
  491. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +512 -0
  492. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +139 -0
  493. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +66 -0
  494. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +161 -0
  495. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.test.ts +115 -0
  496. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.ts +107 -0
  497. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +360 -0
  498. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +200 -0
  499. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.test.ts +35 -0
  500. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +287 -0
  501. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +66 -0
  502. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +54 -0
  503. package/packages/pi-coding-agent/src/modes/interactive/components/collapsible-message.ts +45 -0
  504. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +73 -0
  505. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +599 -0
  506. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +43 -0
  507. package/packages/pi-coding-agent/src/modes/interactive/components/custom-editor.ts +97 -0
  508. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +89 -0
  509. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.test.ts +68 -0
  510. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +159 -0
  511. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +153 -0
  512. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +99 -0
  513. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +97 -0
  514. package/packages/pi-coding-agent/src/modes/interactive/components/extension-editor.ts +150 -0
  515. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +92 -0
  516. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +152 -0
  517. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +266 -0
  518. package/packages/pi-coding-agent/src/modes/interactive/components/index.ts +33 -0
  519. package/packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts +122 -0
  520. package/packages/pi-coding-agent/src/modes/interactive/components/keybinding-hints.ts +84 -0
  521. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +256 -0
  522. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +693 -0
  523. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +127 -0
  524. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +231 -0
  525. package/packages/pi-coding-agent/src/modes/interactive/components/render-cache.ts +22 -0
  526. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +342 -0
  527. package/packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts +63 -0
  528. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +194 -0
  529. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +1015 -0
  530. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +466 -0
  531. package/packages/pi-coding-agent/src/modes/interactive/components/show-images-selector.ts +47 -0
  532. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +61 -0
  533. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts +27 -0
  534. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.ts +67 -0
  535. package/packages/pi-coding-agent/src/modes/interactive/components/thinking-selector.ts +66 -0
  536. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +49 -0
  537. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +303 -0
  538. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1457 -0
  539. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +345 -0
  540. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +84 -0
  541. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +1125 -0
  542. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.test.ts +28 -0
  543. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +154 -0
  544. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +76 -0
  545. package/packages/pi-coding-agent/src/modes/interactive/components/visual-truncate.ts +50 -0
  546. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +230 -0
  547. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1066 -0
  548. package/packages/pi-coding-agent/src/modes/interactive/controllers/extension-ui-controller.ts +68 -0
  549. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +373 -0
  550. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +157 -0
  551. package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +76 -0
  552. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-lifecycle.test.ts +63 -0
  553. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +73 -0
  554. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +40 -0
  555. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4418 -0
  556. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
  557. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +695 -0
  558. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  559. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +96 -0
  560. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +1130 -0
  561. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +388 -0
  562. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +68 -0
  563. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
  564. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +15 -0
  565. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.test.ts +39 -0
  566. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.ts +56 -0
  567. package/packages/pi-coding-agent/src/modes/print-mode.ts +106 -0
  568. package/packages/pi-coding-agent/src/modes/rpc/jsonl.ts +64 -0
  569. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +109 -0
  570. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +574 -0
  571. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +891 -0
  572. package/packages/pi-coding-agent/src/modes/rpc/rpc-protocol-v2.test.ts +971 -0
  573. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +4 -0
  574. package/packages/pi-coding-agent/src/modes/shared/command-context-actions.ts +53 -0
  575. package/packages/pi-coding-agent/src/resources/extensions/memory/index.ts +270 -0
  576. package/packages/pi-coding-agent/src/resources/extensions/memory/pipeline.ts +567 -0
  577. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  578. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +98 -0
  579. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +479 -0
  580. package/packages/pi-coding-agent/src/tests/path-display.test.ts +85 -0
  581. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
  582. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  583. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  584. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
  585. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  586. package/packages/pi-coding-agent/src/utils/changelog.ts +99 -0
  587. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +227 -0
  588. package/packages/pi-coding-agent/src/utils/clipboard-native.ts +11 -0
  589. package/packages/pi-coding-agent/src/utils/clipboard.ts +14 -0
  590. package/packages/pi-coding-agent/src/utils/error.ts +6 -0
  591. package/packages/pi-coding-agent/src/utils/frontmatter.ts +39 -0
  592. package/packages/pi-coding-agent/src/utils/git.ts +192 -0
  593. package/packages/pi-coding-agent/src/utils/image-convert.ts +28 -0
  594. package/packages/pi-coding-agent/src/utils/image-resize.ts +225 -0
  595. package/packages/pi-coding-agent/src/utils/mime.ts +30 -0
  596. package/packages/pi-coding-agent/src/utils/path-display.ts +36 -0
  597. package/packages/pi-coding-agent/src/utils/photon.ts +2 -0
  598. package/packages/pi-coding-agent/src/utils/shell.ts +212 -0
  599. package/packages/pi-coding-agent/src/utils/sleep.ts +18 -0
  600. package/packages/pi-coding-agent/src/utils/tools-manager.ts +286 -0
  601. package/packages/pi-coding-agent/tsconfig.json +28 -0
  602. package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts +2 -0
  603. package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts.map +1 -0
  604. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +206 -0
  605. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -0
  606. package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts +2 -0
  607. package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts.map +1 -0
  608. package/packages/pi-tui/dist/__tests__/fuzzy.test.js +100 -0
  609. package/packages/pi-tui/dist/__tests__/fuzzy.test.js.map +1 -0
  610. package/packages/pi-tui/dist/__tests__/keys.test.d.ts +2 -0
  611. package/packages/pi-tui/dist/__tests__/keys.test.d.ts.map +1 -0
  612. package/packages/pi-tui/dist/__tests__/keys.test.js +18 -0
  613. package/packages/pi-tui/dist/__tests__/keys.test.js.map +1 -0
  614. package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
  615. package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
  616. package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
  617. package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
  618. package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts +2 -0
  619. package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts.map +1 -0
  620. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +227 -0
  621. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -0
  622. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.d.ts +2 -0
  623. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.d.ts.map +1 -0
  624. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +80 -0
  625. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -0
  626. package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
  627. package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
  628. package/packages/pi-tui/dist/__tests__/style.test.js +129 -0
  629. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
  630. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  631. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  632. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  633. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  634. package/packages/pi-tui/dist/__tests__/tui.test.d.ts +2 -0
  635. package/packages/pi-tui/dist/__tests__/tui.test.d.ts.map +1 -0
  636. package/packages/pi-tui/dist/__tests__/tui.test.js +315 -0
  637. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -0
  638. package/packages/pi-tui/dist/__tests__/utils.test.d.ts +2 -0
  639. package/packages/pi-tui/dist/__tests__/utils.test.d.ts.map +1 -0
  640. package/packages/pi-tui/dist/__tests__/utils.test.js +17 -0
  641. package/packages/pi-tui/dist/__tests__/utils.test.js.map +1 -0
  642. package/packages/pi-tui/dist/autocomplete.d.ts +55 -0
  643. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -0
  644. package/packages/pi-tui/dist/autocomplete.js +540 -0
  645. package/packages/pi-tui/dist/autocomplete.js.map +1 -0
  646. package/packages/pi-tui/dist/components/__tests__/box.test.d.ts +2 -0
  647. package/packages/pi-tui/dist/components/__tests__/box.test.d.ts.map +1 -0
  648. package/packages/pi-tui/dist/components/__tests__/box.test.js +20 -0
  649. package/packages/pi-tui/dist/components/__tests__/box.test.js.map +1 -0
  650. package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.d.ts +2 -0
  651. package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.d.ts.map +1 -0
  652. package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.js +38 -0
  653. package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.js.map +1 -0
  654. package/packages/pi-tui/dist/components/__tests__/editor.test.d.ts +2 -0
  655. package/packages/pi-tui/dist/components/__tests__/editor.test.d.ts.map +1 -0
  656. package/packages/pi-tui/dist/components/__tests__/editor.test.js +89 -0
  657. package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -0
  658. package/packages/pi-tui/dist/components/__tests__/input.test.d.ts +2 -0
  659. package/packages/pi-tui/dist/components/__tests__/input.test.d.ts.map +1 -0
  660. package/packages/pi-tui/dist/components/__tests__/input.test.js +81 -0
  661. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -0
  662. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
  663. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
  664. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
  665. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
  666. package/packages/pi-tui/dist/components/__tests__/loader.test.d.ts +2 -0
  667. package/packages/pi-tui/dist/components/__tests__/loader.test.d.ts.map +1 -0
  668. package/packages/pi-tui/dist/components/__tests__/loader.test.js +81 -0
  669. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -0
  670. package/packages/pi-tui/dist/components/__tests__/markdown-list.test.d.ts +2 -0
  671. package/packages/pi-tui/dist/components/__tests__/markdown-list.test.d.ts.map +1 -0
  672. package/packages/pi-tui/dist/components/__tests__/markdown-list.test.js +36 -0
  673. package/packages/pi-tui/dist/components/__tests__/markdown-list.test.js.map +1 -0
  674. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.d.ts +2 -0
  675. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.d.ts.map +1 -0
  676. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +70 -0
  677. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -0
  678. package/packages/pi-tui/dist/components/__tests__/select-list.test.d.ts +2 -0
  679. package/packages/pi-tui/dist/components/__tests__/select-list.test.d.ts.map +1 -0
  680. package/packages/pi-tui/dist/components/__tests__/select-list.test.js +42 -0
  681. package/packages/pi-tui/dist/components/__tests__/select-list.test.js.map +1 -0
  682. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.d.ts +2 -0
  683. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.d.ts.map +1 -0
  684. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js +14 -0
  685. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js.map +1 -0
  686. package/packages/pi-tui/dist/components/box.d.ts +23 -0
  687. package/packages/pi-tui/dist/components/box.d.ts.map +1 -0
  688. package/packages/pi-tui/dist/components/box.js +111 -0
  689. package/packages/pi-tui/dist/components/box.js.map +1 -0
  690. package/packages/pi-tui/dist/components/cancellable-loader.d.ts +22 -0
  691. package/packages/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -0
  692. package/packages/pi-tui/dist/components/cancellable-loader.js +38 -0
  693. package/packages/pi-tui/dist/components/cancellable-loader.js.map +1 -0
  694. package/packages/pi-tui/dist/components/editor.d.ts +245 -0
  695. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -0
  696. package/packages/pi-tui/dist/components/editor.js +1825 -0
  697. package/packages/pi-tui/dist/components/editor.js.map +1 -0
  698. package/packages/pi-tui/dist/components/image.d.ts +37 -0
  699. package/packages/pi-tui/dist/components/image.d.ts.map +1 -0
  700. package/packages/pi-tui/dist/components/image.js +84 -0
  701. package/packages/pi-tui/dist/components/image.js.map +1 -0
  702. package/packages/pi-tui/dist/components/image.test.d.ts +6 -0
  703. package/packages/pi-tui/dist/components/image.test.d.ts.map +1 -0
  704. package/packages/pi-tui/dist/components/image.test.js +33 -0
  705. package/packages/pi-tui/dist/components/image.test.js.map +1 -0
  706. package/packages/pi-tui/dist/components/input.d.ts +42 -0
  707. package/packages/pi-tui/dist/components/input.d.ts.map +1 -0
  708. package/packages/pi-tui/dist/components/input.js +479 -0
  709. package/packages/pi-tui/dist/components/input.js.map +1 -0
  710. package/packages/pi-tui/dist/components/loader.d.ts +24 -0
  711. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -0
  712. package/packages/pi-tui/dist/components/loader.js +74 -0
  713. package/packages/pi-tui/dist/components/loader.js.map +1 -0
  714. package/packages/pi-tui/dist/components/markdown.d.ts +106 -0
  715. package/packages/pi-tui/dist/components/markdown.d.ts.map +1 -0
  716. package/packages/pi-tui/dist/components/markdown.js +668 -0
  717. package/packages/pi-tui/dist/components/markdown.js.map +1 -0
  718. package/packages/pi-tui/dist/components/select-list.d.ts +32 -0
  719. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -0
  720. package/packages/pi-tui/dist/components/select-list.js +155 -0
  721. package/packages/pi-tui/dist/components/select-list.js.map +1 -0
  722. package/packages/pi-tui/dist/components/settings-list.d.ts +50 -0
  723. package/packages/pi-tui/dist/components/settings-list.d.ts.map +1 -0
  724. package/packages/pi-tui/dist/components/settings-list.js +179 -0
  725. package/packages/pi-tui/dist/components/settings-list.js.map +1 -0
  726. package/packages/pi-tui/dist/components/spacer.d.ts +12 -0
  727. package/packages/pi-tui/dist/components/spacer.d.ts.map +1 -0
  728. package/packages/pi-tui/dist/components/spacer.js +22 -0
  729. package/packages/pi-tui/dist/components/spacer.js.map +1 -0
  730. package/packages/pi-tui/dist/components/text.d.ts +19 -0
  731. package/packages/pi-tui/dist/components/text.d.ts.map +1 -0
  732. package/packages/pi-tui/dist/components/text.js +83 -0
  733. package/packages/pi-tui/dist/components/text.js.map +1 -0
  734. package/packages/pi-tui/dist/components/truncated-text.d.ts +13 -0
  735. package/packages/pi-tui/dist/components/truncated-text.d.ts.map +1 -0
  736. package/packages/pi-tui/dist/components/truncated-text.js +54 -0
  737. package/packages/pi-tui/dist/components/truncated-text.js.map +1 -0
  738. package/packages/pi-tui/dist/editor-component.d.ts +41 -0
  739. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -0
  740. package/packages/pi-tui/dist/editor-component.js +2 -0
  741. package/packages/pi-tui/dist/editor-component.js.map +1 -0
  742. package/packages/pi-tui/dist/fuzzy.d.ts +16 -0
  743. package/packages/pi-tui/dist/fuzzy.d.ts.map +1 -0
  744. package/packages/pi-tui/dist/fuzzy.js +111 -0
  745. package/packages/pi-tui/dist/fuzzy.js.map +1 -0
  746. package/packages/pi-tui/dist/index.d.ts +24 -0
  747. package/packages/pi-tui/dist/index.d.ts.map +1 -0
  748. package/packages/pi-tui/dist/index.js +35 -0
  749. package/packages/pi-tui/dist/index.js.map +1 -0
  750. package/packages/pi-tui/dist/keybindings.d.ts +39 -0
  751. package/packages/pi-tui/dist/keybindings.d.ts.map +1 -0
  752. package/packages/pi-tui/dist/keybindings.js +116 -0
  753. package/packages/pi-tui/dist/keybindings.js.map +1 -0
  754. package/packages/pi-tui/dist/keys.d.ts +142 -0
  755. package/packages/pi-tui/dist/keys.d.ts.map +1 -0
  756. package/packages/pi-tui/dist/keys.js +994 -0
  757. package/packages/pi-tui/dist/keys.js.map +1 -0
  758. package/packages/pi-tui/dist/kill-ring.d.ts +28 -0
  759. package/packages/pi-tui/dist/kill-ring.d.ts.map +1 -0
  760. package/packages/pi-tui/dist/kill-ring.js +46 -0
  761. package/packages/pi-tui/dist/kill-ring.js.map +1 -0
  762. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  763. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  764. package/packages/pi-tui/dist/overlay-layout.js +314 -0
  765. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  766. package/packages/pi-tui/dist/stdin-buffer.d.ts +55 -0
  767. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -0
  768. package/packages/pi-tui/dist/stdin-buffer.js +342 -0
  769. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -0
  770. package/packages/pi-tui/dist/style.d.ts +52 -0
  771. package/packages/pi-tui/dist/style.d.ts.map +1 -0
  772. package/packages/pi-tui/dist/style.js +219 -0
  773. package/packages/pi-tui/dist/style.js.map +1 -0
  774. package/packages/pi-tui/dist/terminal-image.d.ts +68 -0
  775. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -0
  776. package/packages/pi-tui/dist/terminal-image.js +181 -0
  777. package/packages/pi-tui/dist/terminal-image.js.map +1 -0
  778. package/packages/pi-tui/dist/terminal.d.ts +89 -0
  779. package/packages/pi-tui/dist/terminal.d.ts.map +1 -0
  780. package/packages/pi-tui/dist/terminal.js +295 -0
  781. package/packages/pi-tui/dist/terminal.js.map +1 -0
  782. package/packages/pi-tui/dist/tui.d.ts +213 -0
  783. package/packages/pi-tui/dist/tui.d.ts.map +1 -0
  784. package/packages/pi-tui/dist/tui.js +978 -0
  785. package/packages/pi-tui/dist/tui.js.map +1 -0
  786. package/packages/pi-tui/dist/undo-stack.d.ts +17 -0
  787. package/packages/pi-tui/dist/undo-stack.d.ts.map +1 -0
  788. package/packages/pi-tui/dist/undo-stack.js +27 -0
  789. package/packages/pi-tui/dist/undo-stack.js.map +1 -0
  790. package/packages/pi-tui/dist/utils.d.ts +72 -0
  791. package/packages/pi-tui/dist/utils.d.ts.map +1 -0
  792. package/packages/pi-tui/dist/utils.js +120 -0
  793. package/packages/pi-tui/dist/utils.js.map +1 -0
  794. package/packages/pi-tui/package.json +35 -0
  795. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +264 -0
  796. package/packages/pi-tui/src/__tests__/fuzzy.test.ts +120 -0
  797. package/packages/pi-tui/src/__tests__/keys.test.ts +21 -0
  798. package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
  799. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +266 -0
  800. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +99 -0
  801. package/packages/pi-tui/src/__tests__/style.test.ts +156 -0
  802. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  803. package/packages/pi-tui/src/__tests__/tui.test.ts +377 -0
  804. package/packages/pi-tui/src/__tests__/utils.test.ts +22 -0
  805. package/packages/pi-tui/src/autocomplete.ts +675 -0
  806. package/packages/pi-tui/src/components/__tests__/box.test.ts +25 -0
  807. package/packages/pi-tui/src/components/__tests__/cancellable-loader.test.ts +45 -0
  808. package/packages/pi-tui/src/components/__tests__/editor.test.ts +119 -0
  809. package/packages/pi-tui/src/components/__tests__/input.test.ts +111 -0
  810. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
  811. package/packages/pi-tui/src/components/__tests__/loader.test.ts +122 -0
  812. package/packages/pi-tui/src/components/__tests__/markdown-list.test.ts +40 -0
  813. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +82 -0
  814. package/packages/pi-tui/src/components/__tests__/select-list.test.ts +70 -0
  815. package/packages/pi-tui/src/components/__tests__/truncated-text.test.ts +17 -0
  816. package/packages/pi-tui/src/components/box.ts +150 -0
  817. package/packages/pi-tui/src/components/cancellable-loader.ts +42 -0
  818. package/packages/pi-tui/src/components/editor.ts +2196 -0
  819. package/packages/pi-tui/src/components/image.test.ts +41 -0
  820. package/packages/pi-tui/src/components/image.ts +131 -0
  821. package/packages/pi-tui/src/components/input.ts +558 -0
  822. package/packages/pi-tui/src/components/loader.ts +83 -0
  823. package/packages/pi-tui/src/components/markdown.ts +842 -0
  824. package/packages/pi-tui/src/components/select-list.ts +194 -0
  825. package/packages/pi-tui/src/components/settings-list.ts +251 -0
  826. package/packages/pi-tui/src/components/spacer.ts +28 -0
  827. package/packages/pi-tui/src/components/text.ts +107 -0
  828. package/packages/pi-tui/src/components/truncated-text.ts +72 -0
  829. package/packages/pi-tui/src/editor-component.ts +77 -0
  830. package/packages/pi-tui/src/fuzzy.ts +138 -0
  831. package/packages/pi-tui/src/index.ts +98 -0
  832. package/packages/pi-tui/src/keybindings.ts +189 -0
  833. package/packages/pi-tui/src/keys.ts +1196 -0
  834. package/packages/pi-tui/src/kill-ring.ts +46 -0
  835. package/packages/pi-tui/src/overlay-layout.ts +408 -0
  836. package/packages/pi-tui/src/stdin-buffer.ts +419 -0
  837. package/packages/pi-tui/src/style.ts +295 -0
  838. package/packages/pi-tui/src/terminal-image.ts +260 -0
  839. package/packages/pi-tui/src/terminal.ts +377 -0
  840. package/packages/pi-tui/src/tui.ts +1182 -0
  841. package/packages/pi-tui/src/undo-stack.ts +28 -0
  842. package/packages/pi-tui/src/utils.ts +154 -0
  843. package/packages/pi-tui/tsconfig.json +28 -0
  844. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  845. package/packages/rpc-client/README.md +132 -0
  846. package/packages/rpc-client/examples/basic-usage.ts +13 -0
  847. package/packages/rpc-client/package.json +42 -0
  848. package/packages/rpc-client/src/index.ts +10 -0
  849. package/packages/rpc-client/src/jsonl.ts +64 -0
  850. package/packages/rpc-client/src/rpc-client.test.ts +625 -0
  851. package/packages/rpc-client/src/rpc-client.ts +663 -0
  852. package/packages/rpc-client/src/rpc-types.ts +4 -0
  853. package/packages/rpc-client/tsconfig.examples.json +17 -0
  854. package/packages/rpc-client/tsconfig.json +25 -0
  855. package/pkg/dist/core/export-html/template.css +971 -0
  856. package/pkg/dist/core/export-html/template.html +54 -0
  857. package/pkg/dist/core/export-html/template.js +1583 -0
  858. package/pkg/dist/core/export-html/vendor/highlight.min.js +1213 -0
  859. package/pkg/dist/core/export-html/vendor/marked.min.js +6 -0
  860. package/pkg/package.json +8 -0
  861. package/scripts/ensure-workspace-builds.cjs +123 -0
  862. package/scripts/install.js +526 -0
  863. package/scripts/lib/workspace-manifest.cjs +86 -0
  864. package/scripts/link-workspace-packages.cjs +82 -0
  865. package/scripts/postinstall.js +11 -0
  866. package/src/resources/GSD-WORKFLOW.md +664 -0
  867. package/src/resources/agents/debugger.md +58 -0
  868. package/src/resources/agents/doc-writer.md +43 -0
  869. package/src/resources/agents/git-ops.md +56 -0
  870. package/src/resources/agents/javascript-pro.md +55 -0
  871. package/src/resources/agents/planner.md +55 -0
  872. package/src/resources/agents/refactorer.md +47 -0
  873. package/src/resources/agents/researcher.md +29 -0
  874. package/src/resources/agents/reviewer.md +48 -0
  875. package/src/resources/agents/scout.md +56 -0
  876. package/src/resources/agents/security.md +59 -0
  877. package/src/resources/agents/tester.md +50 -0
  878. package/src/resources/agents/typescript-pro.md +61 -0
  879. package/src/resources/agents/worker.md +31 -0
  880. package/src/resources/extensions/ask-user-questions.ts +478 -0
  881. package/src/resources/extensions/async-jobs/async-bash-timeout.test.ts +122 -0
  882. package/src/resources/extensions/async-jobs/async-bash-tool.ts +263 -0
  883. package/src/resources/extensions/async-jobs/await-tool.test.ts +200 -0
  884. package/src/resources/extensions/async-jobs/await-tool.ts +136 -0
  885. package/src/resources/extensions/async-jobs/cancel-job-tool.ts +35 -0
  886. package/src/resources/extensions/async-jobs/extension-manifest.json +13 -0
  887. package/src/resources/extensions/async-jobs/index.ts +153 -0
  888. package/src/resources/extensions/async-jobs/job-manager.ts +242 -0
  889. package/src/resources/extensions/aws-auth/index.ts +144 -0
  890. package/src/resources/extensions/bg-shell/bg-shell-command.ts +219 -0
  891. package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +413 -0
  892. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +985 -0
  893. package/src/resources/extensions/bg-shell/extension-manifest.json +14 -0
  894. package/src/resources/extensions/bg-shell/index.ts +54 -0
  895. package/src/resources/extensions/bg-shell/interaction.ts +200 -0
  896. package/src/resources/extensions/bg-shell/output-formatter.ts +262 -0
  897. package/src/resources/extensions/bg-shell/overlay.ts +441 -0
  898. package/src/resources/extensions/bg-shell/process-manager.ts +469 -0
  899. package/src/resources/extensions/bg-shell/readiness-detector.ts +126 -0
  900. package/src/resources/extensions/bg-shell/types.ts +291 -0
  901. package/src/resources/extensions/bg-shell/utilities.ts +93 -0
  902. package/src/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
  903. package/src/resources/extensions/browser-tools/capture.ts +229 -0
  904. package/src/resources/extensions/browser-tools/core.ts +1196 -0
  905. package/src/resources/extensions/browser-tools/evaluate-helpers.ts +184 -0
  906. package/src/resources/extensions/browser-tools/extension-manifest.json +37 -0
  907. package/src/resources/extensions/browser-tools/index.ts +163 -0
  908. package/src/resources/extensions/browser-tools/lifecycle.ts +270 -0
  909. package/src/resources/extensions/browser-tools/package.json +24 -0
  910. package/src/resources/extensions/browser-tools/refs.ts +264 -0
  911. package/src/resources/extensions/browser-tools/settle.ts +197 -0
  912. package/src/resources/extensions/browser-tools/state.ts +408 -0
  913. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +601 -0
  914. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +651 -0
  915. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +91 -0
  916. package/src/resources/extensions/browser-tools/tools/action-cache.ts +216 -0
  917. package/src/resources/extensions/browser-tools/tools/assertions.ts +342 -0
  918. package/src/resources/extensions/browser-tools/tools/codegen.ts +274 -0
  919. package/src/resources/extensions/browser-tools/tools/device.ts +183 -0
  920. package/src/resources/extensions/browser-tools/tools/extract.ts +229 -0
  921. package/src/resources/extensions/browser-tools/tools/forms.ts +805 -0
  922. package/src/resources/extensions/browser-tools/tools/injection-detect.ts +221 -0
  923. package/src/resources/extensions/browser-tools/tools/inspection.ts +492 -0
  924. package/src/resources/extensions/browser-tools/tools/intent.ts +629 -0
  925. package/src/resources/extensions/browser-tools/tools/interaction.ts +865 -0
  926. package/src/resources/extensions/browser-tools/tools/navigation.ts +232 -0
  927. package/src/resources/extensions/browser-tools/tools/network-mock.ts +244 -0
  928. package/src/resources/extensions/browser-tools/tools/pages.ts +303 -0
  929. package/src/resources/extensions/browser-tools/tools/pdf.ts +92 -0
  930. package/src/resources/extensions/browser-tools/tools/refs.ts +541 -0
  931. package/src/resources/extensions/browser-tools/tools/screenshot.ts +102 -0
  932. package/src/resources/extensions/browser-tools/tools/session.ts +400 -0
  933. package/src/resources/extensions/browser-tools/tools/state-persistence.ts +202 -0
  934. package/src/resources/extensions/browser-tools/tools/verify.ts +117 -0
  935. package/src/resources/extensions/browser-tools/tools/visual-diff.ts +209 -0
  936. package/src/resources/extensions/browser-tools/tools/wait.ts +247 -0
  937. package/src/resources/extensions/browser-tools/tools/zoom.ts +105 -0
  938. package/src/resources/extensions/browser-tools/utils.ts +660 -0
  939. package/src/resources/extensions/claude-code-cli/index.ts +28 -0
  940. package/src/resources/extensions/claude-code-cli/models.ts +51 -0
  941. package/src/resources/extensions/claude-code-cli/package.json +11 -0
  942. package/src/resources/extensions/claude-code-cli/partial-builder.ts +305 -0
  943. package/src/resources/extensions/claude-code-cli/readiness.ts +242 -0
  944. package/src/resources/extensions/claude-code-cli/sdk-types.ts +149 -0
  945. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1981 -0
  946. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +256 -0
  947. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +2380 -0
  948. package/src/resources/extensions/cmux/index.ts +479 -0
  949. package/src/resources/extensions/cmux/package.json +7 -0
  950. package/src/resources/extensions/context7/extension-manifest.json +12 -0
  951. package/src/resources/extensions/context7/index.ts +435 -0
  952. package/src/resources/extensions/context7/package.json +11 -0
  953. package/src/resources/extensions/get-secrets-from-user.ts +608 -0
  954. package/src/resources/extensions/github-sync/cli.ts +367 -0
  955. package/src/resources/extensions/github-sync/index.ts +93 -0
  956. package/src/resources/extensions/github-sync/mapping.ts +81 -0
  957. package/src/resources/extensions/github-sync/sync.ts +594 -0
  958. package/src/resources/extensions/github-sync/templates.ts +339 -0
  959. package/src/resources/extensions/github-sync/tests/cli.test.ts +89 -0
  960. package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +43 -0
  961. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
  962. package/src/resources/extensions/github-sync/tests/mapping.test.ts +104 -0
  963. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +14 -0
  964. package/src/resources/extensions/github-sync/tests/templates.test.ts +209 -0
  965. package/src/resources/extensions/github-sync/types.ts +47 -0
  966. package/src/resources/extensions/google-search/extension-manifest.json +13 -0
  967. package/src/resources/extensions/google-search/index.ts +6 -0
  968. package/src/resources/extensions/google-search/package.json +9 -0
  969. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  970. package/src/resources/extensions/gsd/activity-log.ts +184 -0
  971. package/src/resources/extensions/gsd/atomic-write.ts +185 -0
  972. package/src/resources/extensions/gsd/auto/contracts.ts +159 -0
  973. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  974. package/src/resources/extensions/gsd/auto/detect-stuck.ts +138 -0
  975. package/src/resources/extensions/gsd/auto/finalize-timeout.ts +49 -0
  976. package/src/resources/extensions/gsd/auto/infra-errors.ts +92 -0
  977. package/src/resources/extensions/gsd/auto/lease-conflict-notice.ts +62 -0
  978. package/src/resources/extensions/gsd/auto/loop-deps.ts +302 -0
  979. package/src/resources/extensions/gsd/auto/loop.ts +1448 -0
  980. package/src/resources/extensions/gsd/auto/orchestrator.ts +417 -0
  981. package/src/resources/extensions/gsd/auto/phases.ts +3014 -0
  982. package/src/resources/extensions/gsd/auto/resolve.ts +176 -0
  983. package/src/resources/extensions/gsd/auto/run-unit.ts +306 -0
  984. package/src/resources/extensions/gsd/auto/session.ts +427 -0
  985. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  986. package/src/resources/extensions/gsd/auto/types.ts +130 -0
  987. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +19 -0
  988. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  989. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  990. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  991. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  992. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  993. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  994. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  995. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +179 -0
  996. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  997. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  998. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  999. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +542 -0
  1000. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +71 -0
  1001. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  1002. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  1003. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  1004. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  1005. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  1006. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  1007. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +51 -0
  1008. package/src/resources/extensions/gsd/auto-artifact-paths.ts +218 -0
  1009. package/src/resources/extensions/gsd/auto-budget.ts +57 -0
  1010. package/src/resources/extensions/gsd/auto-dashboard.ts +1239 -0
  1011. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +311 -0
  1012. package/src/resources/extensions/gsd/auto-dispatch.ts +1827 -0
  1013. package/src/resources/extensions/gsd/auto-model-selection.ts +755 -0
  1014. package/src/resources/extensions/gsd/auto-post-unit.ts +2375 -0
  1015. package/src/resources/extensions/gsd/auto-prompts.ts +4108 -0
  1016. package/src/resources/extensions/gsd/auto-recovery.ts +1217 -0
  1017. package/src/resources/extensions/gsd/auto-runtime-state.ts +63 -0
  1018. package/src/resources/extensions/gsd/auto-start.ts +1561 -0
  1019. package/src/resources/extensions/gsd/auto-status-message.ts +45 -0
  1020. package/src/resources/extensions/gsd/auto-supervisor.ts +86 -0
  1021. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +308 -0
  1022. package/src/resources/extensions/gsd/auto-timers.ts +366 -0
  1023. package/src/resources/extensions/gsd/auto-tool-tracking.ts +156 -0
  1024. package/src/resources/extensions/gsd/auto-unit-closeout.ts +138 -0
  1025. package/src/resources/extensions/gsd/auto-utils.ts +25 -0
  1026. package/src/resources/extensions/gsd/auto-verification.ts +955 -0
  1027. package/src/resources/extensions/gsd/auto-worktree-repair.ts +194 -0
  1028. package/src/resources/extensions/gsd/auto-worktree.ts +2570 -0
  1029. package/src/resources/extensions/gsd/auto.ts +3167 -0
  1030. package/src/resources/extensions/gsd/blocked-models.ts +98 -0
  1031. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +685 -0
  1032. package/src/resources/extensions/gsd/bootstrap/crash-log.ts +32 -0
  1033. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1408 -0
  1034. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +144 -0
  1035. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +123 -0
  1036. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +67 -0
  1037. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +166 -0
  1038. package/src/resources/extensions/gsd/bootstrap/notify-interceptor.ts +34 -0
  1039. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +61 -0
  1040. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +68 -0
  1041. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +154 -0
  1042. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +1203 -0
  1043. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +101 -0
  1044. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +61 -0
  1045. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +32 -0
  1046. package/src/resources/extensions/gsd/bootstrap/system-context.ts +770 -0
  1047. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +103 -0
  1048. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
  1049. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +103 -0
  1050. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1059 -0
  1051. package/src/resources/extensions/gsd/branch-patterns.ts +16 -0
  1052. package/src/resources/extensions/gsd/browser-evidence.ts +29 -0
  1053. package/src/resources/extensions/gsd/cache.ts +40 -0
  1054. package/src/resources/extensions/gsd/captures.ts +571 -0
  1055. package/src/resources/extensions/gsd/changelog.ts +213 -0
  1056. package/src/resources/extensions/gsd/claude-import.ts +705 -0
  1057. package/src/resources/extensions/gsd/clean-root-preflight.ts +564 -0
  1058. package/src/resources/extensions/gsd/closeout-recovery.ts +290 -0
  1059. package/src/resources/extensions/gsd/codebase-generator.ts +616 -0
  1060. package/src/resources/extensions/gsd/collision-diagnostics.ts +332 -0
  1061. package/src/resources/extensions/gsd/commands/catalog.ts +577 -0
  1062. package/src/resources/extensions/gsd/commands/context.ts +159 -0
  1063. package/src/resources/extensions/gsd/commands/dispatcher.ts +101 -0
  1064. package/src/resources/extensions/gsd/commands/handlers/auto.ts +179 -0
  1065. package/src/resources/extensions/gsd/commands/handlers/core.ts +597 -0
  1066. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  1067. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +144 -0
  1068. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
  1069. package/src/resources/extensions/gsd/commands/handlers/ops.ts +359 -0
  1070. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +147 -0
  1071. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +691 -0
  1072. package/src/resources/extensions/gsd/commands/index.ts +20 -0
  1073. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  1074. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  1075. package/src/resources/extensions/gsd/commands-bootstrap.ts +280 -0
  1076. package/src/resources/extensions/gsd/commands-closeout.ts +109 -0
  1077. package/src/resources/extensions/gsd/commands-cmux.ts +182 -0
  1078. package/src/resources/extensions/gsd/commands-codebase.ts +198 -0
  1079. package/src/resources/extensions/gsd/commands-config.ts +119 -0
  1080. package/src/resources/extensions/gsd/commands-debug.ts +510 -0
  1081. package/src/resources/extensions/gsd/commands-do.ts +110 -0
  1082. package/src/resources/extensions/gsd/commands-eval-review.ts +716 -0
  1083. package/src/resources/extensions/gsd/commands-extensions.ts +1088 -0
  1084. package/src/resources/extensions/gsd/commands-extract-learnings.ts +493 -0
  1085. package/src/resources/extensions/gsd/commands-handlers.ts +510 -0
  1086. package/src/resources/extensions/gsd/commands-inspect.ts +99 -0
  1087. package/src/resources/extensions/gsd/commands-logs.ts +537 -0
  1088. package/src/resources/extensions/gsd/commands-maintenance.ts +544 -0
  1089. package/src/resources/extensions/gsd/commands-mcp-status.ts +402 -0
  1090. package/src/resources/extensions/gsd/commands-memory.ts +551 -0
  1091. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  1092. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1848 -0
  1093. package/src/resources/extensions/gsd/commands-rate.ts +55 -0
  1094. package/src/resources/extensions/gsd/commands-scan.ts +126 -0
  1095. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  1096. package/src/resources/extensions/gsd/commands-ship.ts +292 -0
  1097. package/src/resources/extensions/gsd/commands-verdict.ts +229 -0
  1098. package/src/resources/extensions/gsd/commands-workflow-templates.ts +684 -0
  1099. package/src/resources/extensions/gsd/commands-worktree.ts +383 -0
  1100. package/src/resources/extensions/gsd/commands.ts +17 -0
  1101. package/src/resources/extensions/gsd/compaction-snapshot.ts +165 -0
  1102. package/src/resources/extensions/gsd/complexity-classifier.ts +331 -0
  1103. package/src/resources/extensions/gsd/component-loader.ts +592 -0
  1104. package/src/resources/extensions/gsd/component-types.ts +362 -0
  1105. package/src/resources/extensions/gsd/config-overlay.ts +331 -0
  1106. package/src/resources/extensions/gsd/constants.ts +69 -0
  1107. package/src/resources/extensions/gsd/context-budget.ts +309 -0
  1108. package/src/resources/extensions/gsd/context-injector.ts +100 -0
  1109. package/src/resources/extensions/gsd/context-masker.ts +74 -0
  1110. package/src/resources/extensions/gsd/context-store.ts +497 -0
  1111. package/src/resources/extensions/gsd/crash-recovery.ts +427 -0
  1112. package/src/resources/extensions/gsd/custom-execution-policy.ts +74 -0
  1113. package/src/resources/extensions/gsd/custom-verification.ts +183 -0
  1114. package/src/resources/extensions/gsd/custom-workflow-engine.ts +274 -0
  1115. package/src/resources/extensions/gsd/dashboard-overlay.ts +684 -0
  1116. package/src/resources/extensions/gsd/db/auto-workers.ts +310 -0
  1117. package/src/resources/extensions/gsd/db/command-queue.ts +149 -0
  1118. package/src/resources/extensions/gsd/db/milestone-leases.ts +300 -0
  1119. package/src/resources/extensions/gsd/db/runtime-kv.ts +127 -0
  1120. package/src/resources/extensions/gsd/db/unit-dispatches.ts +554 -0
  1121. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  1122. package/src/resources/extensions/gsd/db-base-schema.ts +387 -0
  1123. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  1124. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  1125. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  1126. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  1127. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  1128. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  1129. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  1130. package/src/resources/extensions/gsd/db-migration-steps.ts +464 -0
  1131. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  1132. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  1133. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  1134. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  1135. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  1136. package/src/resources/extensions/gsd/db-task-slice-rows.ts +150 -0
  1137. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  1138. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  1139. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  1140. package/src/resources/extensions/gsd/db-writer.ts +966 -0
  1141. package/src/resources/extensions/gsd/debug-logger.ts +178 -0
  1142. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  1143. package/src/resources/extensions/gsd/deep-project-setup-policy.ts +257 -0
  1144. package/src/resources/extensions/gsd/definition-io.ts +18 -0
  1145. package/src/resources/extensions/gsd/definition-loader.ts +469 -0
  1146. package/src/resources/extensions/gsd/delegation-policy.ts +197 -0
  1147. package/src/resources/extensions/gsd/detection.ts +1339 -0
  1148. package/src/resources/extensions/gsd/dev-execution-policy.ts +51 -0
  1149. package/src/resources/extensions/gsd/dev-workflow-engine.ts +110 -0
  1150. package/src/resources/extensions/gsd/diff-context.ts +214 -0
  1151. package/src/resources/extensions/gsd/dispatch-guard.ts +211 -0
  1152. package/src/resources/extensions/gsd/docs/COORDINATION.md +42 -0
  1153. package/src/resources/extensions/gsd/docs/claude-marketplace-import.md +214 -0
  1154. package/src/resources/extensions/gsd/docs/preferences-reference.md +755 -0
  1155. package/src/resources/extensions/gsd/doctor-checks.ts +5 -0
  1156. package/src/resources/extensions/gsd/doctor-engine-checks.ts +196 -0
  1157. package/src/resources/extensions/gsd/doctor-environment.ts +643 -0
  1158. package/src/resources/extensions/gsd/doctor-format.ts +99 -0
  1159. package/src/resources/extensions/gsd/doctor-git-checks.ts +622 -0
  1160. package/src/resources/extensions/gsd/doctor-global-checks.ts +84 -0
  1161. package/src/resources/extensions/gsd/doctor-proactive.ts +488 -0
  1162. package/src/resources/extensions/gsd/doctor-providers.ts +523 -0
  1163. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +793 -0
  1164. package/src/resources/extensions/gsd/doctor-types.ts +134 -0
  1165. package/src/resources/extensions/gsd/doctor.ts +802 -0
  1166. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +233 -0
  1167. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  1168. package/src/resources/extensions/gsd/engine-resolver.ts +57 -0
  1169. package/src/resources/extensions/gsd/engine-types.ts +71 -0
  1170. package/src/resources/extensions/gsd/env-utils.ts +31 -0
  1171. package/src/resources/extensions/gsd/error-classifier.ts +188 -0
  1172. package/src/resources/extensions/gsd/error-utils.ts +6 -0
  1173. package/src/resources/extensions/gsd/errors.ts +29 -0
  1174. package/src/resources/extensions/gsd/escalation.ts +369 -0
  1175. package/src/resources/extensions/gsd/eval-review-schema.ts +243 -0
  1176. package/src/resources/extensions/gsd/exec-history.ts +153 -0
  1177. package/src/resources/extensions/gsd/exec-sandbox.ts +333 -0
  1178. package/src/resources/extensions/gsd/execution-policy.ts +43 -0
  1179. package/src/resources/extensions/gsd/exit-command.ts +30 -0
  1180. package/src/resources/extensions/gsd/export-html.ts +1008 -0
  1181. package/src/resources/extensions/gsd/export.ts +318 -0
  1182. package/src/resources/extensions/gsd/extension-manifest.json +33 -0
  1183. package/src/resources/extensions/gsd/file-lock.ts +132 -0
  1184. package/src/resources/extensions/gsd/files.ts +1009 -0
  1185. package/src/resources/extensions/gsd/forensics.ts +1342 -0
  1186. package/src/resources/extensions/gsd/fresh-run-ui.ts +43 -0
  1187. package/src/resources/extensions/gsd/gate-registry.ts +251 -0
  1188. package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
  1189. package/src/resources/extensions/gsd/git-constants.ts +41 -0
  1190. package/src/resources/extensions/gsd/git-self-heal.ts +158 -0
  1191. package/src/resources/extensions/gsd/git-service.ts +1412 -0
  1192. package/src/resources/extensions/gsd/gitignore.ts +336 -0
  1193. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  1194. package/src/resources/extensions/gsd/graph.ts +349 -0
  1195. package/src/resources/extensions/gsd/gsd-command-home.ts +209 -0
  1196. package/src/resources/extensions/gsd/gsd-db.ts +3190 -0
  1197. package/src/resources/extensions/gsd/gsd-home.ts +30 -0
  1198. package/src/resources/extensions/gsd/guided-flow-queue.ts +443 -0
  1199. package/src/resources/extensions/gsd/guided-flow.ts +2887 -0
  1200. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  1201. package/src/resources/extensions/gsd/health-widget-core.ts +140 -0
  1202. package/src/resources/extensions/gsd/health-widget.ts +148 -0
  1203. package/src/resources/extensions/gsd/history.ts +144 -0
  1204. package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
  1205. package/src/resources/extensions/gsd/index.ts +37 -0
  1206. package/src/resources/extensions/gsd/init-wizard.ts +704 -0
  1207. package/src/resources/extensions/gsd/interrupted-session.ts +269 -0
  1208. package/src/resources/extensions/gsd/journal.ts +218 -0
  1209. package/src/resources/extensions/gsd/json-persistence.ts +78 -0
  1210. package/src/resources/extensions/gsd/jsonl-utils.ts +21 -0
  1211. package/src/resources/extensions/gsd/key-manager.ts +1018 -0
  1212. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  1213. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  1214. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  1215. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  1216. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  1217. package/src/resources/extensions/gsd/markdown-renderer.ts +982 -0
  1218. package/src/resources/extensions/gsd/marketplace-discovery.ts +508 -0
  1219. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  1220. package/src/resources/extensions/gsd/mcp-project-config.ts +128 -0
  1221. package/src/resources/extensions/gsd/md-importer.ts +748 -0
  1222. package/src/resources/extensions/gsd/memory-backfill.ts +212 -0
  1223. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  1224. package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
  1225. package/src/resources/extensions/gsd/memory-extractor.ts +434 -0
  1226. package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
  1227. package/src/resources/extensions/gsd/memory-relations.ts +240 -0
  1228. package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
  1229. package/src/resources/extensions/gsd/memory-store.ts +909 -0
  1230. package/src/resources/extensions/gsd/metrics.ts +1040 -0
  1231. package/src/resources/extensions/gsd/migrate/audit.ts +219 -0
  1232. package/src/resources/extensions/gsd/migrate/command.ts +341 -0
  1233. package/src/resources/extensions/gsd/migrate/index.ts +44 -0
  1234. package/src/resources/extensions/gsd/migrate/parser.ts +323 -0
  1235. package/src/resources/extensions/gsd/migrate/parsers.ts +676 -0
  1236. package/src/resources/extensions/gsd/migrate/preview.ts +58 -0
  1237. package/src/resources/extensions/gsd/migrate/safety.ts +149 -0
  1238. package/src/resources/extensions/gsd/migrate/transformer.ts +411 -0
  1239. package/src/resources/extensions/gsd/migrate/types.ts +370 -0
  1240. package/src/resources/extensions/gsd/migrate/validator.ts +55 -0
  1241. package/src/resources/extensions/gsd/migrate/writer.ts +592 -0
  1242. package/src/resources/extensions/gsd/migrate-external.ts +215 -0
  1243. package/src/resources/extensions/gsd/migration-auto-check.ts +121 -0
  1244. package/src/resources/extensions/gsd/milestone-actions.ts +193 -0
  1245. package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
  1246. package/src/resources/extensions/gsd/milestone-id-utils.ts +32 -0
  1247. package/src/resources/extensions/gsd/milestone-ids.ts +136 -0
  1248. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +373 -0
  1249. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  1250. package/src/resources/extensions/gsd/milestone-validation-gates.ts +53 -0
  1251. package/src/resources/extensions/gsd/model-cost-table.ts +89 -0
  1252. package/src/resources/extensions/gsd/model-router.ts +844 -0
  1253. package/src/resources/extensions/gsd/namespaced-registry.ts +467 -0
  1254. package/src/resources/extensions/gsd/namespaced-resolver.ts +307 -0
  1255. package/src/resources/extensions/gsd/native-git-bridge.ts +1447 -0
  1256. package/src/resources/extensions/gsd/native-parser-bridge.ts +267 -0
  1257. package/src/resources/extensions/gsd/notification-overlay.ts +322 -0
  1258. package/src/resources/extensions/gsd/notification-store.ts +342 -0
  1259. package/src/resources/extensions/gsd/notification-widget.ts +69 -0
  1260. package/src/resources/extensions/gsd/notifications.ts +153 -0
  1261. package/src/resources/extensions/gsd/observability-validator.ts +456 -0
  1262. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  1263. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  1264. package/src/resources/extensions/gsd/package.json +11 -0
  1265. package/src/resources/extensions/gsd/parallel-eligibility.ts +248 -0
  1266. package/src/resources/extensions/gsd/parallel-merge.ts +270 -0
  1267. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +507 -0
  1268. package/src/resources/extensions/gsd/parallel-orchestrator.ts +1077 -0
  1269. package/src/resources/extensions/gsd/parsers-legacy.ts +292 -0
  1270. package/src/resources/extensions/gsd/paths.ts +722 -0
  1271. package/src/resources/extensions/gsd/pending-auto-start.ts +81 -0
  1272. package/src/resources/extensions/gsd/phase-anchor.ts +71 -0
  1273. package/src/resources/extensions/gsd/planning-depth.ts +137 -0
  1274. package/src/resources/extensions/gsd/planning-path-scope.ts +45 -0
  1275. package/src/resources/extensions/gsd/plugin-importer.ts +411 -0
  1276. package/src/resources/extensions/gsd/post-execution-checks.ts +665 -0
  1277. package/src/resources/extensions/gsd/post-unit-hooks.ts +86 -0
  1278. package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
  1279. package/src/resources/extensions/gsd/pre-execution-checks.ts +890 -0
  1280. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  1281. package/src/resources/extensions/gsd/preferences-models.ts +572 -0
  1282. package/src/resources/extensions/gsd/preferences-skills.ts +147 -0
  1283. package/src/resources/extensions/gsd/preferences-types.ts +579 -0
  1284. package/src/resources/extensions/gsd/preferences-validation.ts +1453 -0
  1285. package/src/resources/extensions/gsd/preferences.ts +697 -0
  1286. package/src/resources/extensions/gsd/preparation.ts +1419 -0
  1287. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  1288. package/src/resources/extensions/gsd/progress-score.ts +161 -0
  1289. package/src/resources/extensions/gsd/project-research-policy.ts +259 -0
  1290. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +217 -0
  1291. package/src/resources/extensions/gsd/prompt-loader.ts +248 -0
  1292. package/src/resources/extensions/gsd/prompt-ordering.ts +200 -0
  1293. package/src/resources/extensions/gsd/prompt-validation.ts +157 -0
  1294. package/src/resources/extensions/gsd/prompts/add-tests.md +36 -0
  1295. package/src/resources/extensions/gsd/prompts/complete-milestone.md +91 -0
  1296. package/src/resources/extensions/gsd/prompts/complete-slice.md +49 -0
  1297. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +27 -0
  1298. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  1299. package/src/resources/extensions/gsd/prompts/discuss-headless.md +252 -0
  1300. package/src/resources/extensions/gsd/prompts/discuss.md +368 -0
  1301. package/src/resources/extensions/gsd/prompts/doctor-heal.md +31 -0
  1302. package/src/resources/extensions/gsd/prompts/execute-task.md +73 -0
  1303. package/src/resources/extensions/gsd/prompts/forensics.md +155 -0
  1304. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
  1305. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +116 -0
  1306. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +113 -0
  1307. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +99 -0
  1308. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +74 -0
  1309. package/src/resources/extensions/gsd/prompts/guided-research-decision.md +70 -0
  1310. package/src/resources/extensions/gsd/prompts/guided-research-project.md +102 -0
  1311. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +15 -0
  1312. package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
  1313. package/src/resources/extensions/gsd/prompts/guided-workflow-preferences.md +68 -0
  1314. package/src/resources/extensions/gsd/prompts/heal-skill.md +45 -0
  1315. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +28 -0
  1316. package/src/resources/extensions/gsd/prompts/plan-milestone.md +114 -0
  1317. package/src/resources/extensions/gsd/prompts/plan-slice.md +55 -0
  1318. package/src/resources/extensions/gsd/prompts/queue.md +128 -0
  1319. package/src/resources/extensions/gsd/prompts/quick-task.md +40 -0
  1320. package/src/resources/extensions/gsd/prompts/reactive-execute.md +44 -0
  1321. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +68 -0
  1322. package/src/resources/extensions/gsd/prompts/refine-slice.md +79 -0
  1323. package/src/resources/extensions/gsd/prompts/replan-slice.md +39 -0
  1324. package/src/resources/extensions/gsd/prompts/research-milestone.md +47 -0
  1325. package/src/resources/extensions/gsd/prompts/research-slice.md +58 -0
  1326. package/src/resources/extensions/gsd/prompts/rethink.md +95 -0
  1327. package/src/resources/extensions/gsd/prompts/review-migration.md +66 -0
  1328. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +33 -0
  1329. package/src/resources/extensions/gsd/prompts/run-uat.md +89 -0
  1330. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  1331. package/src/resources/extensions/gsd/prompts/system.md +180 -0
  1332. package/src/resources/extensions/gsd/prompts/triage-captures.md +68 -0
  1333. package/src/resources/extensions/gsd/prompts/validate-milestone.md +88 -0
  1334. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  1335. package/src/resources/extensions/gsd/prompts/workflow-start.md +28 -0
  1336. package/src/resources/extensions/gsd/prompts/worktree-merge.md +125 -0
  1337. package/src/resources/extensions/gsd/provider-error-pause.ts +49 -0
  1338. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  1339. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  1340. package/src/resources/extensions/gsd/queue-order.ts +235 -0
  1341. package/src/resources/extensions/gsd/queue-reorder-ui.ts +295 -0
  1342. package/src/resources/extensions/gsd/quick.ts +297 -0
  1343. package/src/resources/extensions/gsd/reactive-graph.ts +337 -0
  1344. package/src/resources/extensions/gsd/recovery-classification.ts +139 -0
  1345. package/src/resources/extensions/gsd/repo-identity.ts +683 -0
  1346. package/src/resources/extensions/gsd/reports.ts +505 -0
  1347. package/src/resources/extensions/gsd/repository-registry.ts +108 -0
  1348. package/src/resources/extensions/gsd/rethink.ts +164 -0
  1349. package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
  1350. package/src/resources/extensions/gsd/roadmap-slices.ts +294 -0
  1351. package/src/resources/extensions/gsd/root-write-leak-guard.ts +101 -0
  1352. package/src/resources/extensions/gsd/routing-history.ts +286 -0
  1353. package/src/resources/extensions/gsd/rule-registry.ts +599 -0
  1354. package/src/resources/extensions/gsd/rule-types.ts +68 -0
  1355. package/src/resources/extensions/gsd/run-manager.ts +214 -0
  1356. package/src/resources/extensions/gsd/safe-fs.ts +48 -0
  1357. package/src/resources/extensions/gsd/safety/content-validator.ts +98 -0
  1358. package/src/resources/extensions/gsd/safety/destructive-guard.ts +49 -0
  1359. package/src/resources/extensions/gsd/safety/evidence-collector.ts +265 -0
  1360. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +155 -0
  1361. package/src/resources/extensions/gsd/safety/file-change-validator.ts +124 -0
  1362. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +130 -0
  1363. package/src/resources/extensions/gsd/safety/safety-harness.ts +114 -0
  1364. package/src/resources/extensions/gsd/schemas/__fixtures__/valid-project.md +26 -0
  1365. package/src/resources/extensions/gsd/schemas/__fixtures__/valid-requirements.md +57 -0
  1366. package/src/resources/extensions/gsd/schemas/__fixtures__/valid-roadmap.md +19 -0
  1367. package/src/resources/extensions/gsd/schemas/parsers.ts +346 -0
  1368. package/src/resources/extensions/gsd/schemas/validate.ts +452 -0
  1369. package/src/resources/extensions/gsd/service-tier.ts +199 -0
  1370. package/src/resources/extensions/gsd/session-forensics.ts +580 -0
  1371. package/src/resources/extensions/gsd/session-lock.ts +732 -0
  1372. package/src/resources/extensions/gsd/session-model-override.ts +36 -0
  1373. package/src/resources/extensions/gsd/session-status-io.ts +179 -0
  1374. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  1375. package/src/resources/extensions/gsd/shortcut-defs.ts +56 -0
  1376. package/src/resources/extensions/gsd/skill-catalog.ts +1088 -0
  1377. package/src/resources/extensions/gsd/skill-discovery.ts +157 -0
  1378. package/src/resources/extensions/gsd/skill-health.ts +422 -0
  1379. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  1380. package/src/resources/extensions/gsd/skill-telemetry.ts +141 -0
  1381. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +242 -0
  1382. package/src/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +83 -0
  1383. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +64 -0
  1384. package/src/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +176 -0
  1385. package/src/resources/extensions/gsd/slice-cadence.ts +411 -0
  1386. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +86 -0
  1387. package/src/resources/extensions/gsd/slice-parallel-eligibility.ts +73 -0
  1388. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +913 -0
  1389. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  1390. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  1391. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +417 -0
  1392. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +66 -0
  1393. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +101 -0
  1394. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  1395. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  1396. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  1397. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  1398. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  1399. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  1400. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +65 -0
  1401. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  1402. package/src/resources/extensions/gsd/state-reconciliation.ts +25 -0
  1403. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  1404. package/src/resources/extensions/gsd/state.ts +1730 -0
  1405. package/src/resources/extensions/gsd/status-guards.ts +41 -0
  1406. package/src/resources/extensions/gsd/structured-data-formatter.ts +146 -0
  1407. package/src/resources/extensions/gsd/sync-lock.ts +152 -0
  1408. package/src/resources/extensions/gsd/templates/PREFERENCES.md +101 -0
  1409. package/src/resources/extensions/gsd/templates/context.md +108 -0
  1410. package/src/resources/extensions/gsd/templates/decisions.md +8 -0
  1411. package/src/resources/extensions/gsd/templates/knowledge.md +19 -0
  1412. package/src/resources/extensions/gsd/templates/milestone-summary.md +81 -0
  1413. package/src/resources/extensions/gsd/templates/milestone-validation.md +74 -0
  1414. package/src/resources/extensions/gsd/templates/plan.md +152 -0
  1415. package/src/resources/extensions/gsd/templates/project.md +41 -0
  1416. package/src/resources/extensions/gsd/templates/reassessment.md +29 -0
  1417. package/src/resources/extensions/gsd/templates/requirements.md +81 -0
  1418. package/src/resources/extensions/gsd/templates/research.md +79 -0
  1419. package/src/resources/extensions/gsd/templates/roadmap.md +131 -0
  1420. package/src/resources/extensions/gsd/templates/runtime.md +21 -0
  1421. package/src/resources/extensions/gsd/templates/secrets-manifest.md +22 -0
  1422. package/src/resources/extensions/gsd/templates/slice-context.md +58 -0
  1423. package/src/resources/extensions/gsd/templates/slice-summary.md +108 -0
  1424. package/src/resources/extensions/gsd/templates/state.md +17 -0
  1425. package/src/resources/extensions/gsd/templates/task-plan.md +95 -0
  1426. package/src/resources/extensions/gsd/templates/task-summary.md +66 -0
  1427. package/src/resources/extensions/gsd/templates/uat.md +54 -0
  1428. package/src/resources/extensions/gsd/tests/active-milestone-id-guard.test.ts +91 -0
  1429. package/src/resources/extensions/gsd/tests/activity-log.test.ts +175 -0
  1430. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +80 -0
  1431. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +296 -0
  1432. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +145 -0
  1433. package/src/resources/extensions/gsd/tests/artifact-validators.test.ts +524 -0
  1434. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +143 -0
  1435. package/src/resources/extensions/gsd/tests/ask-user-questions-dedup.test.ts +120 -0
  1436. package/src/resources/extensions/gsd/tests/atomic-write.test.ts +144 -0
  1437. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +47 -0
  1438. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +89 -0
  1439. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +62 -0
  1440. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +807 -0
  1441. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +457 -0
  1442. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +289 -0
  1443. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +72 -0
  1444. package/src/resources/extensions/gsd/tests/auto-loop-symlink-worktree.test.ts +190 -0
  1445. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +5503 -0
  1446. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  1447. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +61 -0
  1448. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  1449. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  1450. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  1451. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +479 -0
  1452. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +1300 -0
  1453. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +76 -0
  1454. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +103 -0
  1455. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +759 -0
  1456. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +390 -0
  1457. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +32 -0
  1458. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +60 -0
  1459. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +218 -0
  1460. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +66 -0
  1461. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +74 -0
  1462. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  1463. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1773 -0
  1464. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +48 -0
  1465. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  1466. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +98 -0
  1467. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +59 -0
  1468. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +277 -0
  1469. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +348 -0
  1470. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +45 -0
  1471. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +61 -0
  1472. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +27 -0
  1473. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +26 -0
  1474. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +175 -0
  1475. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +161 -0
  1476. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +49 -0
  1477. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +32 -0
  1478. package/src/resources/extensions/gsd/tests/auto-start-validation-block.test.ts +52 -0
  1479. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +19 -0
  1480. package/src/resources/extensions/gsd/tests/auto-status-message.test.ts +46 -0
  1481. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +31 -0
  1482. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +70 -0
  1483. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +54 -0
  1484. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  1485. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +106 -0
  1486. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +134 -0
  1487. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +80 -0
  1488. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +244 -0
  1489. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +199 -0
  1490. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +171 -0
  1491. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +143 -0
  1492. package/src/resources/extensions/gsd/tests/block-db-writes.test.ts +63 -0
  1493. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +98 -0
  1494. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +23 -0
  1495. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  1496. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +92 -0
  1497. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  1498. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +147 -0
  1499. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +77 -0
  1500. package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +180 -0
  1501. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +290 -0
  1502. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  1503. package/src/resources/extensions/gsd/tests/capability-router.test.ts +371 -0
  1504. package/src/resources/extensions/gsd/tests/captures.test.ts +524 -0
  1505. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
  1506. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
  1507. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  1508. package/src/resources/extensions/gsd/tests/claude-import-marketplace-discovery.test.ts +191 -0
  1509. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +350 -0
  1510. package/src/resources/extensions/gsd/tests/claude-skill-dirs.test.ts +51 -0
  1511. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +509 -0
  1512. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +76 -0
  1513. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  1514. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  1515. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +101 -0
  1516. package/src/resources/extensions/gsd/tests/cmux.test.ts +333 -0
  1517. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +669 -0
  1518. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +43 -0
  1519. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +506 -0
  1520. package/src/resources/extensions/gsd/tests/collision-diagnostics.test.ts +705 -0
  1521. package/src/resources/extensions/gsd/tests/command-queue.test.ts +141 -0
  1522. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  1523. package/src/resources/extensions/gsd/tests/commands-config.test.ts +31 -0
  1524. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +188 -0
  1525. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +178 -0
  1526. package/src/resources/extensions/gsd/tests/commands-do.test.ts +175 -0
  1527. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +612 -0
  1528. package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
  1529. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +663 -0
  1530. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +46 -0
  1531. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
  1532. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  1533. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  1534. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  1535. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +156 -0
  1536. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  1537. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +439 -0
  1538. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +311 -0
  1539. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +48 -0
  1540. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +136 -0
  1541. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +366 -0
  1542. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  1543. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +743 -0
  1544. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +193 -0
  1545. package/src/resources/extensions/gsd/tests/complete-slice-gate-closure.test.ts +167 -0
  1546. package/src/resources/extensions/gsd/tests/complete-slice-prompt-task-summary-layout.test.ts +18 -0
  1547. package/src/resources/extensions/gsd/tests/complete-slice-string-coercion.test.ts +247 -0
  1548. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +156 -0
  1549. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +556 -0
  1550. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +50 -0
  1551. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +105 -0
  1552. package/src/resources/extensions/gsd/tests/complete-task.test.ts +513 -0
  1553. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +84 -0
  1554. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +61 -0
  1555. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  1556. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +206 -0
  1557. package/src/resources/extensions/gsd/tests/component-loader.test.ts +582 -0
  1558. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  1559. package/src/resources/extensions/gsd/tests/context-budget.test.ts +389 -0
  1560. package/src/resources/extensions/gsd/tests/context-injector.test.ts +313 -0
  1561. package/src/resources/extensions/gsd/tests/context-masker.test.ts +122 -0
  1562. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  1563. package/src/resources/extensions/gsd/tests/context-store.test.ts +715 -0
  1564. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +185 -0
  1565. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +120 -0
  1566. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +294 -0
  1567. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +331 -0
  1568. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +709 -0
  1569. package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
  1570. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +902 -0
  1571. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +415 -0
  1572. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  1573. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +483 -0
  1574. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  1575. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +360 -0
  1576. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +23 -0
  1577. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +110 -0
  1578. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  1579. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  1580. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  1581. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  1582. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  1583. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  1584. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  1585. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  1586. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  1587. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  1588. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
  1589. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  1590. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  1591. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  1592. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +95 -0
  1593. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  1594. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  1595. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  1596. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +130 -0
  1597. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  1598. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  1599. package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +152 -0
  1600. package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +221 -0
  1601. package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +230 -0
  1602. package/src/resources/extensions/gsd/tests/db-writer.test.ts +980 -0
  1603. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +942 -0
  1604. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  1605. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +187 -0
  1606. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  1607. package/src/resources/extensions/gsd/tests/decision-scope-cascade.test.ts +370 -0
  1608. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  1609. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  1610. package/src/resources/extensions/gsd/tests/deep-mode-integration.test.ts +406 -0
  1611. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +923 -0
  1612. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +1705 -0
  1613. package/src/resources/extensions/gsd/tests/deep-project-setup-policy.test.ts +193 -0
  1614. package/src/resources/extensions/gsd/tests/defer-milestone-stamp.test.ts +30 -0
  1615. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +65 -0
  1616. package/src/resources/extensions/gsd/tests/deferred-slice-dispatch.test.ts +203 -0
  1617. package/src/resources/extensions/gsd/tests/definition-io.test.ts +57 -0
  1618. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +762 -0
  1619. package/src/resources/extensions/gsd/tests/delegation-policy.test.ts +151 -0
  1620. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +514 -0
  1621. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +133 -0
  1622. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +1388 -0
  1623. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +641 -0
  1624. package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +313 -0
  1625. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +558 -0
  1626. package/src/resources/extensions/gsd/tests/derive-state.test.ts +1049 -0
  1627. package/src/resources/extensions/gsd/tests/detect-stuck-respects-retry.test.ts +173 -0
  1628. package/src/resources/extensions/gsd/tests/detection.test.ts +1367 -0
  1629. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +314 -0
  1630. package/src/resources/extensions/gsd/tests/diff-context.test.ts +136 -0
  1631. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  1632. package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +71 -0
  1633. package/src/resources/extensions/gsd/tests/discuss-command-targeting-5471.test.ts +125 -0
  1634. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +62 -0
  1635. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  1636. package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +45 -0
  1637. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +115 -0
  1638. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +15 -0
  1639. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +170 -0
  1640. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +35 -0
  1641. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +138 -0
  1642. package/src/resources/extensions/gsd/tests/dispatch-backgroundable-annotation.test.ts +55 -0
  1643. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +276 -0
  1644. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +43 -0
  1645. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
  1646. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +446 -0
  1647. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +279 -0
  1648. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +358 -0
  1649. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +206 -0
  1650. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +55 -0
  1651. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +112 -0
  1652. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  1653. package/src/resources/extensions/gsd/tests/doctor-fix-flag.test.ts +92 -0
  1654. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  1655. package/src/resources/extensions/gsd/tests/doctor-heal-fixable-warnings.test.ts +14 -0
  1656. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
  1657. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +828 -0
  1658. package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +47 -0
  1659. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +43 -0
  1660. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +36 -0
  1661. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +149 -0
  1662. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  1663. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +271 -0
  1664. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +531 -0
  1665. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +530 -0
  1666. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
  1667. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +32 -0
  1668. package/src/resources/extensions/gsd/tests/escalation.test.ts +819 -0
  1669. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +53 -0
  1670. package/src/resources/extensions/gsd/tests/eval-review-schema.test.ts +282 -0
  1671. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  1672. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +121 -0
  1673. package/src/resources/extensions/gsd/tests/exec-history.test.ts +252 -0
  1674. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +407 -0
  1675. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
  1676. package/src/resources/extensions/gsd/tests/execute-task-prompt-existing-artifact-guard.test.ts +33 -0
  1677. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +62 -0
  1678. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +187 -0
  1679. package/src/resources/extensions/gsd/tests/exit-command.test.ts +101 -0
  1680. package/src/resources/extensions/gsd/tests/export-html-all.test.ts +116 -0
  1681. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +387 -0
  1682. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +164 -0
  1683. package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +144 -0
  1684. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +43 -0
  1685. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  1686. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +108 -0
  1687. package/src/resources/extensions/gsd/tests/file-lock.test.ts +177 -0
  1688. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +18 -0
  1689. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  1690. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +103 -0
  1691. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
  1692. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
  1693. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
  1694. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
  1695. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
  1696. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
  1697. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +305 -0
  1698. package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +121 -0
  1699. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +43 -0
  1700. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  1701. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +215 -0
  1702. package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +100 -0
  1703. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +298 -0
  1704. package/src/resources/extensions/gsd/tests/fresh-run-ui.test.ts +65 -0
  1705. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +34 -0
  1706. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +193 -0
  1707. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +246 -0
  1708. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +218 -0
  1709. package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +216 -0
  1710. package/src/resources/extensions/gsd/tests/gate-registry.test.ts +140 -0
  1711. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  1712. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +156 -0
  1713. package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +103 -0
  1714. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +77 -0
  1715. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +91 -0
  1716. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  1717. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +599 -0
  1718. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +134 -0
  1719. package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +117 -0
  1720. package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +226 -0
  1721. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1210 -0
  1722. package/src/resources/extensions/gsd/tests/gsd-home.test.ts +43 -0
  1723. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +114 -0
  1724. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +95 -0
  1725. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
  1726. package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +66 -0
  1727. package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +149 -0
  1728. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +445 -0
  1729. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +146 -0
  1730. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  1731. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +43 -0
  1732. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  1733. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  1734. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  1735. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +147 -0
  1736. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +219 -0
  1737. package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +140 -0
  1738. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  1739. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  1740. package/src/resources/extensions/gsd/tests/handler-worktree-write-isolation.test.ts +57 -0
  1741. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +130 -0
  1742. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  1743. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +350 -0
  1744. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +127 -0
  1745. package/src/resources/extensions/gsd/tests/headless-query.test.ts +184 -0
  1746. package/src/resources/extensions/gsd/tests/health-widget.test.ts +251 -0
  1747. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
  1748. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +56 -0
  1749. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +103 -0
  1750. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
  1751. package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +32 -0
  1752. package/src/resources/extensions/gsd/tests/infra-error.test.ts +129 -0
  1753. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +189 -0
  1754. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +275 -0
  1755. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +16 -0
  1756. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +239 -0
  1757. package/src/resources/extensions/gsd/tests/insert-slice-no-wipe.test.ts +88 -0
  1758. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +199 -0
  1759. package/src/resources/extensions/gsd/tests/integration/atomic-task-closeout.test.ts +72 -0
  1760. package/src/resources/extensions/gsd/tests/integration/auto-preflight.test.ts +38 -0
  1761. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +966 -0
  1762. package/src/resources/extensions/gsd/tests/integration/auto-secrets-gate.test.ts +194 -0
  1763. package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +121 -0
  1764. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +964 -0
  1765. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +430 -0
  1766. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +256 -0
  1767. package/src/resources/extensions/gsd/tests/integration/continue-here.test.ts +281 -0
  1768. package/src/resources/extensions/gsd/tests/integration/doctor-completion-deferral.test.ts +88 -0
  1769. package/src/resources/extensions/gsd/tests/integration/doctor-delimiter-fix.test.ts +83 -0
  1770. package/src/resources/extensions/gsd/tests/integration/doctor-enhancements.test.ts +243 -0
  1771. package/src/resources/extensions/gsd/tests/integration/doctor-environment-worktree.test.ts +164 -0
  1772. package/src/resources/extensions/gsd/tests/integration/doctor-environment.test.ts +403 -0
  1773. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  1774. package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +263 -0
  1775. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +90 -0
  1776. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +954 -0
  1777. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +431 -0
  1778. package/src/resources/extensions/gsd/tests/integration/doctor-roadmap-summary-atomicity.test.ts +123 -0
  1779. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +549 -0
  1780. package/src/resources/extensions/gsd/tests/integration/doctor.test.ts +612 -0
  1781. package/src/resources/extensions/gsd/tests/integration/e2e-workflow-pipeline-integration.test.ts +476 -0
  1782. package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +415 -0
  1783. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +130 -0
  1784. package/src/resources/extensions/gsd/tests/integration/git-self-heal.test.ts +131 -0
  1785. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +2040 -0
  1786. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  1787. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +257 -0
  1788. package/src/resources/extensions/gsd/tests/integration/headless-command.ts +534 -0
  1789. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +474 -0
  1790. package/src/resources/extensions/gsd/tests/integration/inherited-repo-home-dir.test.ts +191 -0
  1791. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +274 -0
  1792. package/src/resources/extensions/gsd/tests/integration/integration-mixed-milestones.test.ts +539 -0
  1793. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +634 -0
  1794. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +169 -0
  1795. package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +77 -0
  1796. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +405 -0
  1797. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +119 -0
  1798. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +669 -0
  1799. package/src/resources/extensions/gsd/tests/integration/parallel-workers-multi-milestone-e2e.test.ts +337 -0
  1800. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +98 -0
  1801. package/src/resources/extensions/gsd/tests/integration/plugin-importer-live.test.ts +481 -0
  1802. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +161 -0
  1803. package/src/resources/extensions/gsd/tests/integration/queue-reorder-e2e.test.ts +335 -0
  1804. package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +253 -0
  1805. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +689 -0
  1806. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1356 -0
  1807. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +980 -0
  1808. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +832 -0
  1809. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  1810. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +341 -0
  1811. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +369 -0
  1812. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +248 -0
  1813. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +223 -0
  1814. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +71 -0
  1815. package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +119 -0
  1816. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +241 -0
  1817. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +180 -0
  1818. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +19 -0
  1819. package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
  1820. package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +429 -0
  1821. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +1473 -0
  1822. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +179 -0
  1823. package/src/resources/extensions/gsd/tests/journal.test.ts +373 -0
  1824. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +183 -0
  1825. package/src/resources/extensions/gsd/tests/key-manager.test.ts +501 -0
  1826. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  1827. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  1828. package/src/resources/extensions/gsd/tests/knowledge.test.ts +434 -0
  1829. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +53 -0
  1830. package/src/resources/extensions/gsd/tests/lease-conflict-notice.test.ts +38 -0
  1831. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  1832. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  1833. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  1834. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
  1835. package/src/resources/extensions/gsd/tests/manifest-status.test.ts +274 -0
  1836. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1292 -0
  1837. package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +91 -0
  1838. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
  1839. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  1840. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +89 -0
  1841. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +183 -0
  1842. package/src/resources/extensions/gsd/tests/md-importer.test.ts +416 -0
  1843. package/src/resources/extensions/gsd/tests/measurement.test.ts +531 -0
  1844. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  1845. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  1846. package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
  1847. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +244 -0
  1848. package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
  1849. package/src/resources/extensions/gsd/tests/memory-leak-guards.test.ts +91 -0
  1850. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
  1851. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +79 -0
  1852. package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
  1853. package/src/resources/extensions/gsd/tests/memory-store.test.ts +460 -0
  1854. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +327 -0
  1855. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +303 -0
  1856. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  1857. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +105 -0
  1858. package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +222 -0
  1859. package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +400 -0
  1860. package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +141 -0
  1861. package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +287 -0
  1862. package/src/resources/extensions/gsd/tests/metrics-milestone-scope.test.ts +64 -0
  1863. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +149 -0
  1864. package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +378 -0
  1865. package/src/resources/extensions/gsd/tests/metrics.test.ts +519 -0
  1866. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +165 -0
  1867. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
  1868. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +782 -0
  1869. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +242 -0
  1870. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +651 -0
  1871. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +448 -0
  1872. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +347 -0
  1873. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +361 -0
  1874. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +135 -0
  1875. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
  1876. package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +73 -0
  1877. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +152 -0
  1878. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +364 -0
  1879. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +68 -0
  1880. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +206 -0
  1881. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  1882. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +202 -0
  1883. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  1884. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +122 -0
  1885. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +111 -0
  1886. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +305 -0
  1887. package/src/resources/extensions/gsd/tests/model-router.test.ts +990 -0
  1888. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +90 -0
  1889. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +278 -0
  1890. package/src/resources/extensions/gsd/tests/namespaced-registry.test.ts +1027 -0
  1891. package/src/resources/extensions/gsd/tests/namespaced-resolver.test.ts +671 -0
  1892. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +228 -0
  1893. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
  1894. package/src/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +61 -0
  1895. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +55 -0
  1896. package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +23 -0
  1897. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +200 -0
  1898. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +50 -0
  1899. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +129 -0
  1900. package/src/resources/extensions/gsd/tests/notification-store.test.ts +325 -0
  1901. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +87 -0
  1902. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +134 -0
  1903. package/src/resources/extensions/gsd/tests/notifications.test.ts +134 -0
  1904. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  1905. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +159 -0
  1906. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  1907. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  1908. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +374 -0
  1909. package/src/resources/extensions/gsd/tests/overrides.test.ts +124 -0
  1910. package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +330 -0
  1911. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +164 -0
  1912. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +273 -0
  1913. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +170 -0
  1914. package/src/resources/extensions/gsd/tests/parallel-milestone-isolation.test.ts +106 -0
  1915. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +114 -0
  1916. package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +736 -0
  1917. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  1918. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +332 -0
  1919. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +308 -0
  1920. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +158 -0
  1921. package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +226 -0
  1922. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +199 -0
  1923. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +157 -0
  1924. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +253 -0
  1925. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +420 -0
  1926. package/src/resources/extensions/gsd/tests/parsers.test.ts +1892 -0
  1927. package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +209 -0
  1928. package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +175 -0
  1929. package/src/resources/extensions/gsd/tests/paths-cache.test.ts +170 -0
  1930. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +121 -0
  1931. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +144 -0
  1932. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +42 -0
  1933. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +24 -0
  1934. package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +83 -0
  1935. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +126 -0
  1936. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +404 -0
  1937. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
  1938. package/src/resources/extensions/gsd/tests/plan-milestone-artifact-verification.test.ts +102 -0
  1939. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  1940. package/src/resources/extensions/gsd/tests/plan-milestone-queue-context.test.ts +48 -0
  1941. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  1942. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  1943. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +71 -0
  1944. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +349 -0
  1945. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
  1946. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +306 -0
  1947. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +712 -0
  1948. package/src/resources/extensions/gsd/tests/plan-task.test.ts +183 -0
  1949. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  1950. package/src/resources/extensions/gsd/tests/planning-depth-setter.test.ts +172 -0
  1951. package/src/resources/extensions/gsd/tests/plugin-importer.test.ts +1383 -0
  1952. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +536 -0
  1953. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +1065 -0
  1954. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
  1955. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +25 -0
  1956. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +300 -0
  1957. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +567 -0
  1958. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
  1959. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
  1960. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  1961. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +149 -0
  1962. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +275 -0
  1963. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +2246 -0
  1964. package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +244 -0
  1965. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +708 -0
  1966. package/src/resources/extensions/gsd/tests/preferences-formatting.test.ts +87 -0
  1967. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  1968. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +118 -0
  1969. package/src/resources/extensions/gsd/tests/preferences.test.ts +1314 -0
  1970. package/src/resources/extensions/gsd/tests/preflight-context-draft-filter.test.ts +115 -0
  1971. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
  1972. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +222 -0
  1973. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  1974. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +620 -0
  1975. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  1976. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +35 -0
  1977. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +56 -0
  1978. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +277 -0
  1979. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +677 -0
  1980. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +326 -0
  1981. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +574 -0
  1982. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +387 -0
  1983. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  1984. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +49 -0
  1985. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  1986. package/src/resources/extensions/gsd/tests/prompt-loader-working-directory.test.ts +19 -0
  1987. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  1988. package/src/resources/extensions/gsd/tests/prompt-ordering.test.ts +296 -0
  1989. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  1990. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +91 -0
  1991. package/src/resources/extensions/gsd/tests/prompt-system-gate-coverage.test.ts +208 -0
  1992. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  1993. package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
  1994. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +744 -0
  1995. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  1996. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  1997. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +344 -0
  1998. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +51 -0
  1999. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +39 -0
  2000. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +101 -0
  2001. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +166 -0
  2002. package/src/resources/extensions/gsd/tests/queue-order.test.ts +192 -0
  2003. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  2004. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  2005. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +106 -0
  2006. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +36 -0
  2007. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  2008. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +61 -0
  2009. package/src/resources/extensions/gsd/tests/rate-limit-model-fallback.test.ts +90 -0
  2010. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +511 -0
  2011. package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +363 -0
  2012. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +728 -0
  2013. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +146 -0
  2014. package/src/resources/extensions/gsd/tests/reassess-detection.test.ts +154 -0
  2015. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +442 -0
  2016. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +135 -0
  2017. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  2018. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +144 -0
  2019. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +161 -0
  2020. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +126 -0
  2021. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +252 -0
  2022. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +442 -0
  2023. package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +131 -0
  2024. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +197 -0
  2025. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  2026. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +774 -0
  2027. package/src/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
  2028. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
  2029. package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -0
  2030. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  2031. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +609 -0
  2032. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +258 -0
  2033. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +101 -0
  2034. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  2035. package/src/resources/extensions/gsd/tests/requirements.test.ts +110 -0
  2036. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +132 -0
  2037. package/src/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +23 -0
  2038. package/src/resources/extensions/gsd/tests/resolve-ts.mjs +9 -0
  2039. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +50 -0
  2040. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +65 -0
  2041. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +102 -0
  2042. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +209 -0
  2043. package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +161 -0
  2044. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +305 -0
  2045. package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +82 -0
  2046. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  2047. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +213 -0
  2048. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +399 -0
  2049. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +464 -0
  2050. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +294 -0
  2051. package/src/resources/extensions/gsd/tests/routing-history.test.ts +229 -0
  2052. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +411 -0
  2053. package/src/resources/extensions/gsd/tests/run-manager.test.ts +229 -0
  2054. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +151 -0
  2055. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +94 -0
  2056. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +94 -0
  2057. package/src/resources/extensions/gsd/tests/runtime-kv.test.ts +120 -0
  2058. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +268 -0
  2059. package/src/resources/extensions/gsd/tests/save-gate-result-render.test.ts +95 -0
  2060. package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
  2061. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  2062. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  2063. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +364 -0
  2064. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  2065. package/src/resources/extensions/gsd/tests/service-tier.test.ts +131 -0
  2066. package/src/resources/extensions/gsd/tests/session-forensics-readonly-classification.test.ts +70 -0
  2067. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +166 -0
  2068. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +379 -0
  2069. package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +224 -0
  2070. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +40 -0
  2071. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +387 -0
  2072. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +304 -0
  2073. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +239 -0
  2074. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +58 -0
  2075. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +182 -0
  2076. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +130 -0
  2077. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +244 -0
  2078. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  2079. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  2080. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +352 -0
  2081. package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
  2082. package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +126 -0
  2083. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  2084. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  2085. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +63 -0
  2086. package/src/resources/extensions/gsd/tests/skipped-validation-completion.test.ts +144 -0
  2087. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +57 -0
  2088. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +301 -0
  2089. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +79 -0
  2090. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +187 -0
  2091. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +92 -0
  2092. package/src/resources/extensions/gsd/tests/slice-parallel-eligibility.test.ts +95 -0
  2093. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +348 -0
  2094. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +124 -0
  2095. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +76 -0
  2096. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +33 -0
  2097. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  2098. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +29 -0
  2099. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +65 -0
  2100. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +45 -0
  2101. package/src/resources/extensions/gsd/tests/stale-milestone-id-reservation.test.ts +79 -0
  2102. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +147 -0
  2103. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +49 -0
  2104. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +152 -0
  2105. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +148 -0
  2106. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +334 -0
  2107. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +203 -0
  2108. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +442 -0
  2109. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +424 -0
  2110. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  2111. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1645 -0
  2112. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1137 -0
  2113. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  2114. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +42 -0
  2115. package/src/resources/extensions/gsd/tests/status-guards.test.ts +50 -0
  2116. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +123 -0
  2117. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +95 -0
  2118. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +18 -0
  2119. package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +216 -0
  2120. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +285 -0
  2121. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +232 -0
  2122. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +197 -0
  2123. package/src/resources/extensions/gsd/tests/subagent-agent-discovery.test.ts +91 -0
  2124. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +174 -0
  2125. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +226 -0
  2126. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +121 -0
  2127. package/src/resources/extensions/gsd/tests/symlink-extension-discovery.test.ts +125 -0
  2128. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +145 -0
  2129. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +153 -0
  2130. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +40 -0
  2131. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  2132. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +99 -0
  2133. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +162 -0
  2134. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +98 -0
  2135. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +186 -0
  2136. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +128 -0
  2137. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  2138. package/src/resources/extensions/gsd/tests/test-helpers.ts +214 -0
  2139. package/src/resources/extensions/gsd/tests/test-utils.ts +165 -0
  2140. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  2141. package/src/resources/extensions/gsd/tests/token-counter.test.ts +242 -0
  2142. package/src/resources/extensions/gsd/tests/token-profile.test.ts +100 -0
  2143. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +382 -0
  2144. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +179 -0
  2145. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +306 -0
  2146. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +211 -0
  2147. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +155 -0
  2148. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +383 -0
  2149. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +138 -0
  2150. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +612 -0
  2151. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +330 -0
  2152. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +88 -0
  2153. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +153 -0
  2154. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  2155. package/src/resources/extensions/gsd/tests/unborn-branch.test.ts +85 -0
  2156. package/src/resources/extensions/gsd/tests/undo.test.ts +462 -0
  2157. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +203 -0
  2158. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +529 -0
  2159. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +462 -0
  2160. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +326 -0
  2161. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +258 -0
  2162. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +335 -0
  2163. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +112 -0
  2164. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +67 -0
  2165. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  2166. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +245 -0
  2167. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +85 -0
  2168. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +69 -0
  2169. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +145 -0
  2170. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +241 -0
  2171. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +58 -0
  2172. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +178 -0
  2173. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +163 -0
  2174. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  2175. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  2176. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +262 -0
  2177. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  2178. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  2179. package/src/resources/extensions/gsd/tests/update-command.test.ts +86 -0
  2180. package/src/resources/extensions/gsd/tests/vacuous-truth-slices.test.ts +115 -0
  2181. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  2182. package/src/resources/extensions/gsd/tests/validate-directory.test.ts +269 -0
  2183. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  2184. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +21 -0
  2185. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +300 -0
  2186. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +371 -0
  2187. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +766 -0
  2188. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +104 -0
  2189. package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +178 -0
  2190. package/src/resources/extensions/gsd/tests/validation.test.ts +72 -0
  2191. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +239 -0
  2192. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  2193. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +601 -0
  2194. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +1265 -0
  2195. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +112 -0
  2196. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  2197. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  2198. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +204 -0
  2199. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +109 -0
  2200. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -0
  2201. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +359 -0
  2202. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +716 -0
  2203. package/src/resources/extensions/gsd/tests/wave1-critical-regressions.test.ts +49 -0
  2204. package/src/resources/extensions/gsd/tests/wave2-events-regressions.test.ts +48 -0
  2205. package/src/resources/extensions/gsd/tests/wave3-session-regressions.test.ts +47 -0
  2206. package/src/resources/extensions/gsd/tests/wave4-write-safety-regressions.test.ts +70 -0
  2207. package/src/resources/extensions/gsd/tests/wave5-consistency-regressions.test.ts +165 -0
  2208. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +97 -0
  2209. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +56 -0
  2210. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +146 -0
  2211. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  2212. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  2213. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  2214. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  2215. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  2216. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  2217. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +313 -0
  2218. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  2219. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +205 -0
  2220. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  2221. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  2222. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  2223. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +630 -0
  2224. package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +123 -0
  2225. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +92 -0
  2226. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +411 -0
  2227. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +336 -0
  2228. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +76 -0
  2229. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +771 -0
  2230. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +91 -0
  2231. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  2232. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  2233. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +405 -0
  2234. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  2235. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +91 -0
  2236. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  2237. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  2238. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  2239. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +198 -0
  2240. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1397 -0
  2241. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  2242. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  2243. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +154 -0
  2244. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
  2245. package/src/resources/extensions/gsd/tests/workspace-index.test.ts +38 -0
  2246. package/src/resources/extensions/gsd/tests/workspace.test.ts +196 -0
  2247. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +117 -0
  2248. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +202 -0
  2249. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +219 -0
  2250. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +165 -0
  2251. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +440 -0
  2252. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +39 -0
  2253. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  2254. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +207 -0
  2255. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +109 -0
  2256. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +181 -0
  2257. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +216 -0
  2258. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +397 -0
  2259. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +992 -0
  2260. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +27 -0
  2261. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +290 -0
  2262. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +110 -0
  2263. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +242 -0
  2264. package/src/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +165 -0
  2265. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +180 -0
  2266. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  2267. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +206 -0
  2268. package/src/resources/extensions/gsd/tests/worktree-root-resolution.test.ts +50 -0
  2269. package/src/resources/extensions/gsd/tests/worktree-root.test.ts +69 -0
  2270. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +417 -0
  2271. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  2272. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +228 -0
  2273. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +134 -0
  2274. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +705 -0
  2275. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +156 -0
  2276. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +85 -0
  2277. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +148 -0
  2278. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +283 -0
  2279. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +206 -0
  2280. package/src/resources/extensions/gsd/tests/worktree.test.ts +304 -0
  2281. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +476 -0
  2282. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +188 -0
  2283. package/src/resources/extensions/gsd/tests/write-gate.test.ts +726 -0
  2284. package/src/resources/extensions/gsd/tests/write-intercept.test.ts +76 -0
  2285. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +25 -0
  2286. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +81 -0
  2287. package/src/resources/extensions/gsd/token-counter.ts +83 -0
  2288. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  2289. package/src/resources/extensions/gsd/tools/complete-milestone.ts +273 -0
  2290. package/src/resources/extensions/gsd/tools/complete-slice.ts +568 -0
  2291. package/src/resources/extensions/gsd/tools/complete-task.ts +473 -0
  2292. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  2293. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +81 -0
  2294. package/src/resources/extensions/gsd/tools/exec-tool.ts +286 -0
  2295. package/src/resources/extensions/gsd/tools/memory-tools.ts +427 -0
  2296. package/src/resources/extensions/gsd/tools/plan-milestone.ts +370 -0
  2297. package/src/resources/extensions/gsd/tools/plan-slice.ts +443 -0
  2298. package/src/resources/extensions/gsd/tools/plan-task.ts +161 -0
  2299. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +289 -0
  2300. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +152 -0
  2301. package/src/resources/extensions/gsd/tools/reopen-slice.ts +152 -0
  2302. package/src/resources/extensions/gsd/tools/reopen-task.ts +146 -0
  2303. package/src/resources/extensions/gsd/tools/replan-slice.ts +242 -0
  2304. package/src/resources/extensions/gsd/tools/resume-tool.ts +40 -0
  2305. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  2306. package/src/resources/extensions/gsd/tools/validate-milestone.ts +301 -0
  2307. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +991 -0
  2308. package/src/resources/extensions/gsd/triage-resolution.ts +578 -0
  2309. package/src/resources/extensions/gsd/triage-ui.ts +196 -0
  2310. package/src/resources/extensions/gsd/tui/render-kit.ts +153 -0
  2311. package/src/resources/extensions/gsd/types.ts +721 -0
  2312. package/src/resources/extensions/gsd/undo.ts +465 -0
  2313. package/src/resources/extensions/gsd/unit-context-composer.ts +285 -0
  2314. package/src/resources/extensions/gsd/unit-context-manifest.ts +796 -0
  2315. package/src/resources/extensions/gsd/unit-id.ts +14 -0
  2316. package/src/resources/extensions/gsd/unit-ownership.ts +275 -0
  2317. package/src/resources/extensions/gsd/unit-runtime.ts +267 -0
  2318. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +150 -0
  2319. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  2320. package/src/resources/extensions/gsd/uok/audit.ts +85 -0
  2321. package/src/resources/extensions/gsd/uok/contracts.ts +306 -0
  2322. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +60 -0
  2323. package/src/resources/extensions/gsd/uok/execution-graph.ts +263 -0
  2324. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  2325. package/src/resources/extensions/gsd/uok/gate-runner.ts +206 -0
  2326. package/src/resources/extensions/gsd/uok/gitops.ts +80 -0
  2327. package/src/resources/extensions/gsd/uok/kernel.ts +124 -0
  2328. package/src/resources/extensions/gsd/uok/loop-adapter.ts +212 -0
  2329. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  2330. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  2331. package/src/resources/extensions/gsd/uok/plan-v2.ts +209 -0
  2332. package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
  2333. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  2334. package/src/resources/extensions/gsd/user-input-boundary.ts +166 -0
  2335. package/src/resources/extensions/gsd/validate-directory.ts +186 -0
  2336. package/src/resources/extensions/gsd/validation-block-guard.ts +83 -0
  2337. package/src/resources/extensions/gsd/validation.ts +45 -0
  2338. package/src/resources/extensions/gsd/verdict-parser.ts +110 -0
  2339. package/src/resources/extensions/gsd/verification-evidence.ts +270 -0
  2340. package/src/resources/extensions/gsd/verification-gate.ts +848 -0
  2341. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  2342. package/src/resources/extensions/gsd/visualizer-data.ts +953 -0
  2343. package/src/resources/extensions/gsd/visualizer-overlay.ts +570 -0
  2344. package/src/resources/extensions/gsd/visualizer-views.ts +1229 -0
  2345. package/src/resources/extensions/gsd/watch/header-renderer.ts +331 -0
  2346. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  2347. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  2348. package/src/resources/extensions/gsd/workflow-engine.ts +38 -0
  2349. package/src/resources/extensions/gsd/workflow-events.ts +166 -0
  2350. package/src/resources/extensions/gsd/workflow-install.ts +422 -0
  2351. package/src/resources/extensions/gsd/workflow-logger.ts +381 -0
  2352. package/src/resources/extensions/gsd/workflow-manifest.ts +260 -0
  2353. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +60 -0
  2354. package/src/resources/extensions/gsd/workflow-mcp.ts +459 -0
  2355. package/src/resources/extensions/gsd/workflow-migration.ts +340 -0
  2356. package/src/resources/extensions/gsd/workflow-plugins.ts +402 -0
  2357. package/src/resources/extensions/gsd/workflow-projections.ts +567 -0
  2358. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  2359. package/src/resources/extensions/gsd/workflow-reconcile.ts +681 -0
  2360. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  2361. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  2362. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +88 -0
  2363. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  2364. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  2365. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  2366. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +75 -0
  2367. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  2368. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  2369. package/src/resources/extensions/gsd/workflow-templates/full-project.md +42 -0
  2370. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +46 -0
  2371. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  2372. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  2373. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  2374. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  2375. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  2376. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  2377. package/src/resources/extensions/gsd/workflow-templates/refactor.md +84 -0
  2378. package/src/resources/extensions/gsd/workflow-templates/registry.json +269 -0
  2379. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  2380. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  2381. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +74 -0
  2382. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +82 -0
  2383. package/src/resources/extensions/gsd/workflow-templates/spike.md +76 -0
  2384. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  2385. package/src/resources/extensions/gsd/workflow-templates.ts +278 -0
  2386. package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
  2387. package/src/resources/extensions/gsd/workspace-index.ts +277 -0
  2388. package/src/resources/extensions/gsd/workspace.ts +95 -0
  2389. package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
  2390. package/src/resources/extensions/gsd/worktree-command.ts +834 -0
  2391. package/src/resources/extensions/gsd/worktree-health.ts +178 -0
  2392. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1989 -0
  2393. package/src/resources/extensions/gsd/worktree-manager.ts +909 -0
  2394. package/src/resources/extensions/gsd/worktree-root.ts +182 -0
  2395. package/src/resources/extensions/gsd/worktree-safety.ts +329 -0
  2396. package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
  2397. package/src/resources/extensions/gsd/worktree-state-projection.ts +447 -0
  2398. package/src/resources/extensions/gsd/worktree-telemetry.ts +366 -0
  2399. package/src/resources/extensions/gsd/worktree.ts +235 -0
  2400. package/src/resources/extensions/gsd/write-intercept.ts +99 -0
  2401. package/src/resources/extensions/mac-tools/extension-manifest.json +16 -0
  2402. package/src/resources/extensions/mac-tools/index.ts +852 -0
  2403. package/src/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
  2404. package/src/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
  2405. package/src/resources/extensions/mcp-client/auth.ts +160 -0
  2406. package/src/resources/extensions/mcp-client/index.ts +526 -0
  2407. package/src/resources/extensions/mcp-client/manager.ts +516 -0
  2408. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
  2409. package/src/resources/extensions/mcp-client/tests/manager.test.ts +165 -0
  2410. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +89 -0
  2411. package/src/resources/extensions/ollama/index.ts +158 -0
  2412. package/src/resources/extensions/ollama/model-capabilities.ts +186 -0
  2413. package/src/resources/extensions/ollama/ndjson-stream.ts +63 -0
  2414. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +128 -0
  2415. package/src/resources/extensions/ollama/ollama-chat-provider.ts +459 -0
  2416. package/src/resources/extensions/ollama/ollama-client.ts +262 -0
  2417. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  2418. package/src/resources/extensions/ollama/ollama-discovery.ts +134 -0
  2419. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +215 -0
  2420. package/src/resources/extensions/ollama/ollama-tool.ts +287 -0
  2421. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +258 -0
  2422. package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +82 -0
  2423. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
  2424. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  2425. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +55 -0
  2426. package/src/resources/extensions/ollama/thinking-parser.ts +116 -0
  2427. package/src/resources/extensions/ollama/types.ts +153 -0
  2428. package/src/resources/extensions/package.json +3 -0
  2429. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  2430. package/src/resources/extensions/remote-questions/config.ts +126 -0
  2431. package/src/resources/extensions/remote-questions/discord-adapter.ts +148 -0
  2432. package/src/resources/extensions/remote-questions/extension-manifest.json +11 -0
  2433. package/src/resources/extensions/remote-questions/format.ts +315 -0
  2434. package/src/resources/extensions/remote-questions/http-client.ts +76 -0
  2435. package/src/resources/extensions/remote-questions/manager.ts +270 -0
  2436. package/src/resources/extensions/remote-questions/mod.ts +16 -0
  2437. package/src/resources/extensions/remote-questions/notify.ts +90 -0
  2438. package/src/resources/extensions/remote-questions/remote-command.ts +437 -0
  2439. package/src/resources/extensions/remote-questions/slack-adapter.ts +141 -0
  2440. package/src/resources/extensions/remote-questions/status.ts +31 -0
  2441. package/src/resources/extensions/remote-questions/store.ts +81 -0
  2442. package/src/resources/extensions/remote-questions/telegram-adapter.ts +231 -0
  2443. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +256 -0
  2444. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  2445. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  2446. package/src/resources/extensions/remote-questions/types.ts +102 -0
  2447. package/src/resources/extensions/search-the-web/cache.ts +78 -0
  2448. package/src/resources/extensions/search-the-web/command-search-provider.ts +105 -0
  2449. package/src/resources/extensions/search-the-web/extension-manifest.json +13 -0
  2450. package/src/resources/extensions/search-the-web/format.ts +258 -0
  2451. package/src/resources/extensions/search-the-web/http.ts +238 -0
  2452. package/src/resources/extensions/search-the-web/index.ts +64 -0
  2453. package/src/resources/extensions/search-the-web/native-search.ts +276 -0
  2454. package/src/resources/extensions/search-the-web/provider.ts +150 -0
  2455. package/src/resources/extensions/search-the-web/tavily.ts +116 -0
  2456. package/src/resources/extensions/search-the-web/tool-fetch-page.ts +589 -0
  2457. package/src/resources/extensions/search-the-web/tool-llm-context.ts +608 -0
  2458. package/src/resources/extensions/search-the-web/tool-search.ts +677 -0
  2459. package/src/resources/extensions/search-the-web/url-utils.ts +144 -0
  2460. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  2461. package/src/resources/extensions/shared/confirm-ui.ts +126 -0
  2462. package/src/resources/extensions/shared/format-utils.ts +99 -0
  2463. package/src/resources/extensions/shared/frontmatter.ts +117 -0
  2464. package/src/resources/extensions/shared/gsd-phase-state.ts +95 -0
  2465. package/src/resources/extensions/shared/html-shell.ts +412 -0
  2466. package/src/resources/extensions/shared/interview-ui.ts +848 -0
  2467. package/src/resources/extensions/shared/layout-utils.ts +75 -0
  2468. package/src/resources/extensions/shared/mod.ts +31 -0
  2469. package/src/resources/extensions/shared/next-action-ui.ts +226 -0
  2470. package/src/resources/extensions/shared/path-display.ts +19 -0
  2471. package/src/resources/extensions/shared/rtk-session-stats.ts +248 -0
  2472. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  2473. package/src/resources/extensions/shared/rtk.ts +98 -0
  2474. package/src/resources/extensions/shared/sanitize.ts +55 -0
  2475. package/src/resources/extensions/shared/terminal.ts +28 -0
  2476. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +161 -0
  2477. package/src/resources/extensions/shared/tests/format-utils.test.ts +155 -0
  2478. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +90 -0
  2479. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +198 -0
  2480. package/src/resources/extensions/shared/tests/interview-preview.test.ts +185 -0
  2481. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +144 -0
  2482. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  2483. package/src/resources/extensions/shared/tui.ts +11 -0
  2484. package/src/resources/extensions/shared/ui.ts +401 -0
  2485. package/src/resources/extensions/slash-commands/audit.ts +89 -0
  2486. package/src/resources/extensions/slash-commands/clear.ts +10 -0
  2487. package/src/resources/extensions/slash-commands/create-extension.ts +311 -0
  2488. package/src/resources/extensions/slash-commands/create-slash-command.ts +234 -0
  2489. package/src/resources/extensions/slash-commands/extension-manifest.json +11 -0
  2490. package/src/resources/extensions/slash-commands/index.ts +12 -0
  2491. package/src/resources/extensions/subagent/agents.ts +166 -0
  2492. package/src/resources/extensions/subagent/extension-manifest.json +13 -0
  2493. package/src/resources/extensions/subagent/index.ts +1938 -0
  2494. package/src/resources/extensions/subagent/isolation.ts +504 -0
  2495. package/src/resources/extensions/subagent/launch.ts +131 -0
  2496. package/src/resources/extensions/subagent/run-store.ts +218 -0
  2497. package/src/resources/extensions/subagent/tests/agents-conflicts.test.ts +33 -0
  2498. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  2499. package/src/resources/extensions/subagent/tests/model-override.test.ts +55 -0
  2500. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  2501. package/src/resources/extensions/subagent/worker-registry.ts +100 -0
  2502. package/src/resources/extensions/ttsr/extension-manifest.json +11 -0
  2503. package/src/resources/extensions/ttsr/index.ts +168 -0
  2504. package/src/resources/extensions/ttsr/rule-loader.ts +75 -0
  2505. package/src/resources/extensions/ttsr/ttsr-interrupt.md +6 -0
  2506. package/src/resources/extensions/ttsr/ttsr-manager.ts +465 -0
  2507. package/src/resources/extensions/universal-config/discovery.ts +104 -0
  2508. package/src/resources/extensions/universal-config/extension-manifest.json +13 -0
  2509. package/src/resources/extensions/universal-config/format.ts +191 -0
  2510. package/src/resources/extensions/universal-config/index.ts +120 -0
  2511. package/src/resources/extensions/universal-config/package.json +11 -0
  2512. package/src/resources/extensions/universal-config/scanners.ts +642 -0
  2513. package/src/resources/extensions/universal-config/tests/discovery.test.ts +119 -0
  2514. package/src/resources/extensions/universal-config/tests/format.test.ts +127 -0
  2515. package/src/resources/extensions/universal-config/tests/scanners.test.ts +456 -0
  2516. package/src/resources/extensions/universal-config/tools.ts +60 -0
  2517. package/src/resources/extensions/universal-config/types.ts +135 -0
  2518. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  2519. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  2520. package/src/resources/extensions/visual-brief/index.ts +8 -0
  2521. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  2522. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  2523. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  2524. package/src/resources/extensions/voice/extension-manifest.json +12 -0
  2525. package/src/resources/extensions/voice/index.ts +264 -0
  2526. package/src/resources/extensions/voice/linux-ready.ts +86 -0
  2527. package/src/resources/extensions/voice/speech-recognizer.py +504 -0
  2528. package/src/resources/extensions/voice/speech-recognizer.swift +154 -0
  2529. package/src/resources/extensions/voice/tests/linux-ready.test.ts +140 -0
  2530. package/src/resources/skills/accessibility/SKILL.md +522 -0
  2531. package/src/resources/skills/accessibility/references/WCAG.md +162 -0
  2532. package/src/resources/skills/agent-browser/SKILL.md +517 -0
  2533. package/src/resources/skills/agent-browser/references/authentication.md +202 -0
  2534. package/src/resources/skills/agent-browser/references/commands.md +263 -0
  2535. package/src/resources/skills/agent-browser/references/profiling.md +120 -0
  2536. package/src/resources/skills/agent-browser/references/proxy-support.md +194 -0
  2537. package/src/resources/skills/agent-browser/references/session-management.md +193 -0
  2538. package/src/resources/skills/agent-browser/references/snapshot-refs.md +194 -0
  2539. package/src/resources/skills/agent-browser/references/video-recording.md +173 -0
  2540. package/src/resources/skills/agent-browser/templates/authenticated-session.sh +105 -0
  2541. package/src/resources/skills/agent-browser/templates/capture-workflow.sh +69 -0
  2542. package/src/resources/skills/agent-browser/templates/form-automation.sh +62 -0
  2543. package/src/resources/skills/api-design/SKILL.md +190 -0
  2544. package/src/resources/skills/best-practices/SKILL.md +583 -0
  2545. package/src/resources/skills/btw/SKILL.md +42 -0
  2546. package/src/resources/skills/code-optimizer/SKILL.md +160 -0
  2547. package/src/resources/skills/code-optimizer/references/algorithmic-complexity.md +66 -0
  2548. package/src/resources/skills/code-optimizer/references/build-compilation.md +90 -0
  2549. package/src/resources/skills/code-optimizer/references/bundle-dependencies.md +82 -0
  2550. package/src/resources/skills/code-optimizer/references/caching-memoization.md +76 -0
  2551. package/src/resources/skills/code-optimizer/references/concurrency-async.md +80 -0
  2552. package/src/resources/skills/code-optimizer/references/config-infra.md +71 -0
  2553. package/src/resources/skills/code-optimizer/references/data-structures.md +80 -0
  2554. package/src/resources/skills/code-optimizer/references/database-queries.md +76 -0
  2555. package/src/resources/skills/code-optimizer/references/dead-code-redundancy.md +84 -0
  2556. package/src/resources/skills/code-optimizer/references/error-resilience.md +80 -0
  2557. package/src/resources/skills/code-optimizer/references/io-network.md +89 -0
  2558. package/src/resources/skills/code-optimizer/references/logging-observability.md +64 -0
  2559. package/src/resources/skills/code-optimizer/references/memory-resources.md +66 -0
  2560. package/src/resources/skills/code-optimizer/references/rendering-ui.md +90 -0
  2561. package/src/resources/skills/code-optimizer/references/security-performance.md +68 -0
  2562. package/src/resources/skills/core-web-vitals/SKILL.md +441 -0
  2563. package/src/resources/skills/core-web-vitals/references/LCP.md +208 -0
  2564. package/src/resources/skills/create-gsd-extension/SKILL.md +93 -0
  2565. package/src/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
  2566. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
  2567. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
  2568. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
  2569. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
  2570. package/src/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
  2571. package/src/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
  2572. package/src/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
  2573. package/src/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
  2574. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +37 -0
  2575. package/src/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
  2576. package/src/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
  2577. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
  2578. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
  2579. package/src/resources/skills/create-gsd-extension/references/state-management.md +70 -0
  2580. package/src/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
  2581. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
  2582. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
  2583. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +104 -0
  2584. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
  2585. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +176 -0
  2586. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +76 -0
  2587. package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
  2588. package/src/resources/skills/create-skill/SKILL.md +186 -0
  2589. package/src/resources/skills/create-skill/references/api-security.md +226 -0
  2590. package/src/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
  2591. package/src/resources/skills/create-skill/references/common-patterns.md +595 -0
  2592. package/src/resources/skills/create-skill/references/core-principles.md +437 -0
  2593. package/src/resources/skills/create-skill/references/executable-code.md +175 -0
  2594. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
  2595. package/src/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
  2596. package/src/resources/skills/create-skill/references/recommended-structure.md +168 -0
  2597. package/src/resources/skills/create-skill/references/skill-structure.md +372 -0
  2598. package/src/resources/skills/create-skill/references/use-xml-tags.md +466 -0
  2599. package/src/resources/skills/create-skill/references/using-scripts.md +113 -0
  2600. package/src/resources/skills/create-skill/references/using-templates.md +112 -0
  2601. package/src/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
  2602. package/src/resources/skills/create-skill/templates/router-skill.md +73 -0
  2603. package/src/resources/skills/create-skill/templates/simple-skill.md +33 -0
  2604. package/src/resources/skills/create-skill/workflows/add-reference.md +96 -0
  2605. package/src/resources/skills/create-skill/workflows/add-script.md +93 -0
  2606. package/src/resources/skills/create-skill/workflows/add-template.md +74 -0
  2607. package/src/resources/skills/create-skill/workflows/add-workflow.md +120 -0
  2608. package/src/resources/skills/create-skill/workflows/audit-skill.md +148 -0
  2609. package/src/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
  2610. package/src/resources/skills/create-skill/workflows/get-guidance.md +121 -0
  2611. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
  2612. package/src/resources/skills/create-skill/workflows/verify-skill.md +204 -0
  2613. package/src/resources/skills/create-workflow/SKILL.md +130 -0
  2614. package/src/resources/skills/create-workflow/references/feature-patterns.md +128 -0
  2615. package/src/resources/skills/create-workflow/references/verification-policies.md +76 -0
  2616. package/src/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
  2617. package/src/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
  2618. package/src/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
  2619. package/src/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
  2620. package/src/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
  2621. package/src/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
  2622. package/src/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
  2623. package/src/resources/skills/debug-like-expert/SKILL.md +231 -0
  2624. package/src/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
  2625. package/src/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
  2626. package/src/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
  2627. package/src/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
  2628. package/src/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
  2629. package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
  2630. package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
  2631. package/src/resources/skills/design-an-interface/SKILL.md +102 -0
  2632. package/src/resources/skills/forensics/SKILL.md +153 -0
  2633. package/src/resources/skills/frontend-design/SKILL.md +45 -0
  2634. package/src/resources/skills/github-workflows/SKILL.md +90 -0
  2635. package/src/resources/skills/github-workflows/references/gh/SKILL.md +276 -0
  2636. package/src/resources/skills/github-workflows/references/gh/references/issue-stories.md +204 -0
  2637. package/src/resources/skills/github-workflows/references/gh/references/labels.md +170 -0
  2638. package/src/resources/skills/github-workflows/references/gh/references/milestones.md +158 -0
  2639. package/src/resources/skills/github-workflows/references/gh/references/projects-v2.md +177 -0
  2640. package/src/resources/skills/github-workflows/references/gh/scripts/experiment_cleanup.py +191 -0
  2641. package/src/resources/skills/github-workflows/references/gh/scripts/github_project_setup.py +799 -0
  2642. package/src/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  2643. package/src/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  2644. package/src/resources/skills/grill-me/SKILL.md +93 -0
  2645. package/src/resources/skills/handoff/SKILL.md +121 -0
  2646. package/src/resources/skills/lint/SKILL.md +145 -0
  2647. package/src/resources/skills/make-interfaces-feel-better/SKILL.md +122 -0
  2648. package/src/resources/skills/make-interfaces-feel-better/animations.md +379 -0
  2649. package/src/resources/skills/make-interfaces-feel-better/performance.md +88 -0
  2650. package/src/resources/skills/make-interfaces-feel-better/surfaces.md +247 -0
  2651. package/src/resources/skills/make-interfaces-feel-better/typography.md +123 -0
  2652. package/src/resources/skills/observability/SKILL.md +174 -0
  2653. package/src/resources/skills/react-best-practices/README.md +123 -0
  2654. package/src/resources/skills/react-best-practices/SKILL.md +136 -0
  2655. package/src/resources/skills/react-best-practices/metadata.json +15 -0
  2656. package/src/resources/skills/react-best-practices/rules/_sections.md +46 -0
  2657. package/src/resources/skills/react-best-practices/rules/_template.md +28 -0
  2658. package/src/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  2659. package/src/resources/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  2660. package/src/resources/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  2661. package/src/resources/skills/react-best-practices/rules/async-api-routes.md +38 -0
  2662. package/src/resources/skills/react-best-practices/rules/async-defer-await.md +80 -0
  2663. package/src/resources/skills/react-best-practices/rules/async-dependencies.md +51 -0
  2664. package/src/resources/skills/react-best-practices/rules/async-parallel.md +28 -0
  2665. package/src/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  2666. package/src/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  2667. package/src/resources/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  2668. package/src/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  2669. package/src/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  2670. package/src/resources/skills/react-best-practices/rules/bundle-preload.md +50 -0
  2671. package/src/resources/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  2672. package/src/resources/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
  2673. package/src/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  2674. package/src/resources/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  2675. package/src/resources/skills/react-best-practices/rules/js-batch-dom-css.md +107 -0
  2676. package/src/resources/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  2677. package/src/resources/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  2678. package/src/resources/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  2679. package/src/resources/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  2680. package/src/resources/skills/react-best-practices/rules/js-early-exit.md +50 -0
  2681. package/src/resources/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  2682. package/src/resources/skills/react-best-practices/rules/js-index-maps.md +37 -0
  2683. package/src/resources/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  2684. package/src/resources/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  2685. package/src/resources/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  2686. package/src/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  2687. package/src/resources/skills/react-best-practices/rules/rendering-activity.md +26 -0
  2688. package/src/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  2689. package/src/resources/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  2690. package/src/resources/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  2691. package/src/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  2692. package/src/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  2693. package/src/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  2694. package/src/resources/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  2695. package/src/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  2696. package/src/resources/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  2697. package/src/resources/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  2698. package/src/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  2699. package/src/resources/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  2700. package/src/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  2701. package/src/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  2702. package/src/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  2703. package/src/resources/skills/react-best-practices/rules/rerender-memo.md +44 -0
  2704. package/src/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  2705. package/src/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  2706. package/src/resources/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  2707. package/src/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  2708. package/src/resources/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  2709. package/src/resources/skills/react-best-practices/rules/server-auth-actions.md +96 -0
  2710. package/src/resources/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  2711. package/src/resources/skills/react-best-practices/rules/server-cache-react.md +76 -0
  2712. package/src/resources/skills/react-best-practices/rules/server-dedup-props.md +65 -0
  2713. package/src/resources/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
  2714. package/src/resources/skills/react-best-practices/rules/server-serialization.md +38 -0
  2715. package/src/resources/skills/review/SKILL.md +218 -0
  2716. package/src/resources/skills/security-review/SKILL.md +181 -0
  2717. package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
  2718. package/src/resources/skills/tdd/SKILL.md +112 -0
  2719. package/src/resources/skills/test/SKILL.md +204 -0
  2720. package/src/resources/skills/userinterface-wiki/SKILL.md +253 -0
  2721. package/src/resources/skills/userinterface-wiki/rules/_sections.md +66 -0
  2722. package/src/resources/skills/userinterface-wiki/rules/_template.md +24 -0
  2723. package/src/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
  2724. package/src/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
  2725. package/src/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
  2726. package/src/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
  2727. package/src/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
  2728. package/src/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
  2729. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
  2730. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
  2731. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
  2732. package/src/resources/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
  2733. package/src/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
  2734. package/src/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
  2735. package/src/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
  2736. package/src/resources/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
  2737. package/src/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
  2738. package/src/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
  2739. package/src/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
  2740. package/src/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
  2741. package/src/resources/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
  2742. package/src/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
  2743. package/src/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
  2744. package/src/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
  2745. package/src/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
  2746. package/src/resources/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
  2747. package/src/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
  2748. package/src/resources/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
  2749. package/src/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
  2750. package/src/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
  2751. package/src/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
  2752. package/src/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
  2753. package/src/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
  2754. package/src/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
  2755. package/src/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
  2756. package/src/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
  2757. package/src/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
  2758. package/src/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
  2759. package/src/resources/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
  2760. package/src/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
  2761. package/src/resources/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
  2762. package/src/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
  2763. package/src/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
  2764. package/src/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
  2765. package/src/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
  2766. package/src/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
  2767. package/src/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
  2768. package/src/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
  2769. package/src/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
  2770. package/src/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
  2771. package/src/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
  2772. package/src/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
  2773. package/src/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
  2774. package/src/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
  2775. package/src/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
  2776. package/src/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
  2777. package/src/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
  2778. package/src/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
  2779. package/src/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
  2780. package/src/resources/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
  2781. package/src/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
  2782. package/src/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
  2783. package/src/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
  2784. package/src/resources/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
  2785. package/src/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
  2786. package/src/resources/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
  2787. package/src/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
  2788. package/src/resources/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
  2789. package/src/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
  2790. package/src/resources/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
  2791. package/src/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
  2792. package/src/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
  2793. package/src/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
  2794. package/src/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
  2795. package/src/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
  2796. package/src/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
  2797. package/src/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
  2798. package/src/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
  2799. package/src/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
  2800. package/src/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
  2801. package/src/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
  2802. package/src/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
  2803. package/src/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
  2804. package/src/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
  2805. package/src/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
  2806. package/src/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
  2807. package/src/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
  2808. package/src/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
  2809. package/src/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
  2810. package/src/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
  2811. package/src/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
  2812. package/src/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
  2813. package/src/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
  2814. package/src/resources/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
  2815. package/src/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
  2816. package/src/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
  2817. package/src/resources/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
  2818. package/src/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
  2819. package/src/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
  2820. package/src/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
  2821. package/src/resources/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
  2822. package/src/resources/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
  2823. package/src/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
  2824. package/src/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
  2825. package/src/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
  2826. package/src/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
  2827. package/src/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
  2828. package/src/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
  2829. package/src/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
  2830. package/src/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
  2831. package/src/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
  2832. package/src/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
  2833. package/src/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
  2834. package/src/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
  2835. package/src/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
  2836. package/src/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
  2837. package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
  2838. package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
  2839. package/src/resources/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
  2840. package/src/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
  2841. package/src/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
  2842. package/src/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
  2843. package/src/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
  2844. package/src/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
  2845. package/src/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
  2846. package/src/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
  2847. package/src/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
  2848. package/src/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
  2849. package/src/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
  2850. package/src/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
  2851. package/src/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
  2852. package/src/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
  2853. package/src/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
  2854. package/src/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
  2855. package/src/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
  2856. package/src/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
  2857. package/src/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
  2858. package/src/resources/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
  2859. package/src/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
  2860. package/src/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
  2861. package/src/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
  2862. package/src/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
  2863. package/src/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
  2864. package/src/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
  2865. package/src/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
  2866. package/src/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
  2867. package/src/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
  2868. package/src/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
  2869. package/src/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
  2870. package/src/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
  2871. package/src/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
  2872. package/src/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
  2873. package/src/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
  2874. package/src/resources/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
  2875. package/src/resources/skills/verify-before-complete/SKILL.md +98 -0
  2876. package/src/resources/skills/web-design-guidelines/SKILL.md +39 -0
  2877. package/src/resources/skills/web-quality-audit/SKILL.md +168 -0
  2878. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +91 -0
  2879. package/src/resources/skills/write-docs/SKILL.md +82 -0
  2880. package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
@@ -0,0 +1,3014 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Auto-loop pipeline phases, merge closeout, and finalize handling.
3
+ /**
4
+ * auto/phases.ts — Pipeline phases for the auto-loop.
5
+ *
6
+ * Contains: runPreDispatch, runDispatch, runGuards, runUnitPhase, runFinalize,
7
+ * plus internal helpers generateMilestoneReport and closeoutAndStop.
8
+ *
9
+ * Imports from: auto/types, auto/detect-stuck, auto/run-unit, auto/loop-deps
10
+ */
11
+
12
+ import { importExtensionModule, type ExtensionAPI, type ExtensionContext } from "@gsd/pi-coding-agent";
13
+
14
+ import type { AutoSession, SidecarItem } from "./session.js";
15
+ import type { LoopDeps } from "./loop-deps.js";
16
+ import {
17
+ USER_DRIVEN_DEEP_UNITS,
18
+ isAwaitingUserInput,
19
+ type PostUnitContext,
20
+ type PreVerificationOpts,
21
+ } from "../auto-post-unit.js";
22
+ import type { Phase } from "../types.js";
23
+ import {
24
+ MAX_RECOVERY_CHARS,
25
+ BUDGET_THRESHOLDS,
26
+ MAX_FINALIZE_TIMEOUTS,
27
+ type PhaseResult,
28
+ type IterationContext,
29
+ type LoopState,
30
+ type PreDispatchData,
31
+ type IterationData,
32
+ } from "./types.js";
33
+ import { detectStuck } from "./detect-stuck.js";
34
+ import { runUnit } from "./run-unit.js";
35
+ import { debugLog } from "../debug-logger.js";
36
+ import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "../worktree-root.js";
37
+ import { classifyProject } from "../detection.js";
38
+ import { MergeConflictError } from "../git-service.js";
39
+ import { setCurrentPhase, clearCurrentPhase } from "../../shared/gsd-phase-state.js";
40
+ import { pauseAutoForProviderError } from "../provider-error-pause.js";
41
+ import { resumeAutoAfterProviderDelay } from "../bootstrap/provider-error-resume.js";
42
+ import { join, basename } from "node:path";
43
+ import { existsSync, cpSync } from "node:fs";
44
+ import {
45
+ logWarning,
46
+ logError,
47
+ _resetLogs,
48
+ drainLogs,
49
+ drainAndSummarize,
50
+ formatForNotification,
51
+ hasAnyIssues,
52
+ } from "../workflow-logger.js";
53
+ import { gsdRoot, normalizeRealPath } from "../paths.js";
54
+ import { atomicWriteSync } from "../atomic-write.js";
55
+ import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps, refreshRecoveryDbForArtifact } from "../auto-recovery.js";
56
+ import { writeUnitRuntimeRecord } from "../unit-runtime.js";
57
+ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
58
+ import { getEligibleSlices } from "../slice-parallel-eligibility.js";
59
+ import { isSliceParallelActive, startSliceParallel } from "../slice-parallel-orchestrator.js";
60
+ import { isDbAvailable, getMilestoneSlices, getSlice, getTask, refreshOpenDatabaseFromDisk } from "../gsd-db.js";
61
+ import { isClosedStatus } from "../status-guards.js";
62
+ import { setRuntimeKv } from "../db/runtime-kv.js";
63
+ import { getLatestForUnit } from "../db/unit-dispatches.js";
64
+ import { reconcileBeforeSpawn } from "../state-reconciliation.js";
65
+ import type { MinimalModelRegistry } from "../context-budget.js";
66
+ import type { PostflightResult, PreflightResult } from "../clean-root-preflight.js";
67
+ import { ensurePlanV2Graph, isEmptyPlanV2GraphResult, isMissingFinalizedContextResult } from "../uok/plan-v2.js";
68
+ import { resolveUokFlags } from "../uok/flags.js";
69
+ import { UokGateRunner } from "../uok/gate-runner.js";
70
+ import { resetEvidence, loadEvidenceFromDisk } from "../safety/evidence-collector.js";
71
+ import { parseUnitId } from "../unit-id.js";
72
+ import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
73
+ import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
74
+ import { getContextPauseAction } from "../auto-budget.js";
75
+ import {
76
+ getWorkflowTransportSupportError,
77
+ getRequiredWorkflowToolsForAutoUnit,
78
+ supportsStructuredQuestions,
79
+ } from "../workflow-mcp.js";
80
+ import { resolveManifest } from "../unit-context-manifest.js";
81
+ import { createWorktreeSafetyModule, type WorktreeSafetyResult } from "../worktree-safety.js";
82
+ import { isSuspiciousGhostCompletion } from "../auto-unit-closeout.js";
83
+ import { decideVerificationRetry, verificationRetryKey } from "./verification-retry-policy.js";
84
+ import { buildPhaseHandoffOutcome, setAutoOutcomeWidget } from "../auto-dashboard.js";
85
+ import { getConsecutiveDispatchBlocker } from "../dispatch-guard.js";
86
+ import {
87
+ captureRootDirtySnapshot,
88
+ detectRootWriteLeak,
89
+ formatRootWriteLeakMessage,
90
+ } from "../root-write-leak-guard.js";
91
+
92
+ export const STUCK_WINDOW_SIZE = 6;
93
+ const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
94
+
95
+ // ─── Path Comparison Helper ───────────────────────────────────────────────
96
+ /** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
97
+ function isSamePathLocal(a: string, b: string): boolean {
98
+ return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
99
+ }
100
+
101
+ function isIsolatedWorktreeSession(s: AutoSession): boolean {
102
+ return Boolean(s.originalBasePath)
103
+ && Boolean(s.basePath)
104
+ && !isSamePathLocal(s.originalBasePath, s.basePath);
105
+ }
106
+
107
+ function persistStuckRecoveryAttempts(s: AutoSession, loopState: LoopState): void {
108
+ const scopeId = normalizeRealPath(
109
+ s.scope?.workspace.projectRoot ?? (s.originalBasePath || s.basePath),
110
+ );
111
+ if (!scopeId) return;
112
+ try {
113
+ setRuntimeKv("global", scopeId, STUCK_RECOVERY_ATTEMPTS_KEY, loopState.stuckRecoveryAttempts);
114
+ } catch (err) {
115
+ debugLog("autoLoop", {
116
+ phase: "save-stuck-state-failed",
117
+ error: err instanceof Error ? err.message : String(err),
118
+ });
119
+ }
120
+ }
121
+
122
+ async function applyVerificationRetryPolicy(
123
+ ic: IterationContext,
124
+ unitType: string | undefined,
125
+ phase: "artifact-verification-retry" | "verification-retry" | "pre-execution-retry",
126
+ ): Promise<PhaseResult | null> {
127
+ const { ctx, pi, s, deps } = ic;
128
+ const retryInfo = s.pendingVerificationRetry;
129
+ const key = unitType && retryInfo
130
+ ? verificationRetryKey(unitType, retryInfo.unitId)
131
+ : undefined;
132
+ const decision = decideVerificationRetry({
133
+ unitType,
134
+ retryInfo,
135
+ previousFailureHash: key ? s.verificationRetryFailureHashes.get(key) : undefined,
136
+ });
137
+
138
+ if (decision.action === "pause") {
139
+ s.pendingVerificationRetry = null;
140
+ debugLog("autoLoop", {
141
+ phase: `${phase}-paused`,
142
+ reason: decision.reason,
143
+ unitType,
144
+ unitId: retryInfo?.unitId,
145
+ failureHash: decision.failureHash,
146
+ });
147
+ ctx.ui.notify(
148
+ decision.reason === "duplicate-failure-context"
149
+ ? `Verification retry for ${unitType ?? "unit"} ${retryInfo?.unitId ?? "unknown"} produced the same failure context. Pausing auto-mode instead of re-dispatching.`
150
+ : "Verification retry requested without retry context. Pausing auto-mode instead of re-dispatching.",
151
+ "warning",
152
+ );
153
+ await deps.pauseAuto(ctx, pi);
154
+ return { action: "break", reason: decision.reason };
155
+ }
156
+
157
+ s.verificationRetryFailureHashes.set(decision.key, decision.failureHash);
158
+ debugLog("autoLoop", {
159
+ phase: `${phase}-backoff`,
160
+ iteration: ic.iteration,
161
+ unitType,
162
+ unitId: retryInfo?.unitId,
163
+ attempt: retryInfo?.attempt,
164
+ delayMs: decision.delayMs,
165
+ baseDelayMs: decision.baseDelayMs,
166
+ failureHash: decision.failureHash,
167
+ });
168
+ await new Promise<void>((resolve) => setTimeout(resolve, decision.delayMs));
169
+ return null;
170
+ }
171
+
172
+ function rememberRetryDispatch(
173
+ s: AutoSession,
174
+ unit: { type: string; id: string } | null,
175
+ iterData: IterationData,
176
+ ): void {
177
+ if (!unit) return;
178
+ s.pendingVerificationRetryDispatch = {
179
+ unitType: unit.type,
180
+ unitId: unit.id,
181
+ prompt: iterData.prompt,
182
+ pauseAfterUatDispatch: iterData.pauseAfterUatDispatch,
183
+ state: iterData.state,
184
+ mid: iterData.mid,
185
+ midTitle: iterData.midTitle,
186
+ };
187
+ }
188
+
189
+ function getAlreadyClosedDispatchReason(unitType: string, unitId: string): string | null {
190
+ if (!isDbAvailable()) return null;
191
+ refreshOpenDatabaseFromDisk();
192
+ const { milestone, slice, task } = parseUnitId(unitId);
193
+ if (unitType === "execute-task" && milestone && slice && task) {
194
+ const row = getTask(milestone, slice, task);
195
+ return row && isClosedStatus(row.status)
196
+ ? `execute-task ${unitId} is already ${row.status}`
197
+ : null;
198
+ }
199
+ if (unitType === "complete-slice" && milestone && slice) {
200
+ const row = getSlice(milestone, slice);
201
+ return row && isClosedStatus(row.status)
202
+ ? `complete-slice ${unitId} is already ${row.status}`
203
+ : null;
204
+ }
205
+ return null;
206
+ }
207
+
208
+ export function shouldDegradeEmptyWorktreeToProjectRoot(
209
+ worktreeClassification: ReturnType<typeof classifyProject>,
210
+ projectRootClassification: ReturnType<typeof classifyProject>,
211
+ ): boolean {
212
+ return (
213
+ worktreeClassification.kind === "greenfield" &&
214
+ projectRootClassification.kind !== "greenfield" &&
215
+ projectRootClassification.kind !== "invalid-repo"
216
+ );
217
+ }
218
+
219
+ function unitWritesSource(unitType: string): boolean | null {
220
+ if (unitType.startsWith("hook/")) return false;
221
+ // Backward compatibility: sidecar queues from older builds may persist
222
+ // prefixed unit types (e.g. "sidecar/quick-task").
223
+ const normalizedUnitType = unitType.startsWith("sidecar/")
224
+ ? unitType.slice("sidecar/".length)
225
+ : unitType;
226
+ const manifest = resolveManifest(normalizedUnitType);
227
+ if (!manifest) return null;
228
+ return manifest.tools.mode === "all" || manifest.tools.mode === "docs";
229
+ }
230
+
231
+ function formatWorktreeSafetyFailure(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
232
+ return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
233
+ }
234
+
235
+ function formatWorktreeSafetyStopReason(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
236
+ if (result.kind === "empty-worktree-with-project-content") {
237
+ return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
238
+ }
239
+ return `Worktree Safety failed (${result.kind}).`;
240
+ }
241
+
242
+ type BlockerKind = "needs-remediation-dead-end" | "other";
243
+
244
+ function classifyBlocker(blocker: string): BlockerKind {
245
+ const normalized = blocker.toLowerCase();
246
+ if (normalized.includes("needs-remediation") && normalized.includes("all slices are complete")) {
247
+ return "needs-remediation-dead-end";
248
+ }
249
+ return "other";
250
+ }
251
+
252
+ function sanitizeBlockerForUser(blocker: string): string {
253
+ return blocker.replaceAll("gsd_reassess_roadmap", "/gsd dispatch reassess");
254
+ }
255
+
256
+ /**
257
+ * Formats blocked resume guidance for users, ensuring internal tool names are
258
+ * never surfaced in notification text.
259
+ */
260
+ function formatBlockedResumeMessage(blockers: string[]): string {
261
+ const classifiedBlockers = blockers.map((blocker) => ({
262
+ blocker: sanitizeBlockerForUser(blocker),
263
+ kind: classifyBlocker(blocker),
264
+ }));
265
+ const hasNeedsRemediationDeadEnd = classifiedBlockers.some(
266
+ (classifiedBlocker) => classifiedBlocker.kind === "needs-remediation-dead-end"
267
+ );
268
+ if (hasNeedsRemediationDeadEnd) {
269
+ return "Blocked: milestone validation requires remediation but all slices are complete. Run /gsd dispatch reassess to add remediation slices, then /gsd auto to continue.";
270
+ }
271
+ return `Blocked: ${classifiedBlockers.map((classifiedBlocker) => classifiedBlocker.blocker).join(", ")}. Fix and run /gsd auto to resume.`;
272
+ }
273
+
274
+ function resolveEmptyWorktreeWithProjectContent(
275
+ unitRoot: string,
276
+ projectRoot: string,
277
+ ): boolean {
278
+ if (isSamePathLocal(unitRoot, projectRoot)) return false;
279
+ const worktreeClassification = classifyProject(unitRoot);
280
+ if (worktreeClassification.kind !== "greenfield") return false;
281
+ const projectRootClassification = classifyProject(projectRoot);
282
+ return shouldDegradeEmptyWorktreeToProjectRoot(worktreeClassification, projectRootClassification);
283
+ }
284
+
285
+ async function validateSourceWriteWorktreeSafety(
286
+ ic: IterationContext,
287
+ unitType: string,
288
+ unitId: string,
289
+ milestoneId: string | undefined,
290
+ phase: string,
291
+ ): Promise<{ action: "break"; reason: string } | null> {
292
+ const { ctx, pi, s, deps } = ic;
293
+ if (!s.basePath) return null;
294
+
295
+ // Custom engine workflows (graph-driven, registered via run dirs) define
296
+ // their own step ids that are not in the GSD UnitContextManifest. Don't
297
+ // fail closed for those — the custom engine owns its own dispatch
298
+ // contract. The fail-closed safety check applies only to built-in GSD
299
+ // units whose Tool Contract is registered in the manifest. Use a truthy
300
+ // check so undefined (test sessions that never set the field) routes
301
+ // through the safety check, matching the regression test contract.
302
+ if (s.activeEngineId) return null;
303
+
304
+ const writesSource = unitWritesSource(unitType);
305
+ if (writesSource === null) {
306
+ const msg = `Worktree Safety failed (missing-tool-contract): missing Tool Contract for ${unitType}. Add a UnitContextManifest entry before dispatching this Unit.`;
307
+ debugLog("worktreeSafety", {
308
+ phase,
309
+ unitType,
310
+ unitId,
311
+ milestoneId,
312
+ result: { ok: false, kind: "missing-tool-contract", reason: msg },
313
+ basePath: s.basePath,
314
+ });
315
+ ctx.ui.notify(msg, "error");
316
+ await deps.stopAuto(ctx, pi, msg);
317
+ return { action: "break", reason: "missing-tool-contract" };
318
+ }
319
+ if (!writesSource) return null;
320
+
321
+ const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
322
+ const isolationMode = deps.getIsolationMode(projectRoot);
323
+ if (isolationMode !== "worktree") return null;
324
+
325
+ const safety = createWorktreeSafetyModule();
326
+ const result = safety.validateUnitRoot({
327
+ unitType,
328
+ unitId,
329
+ writeScope: "source-writing",
330
+ projectRoot,
331
+ unitRoot: s.basePath,
332
+ milestoneId,
333
+ isolationMode,
334
+ expectedBranch: milestoneId ? deps.autoWorktreeBranch(milestoneId) : null,
335
+ emptyWorktreeWithProjectContent: resolveEmptyWorktreeWithProjectContent(s.basePath, projectRoot),
336
+ lease: s.workerId
337
+ ? {
338
+ required: true,
339
+ held: s.currentMilestoneId === milestoneId && s.milestoneLeaseToken !== null,
340
+ owner: s.workerId,
341
+ }
342
+ : undefined,
343
+ });
344
+
345
+ if (result.ok) return null;
346
+
347
+ const msg = formatWorktreeSafetyFailure(result);
348
+ debugLog("worktreeSafety", {
349
+ phase,
350
+ unitType,
351
+ unitId,
352
+ milestoneId,
353
+ result,
354
+ basePath: s.basePath,
355
+ projectRoot,
356
+ });
357
+ ctx.ui.notify(msg, "error");
358
+ await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
359
+ return { action: "break", reason: result.kind };
360
+ }
361
+
362
+ // ─── Session timeout auto-resume state ────────────────────────────────────────
363
+
364
+ let consecutiveSessionTimeouts = 0;
365
+ const MAX_SESSION_TIMEOUT_AUTO_RESUMES = 3;
366
+
367
+ export function resetSessionTimeoutState(): void {
368
+ consecutiveSessionTimeouts = 0;
369
+ }
370
+
371
+ // ─── generateMilestoneReport ──────────────────────────────────────────────────
372
+
373
+ /**
374
+ * Resolve the base path for milestone reports.
375
+ * Prefers originalBasePath (project root) over basePath (which may be a worktree).
376
+ * Exported for testing as _resolveReportBasePath.
377
+ */
378
+ export function _resolveReportBasePath(s: Pick<AutoSession, "originalBasePath" | "basePath">): string {
379
+ return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
380
+ }
381
+
382
+ /**
383
+ * Resolve the authoritative project base for dispatch guards.
384
+ * Prior-milestone completion lives at the project root, even when the active
385
+ * unit is running inside an auto worktree.
386
+ */
387
+ export function _resolveDispatchGuardBasePath(
388
+ s: Pick<AutoSession, "originalBasePath" | "basePath">,
389
+ ): string {
390
+ return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
391
+ }
392
+
393
+ const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
394
+ "executing",
395
+ "summarizing",
396
+ "validating-milestone",
397
+ "completing-milestone",
398
+ ]);
399
+
400
+ export function shouldRunPlanV2Gate(phase: Phase): boolean {
401
+ return PLAN_V2_GATE_PHASES.has(phase);
402
+ }
403
+
404
+ export function _shouldProceedWithInvalidRepoClassificationForTest(
405
+ reason: string | undefined,
406
+ hasGit: boolean,
407
+ ): boolean {
408
+ return reason === "missing .git" && hasGit;
409
+ }
410
+
411
+ export function _resolveCurrentUnitStartedAtForTest(
412
+ currentUnit: { startedAt: number } | null | undefined,
413
+ ): number | undefined {
414
+ return currentUnit?.startedAt;
415
+ }
416
+
417
+ /**
418
+ * Generate and write an HTML milestone report snapshot.
419
+ * Extracted from the milestone-transition block in autoLoop.
420
+ */
421
+ async function generateMilestoneReport(
422
+ s: AutoSession,
423
+ ctx: ExtensionContext,
424
+ milestoneId: string,
425
+ ): Promise<void> {
426
+ const { loadVisualizerData } = await importExtensionModule<typeof import("../visualizer-data.js")>(import.meta.url, "../visualizer-data.js");
427
+ const { generateHtmlReport } = await importExtensionModule<typeof import("../export-html.js")>(import.meta.url, "../export-html.js");
428
+ const { writeReportSnapshot } = await importExtensionModule<typeof import("../reports.js")>(import.meta.url, "../reports.js");
429
+ const { basename } = await import("node:path");
430
+
431
+ const reportBasePath = _resolveReportBasePath(s);
432
+
433
+ const snapData = await loadVisualizerData(reportBasePath);
434
+ const completedMs = snapData.milestones.find(
435
+ (m: { id: string }) => m.id === milestoneId,
436
+ );
437
+ const msTitle = completedMs?.title ?? milestoneId;
438
+ const gsdVersion = process.env.GSD_VERSION ?? "0.0.0";
439
+ const projName = basename(reportBasePath);
440
+ const doneSlices = snapData.milestones.reduce(
441
+ (acc: number, m: { slices: { done: boolean }[] }) =>
442
+ acc + m.slices.filter((sl: { done: boolean }) => sl.done).length,
443
+ 0,
444
+ );
445
+ const totalSlices = snapData.milestones.reduce(
446
+ (acc: number, m: { slices: unknown[] }) => acc + m.slices.length,
447
+ 0,
448
+ );
449
+ const outPath = writeReportSnapshot({
450
+ basePath: reportBasePath,
451
+ html: generateHtmlReport(snapData, {
452
+ projectName: projName,
453
+ projectPath: reportBasePath,
454
+ gsdVersion,
455
+ milestoneId,
456
+ indexRelPath: "index.html",
457
+ }),
458
+ milestoneId,
459
+ milestoneTitle: msTitle,
460
+ kind: "milestone",
461
+ projectName: projName,
462
+ projectPath: reportBasePath,
463
+ gsdVersion,
464
+ totalCost: snapData.totals?.cost ?? 0,
465
+ totalTokens: snapData.totals?.tokens.total ?? 0,
466
+ totalDuration: snapData.totals?.duration ?? 0,
467
+ doneSlices,
468
+ totalSlices,
469
+ doneMilestones: snapData.milestones.filter(
470
+ (m: { status: string }) => m.status === "complete",
471
+ ).length,
472
+ totalMilestones: snapData.milestones.length,
473
+ phase: snapData.phase,
474
+ });
475
+ ctx.ui.notify(
476
+ `Report saved: .gsd/reports/${basename(outPath)} — open index.html to browse progression.`,
477
+ "info",
478
+ );
479
+ }
480
+
481
+ // ─── closeoutAndStop ──────────────────────────────────────────────────────────
482
+
483
+ /**
484
+ * If a unit is in-flight, close it out, then stop auto-mode.
485
+ * Extracted from ~4 identical if-closeout-then-stop sequences in autoLoop.
486
+ */
487
+ async function closeoutAndStop(
488
+ ctx: ExtensionContext,
489
+ pi: ExtensionAPI,
490
+ s: AutoSession,
491
+ deps: LoopDeps,
492
+ reason: string,
493
+ ): Promise<void> {
494
+ if (s.currentUnit) {
495
+ await deps.closeoutUnit(
496
+ ctx,
497
+ s.basePath,
498
+ s.currentUnit.type,
499
+ s.currentUnit.id,
500
+ s.currentUnit.startedAt,
501
+ deps.buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id),
502
+ );
503
+ s.currentUnit = null;
504
+ }
505
+ await deps.stopAuto(ctx, pi, reason);
506
+ }
507
+
508
+ async function stopOnPostflightRecoveryNeeded(
509
+ ic: IterationContext,
510
+ result: PostflightResult,
511
+ milestoneId: string,
512
+ ): Promise<{ action: "break"; reason: string } | null> {
513
+ if (!result.needsManualRecovery) return null;
514
+ const { ctx, pi, deps } = ic;
515
+ const reason = `Post-merge stash restore failed for milestone ${milestoneId}`;
516
+ ctx.ui.notify(
517
+ `${reason}. Resolve the working tree before resuming auto-mode. ${result.message}`,
518
+ "error",
519
+ );
520
+ await deps.stopAuto(ctx, pi, reason);
521
+ return { action: "break", reason: "postflight-stash-restore-failed" };
522
+ }
523
+
524
+ async function restorePreflightStashOrStop(
525
+ ic: IterationContext,
526
+ preflight: PreflightResult,
527
+ milestoneId: string,
528
+ ): Promise<{ action: "break"; reason: string } | null> {
529
+ if (!preflight.stashPushed) return null;
530
+ const { ctx, s, deps } = ic;
531
+ const result = deps.postflightPopStash(
532
+ s.originalBasePath || s.basePath,
533
+ milestoneId,
534
+ preflight.stashMarker,
535
+ ctx.ui.notify.bind(ctx.ui),
536
+ );
537
+ return stopOnPostflightRecoveryNeeded(ic, result, milestoneId);
538
+ }
539
+
540
+ /**
541
+ * Run a milestone merge surrounded by preflight stash + always-on postflight
542
+ * pop. The previous code popped the stash only after a successful merge, which
543
+ * leaked `gsd-preflight-stash:M00x:*` entries whenever `mergeAndExit` threw —
544
+ * leaving the user's pre-merge working tree silently stashed away after a
545
+ * merge-conflict or other merge error. This helper restores the stash on
546
+ * every exit path, then surfaces the merge or stash failure (in priority
547
+ * order) as the loop's stop reason.
548
+ *
549
+ * Returns a `break` action when auto-mode must stop, or `null` when the merge
550
+ * succeeded and the stash (if any) was restored cleanly.
551
+ */
552
+ export async function _runMilestoneMergeWithStashRestore(
553
+ ic: IterationContext,
554
+ milestoneId: string,
555
+ ): Promise<{ action: "break"; reason: string } | null> {
556
+ const { ctx, pi, s, deps } = ic;
557
+
558
+ const preflight = deps.preflightCleanRoot(
559
+ s.originalBasePath || s.basePath,
560
+ milestoneId,
561
+ ctx.ui.notify.bind(ctx.ui),
562
+ );
563
+ if (preflight.blocked) {
564
+ const reason = preflight.blockedReason === "unmerged-conflicts"
565
+ ? `Pre-merge unresolved Git conflicts block milestone ${milestoneId}`
566
+ : `Pre-merge dirty working tree overlaps milestone ${milestoneId}`;
567
+ await deps.stopAuto(ctx, pi, reason, {
568
+ preserveCompletedMilestoneBranch: true,
569
+ });
570
+ return {
571
+ action: "break",
572
+ reason: preflight.blockedReason === "unmerged-conflicts"
573
+ ? "preflight-unmerged-conflicts"
574
+ : "preflight-dirty-overlap",
575
+ };
576
+ }
577
+
578
+ let mergeError: unknown = null;
579
+ const exitResult = deps.lifecycle.exitMilestone(
580
+ milestoneId,
581
+ { merge: true },
582
+ ctx.ui,
583
+ );
584
+ if (exitResult.ok) {
585
+ s.milestoneMergedInPhases = true;
586
+ } else {
587
+ mergeError = exitResult.cause ?? new Error(`exit ${exitResult.reason}`);
588
+ }
589
+
590
+ // Always attempt to restore the stashed working tree, even on merge error.
591
+ // postflightPopStash itself does not throw; failures surface via the
592
+ // PostflightResult.needsManualRecovery flag.
593
+ let stashResult: PostflightResult | null = null;
594
+ if (preflight.stashPushed) {
595
+ stashResult = deps.postflightPopStash(
596
+ s.originalBasePath || s.basePath,
597
+ milestoneId,
598
+ preflight.stashMarker,
599
+ ctx.ui.notify.bind(ctx.ui),
600
+ );
601
+ }
602
+
603
+ // Merge failure takes priority over stash recovery — the merge is the
604
+ // authoritative gate. If the stash also needed manual recovery, the user
605
+ // already saw the postflightPopStash notify above.
606
+ if (mergeError) {
607
+ if (mergeError instanceof MergeConflictError) {
608
+ // A merge conflict is a recoverable human checkpoint, not an
609
+ // infrastructure failure — the user resolves the conflict and runs
610
+ // `/gsd auto` to resume. Pause (don't stop): stopAuto tears down the
611
+ // session and, because `milestoneMergedInPhases` stays false here,
612
+ // re-runs the already-failed worktree merge in its cleanup step
613
+ // (#2645), then drops the user out of the interactive TUI onto a
614
+ // "stopped" surface.
615
+ const conflictReason = `Merge conflict on milestone ${milestoneId}: ${mergeError.conflictedFiles.join(", ")}. Resolve conflicts manually and run /gsd auto to resume.`;
616
+ ctx.ui.notify(conflictReason, "error");
617
+ await deps.pauseAuto(ctx, pi, {
618
+ message: conflictReason,
619
+ category: "unknown",
620
+ });
621
+ return { action: "break", reason: "merge-conflict" };
622
+ }
623
+ logError("engine", "Milestone merge failed with non-conflict error", {
624
+ milestone: milestoneId,
625
+ error: String(mergeError),
626
+ });
627
+ // Like a merge conflict, a non-conflict merge failure (index lock,
628
+ // network, permissions) is recoverable — the user fixes the cause and
629
+ // runs `/gsd auto` to resume. Pause (don't stop) so the session stays
630
+ // resumable and stopAuto's teardown does not re-run the failed merge.
631
+ const mergeFailReason = `Merge error on milestone ${milestoneId}: ${mergeError instanceof Error ? mergeError.message : String(mergeError)}. Resolve and run /gsd auto to resume.`;
632
+ ctx.ui.notify(mergeFailReason, "error");
633
+ await deps.pauseAuto(ctx, pi, {
634
+ message: mergeFailReason,
635
+ category: "unknown",
636
+ });
637
+ return { action: "break", reason: "merge-failed" };
638
+ }
639
+
640
+ if (stashResult) {
641
+ return stopOnPostflightRecoveryNeeded(ic, stashResult, milestoneId);
642
+ }
643
+ return null;
644
+ }
645
+
646
+ export async function _runMilestoneMergeOnceWithStashRestore(
647
+ ic: IterationContext,
648
+ milestoneId: string,
649
+ ): Promise<{ action: "break"; reason: string } | null> {
650
+ if (ic.s.milestoneMergedInPhases) {
651
+ debugLog("autoLoop", {
652
+ phase: "milestone-merge-skip",
653
+ reason: "already-merged-in-phases",
654
+ milestoneId,
655
+ });
656
+ return null;
657
+ }
658
+ return _runMilestoneMergeWithStashRestore(ic, milestoneId);
659
+ }
660
+
661
+ async function emitCancelledUnitEnd(
662
+ ic: IterationContext,
663
+ unitType: string,
664
+ unitId: string,
665
+ unitStartSeq: number,
666
+ errorContext?: { message: string; category: string; stopReason?: string; isTransient?: boolean; retryAfterMs?: number },
667
+ ): Promise<void> {
668
+ ic.deps.emitJournalEvent({
669
+ ts: new Date().toISOString(),
670
+ flowId: ic.flowId,
671
+ seq: ic.nextSeq(),
672
+ eventType: "unit-end",
673
+ data: {
674
+ unitType,
675
+ unitId,
676
+ status: "cancelled",
677
+ artifactVerified: false,
678
+ ...(errorContext ? { errorContext } : {}),
679
+ },
680
+ causedBy: { flowId: ic.flowId, seq: unitStartSeq },
681
+ });
682
+ }
683
+
684
+ export function _buildCancelledUnitStopReason(
685
+ unitType: string,
686
+ unitId: string,
687
+ errorContext?: { message: string; category: string },
688
+ ): {
689
+ notifyMessage: string;
690
+ stopReason: string;
691
+ loopReason: "session-failed" | "unit-aborted";
692
+ } {
693
+ const cancellationMessage = errorContext?.message ?? "unknown";
694
+ const isSessionCreationFailure = errorContext?.category === "session-failed";
695
+
696
+ if (isSessionCreationFailure) {
697
+ return {
698
+ notifyMessage: `Session creation failed for ${unitType} ${unitId}: ${cancellationMessage}. Stopping auto-mode.`,
699
+ stopReason: `Session creation failed: ${cancellationMessage}`,
700
+ loopReason: "session-failed",
701
+ };
702
+ }
703
+
704
+ return {
705
+ notifyMessage: `Unit ${unitType} ${unitId} aborted after dispatch: ${cancellationMessage}. Stopping auto-mode.`,
706
+ stopReason: `Unit aborted: ${cancellationMessage}`,
707
+ loopReason: "unit-aborted",
708
+ };
709
+ }
710
+
711
+ export function _isPauseOriginCancelledResult(
712
+ isPaused: boolean,
713
+ errorContext?: { message: string; category: string },
714
+ ): boolean {
715
+ return isPaused && !errorContext;
716
+ }
717
+
718
+ async function failClosedOnFinalizeTimeout(
719
+ ic: IterationContext,
720
+ iterData: IterationData,
721
+ loopState: LoopState,
722
+ stage: "pre" | "post",
723
+ startedAt: number,
724
+ ): Promise<PhaseResult> {
725
+ const { ctx, pi, s, deps } = ic;
726
+ const now = Date.now();
727
+ const unitType = iterData.unitType;
728
+ const unitId = iterData.unitId;
729
+ const timeoutMs = stage === "pre" ? FINALIZE_PRE_TIMEOUT_MS : FINALIZE_POST_TIMEOUT_MS;
730
+ const progressKind = stage === "pre" ? "finalize-pre-timeout" : "finalize-post-timeout";
731
+
732
+ writeUnitRuntimeRecord(s.basePath, unitType, unitId, startedAt, {
733
+ phase: "finalize-timeout",
734
+ timeoutAt: now,
735
+ lastProgressAt: now,
736
+ lastProgressKind: progressKind,
737
+ });
738
+
739
+ deps.emitJournalEvent({
740
+ ts: new Date(now).toISOString(),
741
+ flowId: ic.flowId,
742
+ seq: ic.nextSeq(),
743
+ eventType: "unit-end",
744
+ data: {
745
+ unitType,
746
+ unitId,
747
+ status: "timed-out-finalize",
748
+ artifactVerified: false,
749
+ finalizeStage: stage,
750
+ },
751
+ });
752
+
753
+ loopState.consecutiveFinalizeTimeouts++;
754
+ debugLog("autoLoop", {
755
+ phase: progressKind,
756
+ iteration: ic.iteration,
757
+ unitType,
758
+ unitId,
759
+ consecutiveTimeouts: loopState.consecutiveFinalizeTimeouts,
760
+ });
761
+
762
+ ctx.ui.notify(
763
+ `${stage === "pre" ? "postUnitPreVerification" : "postUnitPostVerification"} timed out after ${timeoutMs / 1000}s for ${unitType} ${unitId} (${loopState.consecutiveFinalizeTimeouts}/${MAX_FINALIZE_TIMEOUTS}) — pausing auto-mode for recovery.`,
764
+ "warning",
765
+ );
766
+
767
+ await deps.pauseAuto(ctx, pi);
768
+ s.currentUnit = null;
769
+ clearCurrentPhase();
770
+ drainLogs();
771
+ return { action: "break", reason: progressKind };
772
+ }
773
+
774
+ // ─── runPreDispatch ───────────────────────────────────────────────────────────
775
+
776
+ /**
777
+ * Phase 1: Pre-dispatch — resource guard, health gate, state derivation,
778
+ * milestone transition, terminal conditions.
779
+ * Returns break to exit the loop, or next with PreDispatchData on success.
780
+ */
781
+ export async function runPreDispatch(
782
+ ic: IterationContext,
783
+ loopState: LoopState,
784
+ ): Promise<PhaseResult<PreDispatchData>> {
785
+ const { ctx, pi, s, deps, prefs } = ic;
786
+ const uokFlags = resolveUokFlags(prefs);
787
+ const runPreDispatchGate = async (input: {
788
+ gateId: string;
789
+ gateType: string;
790
+ outcome: "pass" | "fail" | "retry" | "manual-attention";
791
+ failureClass: "none" | "policy" | "input" | "execution" | "artifact" | "verification" | "closeout" | "git" | "timeout" | "manual-attention" | "unknown";
792
+ rationale: string;
793
+ findings?: string;
794
+ milestoneId?: string;
795
+ }): Promise<void> => {
796
+ if (!uokFlags.gates) return;
797
+ const gateRunner = new UokGateRunner();
798
+ gateRunner.register({
799
+ id: input.gateId,
800
+ type: input.gateType,
801
+ execute: async () => ({
802
+ outcome: input.outcome,
803
+ failureClass: input.failureClass,
804
+ rationale: input.rationale,
805
+ findings: input.findings ?? "",
806
+ }),
807
+ });
808
+ await gateRunner.run(input.gateId, {
809
+ basePath: s.basePath,
810
+ traceId: `pre-dispatch:${ic.flowId}`,
811
+ turnId: `iter-${ic.iteration}`,
812
+ milestoneId: input.milestoneId ?? s.currentMilestoneId ?? undefined,
813
+ unitType: "pre-dispatch",
814
+ unitId: `iter-${ic.iteration}`,
815
+ });
816
+ };
817
+
818
+ // Resource version guard
819
+ const staleMsg = deps.checkResourcesStale(s.resourceVersionOnStart);
820
+ if (staleMsg) {
821
+ await runPreDispatchGate({
822
+ gateId: "resource-version-guard",
823
+ gateType: "policy",
824
+ outcome: "fail",
825
+ failureClass: "policy",
826
+ rationale: "resource version guard blocked dispatch",
827
+ findings: staleMsg,
828
+ });
829
+ await deps.stopAuto(ctx, pi, staleMsg);
830
+ debugLog("autoLoop", { phase: "exit", reason: "resources-stale" });
831
+ return { action: "break", reason: "resources-stale" };
832
+ }
833
+ await runPreDispatchGate({
834
+ gateId: "resource-version-guard",
835
+ gateType: "policy",
836
+ outcome: "pass",
837
+ failureClass: "none",
838
+ rationale: "resource version guard passed",
839
+ });
840
+
841
+ deps.invalidateAllCaches();
842
+ s.lastPromptCharCount = undefined;
843
+ s.lastBaselineCharCount = undefined;
844
+
845
+ // Pre-dispatch health gate
846
+ try {
847
+ const healthGate = await deps.preDispatchHealthGate(s.basePath);
848
+ if (healthGate.fixesApplied.length > 0) {
849
+ ctx.ui.notify(
850
+ `Pre-dispatch: ${healthGate.fixesApplied.join(", ")}`,
851
+ "info",
852
+ );
853
+ }
854
+ if (!healthGate.proceed) {
855
+ await runPreDispatchGate({
856
+ gateId: "pre-dispatch-health-gate",
857
+ gateType: "execution",
858
+ outcome: "manual-attention",
859
+ failureClass: "manual-attention",
860
+ rationale: "pre-dispatch health gate blocked dispatch",
861
+ findings: healthGate.reason,
862
+ });
863
+ ctx.ui.notify(
864
+ healthGate.reason || "Pre-dispatch health check failed — run /gsd doctor for details.",
865
+ "error",
866
+ );
867
+ await deps.pauseAuto(ctx, pi);
868
+ debugLog("autoLoop", { phase: "exit", reason: "health-gate-failed" });
869
+ return { action: "break", reason: "health-gate-failed" };
870
+ }
871
+ await runPreDispatchGate({
872
+ gateId: "pre-dispatch-health-gate",
873
+ gateType: "execution",
874
+ outcome: "pass",
875
+ failureClass: "none",
876
+ rationale: "pre-dispatch health gate passed",
877
+ findings: healthGate.fixesApplied.length > 0 ? healthGate.fixesApplied.join(", ") : "",
878
+ });
879
+ } catch (e) {
880
+ await runPreDispatchGate({
881
+ gateId: "pre-dispatch-health-gate",
882
+ gateType: "execution",
883
+ outcome: "manual-attention",
884
+ failureClass: "manual-attention",
885
+ rationale: "pre-dispatch health gate threw unexpectedly",
886
+ findings: String(e),
887
+ });
888
+ logWarning("engine", "Pre-dispatch health gate threw unexpectedly", { error: String(e) });
889
+ }
890
+
891
+ // Sync project root artifacts into worktree
892
+ if (
893
+ s.originalBasePath &&
894
+ !isSamePathLocal(s.basePath, s.originalBasePath) &&
895
+ s.currentMilestoneId &&
896
+ s.scope
897
+ ) {
898
+ deps.worktreeProjection.projectRootToWorktree(s.scope);
899
+ }
900
+
901
+ // Derive state — use canonical project root so the cache key is stable
902
+ // across worktree↔project-root path-form alternation. See PR #5236
903
+ // (workspace handle infrastructure) and the Phase A pt 2 plan.
904
+ let state = await deps.deriveState(s.canonicalProjectRoot);
905
+ const { getDeepStageGate } = await import("../auto-dispatch.js");
906
+ const deepStageGate = getDeepStageGate(prefs, s.basePath);
907
+ const canRunDeepSetupGate =
908
+ state.phase === "pre-planning" ||
909
+ state.phase === "needs-discussion" ||
910
+ state.phase === "planning";
911
+ if (
912
+ canRunDeepSetupGate &&
913
+ (deepStageGate.status === "pending" || deepStageGate.status === "blocked")
914
+ ) {
915
+ debugLog("autoLoop", {
916
+ phase: "deep-project-stage-gate",
917
+ stage: deepStageGate.stage,
918
+ status: deepStageGate.status,
919
+ reason: deepStageGate.reason,
920
+ });
921
+ return {
922
+ action: "next",
923
+ data: {
924
+ state: {
925
+ ...state,
926
+ phase: "pre-planning",
927
+ activeMilestone: null,
928
+ activeSlice: null,
929
+ activeTask: null,
930
+ nextAction: deepStageGate.reason,
931
+ },
932
+ mid: "PROJECT",
933
+ midTitle: "Project setup",
934
+ },
935
+ };
936
+ }
937
+
938
+ if (uokFlags.planV2 && shouldRunPlanV2Gate(state.phase)) {
939
+ let compiled = ensurePlanV2Graph(s.basePath, state);
940
+ if (isEmptyPlanV2GraphResult(compiled)) {
941
+ deps.invalidateAllCaches();
942
+ state = await deps.deriveState(s.canonicalProjectRoot);
943
+ compiled = shouldRunPlanV2Gate(state.phase)
944
+ ? ensurePlanV2Graph(s.basePath, state)
945
+ : {
946
+ ok: true,
947
+ reason: "empty plan-v2 graph recovered by state rederive",
948
+ nodeCount: 0,
949
+ };
950
+ }
951
+ if (!compiled.ok) {
952
+ const reason = compiled.reason ?? "Plan v2 compilation failed";
953
+ if (isMissingFinalizedContextResult(compiled)) {
954
+ await runPreDispatchGate({
955
+ gateId: "plan-v2-gate",
956
+ gateType: "policy",
957
+ outcome: "pass",
958
+ failureClass: "none",
959
+ rationale: "plan v2 missing context recovery deferred to dispatch",
960
+ findings: reason,
961
+ milestoneId: state.activeMilestone?.id ?? undefined,
962
+ });
963
+ } else {
964
+ await runPreDispatchGate({
965
+ gateId: "plan-v2-gate",
966
+ gateType: "policy",
967
+ outcome: "manual-attention",
968
+ failureClass: "manual-attention",
969
+ rationale: "plan v2 compile gate failed",
970
+ findings: reason,
971
+ milestoneId: state.activeMilestone?.id ?? undefined,
972
+ });
973
+ ctx.ui.notify(`Plan gate failed-closed: ${reason}\n\nIf this keeps happening, try: /gsd doctor heal`, "error");
974
+ await deps.pauseAuto(ctx, pi);
975
+ return { action: "break", reason: "plan-v2-gate-failed" };
976
+ }
977
+ }
978
+ if (compiled.ok) {
979
+ await runPreDispatchGate({
980
+ gateId: "plan-v2-gate",
981
+ gateType: "policy",
982
+ outcome: "pass",
983
+ failureClass: "none",
984
+ rationale: "plan v2 compile gate passed",
985
+ milestoneId: state.activeMilestone?.id ?? undefined,
986
+ });
987
+ }
988
+ }
989
+ deps.syncCmuxSidebar(prefs, state);
990
+ let mid = state.activeMilestone?.id;
991
+ let midTitle = state.activeMilestone?.title;
992
+ debugLog("autoLoop", {
993
+ phase: "state-derived",
994
+ iteration: ic.iteration,
995
+ mid,
996
+ statePhase: state.phase,
997
+ });
998
+
999
+ // ── Slice-level parallelism gate (#2340) ─────────────────────────────
1000
+ // When slice_parallel is enabled, check if multiple slices are eligible
1001
+ // for parallel execution. If so, dispatch them in parallel and stop the
1002
+ // sequential loop. Workers are spawned via slice-parallel-orchestrator.ts.
1003
+ if (
1004
+ prefs?.slice_parallel?.enabled &&
1005
+ mid &&
1006
+ !process.env.GSD_PARALLEL_WORKER &&
1007
+ isDbAvailable()
1008
+ ) {
1009
+ try {
1010
+ const projectRoot = _resolveDispatchGuardBasePath(s);
1011
+ if (isSliceParallelActive(projectRoot)) {
1012
+ ctx.ui.notify("Slice-parallel: workers are still running; waiting for completion before next dispatch.", "info");
1013
+ await new Promise<void>((resolve) => setTimeout(resolve, 1000));
1014
+ return { action: "continue" };
1015
+ }
1016
+ const dbSlices = getMilestoneSlices(mid);
1017
+ if (dbSlices.length > 0) {
1018
+ const doneIds = new Set(dbSlices.filter(sl => sl.status === "complete" || sl.status === "done").map(sl => sl.id));
1019
+ const sliceInputs = dbSlices.map(sl => ({
1020
+ id: sl.id,
1021
+ done: doneIds.has(sl.id),
1022
+ depends: sl.depends ?? [],
1023
+ }));
1024
+ const eligible = getEligibleSlices(sliceInputs, doneIds);
1025
+ if (eligible.length > 1) {
1026
+ debugLog("autoLoop", {
1027
+ phase: "slice-parallel-dispatch",
1028
+ iteration: ic.iteration,
1029
+ mid,
1030
+ eligibleSlices: eligible.map(e => e.id),
1031
+ });
1032
+ ctx.ui.notify(
1033
+ `Slice-parallel: dispatching ${eligible.length} eligible slices for ${mid}.`,
1034
+ "info",
1035
+ );
1036
+ // ADR-017 #5707: reconcile before spawning so each worker doesn't
1037
+ // independently race on the same drift. Failure aborts the spawn.
1038
+ const spawnGate = await reconcileBeforeSpawn(projectRoot);
1039
+ if (!spawnGate.ok) {
1040
+ ctx.ui.notify(
1041
+ `Slice-parallel: aborting spawn — ${spawnGate.reason}`,
1042
+ "error",
1043
+ );
1044
+ return { action: "break", reason: `slice-parallel-reconciliation-failed: ${spawnGate.reason}` };
1045
+ }
1046
+ const result = await startSliceParallel(
1047
+ projectRoot,
1048
+ mid,
1049
+ eligible,
1050
+ {
1051
+ maxWorkers: prefs.slice_parallel.max_workers ?? 2,
1052
+ useExecutionGraph: uokFlags.executionGraph,
1053
+ },
1054
+ );
1055
+ if (result.started.length > 0) {
1056
+ ctx.ui.notify(
1057
+ `Slice-parallel: started ${result.started.length} worker(s): ${result.started.join(", ")}.`,
1058
+ "info",
1059
+ );
1060
+ return { action: "continue" };
1061
+ }
1062
+ if (result.errors.length > 0) {
1063
+ const detail = result.errors
1064
+ .map((err) => `${err.sid}: ${err.error}`)
1065
+ .join("; ");
1066
+ ctx.ui.notify(
1067
+ `Slice-parallel startup failed; falling back to sequential execution. ${detail}`,
1068
+ "warning",
1069
+ );
1070
+ }
1071
+ // Fall through to sequential if no workers started
1072
+ }
1073
+ }
1074
+ } catch (err) {
1075
+ debugLog("autoLoop", {
1076
+ phase: "slice-parallel-check-error",
1077
+ error: err instanceof Error ? err.message : String(err),
1078
+ });
1079
+ // Non-fatal — fall through to sequential dispatch
1080
+ }
1081
+ }
1082
+
1083
+ // ── Milestone transition ────────────────────────────────────────────
1084
+ if (mid && s.currentMilestoneId && mid !== s.currentMilestoneId) {
1085
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "milestone-transition", data: { from: s.currentMilestoneId, to: mid } });
1086
+ ctx.ui.notify(
1087
+ `Milestone ${s.currentMilestoneId} complete. Advancing to ${mid}: ${midTitle}.`,
1088
+ "info",
1089
+ );
1090
+ deps.sendDesktopNotification(
1091
+ "GSD",
1092
+ `Milestone ${s.currentMilestoneId} complete!`,
1093
+ "success",
1094
+ "milestone",
1095
+ basename(s.originalBasePath || s.basePath),
1096
+ );
1097
+ deps.logCmuxEvent(
1098
+ prefs,
1099
+ `Milestone ${s.currentMilestoneId} complete. Advancing to ${mid}.`,
1100
+ "success",
1101
+ );
1102
+
1103
+ const vizPrefs = prefs;
1104
+ if (vizPrefs?.auto_visualize) {
1105
+ ctx.ui.notify("Run /gsd visualize to see progress overview.", "info");
1106
+ }
1107
+ if (vizPrefs?.auto_report !== false) {
1108
+ try {
1109
+ await generateMilestoneReport(s, ctx, s.currentMilestoneId!);
1110
+ } catch (err) {
1111
+ ctx.ui.notify(
1112
+ `Report generation failed: ${err instanceof Error ? err.message : String(err)}`,
1113
+ "warning",
1114
+ );
1115
+ }
1116
+ }
1117
+
1118
+ // Reset dispatch counters for new milestone
1119
+ s.unitDispatchCount.clear();
1120
+ s.unitRecoveryCount.clear();
1121
+ s.unitLifetimeDispatches.clear();
1122
+ loopState.recentUnits.length = 0;
1123
+ loopState.stuckRecoveryAttempts = 0;
1124
+ persistStuckRecoveryAttempts(s, loopState);
1125
+
1126
+ // Worktree lifecycle on milestone transition — merge current, enter next.
1127
+ // #2909 / #5538-followup: preflight stash + always-on postflight pop.
1128
+ {
1129
+ const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId!);
1130
+ if (stop) return stop;
1131
+ }
1132
+
1133
+ // PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
1134
+
1135
+ deps.invalidateAllCaches();
1136
+
1137
+ state = await deps.deriveState(s.canonicalProjectRoot);
1138
+ mid = state.activeMilestone?.id;
1139
+ midTitle = state.activeMilestone?.title;
1140
+
1141
+ if (mid) {
1142
+ if (deps.getIsolationMode(s.basePath) !== "none") {
1143
+ deps.captureIntegrationBranch(s.basePath, mid);
1144
+ }
1145
+ const enterResult = deps.lifecycle.enterMilestone(mid, ctx.ui);
1146
+ if (!enterResult.ok) {
1147
+ ctx.ui.notify(
1148
+ `Milestone transition stopped: failed to enter ${mid} (${enterResult.reason}).`,
1149
+ "error",
1150
+ );
1151
+ if (enterResult.reason === "lease-conflict") {
1152
+ await deps.pauseAuto(ctx, pi);
1153
+ }
1154
+ return { action: "break", reason: "milestone-enter-failed" };
1155
+ }
1156
+ } else {
1157
+ // mid is undefined — no milestone to capture integration branch for
1158
+ }
1159
+
1160
+ const pendingIds = state.registry
1161
+ .filter(
1162
+ (m: { status: string }) =>
1163
+ m.status !== "complete" && m.status !== "parked",
1164
+ )
1165
+ .map((m: { id: string }) => m.id);
1166
+ deps.pruneQueueOrder(s.basePath, pendingIds);
1167
+
1168
+ // Archive the old completed-units.json instead of wiping it (#2313).
1169
+ try {
1170
+ const completedKeysPath = join(gsdRoot(s.basePath), "completed-units.json");
1171
+ if (existsSync(completedKeysPath) && s.currentMilestoneId) {
1172
+ const archivePath = join(
1173
+ gsdRoot(s.basePath),
1174
+ `completed-units-${s.currentMilestoneId}.json`,
1175
+ );
1176
+ cpSync(completedKeysPath, archivePath);
1177
+ }
1178
+ atomicWriteSync(completedKeysPath, JSON.stringify([], null, 2));
1179
+ } catch (e) {
1180
+ logWarning("engine", "Failed to archive completed-units on milestone transition", { error: String(e) });
1181
+ }
1182
+
1183
+ // Rebuild STATE.md immediately so it reflects the new active milestone.
1184
+ // This bypasses the 30-second throttle in the normal rebuild path —
1185
+ // milestone transitions are rare and important enough to warrant an
1186
+ // immediate write.
1187
+ try {
1188
+ await deps.rebuildState(s.basePath);
1189
+ } catch (e) {
1190
+ logWarning("engine", "STATE.md rebuild failed after milestone transition", { error: String(e) });
1191
+ }
1192
+ }
1193
+
1194
+ if (mid) {
1195
+ s.currentMilestoneId = mid;
1196
+ deps.setActiveMilestoneId(s.basePath, mid);
1197
+ }
1198
+
1199
+ // ── Terminal conditions ──────────────────────────────────────────────
1200
+
1201
+ if (!mid) {
1202
+ if (s.currentUnit) {
1203
+ await deps.closeoutUnit(
1204
+ ctx,
1205
+ s.basePath,
1206
+ s.currentUnit.type,
1207
+ s.currentUnit.id,
1208
+ s.currentUnit.startedAt,
1209
+ deps.buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id),
1210
+ );
1211
+ }
1212
+
1213
+ const incomplete = state.registry.filter(
1214
+ (m: { status: string }) =>
1215
+ m.status !== "complete" && m.status !== "parked",
1216
+ );
1217
+ if (incomplete.length === 0 && state.registry.length > 0) {
1218
+ // All milestones complete — merge milestone branch before stopping.
1219
+ if (s.currentMilestoneId) {
1220
+ // #2909 / #5538-followup: preflight stash + always-on postflight pop.
1221
+ const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
1222
+ if (stop) return stop;
1223
+ // PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
1224
+ }
1225
+ deps.sendDesktopNotification(
1226
+ "GSD",
1227
+ "All milestones complete!",
1228
+ "success",
1229
+ "milestone",
1230
+ basename(s.originalBasePath || s.basePath),
1231
+ );
1232
+ deps.logCmuxEvent(
1233
+ prefs,
1234
+ "All milestones complete.",
1235
+ "success",
1236
+ );
1237
+ await deps.stopAuto(ctx, pi, "All milestones complete", {
1238
+ completionWidget: {
1239
+ milestoneId: s.currentMilestoneId,
1240
+ milestoneTitle: midTitle,
1241
+ allMilestonesComplete: true,
1242
+ },
1243
+ });
1244
+ } else if (incomplete.length === 0 && state.registry.length === 0) {
1245
+ // Empty registry — no milestones visible, likely a path resolution bug
1246
+ const diag = `basePath=${s.basePath}, phase=${state.phase}`;
1247
+ ctx.ui.notify(
1248
+ `No milestones visible in current scope. Possible path resolution issue.\n Diagnostic: ${diag}`,
1249
+ "error",
1250
+ );
1251
+ await deps.stopAuto(
1252
+ ctx,
1253
+ pi,
1254
+ `No milestones found — check basePath resolution`,
1255
+ );
1256
+ } else if (state.phase === "blocked") {
1257
+ const blockedResumeMessage = formatBlockedResumeMessage(state.blockers);
1258
+ // Pause instead of hard-stop so the session is resumable with `/gsd auto`.
1259
+ // Hard-stop here was causing premature termination when slice dependencies
1260
+ // were temporarily unresolvable (e.g. after reassessment added new slices).
1261
+ await deps.pauseAuto(ctx, pi);
1262
+ ctx.ui.notify(blockedResumeMessage, "warning");
1263
+ deps.sendDesktopNotification("GSD", blockedResumeMessage, "warning", "attention", basename(s.originalBasePath || s.basePath));
1264
+ deps.logCmuxEvent(prefs, blockedResumeMessage, "warning");
1265
+ } else {
1266
+ const ids = incomplete.map((m: { id: string }) => m.id).join(", ");
1267
+ const diag = `basePath=${s.basePath}, milestones=[${state.registry.map((m: { id: string; status: string }) => `${m.id}:${m.status}`).join(", ")}], phase=${state.phase}`;
1268
+ ctx.ui.notify(
1269
+ `Unexpected: ${incomplete.length} incomplete milestone(s) (${ids}) but no active milestone.\n Diagnostic: ${diag}`,
1270
+ "error",
1271
+ );
1272
+ await deps.stopAuto(
1273
+ ctx,
1274
+ pi,
1275
+ `No active milestone — ${incomplete.length} incomplete (${ids}), see diagnostic above`,
1276
+ );
1277
+ }
1278
+ debugLog("autoLoop", { phase: "exit", reason: "no-active-milestone" });
1279
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "no-active-milestone" } });
1280
+ return { action: "break", reason: "no-active-milestone" };
1281
+ }
1282
+
1283
+ if (!midTitle) {
1284
+ midTitle = mid;
1285
+ ctx.ui.notify(
1286
+ `Milestone ${mid} has no title in roadmap — using ID as fallback.`,
1287
+ "warning",
1288
+ );
1289
+ }
1290
+
1291
+ // Mid-merge safety check
1292
+ const mergeReconcileResult = deps.reconcileMergeState(s.basePath, ctx);
1293
+ if (mergeReconcileResult === "blocked") {
1294
+ await deps.pauseAuto(ctx, pi);
1295
+ debugLog("autoLoop", { phase: "exit", reason: "merge-reconciliation-blocked" });
1296
+ return { action: "break", reason: "merge-reconciliation-blocked" };
1297
+ }
1298
+ if (mergeReconcileResult === "reconciled") {
1299
+ deps.invalidateAllCaches();
1300
+ state = await deps.deriveState(s.canonicalProjectRoot);
1301
+ mid = state.activeMilestone?.id;
1302
+ midTitle = state.activeMilestone?.title;
1303
+ }
1304
+
1305
+ if (!mid || !midTitle) {
1306
+ const noMilestoneReason = !mid
1307
+ ? "No active milestone after merge reconciliation"
1308
+ : `Milestone ${mid} has no title after reconciliation`;
1309
+ await closeoutAndStop(ctx, pi, s, deps, noMilestoneReason);
1310
+ debugLog("autoLoop", {
1311
+ phase: "exit",
1312
+ reason: "no-milestone-after-reconciliation",
1313
+ });
1314
+ return { action: "break", reason: "no-milestone-after-reconciliation" };
1315
+ }
1316
+
1317
+ // Terminal: complete
1318
+ if (state.phase === "complete") {
1319
+ // Milestone merge on complete (before closeout so branch state is clean).
1320
+ if (s.currentMilestoneId) {
1321
+ // #2909 / #5538-followup: preflight stash + always-on postflight pop.
1322
+ const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
1323
+ if (stop) return stop;
1324
+ // PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
1325
+ }
1326
+ deps.sendDesktopNotification(
1327
+ "GSD",
1328
+ `Milestone ${mid} complete!`,
1329
+ "success",
1330
+ "milestone",
1331
+ basename(s.originalBasePath || s.basePath),
1332
+ );
1333
+ deps.logCmuxEvent(
1334
+ prefs,
1335
+ `Milestone ${mid} complete.`,
1336
+ "success",
1337
+ );
1338
+ if (s.currentUnit) {
1339
+ await deps.closeoutUnit(
1340
+ ctx,
1341
+ s.basePath,
1342
+ s.currentUnit.type,
1343
+ s.currentUnit.id,
1344
+ s.currentUnit.startedAt,
1345
+ deps.buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id),
1346
+ );
1347
+ s.currentUnit = null;
1348
+ }
1349
+ await deps.stopAuto(ctx, pi, `Milestone ${mid} complete`, {
1350
+ completionWidget: {
1351
+ milestoneId: mid,
1352
+ milestoneTitle: midTitle,
1353
+ },
1354
+ });
1355
+ debugLog("autoLoop", { phase: "exit", reason: "milestone-complete" });
1356
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "milestone-complete", milestoneId: mid } });
1357
+ return { action: "break", reason: "milestone-complete" };
1358
+ }
1359
+
1360
+ // Terminal: blocked — pause instead of hard-stop so the session is resumable.
1361
+ if (state.phase === "blocked") {
1362
+ const blockedResumeMessage = formatBlockedResumeMessage(state.blockers);
1363
+ if (s.currentUnit) {
1364
+ await deps.closeoutUnit(
1365
+ ctx,
1366
+ s.basePath,
1367
+ s.currentUnit.type,
1368
+ s.currentUnit.id,
1369
+ s.currentUnit.startedAt,
1370
+ deps.buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id),
1371
+ );
1372
+ }
1373
+ await deps.pauseAuto(ctx, pi);
1374
+ ctx.ui.notify(blockedResumeMessage, "warning");
1375
+ deps.sendDesktopNotification("GSD", blockedResumeMessage, "warning", "attention", basename(s.originalBasePath || s.basePath));
1376
+ deps.logCmuxEvent(prefs, blockedResumeMessage, "warning");
1377
+ debugLog("autoLoop", { phase: "exit", reason: "blocked" });
1378
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "blocked", blockers: state.blockers } });
1379
+ return { action: "break", reason: "blocked" };
1380
+ }
1381
+
1382
+ return { action: "next", data: { state, mid, midTitle } };
1383
+ }
1384
+
1385
+ // ─── runDispatch ──────────────────────────────────────────────────────────────
1386
+
1387
+ /**
1388
+ * Phase 3: Dispatch resolution — resolve next unit, stuck detection, pre-dispatch hooks.
1389
+ * Returns break/continue to control the loop, or next with IterationData on success.
1390
+ */
1391
+ export async function runDispatch(
1392
+ ic: IterationContext,
1393
+ preData: PreDispatchData,
1394
+ loopState: LoopState,
1395
+ ): Promise<PhaseResult<IterationData>> {
1396
+ const { ctx, pi, s, deps, prefs } = ic;
1397
+ const { state, mid, midTitle } = preData;
1398
+ const provider = ctx.model?.provider;
1399
+ const authMode = provider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
1400
+ ? ctx.modelRegistry.getProviderAuthMode(provider)
1401
+ : undefined;
1402
+ const activeTools = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
1403
+ // Deep planning intentionally keeps human checkpoints in plain chat. In
1404
+ // Claude Code/local MCP transports, structured question requests can be
1405
+ // cancelled outside the normal chat flow, which made approval gates easy to
1406
+ // skip or bury under tool output.
1407
+ const structuredQuestionsAvailable = prefs?.planning_depth === "deep"
1408
+ ? "false"
1409
+ : supportsStructuredQuestions(activeTools, {
1410
+ authMode,
1411
+ baseUrl: ctx.model?.baseUrl,
1412
+ }) ? "true" : "false";
1413
+
1414
+ debugLog("autoLoop", { phase: "dispatch-resolve", iteration: ic.iteration });
1415
+ const dispatchResult = await deps.resolveDispatch({
1416
+ basePath: s.basePath,
1417
+ mid,
1418
+ midTitle,
1419
+ state,
1420
+ prefs,
1421
+ session: s,
1422
+ structuredQuestionsAvailable,
1423
+ sessionContextWindow: ctx.model?.contextWindow,
1424
+ sessionProvider: ctx.model?.provider,
1425
+ modelRegistry: ctx.modelRegistry as MinimalModelRegistry | undefined,
1426
+ });
1427
+
1428
+ if (dispatchResult.action === "stop") {
1429
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "dispatch-stop", rule: dispatchResult.matchedRule, data: { reason: dispatchResult.reason } });
1430
+ // Warning-level stops are recoverable human checkpoints (e.g. UAT verdict
1431
+ // gate) — pause instead of hard-stopping so the session is resumable with
1432
+ // `/gsd auto`. Error/info-level stops remain hard stops for infrastructure
1433
+ // failures and terminal conditions respectively.
1434
+ // See: https://github.com/open-gsd/gsd-pi/issues/2474
1435
+ if (dispatchResult.level === "warning") {
1436
+ ctx.ui.notify(dispatchResult.reason, "warning");
1437
+ await deps.pauseAuto(ctx, pi, {
1438
+ message: dispatchResult.reason,
1439
+ category: "unknown",
1440
+ });
1441
+ } else {
1442
+ await closeoutAndStop(ctx, pi, s, deps, dispatchResult.reason);
1443
+ }
1444
+ debugLog("autoLoop", { phase: "exit", reason: "dispatch-stop" });
1445
+ return { action: "break", reason: "dispatch-stop" };
1446
+ }
1447
+
1448
+ if (dispatchResult.action !== "dispatch") {
1449
+ // Non-dispatch action (e.g. "skip") — re-derive state
1450
+ await new Promise((r) => setImmediate(r));
1451
+ return { action: "continue" };
1452
+ }
1453
+
1454
+ let unitType = dispatchResult.unitType;
1455
+ let unitId = dispatchResult.unitId;
1456
+ let prompt = dispatchResult.prompt;
1457
+ let pauseAfterUatDispatch = dispatchResult.pauseAfterDispatch ?? false;
1458
+ let dispatchState = state;
1459
+ let dispatchMid = mid;
1460
+ let dispatchMidTitle = midTitle;
1461
+ const pendingRetryDispatch = s.pendingVerificationRetryDispatch;
1462
+ if (pendingRetryDispatch) {
1463
+ unitType = pendingRetryDispatch.unitType;
1464
+ unitId = pendingRetryDispatch.unitId;
1465
+ prompt = pendingRetryDispatch.prompt;
1466
+ pauseAfterUatDispatch = pendingRetryDispatch.pauseAfterUatDispatch;
1467
+ dispatchState = pendingRetryDispatch.state;
1468
+ dispatchMid = pendingRetryDispatch.mid ?? mid;
1469
+ dispatchMidTitle = pendingRetryDispatch.midTitle ?? midTitle;
1470
+ s.pendingVerificationRetryDispatch = null;
1471
+ debugLog("autoLoop", {
1472
+ phase: "dispatch-pending-verification-retry",
1473
+ unitType,
1474
+ unitId,
1475
+ });
1476
+ }
1477
+
1478
+ const alreadyClosedReason = getAlreadyClosedDispatchReason(unitType, unitId);
1479
+ if (alreadyClosedReason) {
1480
+ s.pendingVerificationRetry = null;
1481
+ loopState.recentUnits = [];
1482
+ loopState.stuckRecoveryAttempts = Math.max(loopState.stuckRecoveryAttempts, 1);
1483
+ deps.invalidateAllCaches();
1484
+ debugLog("autoLoop", {
1485
+ phase: "dispatch-skip-already-closed",
1486
+ unitType,
1487
+ unitId,
1488
+ reason: alreadyClosedReason,
1489
+ });
1490
+ deps.emitJournalEvent({
1491
+ ts: new Date().toISOString(),
1492
+ flowId: ic.flowId,
1493
+ seq: ic.nextSeq(),
1494
+ eventType: "guard-block",
1495
+ data: { unitType, unitId, reason: alreadyClosedReason },
1496
+ });
1497
+ ctx.ui.notify(`Skipping ${unitType} ${unitId}: ${alreadyClosedReason}.`, "info");
1498
+ await new Promise((r) => setImmediate(r));
1499
+ return { action: "continue" };
1500
+ }
1501
+
1502
+ deps.emitJournalEvent({
1503
+ ts: new Date().toISOString(),
1504
+ flowId: ic.flowId,
1505
+ seq: ic.nextSeq(),
1506
+ eventType: "dispatch-match",
1507
+ rule: pendingRetryDispatch ? "verification-retry" : dispatchResult.matchedRule,
1508
+ data: { unitType, unitId },
1509
+ });
1510
+
1511
+ // Resolve hooks and prior-slice gating before health/stuck accounting so
1512
+ // those checks run against the final dispatch unit.
1513
+ const preDispatchResult = deps.runPreDispatchHooks(
1514
+ unitType,
1515
+ unitId,
1516
+ prompt,
1517
+ s.basePath,
1518
+ );
1519
+ if (preDispatchResult.firedHooks.length > 0) {
1520
+ ctx.ui.notify(
1521
+ `Pre-dispatch hook${preDispatchResult.firedHooks.length > 1 ? "s" : ""}: ${preDispatchResult.firedHooks.join(", ")}`,
1522
+ "info",
1523
+ );
1524
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "pre-dispatch-hook", data: { firedHooks: preDispatchResult.firedHooks, action: preDispatchResult.action } });
1525
+ }
1526
+ if (preDispatchResult.action === "skip") {
1527
+ ctx.ui.notify(
1528
+ `Skipping ${unitType} ${unitId} (pre-dispatch hook).`,
1529
+ "info",
1530
+ );
1531
+ await new Promise((r) => setImmediate(r));
1532
+ return { action: "continue" };
1533
+ }
1534
+ if (preDispatchResult.action === "replace") {
1535
+ prompt = preDispatchResult.prompt ?? prompt;
1536
+ if (preDispatchResult.unitType) unitType = preDispatchResult.unitType;
1537
+ } else if (preDispatchResult.prompt) {
1538
+ prompt = preDispatchResult.prompt;
1539
+ }
1540
+
1541
+ const guardBasePath = _resolveDispatchGuardBasePath(s);
1542
+ let mainBranch = "main";
1543
+ try {
1544
+ mainBranch = deps.getMainBranch(guardBasePath);
1545
+ } catch (err) {
1546
+ debugLog("autoLoop", { phase: "getMainBranch-failed", error: String(err) });
1547
+ }
1548
+ const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
1549
+ guardBasePath,
1550
+ mainBranch,
1551
+ unitType,
1552
+ unitId,
1553
+ );
1554
+ if (priorSliceBlocker) {
1555
+ await deps.stopAuto(ctx, pi, priorSliceBlocker);
1556
+ debugLog("autoLoop", { phase: "exit", reason: "prior-slice-blocker" });
1557
+ return { action: "break", reason: "prior-slice-blocker" };
1558
+ }
1559
+
1560
+ const consecutiveDispatchBlocker = getConsecutiveDispatchBlocker(
1561
+ loopState,
1562
+ state.phase,
1563
+ unitType,
1564
+ unitId,
1565
+ );
1566
+ if (consecutiveDispatchBlocker) {
1567
+ await deps.stopAuto(ctx, pi, consecutiveDispatchBlocker);
1568
+ debugLog("autoLoop", { phase: "exit", reason: "consecutive-dispatch-blocker" });
1569
+ return { action: "break", reason: "consecutive-dispatch-blocker" };
1570
+ }
1571
+
1572
+ const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
1573
+ ic,
1574
+ unitType,
1575
+ unitId,
1576
+ mid,
1577
+ "pre-dispatch",
1578
+ );
1579
+ if (worktreeSafetyBlock) return worktreeSafetyBlock;
1580
+
1581
+ // ── Sliding-window stuck detection with graduated recovery ──
1582
+ const derivedKey = `${unitType}/${unitId}`;
1583
+
1584
+ // Always record this dispatch in the sliding window and run detection so
1585
+ // Rules 1/3/4 can catch retry loops with repeated failure content (#5719).
1586
+ // Rules 2/2b suppress legitimate retry backoff through the dispatch ledger.
1587
+ const latestDispatch = getLatestForUnit(derivedKey);
1588
+ const recentError = latestDispatch?.error_summary ?? undefined;
1589
+ loopState.recentUnits.push({ key: derivedKey, error: recentError });
1590
+ while (loopState.recentUnits.length > STUCK_WINDOW_SIZE) {
1591
+ loopState.recentUnits.shift();
1592
+ }
1593
+
1594
+ const stuckSignal = detectStuck(loopState.recentUnits, {
1595
+ pendingRetry: !!s.pendingVerificationRetry,
1596
+ retryAttempt: s.pendingVerificationRetry?.attempt,
1597
+ });
1598
+ if (stuckSignal) {
1599
+ debugLog("autoLoop", {
1600
+ phase: "stuck-check",
1601
+ unitType,
1602
+ unitId,
1603
+ reason: stuckSignal.reason,
1604
+ recoveryAttempts: loopState.stuckRecoveryAttempts,
1605
+ });
1606
+
1607
+ if (loopState.stuckRecoveryAttempts === 0) {
1608
+ // Level 1: try verifying the artifact, then cache invalidation + retry
1609
+ loopState.stuckRecoveryAttempts++;
1610
+ persistStuckRecoveryAttempts(s, loopState);
1611
+ const artifactExists = verifyExpectedArtifact(
1612
+ unitType,
1613
+ unitId,
1614
+ s.basePath,
1615
+ );
1616
+ if (artifactExists) {
1617
+ debugLog("autoLoop", {
1618
+ phase: "stuck-recovery",
1619
+ level: 1,
1620
+ action: "artifact-found",
1621
+ });
1622
+ const recoveryDb = refreshRecoveryDbForArtifact(unitType, unitId, s.basePath);
1623
+ if (!recoveryDb.ok) {
1624
+ ctx.ui.notify(
1625
+ recoveryDb.fatal
1626
+ ? `${recoveryDb.message} Pausing auto-mode for manual recovery.`
1627
+ : `${recoveryDb.message} Keeping stuck state for retry.`,
1628
+ "warning",
1629
+ );
1630
+ if (recoveryDb.fatal) {
1631
+ await deps.pauseAuto(ctx, pi);
1632
+ return { action: "break", reason: recoveryDb.reason };
1633
+ }
1634
+ return { action: "continue" };
1635
+ }
1636
+ ctx.ui.notify(
1637
+ `Stuck recovery: artifact for ${unitType} ${unitId} found on disk. Invalidating caches.`,
1638
+ "info",
1639
+ );
1640
+ deps.invalidateAllCaches();
1641
+ loopState.recentUnits.length = 0;
1642
+ return { action: "continue" };
1643
+ }
1644
+ ctx.ui.notify(
1645
+ `Stuck on ${unitType} ${unitId} (${stuckSignal.reason}). Invalidating caches and retrying.`,
1646
+ "warning",
1647
+ );
1648
+ deps.invalidateAllCaches();
1649
+ } else {
1650
+ // Level 2: hard stop — genuinely stuck
1651
+ deps.invalidateAllCaches();
1652
+ const artifactExists = verifyExpectedArtifact(
1653
+ unitType,
1654
+ unitId,
1655
+ s.basePath,
1656
+ );
1657
+ if (artifactExists) {
1658
+ debugLog("autoLoop", {
1659
+ phase: "stuck-recovery",
1660
+ level: 2,
1661
+ action: "artifact-found",
1662
+ });
1663
+ const recoveryDb = refreshRecoveryDbForArtifact(unitType, unitId, s.basePath);
1664
+ if (recoveryDb.ok) {
1665
+ ctx.ui.notify(
1666
+ `Stuck recovery: artifact for ${unitType} ${unitId} found on disk after cache invalidation. Continuing.`,
1667
+ "info",
1668
+ );
1669
+ loopState.recentUnits.length = 0;
1670
+ return { action: "continue" };
1671
+ }
1672
+ ctx.ui.notify(
1673
+ recoveryDb.fatal
1674
+ ? `${recoveryDb.message} Pausing auto-mode for manual recovery.`
1675
+ : `${recoveryDb.message} Stopping for manual recovery.`,
1676
+ "warning",
1677
+ );
1678
+ if (recoveryDb.fatal) {
1679
+ await deps.pauseAuto(ctx, pi);
1680
+ return { action: "break", reason: recoveryDb.reason };
1681
+ }
1682
+ }
1683
+ debugLog("autoLoop", {
1684
+ phase: "stuck-detected",
1685
+ unitType,
1686
+ unitId,
1687
+ reason: stuckSignal.reason,
1688
+ });
1689
+ const stuckDiag = diagnoseExpectedArtifact(unitType, unitId, s.basePath);
1690
+ const stuckRemediation = buildLoopRemediationSteps(unitType, unitId, s.basePath);
1691
+ const stuckParts = [`Stuck on ${unitType} ${unitId} — ${stuckSignal.reason}.`];
1692
+ if (stuckDiag) stuckParts.push(`Expected: ${stuckDiag}`);
1693
+ if (stuckRemediation) stuckParts.push(`To recover:\n${stuckRemediation}`);
1694
+ ctx.ui.notify(stuckParts.join(" "), "error");
1695
+ await deps.stopAuto(
1696
+ ctx,
1697
+ pi,
1698
+ `Stuck: ${stuckSignal.reason}`,
1699
+ );
1700
+ return { action: "break", reason: "stuck-detected" };
1701
+ }
1702
+ } else {
1703
+ // Progress detected — reset recovery counter
1704
+ if (loopState.stuckRecoveryAttempts > 0) {
1705
+ debugLog("autoLoop", {
1706
+ phase: "stuck-counter-reset",
1707
+ from: loopState.recentUnits[loopState.recentUnits.length - 2]?.key ?? "",
1708
+ to: derivedKey,
1709
+ });
1710
+ loopState.stuckRecoveryAttempts = 0;
1711
+ persistStuckRecoveryAttempts(s, loopState);
1712
+ }
1713
+ }
1714
+
1715
+ return {
1716
+ action: "next",
1717
+ data: {
1718
+ unitType, unitId, prompt, finalPrompt: prompt,
1719
+ pauseAfterUatDispatch,
1720
+ state: dispatchState, mid: dispatchMid, midTitle: dispatchMidTitle,
1721
+ isRetry: Boolean(pendingRetryDispatch), previousTier: undefined,
1722
+ hookModelOverride: preDispatchResult.model,
1723
+ },
1724
+ };
1725
+ }
1726
+
1727
+ // ─── runGuards ────────────────────────────────────────────────────────────────
1728
+
1729
+ /**
1730
+ * Phase 2: Guards — stop directives, budget ceiling, context window, secrets re-check.
1731
+ * Returns break to exit the loop, or next to proceed to dispatch.
1732
+ */
1733
+ export async function runGuards(
1734
+ ic: IterationContext,
1735
+ mid: string,
1736
+ ): Promise<PhaseResult> {
1737
+ const { ctx, pi, s, deps, prefs } = ic;
1738
+
1739
+ // ── Stop/Backtrack directive guard (#3487) ──
1740
+ // Check for unexecuted stop or backtrack captures BEFORE dispatching any unit.
1741
+ // This ensures user "halt" directives are honored immediately.
1742
+ // IMPORTANT: Fail-closed — any exception during stop handling still breaks the loop
1743
+ // to ensure user halt intent is never silently dropped.
1744
+ try {
1745
+ const { loadStopCaptures, markCaptureExecuted } = await import("../captures.js");
1746
+ const stopCaptures = loadStopCaptures(s.basePath);
1747
+ if (stopCaptures.length > 0) {
1748
+ const first = stopCaptures[0];
1749
+ const isBacktrack = first.classification === "backtrack";
1750
+ const label = isBacktrack
1751
+ ? `Backtrack directive: ${first.text}`
1752
+ : `Stop directive: ${first.text}`;
1753
+
1754
+ ctx.ui.notify(label, "warning");
1755
+ deps.sendDesktopNotification(
1756
+ "GSD", label, "warning", "stop-directive",
1757
+ basename(s.originalBasePath || s.basePath),
1758
+ );
1759
+
1760
+ // Pause first — ensures auto-mode stops even if later steps fail
1761
+ await deps.pauseAuto(ctx, pi);
1762
+
1763
+ // For backtrack captures, write the backtrack trigger after pausing
1764
+ if (isBacktrack) {
1765
+ try {
1766
+ const { executeBacktrack } = await import("../triage-resolution.js");
1767
+ executeBacktrack(s.basePath, mid, first);
1768
+ } catch (e) {
1769
+ debugLog("guards", { phase: "backtrack-execution-error", error: String(e) });
1770
+ }
1771
+ }
1772
+
1773
+ // Mark captures as executed only after successful pause/transition
1774
+ for (const cap of stopCaptures) {
1775
+ markCaptureExecuted(s.basePath, cap.id);
1776
+ }
1777
+
1778
+ debugLog("autoLoop", { phase: "exit", reason: isBacktrack ? "user-backtrack" : "user-stop" });
1779
+ return { action: "break", reason: isBacktrack ? "user-backtrack" : "user-stop" };
1780
+ }
1781
+ } catch (e) {
1782
+ // Fail-closed: if anything in the stop guard throws, break the loop
1783
+ // rather than silently continuing and dropping user halt intent
1784
+ debugLog("guards", { phase: "stop-guard-error", error: String(e) });
1785
+ return { action: "break", reason: "stop-guard-error" };
1786
+ }
1787
+
1788
+ // Budget ceiling guard
1789
+ const budgetCeiling = prefs?.budget_ceiling;
1790
+ if (budgetCeiling !== undefined && budgetCeiling > 0) {
1791
+ const currentLedger = deps.getLedger() as { units: unknown } | null;
1792
+ // In parallel worker mode, only count cost from the current auto-mode session
1793
+ // to avoid hitting the ceiling due to historical project-wide spend (#2184).
1794
+ let costUnits = currentLedger?.units;
1795
+ if (process.env.GSD_PARALLEL_WORKER && s.autoStartTime && Array.isArray(costUnits)) {
1796
+ const sessionStartISO = new Date(s.autoStartTime).toISOString();
1797
+ costUnits = costUnits.filter(
1798
+ (u: { startedAt?: string }) => u.startedAt != null && u.startedAt >= sessionStartISO,
1799
+ );
1800
+ }
1801
+ const totalCost = costUnits
1802
+ ? deps.getProjectTotals(costUnits).cost
1803
+ : 0;
1804
+ const budgetPct = totalCost / budgetCeiling;
1805
+ const budgetAlertLevel = deps.getBudgetAlertLevel(budgetPct);
1806
+ const newBudgetAlertLevel = deps.getNewBudgetAlertLevel(
1807
+ s.lastBudgetAlertLevel,
1808
+ budgetPct,
1809
+ );
1810
+ const enforcement = prefs?.budget_enforcement ?? "pause";
1811
+ const budgetEnforcementAction = deps.getBudgetEnforcementAction(
1812
+ enforcement,
1813
+ budgetPct,
1814
+ );
1815
+
1816
+ // Data-driven threshold check — loop descending, fire first match
1817
+ const threshold = BUDGET_THRESHOLDS.find(
1818
+ (t) => newBudgetAlertLevel >= t.pct,
1819
+ );
1820
+ if (threshold) {
1821
+ s.lastBudgetAlertLevel =
1822
+ newBudgetAlertLevel as AutoSession["lastBudgetAlertLevel"];
1823
+
1824
+ // Emit Layer 2 budget_threshold event (post-plan hook recommendation).
1825
+ // Extensions / Layer 0 shell hooks may return an action override.
1826
+ let hookAction: "pause" | "downgrade" | "continue" | undefined;
1827
+ try {
1828
+ const { emitBudgetThreshold } = await import("../hook-emitter.js");
1829
+ const hookResult = await emitBudgetThreshold({
1830
+ fraction: budgetPct,
1831
+ spent: totalCost,
1832
+ limit: budgetCeiling,
1833
+ });
1834
+ if (hookResult?.action) hookAction = hookResult.action;
1835
+ } catch (hookErr) {
1836
+ logWarning("engine", `budget_threshold hook emission failed: ${(hookErr as Error).message}`);
1837
+ }
1838
+
1839
+ // Apply hook override to enforcement action. "continue" → "none" (no enforcement),
1840
+ // "pause" and "downgrade" map to the matching enforcement path below.
1841
+ let effectiveAction = budgetEnforcementAction;
1842
+ if (hookAction === "continue") {
1843
+ effectiveAction = "none";
1844
+ } else if (hookAction === "pause") {
1845
+ effectiveAction = "pause";
1846
+ } else if (hookAction === "downgrade") {
1847
+ effectiveAction = "warn";
1848
+ }
1849
+
1850
+ if (threshold.pct === 100 && effectiveAction !== "none") {
1851
+ // 100% — special enforcement logic (halt/pause/warn)
1852
+ const msg = `Budget ceiling ${deps.formatCost(budgetCeiling)} reached (spent ${deps.formatCost(totalCost)}).`;
1853
+ if (effectiveAction === "halt") {
1854
+ deps.sendDesktopNotification("GSD", msg, "error", "budget", basename(s.originalBasePath || s.basePath));
1855
+ await deps.stopAuto(ctx, pi, "Budget ceiling reached");
1856
+ debugLog("autoLoop", { phase: "exit", reason: "budget-halt" });
1857
+ return { action: "break", reason: "budget-halt" };
1858
+ }
1859
+ if (effectiveAction === "pause") {
1860
+ ctx.ui.notify(
1861
+ `${msg} Pausing auto-mode — /gsd auto to override and continue.`,
1862
+ "warning",
1863
+ );
1864
+ deps.sendDesktopNotification("GSD", msg, "warning", "budget", basename(s.originalBasePath || s.basePath));
1865
+ deps.logCmuxEvent(prefs, msg, "warning");
1866
+ await deps.pauseAuto(ctx, pi);
1867
+ debugLog("autoLoop", { phase: "exit", reason: "budget-pause" });
1868
+ return { action: "break", reason: "budget-pause" };
1869
+ }
1870
+ ctx.ui.notify(`${msg} Continuing (enforcement: warn).`, "warning");
1871
+ deps.sendDesktopNotification("GSD", msg, "warning", "budget", basename(s.originalBasePath || s.basePath));
1872
+ deps.logCmuxEvent(prefs, msg, "warning");
1873
+ } else if (threshold.pct < 100) {
1874
+ // Sub-100% — simple notification
1875
+ const msg = `${threshold.label}: ${deps.formatCost(totalCost)} / ${deps.formatCost(budgetCeiling)}`;
1876
+ ctx.ui.notify(msg, threshold.notifyLevel);
1877
+ deps.sendDesktopNotification(
1878
+ "GSD",
1879
+ msg,
1880
+ threshold.notifyLevel,
1881
+ "budget",
1882
+ basename(s.originalBasePath || s.basePath),
1883
+ );
1884
+ deps.logCmuxEvent(prefs, msg, threshold.cmuxLevel);
1885
+ }
1886
+ } else if (budgetAlertLevel === 0) {
1887
+ s.lastBudgetAlertLevel = 0;
1888
+ }
1889
+ } else {
1890
+ s.lastBudgetAlertLevel = 0;
1891
+ }
1892
+
1893
+ // Context window guard
1894
+ const contextThreshold = prefs?.context_pause_threshold ?? 0;
1895
+ if (contextThreshold > 0 && s.cmdCtx) {
1896
+ const contextUsage = s.cmdCtx.getContextUsage();
1897
+ if (getContextPauseAction(contextUsage?.percent, contextThreshold) === "pause") {
1898
+ const contextPercent = contextUsage!.percent as number;
1899
+ const msg = `Context window at ${contextPercent}% (threshold: ${contextThreshold}%). Pausing to prevent truncated output.`;
1900
+ ctx.ui.notify(
1901
+ `${msg} Run /gsd auto to continue (will start fresh session).`,
1902
+ "warning",
1903
+ );
1904
+ deps.sendDesktopNotification(
1905
+ "GSD",
1906
+ `Context ${contextPercent}% — paused`,
1907
+ "warning",
1908
+ "attention",
1909
+ basename(s.originalBasePath || s.basePath),
1910
+ );
1911
+ await deps.pauseAuto(ctx, pi);
1912
+ debugLog("autoLoop", { phase: "exit", reason: "context-window" });
1913
+ return { action: "break", reason: "context-window" };
1914
+ }
1915
+ }
1916
+
1917
+ // Secrets re-check gate
1918
+ try {
1919
+ const manifestStatus = await deps.getManifestStatus(s.basePath, mid, s.originalBasePath);
1920
+ if (manifestStatus && manifestStatus.pending.length > 0) {
1921
+ const result = await deps.collectSecretsFromManifest(
1922
+ s.basePath,
1923
+ mid,
1924
+ ctx,
1925
+ );
1926
+ if (
1927
+ result &&
1928
+ result.applied &&
1929
+ result.skipped &&
1930
+ result.existingSkipped
1931
+ ) {
1932
+ ctx.ui.notify(
1933
+ `Secrets collected: ${result.applied.length} applied, ${result.skipped.length} skipped, ${result.existingSkipped.length} already set.`,
1934
+ "info",
1935
+ );
1936
+ } else {
1937
+ ctx.ui.notify("Secrets collection skipped.", "info");
1938
+ }
1939
+ }
1940
+ } catch (err) {
1941
+ ctx.ui.notify(
1942
+ `Secrets collection error: ${err instanceof Error ? err.message : String(err)}. Continuing with next task.`,
1943
+ "warning",
1944
+ );
1945
+ }
1946
+
1947
+ return { action: "next", data: undefined as void };
1948
+ }
1949
+
1950
+ // ─── runUnitPhase ─────────────────────────────────────────────────────────────
1951
+
1952
+ /**
1953
+ * Phase 4: Unit execution — dispatch prompt, await agent_end, closeout, artifact verify.
1954
+ * Returns break or next with unitStartedAt for downstream phases.
1955
+ */
1956
+ export async function runUnitPhase(
1957
+ ic: IterationContext,
1958
+ iterData: IterationData,
1959
+ loopState: LoopState,
1960
+ sidecarItem?: SidecarItem,
1961
+ ): Promise<PhaseResult<{ unitStartedAt?: number; requestDispatchedAt?: number }>> {
1962
+ const { ctx, pi, s, deps, prefs } = ic;
1963
+ const { unitType, unitId, prompt, state, mid } = iterData;
1964
+
1965
+ debugLog("autoLoop", {
1966
+ phase: "unit-execution",
1967
+ iteration: ic.iteration,
1968
+ unitType,
1969
+ unitId,
1970
+ });
1971
+
1972
+ const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
1973
+ ic,
1974
+ unitType,
1975
+ unitId,
1976
+ mid,
1977
+ "unit-execution",
1978
+ );
1979
+ if (worktreeSafetyBlock) return worktreeSafetyBlock;
1980
+
1981
+ // ── Project classification notice (#1833, #1843) ─────────────────────
1982
+ // Worktree Safety owns source-write root validity. Classification now only
1983
+ // shapes user/model guidance for valid roots.
1984
+ let projectClassification: ReturnType<typeof classifyProject> | null = null;
1985
+ if (s.basePath && unitType === "execute-task") {
1986
+ projectClassification = classifyProject(s.basePath);
1987
+ if (projectClassification.kind === "invalid-repo") {
1988
+ const msg = `Worktree health check failed: ${s.basePath} classified as invalid-repo (${projectClassification.reason}) — refusing to dispatch ${unitType} ${unitId}`;
1989
+ debugLog("runUnitPhase", { phase: "worktree-health-invalid-repo", basePath: s.basePath, classification: projectClassification });
1990
+ const hasGit = deps.existsSync(join(s.basePath, ".git"));
1991
+ if (_shouldProceedWithInvalidRepoClassificationForTest(projectClassification.reason, hasGit)) {
1992
+ ctx.ui.notify(
1993
+ `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`,
1994
+ "warning",
1995
+ );
1996
+ } else {
1997
+ ctx.ui.notify(msg, "error");
1998
+ await deps.stopAuto(ctx, pi, msg);
1999
+ return { action: "break", reason: "worktree-invalid" };
2000
+ }
2001
+ }
2002
+
2003
+ if (projectClassification.kind === "greenfield") {
2004
+ debugLog("runUnitPhase", { phase: "worktree-health-greenfield", basePath: s.basePath, classification: projectClassification });
2005
+ ctx.ui.notify(`Warning: ${s.basePath} has no project content yet — proceeding as greenfield project`, "warning");
2006
+ } else if (projectClassification.kind === "untyped-existing") {
2007
+ debugLog("runUnitPhase", { phase: "worktree-health-untyped-existing", basePath: s.basePath, classification: projectClassification });
2008
+ ctx.ui.notify(
2009
+ `Notice: ${s.basePath} has existing project content but no recognized tooling markers — using generic file-level workflow guidance`,
2010
+ "info",
2011
+ );
2012
+ }
2013
+ }
2014
+
2015
+ // Detect retry and capture previous tier for escalation
2016
+ const isRetry = !!(
2017
+ s.currentUnit &&
2018
+ s.currentUnit.type === unitType &&
2019
+ s.currentUnit.id === unitId
2020
+ );
2021
+ const previousTier = s.currentUnitRouting?.tier;
2022
+ const dispatchKey = `${unitType}/${unitId}`;
2023
+ const nextDispatchCount = (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1;
2024
+
2025
+ // Status bar (widget + preconditions deferred until after model selection — see #2899)
2026
+ ctx.ui.setStatus("gsd-auto", "auto");
2027
+ if (mid)
2028
+ deps.updateSliceProgressCache(s.basePath, mid, state.activeSlice?.id);
2029
+
2030
+ // ── Safety harness: reset evidence + create checkpoint ──
2031
+ const safetyConfig = resolveSafetyHarnessConfig(
2032
+ prefs?.safety_harness as Record<string, unknown> | undefined,
2033
+ );
2034
+ if (safetyConfig.enabled && safetyConfig.evidence_collection) {
2035
+ resetEvidence();
2036
+ // Restore persisted evidence so session-restart resumes don't produce
2037
+ // false-positive "no bash calls" warnings (Bug #4385).
2038
+ if (s.basePath && unitType === "execute-task") {
2039
+ const { milestone: eMid, slice: eSid, task: eTid } = parseUnitId(unitId);
2040
+ if (eMid && eSid && eTid) {
2041
+ loadEvidenceFromDisk(s.basePath, eMid, eSid, eTid);
2042
+ }
2043
+ }
2044
+ }
2045
+ // Only checkpoint code-executing units (not lifecycle/planning units)
2046
+ if (safetyConfig.enabled && safetyConfig.checkpoints && unitType === "execute-task") {
2047
+ s.checkpointSha = createCheckpoint(s.basePath, unitId);
2048
+ if (s.checkpointSha) {
2049
+ debugLog("runUnitPhase", { phase: "checkpoint-created", unitId, sha: s.checkpointSha.slice(0, 8) });
2050
+ }
2051
+ }
2052
+
2053
+ // Prompt injection
2054
+ let finalPrompt = prompt;
2055
+
2056
+ if (unitType === "execute-task") {
2057
+ projectClassification ??= classifyProject(s.basePath);
2058
+ if (projectClassification.kind === "untyped-existing") {
2059
+ const samples = projectClassification.contentFiles.slice(0, 8).join(", ") || "project files";
2060
+ finalPrompt +=
2061
+ "\n\n**Project classification:** Existing untyped project. No recognized build/tooling markers were detected, " +
2062
+ "so use generic file-level workflow guidance. Task plans and completion summaries must list every concrete " +
2063
+ `project file changed in \`files\` or \`expected_output\`. Detected content sample: ${samples}.`;
2064
+ }
2065
+ }
2066
+
2067
+ if (s.pendingVerificationRetry && s.pendingVerificationRetry.unitId === unitId) {
2068
+ const retryCtx = s.pendingVerificationRetry;
2069
+ s.pendingVerificationRetry = null;
2070
+ const capped =
2071
+ retryCtx.failureContext.length > MAX_RECOVERY_CHARS
2072
+ ? retryCtx.failureContext.slice(0, MAX_RECOVERY_CHARS) +
2073
+ "\n\n[...failure context truncated]"
2074
+ : retryCtx.failureContext;
2075
+ finalPrompt = `**VERIFICATION FAILED — AUTO-FIX ATTEMPT ${retryCtx.attempt}**\n\nThe verification gate ran after your previous attempt and found failures. Fix these issues before completing the task.\n\n${capped}\n\n---\n\n${finalPrompt}`;
2076
+ }
2077
+
2078
+ if (s.pendingCrashRecovery) {
2079
+ const capped =
2080
+ s.pendingCrashRecovery.length > MAX_RECOVERY_CHARS
2081
+ ? s.pendingCrashRecovery.slice(0, MAX_RECOVERY_CHARS) +
2082
+ "\n\n[...recovery briefing truncated to prevent memory exhaustion]"
2083
+ : s.pendingCrashRecovery;
2084
+ finalPrompt = `${capped}\n\n---\n\n${finalPrompt}`;
2085
+ s.pendingCrashRecovery = null;
2086
+ } else if (nextDispatchCount > 1) {
2087
+ const diagnostic = deps.getDeepDiagnostic(s.basePath);
2088
+ if (diagnostic) {
2089
+ const cappedDiag =
2090
+ diagnostic.length > MAX_RECOVERY_CHARS
2091
+ ? diagnostic.slice(0, MAX_RECOVERY_CHARS) +
2092
+ "\n\n[...diagnostic truncated to prevent memory exhaustion]"
2093
+ : diagnostic;
2094
+ const retryInstruction =
2095
+ unitType === "execute-task"
2096
+ ? "The required artifact is `T##-SUMMARY.md`. Do NOT manually write this file. Call `gsd_task_complete` with `milestoneId`, `sliceId`, `taskId`, and the required completion fields. Do not re-run implementation work — call the tool."
2097
+ : "Fix whatever went wrong and make sure you write the required file this time.";
2098
+ finalPrompt = `**RETRY — your previous attempt did not produce the required artifact.**\n\nDiagnostic from previous attempt:\n${cappedDiag}\n\n${retryInstruction}\n\n---\n\n${finalPrompt}`;
2099
+ }
2100
+ }
2101
+
2102
+ // Prompt char measurement
2103
+ s.lastPromptCharCount = finalPrompt.length;
2104
+ s.lastBaselineCharCount = undefined;
2105
+ if (deps.isDbAvailable()) {
2106
+ try {
2107
+ const { inlineGsdRootFile } = await importExtensionModule<typeof import("../auto-prompts.js")>(import.meta.url, "../auto-prompts.js");
2108
+ const [decisionsContent, requirementsContent, projectContent] =
2109
+ await Promise.all([
2110
+ inlineGsdRootFile(s.basePath, "decisions.md", "Decisions"),
2111
+ inlineGsdRootFile(s.basePath, "requirements.md", "Requirements"),
2112
+ inlineGsdRootFile(s.basePath, "project.md", "Project"),
2113
+ ]);
2114
+ s.lastBaselineCharCount =
2115
+ (decisionsContent?.length ?? 0) +
2116
+ (requirementsContent?.length ?? 0) +
2117
+ (projectContent?.length ?? 0);
2118
+ } catch (e) {
2119
+ logWarning("engine", "Baseline char count measurement failed", { error: String(e) });
2120
+ }
2121
+ }
2122
+
2123
+ // Cache-optimize prompt section ordering
2124
+ try {
2125
+ finalPrompt = deps.reorderForCaching(finalPrompt);
2126
+ } catch (reorderErr) {
2127
+ const msg =
2128
+ reorderErr instanceof Error ? reorderErr.message : String(reorderErr);
2129
+ logWarning("engine", "Prompt reorder failed", { error: msg });
2130
+ }
2131
+
2132
+ // Select and apply model (with tier escalation on retry — normal units only)
2133
+ const prevUnitRouting = s.currentUnitRouting;
2134
+ const prevUnitModel = s.currentUnitModel;
2135
+ const prevDispatchedModelId = s.currentDispatchedModelId;
2136
+ const prevSessionModel = ctx.model;
2137
+ const prevSessionThinkingLevel = pi.getThinkingLevel();
2138
+ const modelResult = await deps.selectAndApplyModel(
2139
+ ctx,
2140
+ pi,
2141
+ unitType,
2142
+ unitId,
2143
+ s.basePath,
2144
+ prefs,
2145
+ s.verbose,
2146
+ s.autoModeStartModel,
2147
+ sidecarItem ? undefined : { isRetry, previousTier },
2148
+ undefined,
2149
+ s.manualSessionModelOverride,
2150
+ s.autoModeStartThinkingLevel,
2151
+ );
2152
+ s.currentUnitRouting =
2153
+ modelResult.routing as AutoSession["currentUnitRouting"];
2154
+ s.currentUnitModel =
2155
+ modelResult.appliedModel as AutoSession["currentUnitModel"];
2156
+
2157
+ // Apply sidecar/pre-dispatch hook model override (takes priority over standard model selection)
2158
+ const hookModelOverride = sidecarItem?.model ?? iterData.hookModelOverride;
2159
+ if (hookModelOverride) {
2160
+ const availableModels = ctx.modelRegistry.getAvailable();
2161
+ const match = deps.resolveModelId(hookModelOverride, availableModels, ctx.model?.provider);
2162
+ if (match) {
2163
+ const ok = await pi.setModel(match, { persist: false });
2164
+ if (ok) {
2165
+ if (s.autoModeStartThinkingLevel) {
2166
+ pi.setThinkingLevel(s.autoModeStartThinkingLevel);
2167
+ }
2168
+ s.currentUnitModel = match as AutoSession["currentUnitModel"];
2169
+ ctx.ui.notify(`Hook model override: ${match.provider}/${match.id}`, "info");
2170
+ } else {
2171
+ ctx.ui.notify(
2172
+ `Hook model "${hookModelOverride}" found but setModel failed. Using default.`,
2173
+ "warning",
2174
+ );
2175
+ }
2176
+ } else {
2177
+ ctx.ui.notify(
2178
+ `Hook model "${hookModelOverride}" not found in available models. Falling back to current session model. ` +
2179
+ `Ensure the model is defined in models.json and has auth configured.`,
2180
+ "warning",
2181
+ );
2182
+ }
2183
+ }
2184
+
2185
+ // Store the final dispatched model ID so the dashboard can read it (#2899).
2186
+ // This accounts for hook model overrides applied after selectAndApplyModel.
2187
+ s.currentDispatchedModelId = s.currentUnitModel
2188
+ ? `${(s.currentUnitModel as any).provider ?? ""}/${(s.currentUnitModel as any).id ?? ""}`
2189
+ : null;
2190
+
2191
+ const compatibilityError = getWorkflowTransportSupportError(
2192
+ s.currentUnitModel?.provider ?? ctx.model?.provider,
2193
+ getRequiredWorkflowToolsForAutoUnit(unitType),
2194
+ {
2195
+ projectRoot: s.basePath,
2196
+ surface: "auto-mode",
2197
+ unitType,
2198
+ authMode: s.currentUnitModel?.provider
2199
+ ? ctx.modelRegistry.getProviderAuthMode(s.currentUnitModel.provider)
2200
+ : ctx.model?.provider
2201
+ ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
2202
+ : undefined,
2203
+ baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
2204
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
2205
+ },
2206
+ );
2207
+ if (compatibilityError) {
2208
+ s.currentUnitRouting = prevUnitRouting;
2209
+ s.currentUnitModel = prevUnitModel;
2210
+ s.currentDispatchedModelId = prevDispatchedModelId;
2211
+ if (s.checkpointSha) {
2212
+ cleanupCheckpoint(s.basePath, unitId);
2213
+ s.checkpointSha = null;
2214
+ }
2215
+ if (prevSessionModel) {
2216
+ const ok = await pi.setModel(prevSessionModel, { persist: false });
2217
+ if (!ok) {
2218
+ ctx.ui.notify("Failed to restore previous session model after compatibility check failure.", "warning");
2219
+ }
2220
+ if (prevSessionThinkingLevel) {
2221
+ pi.setThinkingLevel(prevSessionThinkingLevel);
2222
+ }
2223
+ }
2224
+ ctx.ui.notify(compatibilityError, "error");
2225
+ await deps.stopAuto(ctx, pi, compatibilityError);
2226
+ return { action: "break", reason: "workflow-capability" };
2227
+ }
2228
+
2229
+ // Scope workflow-logger buffer to this unit so post-finalize drains are
2230
+ // per-unit. Without this, the module-level _buffer accumulates across every
2231
+ // unit in the same Node process (see workflow-logger.ts module header).
2232
+ _resetLogs();
2233
+ const unitStartedAt = Date.now();
2234
+ s.unitDispatchCount.set(dispatchKey, nextDispatchCount);
2235
+ s.currentUnit = { type: unitType, id: unitId, startedAt: unitStartedAt, workspaceRoot: s.basePath };
2236
+ s.rootWriteBaseline = isIsolatedWorktreeSession(s)
2237
+ ? captureRootDirtySnapshot(s.originalBasePath)
2238
+ : null;
2239
+ s.lastGitActionFailure = null;
2240
+ s.lastGitActionStatus = null;
2241
+ s.lastUnitAgentEndMessages = null;
2242
+ setCurrentPhase(unitType, {
2243
+ basePath: s.basePath,
2244
+ traceId: ic.flowId,
2245
+ turnId: `iter-${ic.iteration}`,
2246
+ causedBy: "unit-start",
2247
+ });
2248
+ s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
2249
+ const unitStartSeq = ic.nextSeq();
2250
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
2251
+ deps.captureAvailableSkills();
2252
+ writeUnitRuntimeRecord(
2253
+ s.basePath,
2254
+ unitType,
2255
+ unitId,
2256
+ unitStartedAt,
2257
+ {
2258
+ phase: "dispatched",
2259
+ wrapupWarningSent: false,
2260
+ timeoutAt: null,
2261
+ lastProgressAt: unitStartedAt,
2262
+ progressCount: 0,
2263
+ lastProgressKind: "dispatch",
2264
+ recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
2265
+ },
2266
+ );
2267
+
2268
+ // Progress widget + preconditions — deferred to after model selection so the
2269
+ // widget's first render tick shows the correct model (#2899).
2270
+ deps.updateProgressWidget(ctx, unitType, unitId, state);
2271
+ deps.ensurePreconditions(unitType, unitId, s.basePath, state);
2272
+
2273
+ // Start unit supervision
2274
+ deps.clearUnitTimeout();
2275
+ deps.startUnitSupervision({
2276
+ s,
2277
+ ctx,
2278
+ pi,
2279
+ unitType,
2280
+ unitId,
2281
+ prefs,
2282
+ buildSnapshotOpts: () => deps.buildSnapshotOpts(unitType, unitId),
2283
+ buildRecoveryContext: () => ({
2284
+ basePath: s.basePath,
2285
+ verbose: s.verbose,
2286
+ currentUnitStartedAt: s.currentUnit?.startedAt ?? Date.now(),
2287
+ unitRecoveryCount: s.unitRecoveryCount,
2288
+ }),
2289
+ pauseAuto: deps.pauseAuto,
2290
+ });
2291
+
2292
+ // Write preliminary lock (no session path yet — runUnit creates a new session).
2293
+ // Crash recovery can still identify the in-flight unit from this lock.
2294
+ deps.writeLock(
2295
+ deps.lockBase(),
2296
+ unitType,
2297
+ unitId,
2298
+ );
2299
+
2300
+ debugLog("autoLoop", {
2301
+ phase: "runUnit-start",
2302
+ iteration: ic.iteration,
2303
+ unitType,
2304
+ unitId,
2305
+ });
2306
+ const pausedBeforeRun = s.paused;
2307
+ const unitResult = await runUnit(
2308
+ ctx,
2309
+ pi,
2310
+ s,
2311
+ unitType,
2312
+ unitId,
2313
+ finalPrompt,
2314
+ );
2315
+ s.lastUnitAgentEndMessages = unitResult.event?.messages ?? null;
2316
+ debugLog("autoLoop", {
2317
+ phase: "runUnit-end",
2318
+ iteration: ic.iteration,
2319
+ unitType,
2320
+ unitId,
2321
+ status: unitResult.status,
2322
+ });
2323
+
2324
+ if (
2325
+ unitResult.status === "completed" &&
2326
+ s.currentUnit &&
2327
+ (unitResult.event?.messages?.length ?? 0) === 0 &&
2328
+ isSuspiciousGhostCompletion(ctx, unitResult.requestDispatchedAt ?? s.currentUnit.startedAt)
2329
+ ) {
2330
+ const message =
2331
+ `${unitType} ${unitId} completed without assistant output or tool calls; treating as a stale ghost completion.`;
2332
+ debugLog("autoLoop", {
2333
+ phase: "ghost-completion",
2334
+ iteration: ic.iteration,
2335
+ unitType,
2336
+ unitId,
2337
+ elapsedMs: Date.now() - (unitResult.requestDispatchedAt ?? s.currentUnit.startedAt),
2338
+ });
2339
+ logWarning("engine", message);
2340
+ ctx.ui.notify(`${message} Pausing auto-mode before closeout side effects.`, "warning");
2341
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, {
2342
+ message,
2343
+ category: "unknown",
2344
+ isTransient: true,
2345
+ });
2346
+ s.currentUnit = null;
2347
+ await deps.pauseAuto(ctx, pi);
2348
+ return { action: "break", reason: "ghost-completion" };
2349
+ }
2350
+
2351
+ // Now that runUnit has called newSession(), the session file path is correct.
2352
+ const sessionFile = deps.getSessionFile(ctx);
2353
+ deps.updateSessionLock(
2354
+ deps.lockBase(),
2355
+ unitType,
2356
+ unitId,
2357
+ sessionFile,
2358
+ );
2359
+ deps.writeLock(
2360
+ deps.lockBase(),
2361
+ unitType,
2362
+ unitId,
2363
+ sessionFile,
2364
+ );
2365
+
2366
+ // Tag the most recent window entry with error info for stuck detection
2367
+ const lastEntry = loopState.recentUnits[loopState.recentUnits.length - 1];
2368
+ if (lastEntry) {
2369
+ if (unitResult.errorContext) {
2370
+ lastEntry.error = `${unitResult.errorContext.category}:${unitResult.errorContext.message}`.slice(0, 200);
2371
+ } else if (unitResult.status === "error" || unitResult.status === "cancelled") {
2372
+ lastEntry.error = `${unitResult.status}:${unitType}/${unitId}`;
2373
+ } else if (unitResult.event?.messages?.length) {
2374
+ const lastMsg = unitResult.event.messages[unitResult.event.messages.length - 1];
2375
+ const msgStr = typeof lastMsg === "string" ? lastMsg : JSON.stringify(lastMsg);
2376
+ if (/error|fail|exception/i.test(msgStr)) {
2377
+ lastEntry.error = msgStr.slice(0, 200);
2378
+ }
2379
+ }
2380
+ }
2381
+
2382
+ if (unitResult.status === "cancelled") {
2383
+ if (_isPauseOriginCancelledResult(s.paused, unitResult.errorContext)) {
2384
+ if (!pausedBeforeRun) {
2385
+ const pauseContext = {
2386
+ message: "Auto-mode paused during unit setup",
2387
+ category: "aborted" as const,
2388
+ isTransient: true,
2389
+ };
2390
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
2391
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, pauseContext);
2392
+ return { action: "break", reason: "pause-during-setup" };
2393
+ }
2394
+ debugLog("autoLoop", { phase: "cancelled-after-pause", unitType, unitId });
2395
+ return { action: "break", reason: "paused" };
2396
+ }
2397
+
2398
+ const errorCategory = unitResult.errorContext?.category;
2399
+ // Provider-error pause: agent_end recovery normally pauses before this
2400
+ // branch. Provider readiness failures happen before dispatch, so pause here
2401
+ // if nothing upstream already did.
2402
+ if (errorCategory === "provider") {
2403
+ if (!s.paused) {
2404
+ const detail = unitResult.errorContext?.message ?? `Provider unavailable for ${unitType} ${unitId}`;
2405
+ const isTransient = Boolean(unitResult.errorContext?.isTransient);
2406
+ const retryAfterMs = unitResult.errorContext?.retryAfterMs ?? (isTransient ? 30_000 : undefined);
2407
+ await pauseAutoForProviderError(
2408
+ ctx.ui,
2409
+ detail,
2410
+ () => deps.pauseAuto(ctx, pi),
2411
+ {
2412
+ isRateLimit: false,
2413
+ isTransient,
2414
+ retryAfterMs,
2415
+ resume: isTransient
2416
+ ? () => {
2417
+ void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
2418
+ logWarning("engine", `Provider error auto-resume failed: ${err instanceof Error ? err.message : String(err)}`);
2419
+ });
2420
+ }
2421
+ : undefined,
2422
+ },
2423
+ );
2424
+ }
2425
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
2426
+ debugLog("autoLoop", { phase: "exit", reason: "provider-pause", isTransient: unitResult.errorContext?.isTransient });
2427
+ return { action: "break", reason: "provider-pause" };
2428
+ }
2429
+ // Timeout category covers two distinct scenarios:
2430
+ // 1. Session creation timeout (120s) — transient, auto-resume with backoff
2431
+ // 2. Unit hard timeout (30min+) — stuck agent, pause for manual review
2432
+ // Transient session-failed covers recoverable newSession failures and should
2433
+ // pause instead of hard-stopping.
2434
+ // Structural errors (TypeError, is not a function) are NOT transient
2435
+ // and must hard-stop to avoid infinite retry loops.
2436
+ if (
2437
+ unitResult.errorContext?.isTransient &&
2438
+ errorCategory === "timeout"
2439
+ ) {
2440
+ const isSessionCreationTimeout = unitResult.errorContext.message?.includes("Session creation timed out");
2441
+
2442
+ if (isSessionCreationTimeout) {
2443
+ consecutiveSessionTimeouts += 1;
2444
+ const baseRetryAfterMs = 30_000;
2445
+ const retryAfterMs = baseRetryAfterMs * 2 ** Math.max(0, consecutiveSessionTimeouts - 1);
2446
+ const allowAutoResume = consecutiveSessionTimeouts <= MAX_SESSION_TIMEOUT_AUTO_RESUMES;
2447
+
2448
+ if (!allowAutoResume) {
2449
+ ctx.ui.notify(
2450
+ `Session creation timed out ${consecutiveSessionTimeouts} consecutive times for ${unitType} ${unitId}. Pausing for manual review.`,
2451
+ "warning",
2452
+ );
2453
+ }
2454
+
2455
+ debugLog("autoLoop", {
2456
+ phase: "session-timeout-pause",
2457
+ unitType, unitId,
2458
+ consecutiveSessionTimeouts,
2459
+ retryAfterMs,
2460
+ allowAutoResume,
2461
+ });
2462
+
2463
+ const errorDetail = ` for ${unitType} ${unitId}`;
2464
+ await pauseAutoForProviderError(
2465
+ ctx.ui,
2466
+ errorDetail,
2467
+ () => deps.pauseAuto(ctx, pi),
2468
+ {
2469
+ isRateLimit: false,
2470
+ isTransient: allowAutoResume,
2471
+ retryAfterMs,
2472
+ resume: allowAutoResume
2473
+ ? () => {
2474
+ void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
2475
+ const message = err instanceof Error ? err.message : String(err);
2476
+ ctx.ui.notify(
2477
+ `Session timeout recovery failed: ${message}`,
2478
+ "error",
2479
+ );
2480
+ });
2481
+ }
2482
+ : undefined,
2483
+ },
2484
+ );
2485
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
2486
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
2487
+ return { action: "break", reason: "session-timeout" };
2488
+ }
2489
+
2490
+ // Unit hard timeout (30min+): pause without auto-resume — stuck agent
2491
+ ctx.ui.notify(
2492
+ `Unit timed out for ${unitType} ${unitId} (supervision may have failed). Pausing auto-mode.`,
2493
+ "warning",
2494
+ );
2495
+ debugLog("autoLoop", { phase: "unit-hard-timeout-pause", unitType, unitId });
2496
+ await deps.pauseAuto(ctx, pi);
2497
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
2498
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
2499
+ return { action: "break", reason: "unit-hard-timeout" };
2500
+ }
2501
+ if (
2502
+ unitResult.errorContext?.isTransient &&
2503
+ errorCategory === "session-failed"
2504
+ ) {
2505
+ ctx.ui.notify(
2506
+ `Session creation failed transiently for ${unitType} ${unitId}: ${unitResult.errorContext?.message ?? "unknown"}. Pausing auto-mode (recoverable).`,
2507
+ "warning",
2508
+ );
2509
+ debugLog("autoLoop", { phase: "session-start-transient-pause", unitType, unitId, category: errorCategory });
2510
+ await deps.pauseAuto(ctx, pi);
2511
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
2512
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
2513
+ return { action: "break", reason: "session-timeout" };
2514
+ }
2515
+ if (
2516
+ unitResult.errorContext?.isTransient &&
2517
+ errorCategory === "aborted"
2518
+ ) {
2519
+ rememberRetryDispatch(s, { type: unitType, id: unitId }, iterData);
2520
+ writeUnitRuntimeRecord(s.basePath, unitType, unitId, s.currentUnit?.startedAt ?? Date.now(), {
2521
+ phase: "paused",
2522
+ lastProgressAt: Date.now(),
2523
+ lastProgressKind: "unit-aborted-pause",
2524
+ });
2525
+ ctx.ui.notify(
2526
+ `Unit ${unitType} ${unitId} was aborted (transient). Pausing auto-mode (recoverable).`,
2527
+ "warning",
2528
+ );
2529
+ debugLog("autoLoop", { phase: "unit-aborted-transient-pause", unitType, unitId, category: errorCategory });
2530
+ await deps.pauseAuto(ctx, pi, unitResult.errorContext);
2531
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
2532
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
2533
+ return { action: "break", reason: "unit-aborted-pause" };
2534
+ }
2535
+ // All other cancelled states (structural errors, non-transient failures): hard stop
2536
+ if (s.currentUnit) {
2537
+ await deps.closeoutUnit(
2538
+ ctx,
2539
+ s.basePath,
2540
+ unitType,
2541
+ unitId,
2542
+ s.currentUnit.startedAt,
2543
+ deps.buildSnapshotOpts(unitType, unitId),
2544
+ );
2545
+ }
2546
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
2547
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
2548
+
2549
+ const cancelledStop = _buildCancelledUnitStopReason(
2550
+ unitType,
2551
+ unitId,
2552
+ unitResult.errorContext,
2553
+ );
2554
+ ctx.ui.notify(cancelledStop.notifyMessage, "warning");
2555
+ await deps.stopAuto(ctx, pi, cancelledStop.stopReason);
2556
+ debugLog("autoLoop", { phase: "exit", reason: cancelledStop.loopReason });
2557
+ return { action: "break", reason: cancelledStop.loopReason };
2558
+ }
2559
+
2560
+ // ── Immediate unit closeout (metrics, activity log, memory) ────────
2561
+ // Run right after runUnit() returns so telemetry is never lost to a
2562
+ // crash between iterations.
2563
+ // Guard: stopAuto() may have nulled s.currentUnit via s.reset() while
2564
+ // this coroutine was suspended at `await runUnit(...)` (#2939).
2565
+ if (s.currentUnit) {
2566
+ // Reset session timeout counter — any successful unit clears the slate
2567
+ consecutiveSessionTimeouts = 0;
2568
+ await deps.closeoutUnit(
2569
+ ctx,
2570
+ s.basePath,
2571
+ unitType,
2572
+ unitId,
2573
+ s.currentUnit.startedAt,
2574
+ deps.buildSnapshotOpts(unitType, unitId),
2575
+ );
2576
+ }
2577
+
2578
+ // ── Zero tool-call guard (#1833, #2653) ──────────────────────────
2579
+ // Any unit that completes with 0 tool calls made no real progress —
2580
+ // likely context exhaustion where all tool calls errored out. Treat
2581
+ // as failed so the unit is retried in a fresh context instead of
2582
+ // silently passing through to artifact verification (which loops
2583
+ // forever when the unit never produced its artifact).
2584
+ {
2585
+ const currentLedger = deps.getLedger() as { units: Array<{ type: string; id: string; startedAt: number; toolCalls: number }> } | null;
2586
+ if (currentLedger?.units) {
2587
+ const lastUnit = [...currentLedger.units].reverse().find(
2588
+ (u: { type: string; id: string; startedAt: number; toolCalls: number }) => u.type === unitType && u.id === unitId && u.startedAt === _resolveCurrentUnitStartedAtForTest(s.currentUnit),
2589
+ );
2590
+ if (lastUnit && lastUnit.toolCalls === 0) {
2591
+ if (USER_DRIVEN_DEEP_UNITS.has(unitType) && isAwaitingUserInput(s.lastUnitAgentEndMessages ?? undefined)) {
2592
+ debugLog("runUnitPhase", {
2593
+ phase: "zero-tool-calls-awaiting-user-input",
2594
+ unitType,
2595
+ unitId,
2596
+ });
2597
+ } else {
2598
+ debugLog("runUnitPhase", {
2599
+ phase: "zero-tool-calls",
2600
+ unitType,
2601
+ unitId,
2602
+ warning: "Unit completed with 0 tool calls — likely context exhaustion, marking as failed",
2603
+ });
2604
+ ctx.ui.notify(
2605
+ `${unitType} ${unitId} completed with 0 tool calls — context exhaustion, will retry`,
2606
+ "warning",
2607
+ );
2608
+ return {
2609
+ action: "retry",
2610
+ reason: "zero-tool-calls",
2611
+ data: {
2612
+ unitStartedAt: _resolveCurrentUnitStartedAtForTest(s.currentUnit),
2613
+ requestDispatchedAt: unitResult.requestDispatchedAt,
2614
+ },
2615
+ };
2616
+ }
2617
+ }
2618
+ }
2619
+ }
2620
+
2621
+ const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
2622
+ const artifactVerified =
2623
+ skipArtifactVerification ||
2624
+ verifyExpectedArtifact(unitType, unitId, s.basePath);
2625
+ if (s.currentUnitRouting) {
2626
+ deps.recordOutcome(
2627
+ unitType,
2628
+ s.currentUnitRouting.tier as "light" | "standard" | "heavy",
2629
+ artifactVerified,
2630
+ );
2631
+ }
2632
+ if (artifactVerified) {
2633
+ s.unitDispatchCount.delete(dispatchKey);
2634
+ s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
2635
+ }
2636
+
2637
+ // Write phase handoff anchor after successful research/planning completion
2638
+ const anchorPhases = new Set(["research-milestone", "research-slice", "plan-milestone", "plan-slice"]);
2639
+ if (artifactVerified && mid && anchorPhases.has(unitType)) {
2640
+ try {
2641
+ const { writePhaseAnchor } = await import("../phase-anchor.js");
2642
+ writePhaseAnchor(s.basePath, mid, {
2643
+ phase: unitType,
2644
+ milestoneId: mid,
2645
+ generatedAt: new Date().toISOString(),
2646
+ intent: `Completed ${unitType} for ${unitId}`,
2647
+ decisions: [],
2648
+ blockers: [],
2649
+ nextSteps: [],
2650
+ });
2651
+ } catch (err) { /* non-fatal — anchor is advisory */
2652
+ logWarning("engine", `phase anchor failed: ${err instanceof Error ? err.message : String(err)}`);
2653
+ }
2654
+ }
2655
+
2656
+ const unitEndStatus =
2657
+ !artifactVerified && unitResult.status === "completed"
2658
+ ? "no-artifact"
2659
+ : unitResult.status;
2660
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitEndStatus, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
2661
+
2662
+ // ── Safety harness: checkpoint cleanup or rollback ──
2663
+ if (s.checkpointSha) {
2664
+ if (unitResult.status === "error" && safetyConfig.auto_rollback) {
2665
+ const rolled = rollbackToCheckpoint(s.basePath, unitId, s.checkpointSha);
2666
+ if (rolled) {
2667
+ ctx.ui.notify(`Rolled back to pre-unit checkpoint for ${unitId}`, "info");
2668
+ debugLog("runUnitPhase", { phase: "checkpoint-rollback", unitId });
2669
+ }
2670
+ } else if (unitResult.status === "error") {
2671
+ ctx.ui.notify(
2672
+ `Unit ${unitId} failed. Pre-unit checkpoint available at ${s.checkpointSha.slice(0, 8)}`,
2673
+ "warning",
2674
+ );
2675
+ } else {
2676
+ // Success — clean up checkpoint ref
2677
+ cleanupCheckpoint(s.basePath, unitId);
2678
+ debugLog("runUnitPhase", { phase: "checkpoint-cleaned", unitId });
2679
+ }
2680
+ s.checkpointSha = null;
2681
+ }
2682
+
2683
+ return { action: "next", data: { unitStartedAt: _resolveCurrentUnitStartedAtForTest(s.currentUnit), requestDispatchedAt: unitResult.requestDispatchedAt } };
2684
+ }
2685
+
2686
+ // ─── runFinalize ──────────────────────────────────────────────────────────────
2687
+
2688
+ /**
2689
+ * Phase 5: Post-unit finalize — pre/post verification, UAT pause, step-wizard.
2690
+ * Returns break/continue/next to control the outer loop.
2691
+ */
2692
+ export async function runFinalize(
2693
+ ic: IterationContext,
2694
+ iterData: IterationData,
2695
+ loopState: LoopState,
2696
+ sidecarItem?: SidecarItem,
2697
+ ): Promise<PhaseResult> {
2698
+ const { ctx, pi, s, deps } = ic;
2699
+ const { pauseAfterUatDispatch } = iterData;
2700
+
2701
+ debugLog("autoLoop", { phase: "finalize", iteration: ic.iteration });
2702
+
2703
+ // Clear unit timeout (unit completed)
2704
+ deps.clearUnitTimeout();
2705
+
2706
+ // Post-unit context for pre/post verification
2707
+ const postUnitCtx: PostUnitContext = {
2708
+ s,
2709
+ ctx,
2710
+ pi,
2711
+ buildSnapshotOpts: deps.buildSnapshotOpts,
2712
+ lockBase: deps.lockBase,
2713
+ stopAuto: deps.stopAuto,
2714
+ pauseAuto: deps.pauseAuto,
2715
+ updateProgressWidget: deps.updateProgressWidget,
2716
+ };
2717
+
2718
+ // Pre-verification processing (commit, doctor, state rebuild, etc.)
2719
+ // Timeout guard: if postUnitPreVerification hangs (e.g., safety harness
2720
+ // deadlock, browser teardown hang, worktree sync stall), force-continue
2721
+ // after timeout so the auto-loop is not permanently frozen (#3757).
2722
+ //
2723
+ // On timeout, null out s.currentUnit so the timed-out task's late async
2724
+ // mutations are harmless — postUnitPreVerification guards all side effects
2725
+ // behind `if (s.currentUnit)`. The next iteration sets a fresh currentUnit.
2726
+ // Sidecar items use lightweight pre-verification opts
2727
+ const preVerificationOpts: PreVerificationOpts = sidecarItem
2728
+ ? sidecarItem.kind === "hook"
2729
+ ? { skipSettleDelay: true, skipWorktreeSync: true, agentEndMessages: s.lastUnitAgentEndMessages ?? undefined }
2730
+ : { skipSettleDelay: true, agentEndMessages: s.lastUnitAgentEndMessages ?? undefined }
2731
+ : { agentEndMessages: s.lastUnitAgentEndMessages ?? undefined };
2732
+ const preUnitSnapshot = s.currentUnit
2733
+ ? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
2734
+ : null;
2735
+ const clearFinalizingUnit = () => {
2736
+ if (
2737
+ preUnitSnapshot &&
2738
+ s.currentUnit?.type === preUnitSnapshot.type &&
2739
+ s.currentUnit?.id === preUnitSnapshot.id &&
2740
+ s.currentUnit?.startedAt === preUnitSnapshot.startedAt
2741
+ ) {
2742
+ s.currentUnit = null;
2743
+ }
2744
+ s.rootWriteBaseline = null;
2745
+ };
2746
+ clearCurrentPhase();
2747
+ const preResultGuard = await withTimeout(
2748
+ deps.postUnitPreVerification(postUnitCtx, preVerificationOpts),
2749
+ FINALIZE_PRE_TIMEOUT_MS,
2750
+ "postUnitPreVerification",
2751
+ );
2752
+
2753
+ if (preResultGuard.timedOut) {
2754
+ return failClosedOnFinalizeTimeout(
2755
+ ic,
2756
+ iterData,
2757
+ loopState,
2758
+ "pre",
2759
+ preUnitSnapshot?.startedAt ?? Date.now(),
2760
+ );
2761
+ }
2762
+
2763
+ const preResult = preResultGuard.value;
2764
+ if (preResult === "dispatched") {
2765
+ const dispatchedReason = s.lastGitActionFailure
2766
+ ? "git-closeout-failure"
2767
+ : "pre-verification-dispatched";
2768
+ debugLog("autoLoop", {
2769
+ phase: "exit",
2770
+ reason: dispatchedReason,
2771
+ gitError: s.lastGitActionFailure ?? undefined,
2772
+ });
2773
+ clearFinalizingUnit();
2774
+ return { action: "break", reason: dispatchedReason };
2775
+ }
2776
+ if (preResult === "retry") {
2777
+ if (sidecarItem) {
2778
+ // Sidecar artifact retries are skipped — just continue
2779
+ debugLog("autoLoop", { phase: "sidecar-artifact-retry-skipped", iteration: ic.iteration });
2780
+ } else {
2781
+ // s.pendingVerificationRetry was set by postUnitPreVerification.
2782
+ // Emit a dedicated journal event so forensics can distinguish bounded
2783
+ // verification retries from genuine stuck-loop dispatch repetitions (#4540).
2784
+ const retryInfo = s.pendingVerificationRetry;
2785
+ deps.emitJournalEvent({
2786
+ ts: new Date().toISOString(),
2787
+ flowId: ic.flowId,
2788
+ seq: ic.nextSeq(),
2789
+ eventType: "artifact-verification-retry",
2790
+ data: {
2791
+ unitType: preUnitSnapshot?.type,
2792
+ unitId: retryInfo?.unitId,
2793
+ attempt: retryInfo?.attempt,
2794
+ },
2795
+ });
2796
+ const retryPolicyResult = await applyVerificationRetryPolicy(
2797
+ ic,
2798
+ preUnitSnapshot?.type,
2799
+ "artifact-verification-retry",
2800
+ );
2801
+ if (retryPolicyResult) {
2802
+ clearFinalizingUnit();
2803
+ return retryPolicyResult;
2804
+ }
2805
+ // Continue the loop — next iteration will inject the retry context into the prompt.
2806
+ rememberRetryDispatch(s, preUnitSnapshot, iterData);
2807
+ debugLog("autoLoop", { phase: "artifact-verification-retry", iteration: ic.iteration });
2808
+ clearFinalizingUnit();
2809
+ return { action: "continue" };
2810
+ }
2811
+ }
2812
+
2813
+ if (pauseAfterUatDispatch) {
2814
+ ctx.ui.notify(
2815
+ "UAT requires human execution. Auto-mode will pause after this unit writes the result file.",
2816
+ "info",
2817
+ );
2818
+ await deps.pauseAuto(ctx, pi);
2819
+ debugLog("autoLoop", { phase: "exit", reason: "uat-pause" });
2820
+ clearFinalizingUnit();
2821
+ return { action: "break", reason: "uat-pause" };
2822
+ }
2823
+
2824
+ // Verification gate
2825
+ // Hook sidecar items skip verification entirely.
2826
+ // Non-hook sidecar items run verification but skip retries (just continue).
2827
+ const skipVerification = sidecarItem?.kind === "hook";
2828
+ if (!skipVerification) {
2829
+ const verificationResult = await deps.runPostUnitVerification(
2830
+ { s, ctx, pi },
2831
+ deps.pauseAuto,
2832
+ );
2833
+
2834
+ if (verificationResult === "pause") {
2835
+ debugLog("autoLoop", { phase: "exit", reason: "verification-pause" });
2836
+ clearFinalizingUnit();
2837
+ return { action: "break", reason: "verification-pause" };
2838
+ }
2839
+
2840
+ if (verificationResult === "retry") {
2841
+ if (sidecarItem) {
2842
+ // Sidecar verification retries are skipped — just continue
2843
+ debugLog("autoLoop", { phase: "sidecar-verification-retry-skipped", iteration: ic.iteration });
2844
+ } else {
2845
+ // s.pendingVerificationRetry was set by runPostUnitVerification.
2846
+ const retryPolicyResult = await applyVerificationRetryPolicy(
2847
+ ic,
2848
+ iterData.unitType,
2849
+ "verification-retry",
2850
+ );
2851
+ if (retryPolicyResult) {
2852
+ clearFinalizingUnit();
2853
+ return retryPolicyResult;
2854
+ }
2855
+ // Continue the loop — next iteration will inject the retry context into the prompt.
2856
+ rememberRetryDispatch(s, preUnitSnapshot, iterData);
2857
+ debugLog("autoLoop", { phase: "verification-retry", iteration: ic.iteration });
2858
+ clearFinalizingUnit();
2859
+ return { action: "continue" };
2860
+ }
2861
+ }
2862
+ }
2863
+
2864
+ // Post-verification processing (DB dual-write, hooks, triage, quick-tasks)
2865
+ // Timeout guard: if postUnitPostVerification hangs (e.g., module import
2866
+ // deadlock, SQLite transaction hang), force-continue after timeout so the
2867
+ // auto-loop is not permanently frozen (#2344).
2868
+ const postResultGuard = await withTimeout(
2869
+ deps.postUnitPostVerification(postUnitCtx),
2870
+ FINALIZE_POST_TIMEOUT_MS,
2871
+ "postUnitPostVerification",
2872
+ );
2873
+
2874
+ if (postResultGuard.timedOut) {
2875
+ return failClosedOnFinalizeTimeout(
2876
+ ic,
2877
+ iterData,
2878
+ loopState,
2879
+ "post",
2880
+ preUnitSnapshot?.startedAt ?? Date.now(),
2881
+ );
2882
+ }
2883
+
2884
+ const postResult = postResultGuard.value;
2885
+
2886
+ if (postResult === "retry") {
2887
+ if (sidecarItem) {
2888
+ debugLog("autoLoop", { phase: "sidecar-pre-execution-retry-skipped", iteration: ic.iteration });
2889
+ } else {
2890
+ const retryInfo = s.pendingVerificationRetry;
2891
+ deps.emitJournalEvent({
2892
+ ts: new Date().toISOString(),
2893
+ flowId: ic.flowId,
2894
+ seq: ic.nextSeq(),
2895
+ eventType: "pre-execution-retry",
2896
+ data: {
2897
+ unitType: preUnitSnapshot?.type,
2898
+ unitId: retryInfo?.unitId,
2899
+ attempt: retryInfo?.attempt,
2900
+ },
2901
+ });
2902
+ const retryPolicyResult = await applyVerificationRetryPolicy(
2903
+ ic,
2904
+ preUnitSnapshot?.type,
2905
+ "pre-execution-retry",
2906
+ );
2907
+ if (retryPolicyResult) {
2908
+ clearFinalizingUnit();
2909
+ return retryPolicyResult;
2910
+ }
2911
+ rememberRetryDispatch(s, preUnitSnapshot, iterData);
2912
+ debugLog("autoLoop", {
2913
+ phase: "pre-execution-retry",
2914
+ iteration: ic.iteration,
2915
+ unitType: preUnitSnapshot?.type,
2916
+ unitId: retryInfo?.unitId,
2917
+ attempt: retryInfo?.attempt,
2918
+ });
2919
+ clearFinalizingUnit();
2920
+ return { action: "continue" };
2921
+ }
2922
+ }
2923
+
2924
+ if (postResult === "stopped") {
2925
+ debugLog("autoLoop", {
2926
+ phase: "exit",
2927
+ reason: "post-verification-stopped",
2928
+ });
2929
+ clearFinalizingUnit();
2930
+ return { action: "break", reason: "post-verification-stopped" };
2931
+ }
2932
+
2933
+ if (postResult === "step-wizard") {
2934
+ // Step mode — exit the loop (caller handles wizard)
2935
+ debugLog("autoLoop", { phase: "exit", reason: "step-wizard" });
2936
+ clearFinalizingUnit();
2937
+ return { action: "break", reason: "step-wizard" };
2938
+ }
2939
+
2940
+ if (preUnitSnapshot && isIsolatedWorktreeSession(s)) {
2941
+ const leak = detectRootWriteLeak({
2942
+ rootPath: s.originalBasePath,
2943
+ worktreePath: s.basePath,
2944
+ unitType: preUnitSnapshot.type,
2945
+ unitId: preUnitSnapshot.id,
2946
+ before: s.rootWriteBaseline,
2947
+ });
2948
+ s.rootWriteBaseline = null;
2949
+ if (leak) {
2950
+ const message = formatRootWriteLeakMessage(leak);
2951
+ debugLog("autoLoop", {
2952
+ phase: "root-write-leak",
2953
+ unitType: preUnitSnapshot.type,
2954
+ unitId: preUnitSnapshot.id,
2955
+ rootPath: leak.rootPath,
2956
+ worktreePath: leak.worktreePath,
2957
+ files: leak.files.map((file) => ({ path: file.path, status: file.status })),
2958
+ });
2959
+ ctx.ui.notify(message, "error");
2960
+ await deps.stopAuto(ctx, pi, "Root-write leak during isolated auto-mode", {
2961
+ preserveCompletedMilestoneBranch: true,
2962
+ });
2963
+ clearFinalizingUnit();
2964
+ return { action: "break", reason: "root-write-leak" };
2965
+ }
2966
+ } else {
2967
+ s.rootWriteBaseline = null;
2968
+ }
2969
+
2970
+ if (preUnitSnapshot?.type === "complete-milestone" && s.currentMilestoneId) {
2971
+ const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
2972
+ if (stop) {
2973
+ clearFinalizingUnit();
2974
+ return stop;
2975
+ }
2976
+ }
2977
+
2978
+ // Both pre and post verification completed without timeout — reset counter
2979
+ loopState.consecutiveFinalizeTimeouts = 0;
2980
+ if (preUnitSnapshot) {
2981
+ writeUnitRuntimeRecord(s.basePath, preUnitSnapshot.type, preUnitSnapshot.id, preUnitSnapshot.startedAt, {
2982
+ phase: "finalized",
2983
+ lastProgressAt: Date.now(),
2984
+ lastProgressKind: "finalize-success",
2985
+ });
2986
+ if (
2987
+ !preUnitSnapshot.type.startsWith("hook/") &&
2988
+ preUnitSnapshot.type !== "custom-step" &&
2989
+ preUnitSnapshot.type !== "complete-milestone"
2990
+ ) {
2991
+ setAutoOutcomeWidget(ctx, {
2992
+ ...buildPhaseHandoffOutcome({
2993
+ unitType: preUnitSnapshot.type,
2994
+ unitId: preUnitSnapshot.id,
2995
+ agentEndMessages: s.lastUnitAgentEndMessages,
2996
+ }),
2997
+ startedAt: s.autoStartTime,
2998
+ });
2999
+ }
3000
+ }
3001
+ clearFinalizingUnit();
3002
+ // Surface accumulated workflow-logger issues for this unit to the user.
3003
+ // Warnings/errors logged during the unit are buffered in the logger and
3004
+ // drained here so the user sees a single consolidated post-unit alert.
3005
+ if (hasAnyIssues()) {
3006
+ const { logs } = drainAndSummarize();
3007
+ if (logs.length > 0) {
3008
+ const severity = logs.some((e) => e.severity === "error") ? "error" : "warning";
3009
+ ctx.ui.notify(formatForNotification(logs), severity);
3010
+ }
3011
+ }
3012
+
3013
+ return { action: "next", data: undefined as void };
3014
+ }