gsd-pi 2.81.0 → 2.82.0-dev.20138ae42

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 (740) hide show
  1. package/README.md +64 -33
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/GSD-WORKFLOW.md +10 -1
  4. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  5. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  6. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  7. package/dist/resources/extensions/cmux/index.js +5 -0
  8. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  9. package/dist/resources/extensions/gsd/auto/loop.js +116 -13
  10. package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
  11. package/dist/resources/extensions/gsd/auto/phases.js +220 -98
  12. package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
  13. package/dist/resources/extensions/gsd/auto/session.js +9 -0
  14. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  16. package/dist/resources/extensions/gsd/auto-dashboard.js +247 -178
  17. package/dist/resources/extensions/gsd/auto-dispatch.js +27 -17
  18. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  19. package/dist/resources/extensions/gsd/auto-post-unit.js +240 -128
  20. package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
  21. package/dist/resources/extensions/gsd/auto-recovery.js +34 -179
  22. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  23. package/dist/resources/extensions/gsd/auto-start.js +105 -35
  24. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  25. package/dist/resources/extensions/gsd/auto-verification.js +38 -26
  26. package/dist/resources/extensions/gsd/auto-worktree.js +119 -1
  27. package/dist/resources/extensions/gsd/auto.js +400 -108
  28. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +38 -12
  29. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +9 -8
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -4
  31. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  32. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  33. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  34. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +16 -2
  35. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  36. package/dist/resources/extensions/gsd/commands/catalog.js +4 -1
  37. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -1
  38. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  39. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
  40. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  41. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  42. package/dist/resources/extensions/gsd/context-store.js +112 -0
  43. package/dist/resources/extensions/gsd/crash-recovery.js +31 -5
  44. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  45. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  46. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
  47. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  48. package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
  49. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  50. package/dist/resources/extensions/gsd/doctor.js +2 -28
  51. package/dist/resources/extensions/gsd/export-html.js +27 -425
  52. package/dist/resources/extensions/gsd/git-service.js +41 -2
  53. package/dist/resources/extensions/gsd/gsd-db.js +8 -23
  54. package/dist/resources/extensions/gsd/guided-flow.js +93 -111
  55. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  56. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  57. package/dist/resources/extensions/gsd/health-widget.js +4 -10
  58. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  59. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  60. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  61. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  62. package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
  63. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  64. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  65. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  66. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  67. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  68. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  69. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  70. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  72. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +62 -26
  74. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  75. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  76. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  77. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  78. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
  79. package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
  80. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  81. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  83. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +28 -10
  84. package/dist/resources/extensions/gsd/prompts/discuss.md +29 -11
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  86. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  88. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  89. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  90. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  91. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  92. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  93. package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
  94. package/dist/resources/extensions/gsd/session-lock.js +40 -0
  95. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  96. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
  97. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +252 -0
  98. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +45 -0
  99. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +82 -0
  100. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
  101. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
  102. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
  103. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
  104. package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
  105. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
  106. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
  107. package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
  108. package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
  109. package/dist/resources/extensions/gsd/status-guards.js +4 -0
  110. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  111. package/dist/resources/extensions/gsd/templates/plan.md +8 -5
  112. package/dist/resources/extensions/gsd/templates/task-plan.md +4 -2
  113. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  114. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  115. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  116. package/dist/resources/extensions/gsd/tools/plan-slice.js +89 -14
  117. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  118. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  119. package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
  120. package/dist/resources/extensions/gsd/validation.js +23 -1
  121. package/dist/resources/extensions/gsd/verification-gate.js +68 -7
  122. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  123. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  124. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  125. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  126. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  127. package/dist/resources/extensions/gsd/worktree-lifecycle.js +769 -319
  128. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  129. package/dist/resources/extensions/shared/html-shell.js +388 -0
  130. package/dist/resources/extensions/subagent/index.js +448 -78
  131. package/dist/resources/extensions/subagent/launch.js +77 -0
  132. package/dist/resources/extensions/subagent/run-store.js +148 -0
  133. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  134. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  135. package/dist/resources/extensions/visual-brief/index.js +5 -0
  136. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  137. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  138. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  139. package/dist/web/standalone/.next/BUILD_ID +1 -1
  140. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  141. package/dist/web/standalone/.next/build-manifest.json +4 -4
  142. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  143. package/dist/web/standalone/.next/react-loadable-manifest.json +3 -3
  144. package/dist/web/standalone/.next/required-server-files.json +3 -3
  145. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  146. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  148. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  156. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  161. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  163. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  166. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  173. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  185. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  215. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  221. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  237. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  241. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/index.html +1 -1
  251. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  252. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  253. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  254. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  255. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  256. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  257. package/dist/web/standalone/.next/server/app/page.js +2 -2
  258. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  260. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  261. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  262. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  263. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  264. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/middleware.js +2 -2
  267. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  269. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  270. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  271. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  272. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  273. package/dist/web/standalone/.next/static/chunks/{8359.e059d86b255fce1c.js → 8359.7eb3bb8f8ecf4c01.js} +2 -2
  274. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  275. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  277. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  279. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-9a4db269f9ed63ad.js} +1 -1
  280. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  281. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  282. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  283. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  284. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  285. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  286. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  287. package/dist/web/standalone/server.js +1 -1
  288. package/dist/welcome-screen.d.ts +0 -7
  289. package/dist/welcome-screen.js +60 -69
  290. package/package.json +6 -5
  291. package/packages/contracts/dist/rpc.test.js +7 -0
  292. package/packages/contracts/dist/rpc.test.js.map +1 -1
  293. package/packages/contracts/dist/workflow.d.ts +21 -0
  294. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  295. package/packages/contracts/dist/workflow.js +24 -0
  296. package/packages/contracts/dist/workflow.js.map +1 -1
  297. package/packages/contracts/src/rpc.test.ts +8 -0
  298. package/packages/contracts/src/workflow.ts +24 -0
  299. package/packages/daemon/package.json +2 -2
  300. package/packages/mcp-server/README.md +14 -3
  301. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  302. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  303. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  304. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  305. package/packages/mcp-server/package.json +2 -2
  306. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  307. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  308. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  309. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  310. package/packages/native/package.json +1 -1
  311. package/packages/native/tsconfig.json +2 -1
  312. package/packages/native/tsconfig.tsbuildinfo +1 -1
  313. package/packages/pi-agent-core/package.json +1 -1
  314. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  315. package/packages/pi-ai/dist/index.d.ts +2 -2
  316. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  317. package/packages/pi-ai/dist/index.js +1 -1
  318. package/packages/pi-ai/dist/index.js.map +1 -1
  319. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  320. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  321. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  322. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  323. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  324. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  325. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  326. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  327. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  329. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  330. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  331. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  332. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  333. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  334. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  335. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  336. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  337. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  338. package/packages/pi-ai/package.json +1 -1
  339. package/packages/pi-ai/src/index.ts +7 -2
  340. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  341. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  342. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  343. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  344. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  345. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  346. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  347. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  348. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  349. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  350. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  351. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  353. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  355. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  361. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  362. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  363. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  364. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  365. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  367. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  376. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  378. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  380. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  382. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +33 -42
  383. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
  387. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  389. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  390. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  391. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  393. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  394. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  395. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  396. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  397. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  398. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  399. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  400. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  401. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  402. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  403. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  404. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  406. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  409. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  411. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  412. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  413. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  414. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  415. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  416. package/packages/pi-coding-agent/package.json +1 -1
  417. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  418. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  419. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  420. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  421. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
  422. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  423. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  424. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  425. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  426. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  427. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  428. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +33 -44
  429. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
  430. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  431. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  432. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  433. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  434. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  435. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  436. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  437. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  438. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  439. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  440. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  441. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  442. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  443. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  444. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  445. package/packages/pi-tui/dist/tui.js +5 -0
  446. package/packages/pi-tui/dist/tui.js.map +1 -1
  447. package/packages/pi-tui/package.json +1 -1
  448. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  449. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  450. package/packages/pi-tui/src/tui.ts +6 -0
  451. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  452. package/packages/rpc-client/package.json +1 -1
  453. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  454. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  455. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  456. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  457. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  458. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  459. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  460. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  461. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  462. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  463. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  464. package/pkg/package.json +1 -1
  465. package/src/resources/GSD-WORKFLOW.md +10 -1
  466. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  467. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  468. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  469. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  470. package/src/resources/extensions/cmux/index.ts +6 -0
  471. package/src/resources/extensions/gsd/auto/contracts.ts +59 -16
  472. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  473. package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
  474. package/src/resources/extensions/gsd/auto/loop.ts +121 -14
  475. package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
  476. package/src/resources/extensions/gsd/auto/phases.ts +180 -20
  477. package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
  478. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  479. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  480. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  481. package/src/resources/extensions/gsd/auto-dashboard.ts +301 -183
  482. package/src/resources/extensions/gsd/auto-dispatch.ts +29 -7
  483. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  484. package/src/resources/extensions/gsd/auto-post-unit.ts +273 -140
  485. package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
  486. package/src/resources/extensions/gsd/auto-recovery.ts +36 -209
  487. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  488. package/src/resources/extensions/gsd/auto-start.ts +114 -31
  489. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  490. package/src/resources/extensions/gsd/auto-verification.ts +46 -38
  491. package/src/resources/extensions/gsd/auto-worktree.ts +127 -1
  492. package/src/resources/extensions/gsd/auto.ts +441 -107
  493. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +54 -12
  494. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +9 -8
  495. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +16 -4
  496. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  497. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  498. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  499. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -3
  500. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  501. package/src/resources/extensions/gsd/commands/catalog.ts +4 -1
  502. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -1
  503. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  504. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
  505. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  506. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  507. package/src/resources/extensions/gsd/context-store.ts +120 -1
  508. package/src/resources/extensions/gsd/crash-recovery.ts +30 -4
  509. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  510. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  511. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
  512. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  513. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  514. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  515. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  516. package/src/resources/extensions/gsd/doctor.ts +2 -27
  517. package/src/resources/extensions/gsd/export-html.ts +27 -427
  518. package/src/resources/extensions/gsd/git-service.ts +47 -1
  519. package/src/resources/extensions/gsd/gsd-db.ts +10 -23
  520. package/src/resources/extensions/gsd/guided-flow.ts +126 -128
  521. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  522. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  523. package/src/resources/extensions/gsd/health-widget.ts +6 -10
  524. package/src/resources/extensions/gsd/journal.ts +2 -0
  525. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  526. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  527. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  528. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  529. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
  530. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  531. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  532. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  533. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  534. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  535. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  536. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  537. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  538. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  539. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  540. package/src/resources/extensions/gsd/native-git-bridge.ts +68 -25
  541. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  542. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  543. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  544. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  545. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
  546. package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
  547. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  548. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  549. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  550. package/src/resources/extensions/gsd/prompts/discuss-headless.md +28 -10
  551. package/src/resources/extensions/gsd/prompts/discuss.md +29 -11
  552. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  553. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  554. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  555. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  556. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  557. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  558. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  559. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  560. package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
  561. package/src/resources/extensions/gsd/session-lock.ts +41 -0
  562. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  563. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  564. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +344 -0
  565. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +66 -0
  566. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +101 -0
  567. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  568. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  569. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  570. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  571. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  572. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  573. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
  574. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  575. package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
  576. package/src/resources/extensions/gsd/status-guards.ts +5 -0
  577. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  578. package/src/resources/extensions/gsd/templates/plan.md +8 -5
  579. package/src/resources/extensions/gsd/templates/task-plan.md +4 -2
  580. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  581. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +170 -0
  582. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  583. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +783 -176
  584. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +487 -4
  585. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +292 -4
  586. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  587. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +12 -1
  588. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +15 -1
  589. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
  590. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +19 -0
  591. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  592. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  593. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  594. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  595. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  596. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
  597. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  598. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  599. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  600. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  601. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  602. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +43 -2
  603. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
  604. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  605. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  606. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  607. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  608. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +79 -4
  609. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +83 -0
  610. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
  611. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
  612. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  613. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  614. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  615. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  616. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  617. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  618. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  619. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  620. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  621. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +17 -7
  622. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  623. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  624. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  625. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  626. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  627. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  628. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +129 -1
  629. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  630. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
  631. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  632. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  633. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  634. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
  635. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  636. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  637. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  638. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  639. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
  640. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  641. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
  642. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  643. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  644. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  645. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  646. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
  647. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  648. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  649. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
  650. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  651. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  652. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  653. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  654. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  655. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  656. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  657. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +225 -1
  658. package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
  659. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +81 -3
  660. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
  661. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  662. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
  663. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
  664. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
  665. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  666. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +20 -1
  667. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  668. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +46 -2
  669. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
  670. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
  671. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  672. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +34 -0
  673. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  674. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  675. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +71 -58
  676. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1048 -0
  677. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  678. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  679. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
  680. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
  681. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  682. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +86 -7
  683. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
  684. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  685. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  686. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +7 -1
  687. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  688. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  689. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  690. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +211 -59
  691. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +597 -118
  692. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  693. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +72 -0
  694. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  695. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  696. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  697. package/src/resources/extensions/gsd/tools/plan-slice.ts +98 -12
  698. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  699. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  700. package/src/resources/extensions/gsd/types.ts +1 -1
  701. package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
  702. package/src/resources/extensions/gsd/validation.ts +23 -1
  703. package/src/resources/extensions/gsd/verification-gate.ts +78 -6
  704. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  705. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  706. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  707. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  708. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  709. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  710. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1196 -518
  711. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  712. package/src/resources/extensions/shared/html-shell.ts +412 -0
  713. package/src/resources/extensions/subagent/index.ts +567 -103
  714. package/src/resources/extensions/subagent/launch.ts +131 -0
  715. package/src/resources/extensions/subagent/run-store.ts +218 -0
  716. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  717. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  718. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  719. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  720. package/src/resources/extensions/visual-brief/index.ts +8 -0
  721. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  722. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  723. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  724. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  725. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  726. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  727. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  728. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  729. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  730. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  731. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  732. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  733. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  734. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  735. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  736. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  737. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  738. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
  739. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → xRy4LqKSNKdT7y6ATYyEl}/_buildManifest.js +0 -0
  740. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → xRy4LqKSNKdT7y6ATYyEl}/_ssgManifest.js +0 -0
@@ -806,14 +806,22 @@ export async function inlineDecisionsFromDb(
806
806
  try {
807
807
  const { isDbAvailable } = await import("./gsd-db.js");
808
808
  if (isDbAvailable()) {
809
- const { queryDecisions, formatDecisionsForPrompt } = await import("./context-store.js");
809
+ // ADR-013 Phase 6 cutover (Stage 1): read decisions from the `memories`
810
+ // table. Both `queryDecisions` (legacy) and `queryDecisionsFromMemories`
811
+ // return identical Decision[] for active rows once Phase 5 dual-write is
812
+ // caught up. Switching the read here lets the destructive Phase 6 step
813
+ // (#5755) retire the legacy `decisions` table without changing prompt
814
+ // contents. Projection regen (`DECISIONS.md`) still sources from the
815
+ // legacy table — that switch lands separately to handle superseded
816
+ // history cleanly.
817
+ const { queryDecisionsFromMemories, formatDecisionsForPrompt } = await import("./context-store.js");
810
818
 
811
819
  // First query: try with both milestoneId and scope (if scope provided)
812
- let decisions = queryDecisions({ milestoneId, scope });
820
+ let decisions = queryDecisionsFromMemories({ milestoneId, scope });
813
821
 
814
822
  // Cascade: if empty AND scope was provided, retry without scope
815
823
  if (decisions.length === 0 && scope) {
816
- decisions = queryDecisions({ milestoneId });
824
+ decisions = queryDecisionsFromMemories({ milestoneId });
817
825
  }
818
826
 
819
827
  if (decisions.length > 0) {
@@ -3189,7 +3197,7 @@ export async function buildParallelResearchSlicesPrompt(
3189
3197
  subagentSections.push([
3190
3198
  `### ${slice.id}: ${slice.title}`,
3191
3199
  "",
3192
- `Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`gsd-executor\` or the default agent):`,
3200
+ `Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`scout\`):`,
3193
3201
  "",
3194
3202
  "```",
3195
3203
  slicePrompt,
@@ -3271,7 +3279,7 @@ export async function buildGateEvaluatePrompt(
3271
3279
  subagentSections.push([
3272
3280
  `### ${def.id}: ${def.question}`,
3273
3281
  "",
3274
- `Use this as the prompt for a \`subagent\` call${modelSuffix}:`,
3282
+ `Use this as the prompt for a \`subagent\` call${modelSuffix} (agent: \`tester\`):`,
3275
3283
  "",
3276
3284
  "```",
3277
3285
  subPrompt,
@@ -7,7 +7,6 @@
7
7
  * globals or AutoContext dependency.
8
8
  */
9
9
 
10
- import type { ExtensionContext } from "@gsd/pi-coding-agent";
11
10
  import { parseUnitId } from "./unit-id.js";
12
11
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
13
12
  import { appendEvent } from "./workflow-events.js";
@@ -20,15 +19,6 @@ import { getErrorMessage } from "./error-utils.js";
20
19
  import { logWarning, logError } from "./workflow-logger.js";
21
20
  import { readIntegrationBranch } from "./git-service.js";
22
21
  import { isClosedStatus } from "./status-guards.js";
23
- import {
24
- nativeConflictFiles,
25
- nativeCommit,
26
- nativeCheckoutTheirs,
27
- nativeAddPaths,
28
- nativeMergeAbort,
29
- nativeRebaseAbort,
30
- nativeResetHard,
31
- } from "./native-git-bridge.js";
32
22
  import {
33
23
  resolveSlicePath,
34
24
  resolveSliceFile,
@@ -46,7 +36,6 @@ import {
46
36
  mkdirSync,
47
37
  readFileSync,
48
38
  writeFileSync,
49
- unlinkSync,
50
39
  } from "node:fs";
51
40
  import { execFileSync } from "node:child_process";
52
41
  import { dirname, join } from "node:path";
@@ -57,6 +46,7 @@ import {
57
46
  import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
58
47
  import { validateArtifact } from "./schemas/validate.js";
59
48
  import { getProjectResearchStatus } from "./project-research-policy.js";
49
+ import { isGsdWorktreePath } from "./worktree-root.js";
60
50
 
61
51
  // Re-export so existing consumers of auto-recovery.ts keep working.
62
52
  export { resolveExpectedArtifactPath, diagnoseExpectedArtifact };
@@ -67,6 +57,29 @@ export {
67
57
 
68
58
  // ─── Artifact Resolution & Verification ───────────────────────────────────────
69
59
 
60
+ export function diagnoseWorktreeIntegrityFailure(basePath: string): string | null {
61
+ if (!isGsdWorktreePath(basePath)) return null;
62
+ if (!existsSync(basePath)) {
63
+ return `Worktree integrity failure: ${basePath} does not exist. Repair or recreate the worktree before retrying.`;
64
+ }
65
+
66
+ const gitPath = join(basePath, ".git");
67
+ if (!existsSync(gitPath)) {
68
+ return `Worktree integrity failure: ${basePath} is not a valid git worktree (.git missing). Repair or recreate the worktree before retrying.`;
69
+ }
70
+
71
+ try {
72
+ execFileSync("git", ["rev-parse", "--git-dir"], {
73
+ cwd: basePath,
74
+ stdio: ["ignore", "pipe", "pipe"],
75
+ encoding: "utf-8",
76
+ });
77
+ return null;
78
+ } catch (err) {
79
+ return `Worktree integrity failure: ${basePath} is not a valid git worktree (git rev-parse failed: ${getErrorMessage(err).split("\n")[0]}). Repair or recreate the worktree before retrying.`;
80
+ }
81
+ }
82
+
70
83
  export type ArtifactRecoveryDbRefreshResult =
71
84
  | { ok: true }
72
85
  | { ok: false; fatal: boolean; message: string; reason: string };
@@ -763,6 +776,11 @@ export function verifyExpectedArtifact(
763
776
  return false;
764
777
  }
765
778
  if (!existsSync(absPath)) {
779
+ const worktreeFailure = diagnoseWorktreeIntegrityFailure(base);
780
+ if (worktreeFailure) {
781
+ logError("recovery", `${worktreeFailure} Unit: ${unitType} ${unitId}.`);
782
+ return false;
783
+ }
766
784
  logWarning("recovery", `verify-fail ${unitType} ${unitId}: existsSync false for ${absPath}`);
767
785
  return false;
768
786
  }
@@ -1001,205 +1019,14 @@ export function writeBlockerPlaceholder(
1001
1019
  }
1002
1020
 
1003
1021
  // ─── Merge State Reconciliation ───────────────────────────────────────────────
1022
+ // Body relocated to state-reconciliation/drift/merge-state.ts (ADR-017 #5701).
1023
+ // Re-exported here for backward compatibility with existing call sites:
1024
+ // auto.ts, auto/loop-deps.ts, tests/integration/auto-recovery.test.ts.
1004
1025
 
1005
- /**
1006
- * Best-effort abort of a pending merge/squash and hard-reset to HEAD.
1007
- * Handles both real merges (MERGE_HEAD) and squash merges (SQUASH_MSG).
1008
- */
1009
- function abortAndResetMerge(
1010
- basePath: string,
1011
- hasMergeHead: boolean,
1012
- squashMsgPath: string,
1013
- ): void {
1014
- if (hasMergeHead) {
1015
- try {
1016
- nativeMergeAbort(basePath);
1017
- } catch (err) {
1018
- /* best-effort */
1019
- logWarning("recovery", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
1020
- }
1021
- } else if (squashMsgPath) {
1022
- try {
1023
- unlinkSync(squashMsgPath);
1024
- } catch (err) {
1025
- /* best-effort */
1026
- logWarning("recovery", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
1027
- }
1028
- }
1029
- try {
1030
- nativeResetHard(basePath);
1031
- } catch (err) {
1032
- /* best-effort */
1033
- logError("recovery", `git reset failed: ${err instanceof Error ? err.message : String(err)}`);
1034
- }
1035
- }
1036
-
1037
- export type MergeReconcileResult = "clean" | "reconciled" | "blocked";
1038
-
1039
- /**
1040
- * Detect and abort other in-progress git operations left behind by a SIGKILL'd
1041
- * worker (rebase, cherry-pick, revert). Without this, a killed worker mid-rebase
1042
- * leaves `.git/rebase-merge/` or `.git/CHERRY_PICK_HEAD` and the worktree is
1043
- * wedged until the user manually runs the matching `--abort`.
1044
- *
1045
- * Called before merge-state reconciliation because these states block any
1046
- * subsequent merge/commit operation. (Issue #4980 HIGH-7)
1047
- */
1048
- function reconcileOtherInProgressGitOps(
1049
- basePath: string,
1050
- ctx: ExtensionContext,
1051
- ): "clean" | "reconciled" | "blocked" {
1052
- const gitDir = join(basePath, ".git");
1053
- const states: Array<{
1054
- label: string;
1055
- indicators: string[];
1056
- abort: () => void;
1057
- }> = [
1058
- {
1059
- label: "rebase",
1060
- indicators: [join(gitDir, "rebase-merge"), join(gitDir, "rebase-apply")],
1061
- abort: () => nativeRebaseAbort(basePath),
1062
- },
1063
- {
1064
- label: "cherry-pick",
1065
- indicators: [join(gitDir, "CHERRY_PICK_HEAD")],
1066
- abort: () => {
1067
- // No native helper; fall back to git CLI.
1068
- try {
1069
- execFileSync("git", ["cherry-pick", "--abort"], {
1070
- cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8",
1071
- });
1072
- } catch (err) { logWarning("recovery", `cherry-pick --abort failed: ${getErrorMessage(err)}`); }
1073
- },
1074
- },
1075
- {
1076
- label: "revert",
1077
- indicators: [join(gitDir, "REVERT_HEAD")],
1078
- abort: () => {
1079
- try {
1080
- execFileSync("git", ["revert", "--abort"], {
1081
- cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8",
1082
- });
1083
- } catch (err) { logWarning("recovery", `revert --abort failed: ${getErrorMessage(err)}`); }
1084
- },
1085
- },
1086
- ];
1087
-
1088
- let reconciled = false;
1089
- for (const s of states) {
1090
- const present = s.indicators.some((p) => existsSync(p));
1091
- if (!present) continue;
1092
- try {
1093
- s.abort();
1094
- ctx.ui.notify(
1095
- `Detected leftover ${s.label} state from prior session — aborted.`,
1096
- "warning",
1097
- );
1098
- reconciled = true;
1099
- } catch (err) {
1100
- logError("recovery", `${s.label} abort failed: ${getErrorMessage(err)}`);
1101
- ctx.ui.notify(
1102
- `Detected leftover ${s.label} state but auto-abort failed. ` +
1103
- `Run \`git ${s.label} --abort\` manually before retrying.`,
1104
- "error",
1105
- );
1106
- return "blocked";
1107
- }
1108
- }
1109
- return reconciled ? "reconciled" : "clean";
1110
- }
1111
-
1112
- /**
1113
- * Detect leftover merge state from a prior session and reconcile it.
1114
- * If MERGE_HEAD or SQUASH_MSG exists, check whether conflicts are resolved.
1115
- * If resolved: finalize the commit. If only .gsd conflicts remain: auto-resolve.
1116
- * If code conflicts remain: fail safe without modifying the worktree.
1117
- */
1118
- export function reconcileMergeState(
1119
- basePath: string,
1120
- ctx: ExtensionContext,
1121
- ): MergeReconcileResult {
1122
- // First, abort any rebase/cherry-pick/revert left over from a SIGKILL'd
1123
- // worker. Doing this before the merge-state check unblocks any merge that
1124
- // would otherwise refuse with "you have unfinished operation". (HIGH-7)
1125
- const otherOpsResult = reconcileOtherInProgressGitOps(basePath, ctx);
1126
- if (otherOpsResult === "blocked") return "blocked";
1127
-
1128
- const mergeHeadPath = join(basePath, ".git", "MERGE_HEAD");
1129
- const squashMsgPath = join(basePath, ".git", "SQUASH_MSG");
1130
- const hasMergeHead = existsSync(mergeHeadPath);
1131
- const hasSquashMsg = existsSync(squashMsgPath);
1132
- if (!hasMergeHead && !hasSquashMsg) {
1133
- // If we cleaned up another op type, return "reconciled" so the caller
1134
- // re-derives state from a known-good baseline.
1135
- return otherOpsResult === "reconciled" ? "reconciled" : "clean";
1136
- }
1137
-
1138
- const conflictedFiles = nativeConflictFiles(basePath);
1139
- if (conflictedFiles.length === 0) {
1140
- // All conflicts resolved — finalize the merge/squash commit
1141
- try {
1142
- const commitSha = nativeCommit(basePath, "chore(gsd): reconcile merge state");
1143
- if (commitSha) {
1144
- const mode = hasMergeHead ? "merge" : "squash commit";
1145
- ctx.ui.notify(`Finalized leftover ${mode} from prior session.`, "info");
1146
- } else {
1147
- ctx.ui.notify("No new commit needed for leftover merge/squash state — already committed.", "info");
1148
- }
1149
- } catch (err) {
1150
- const errorMessage = getErrorMessage(err);
1151
- ctx.ui.notify(`Failed to finalize leftover merge/squash commit: ${errorMessage}`, "error");
1152
- return "blocked";
1153
- }
1154
- } else {
1155
- // Still conflicted — try auto-resolving .gsd/ state file conflicts (#530)
1156
- const gsdConflicts = conflictedFiles.filter((f) => f.startsWith(".gsd/"));
1157
- const codeConflicts = conflictedFiles.filter((f) => !f.startsWith(".gsd/"));
1158
-
1159
- if (gsdConflicts.length > 0 && codeConflicts.length === 0) {
1160
- // All conflicts are in .gsd/ state files — auto-resolve by accepting theirs
1161
- let resolved = true;
1162
- try {
1163
- nativeCheckoutTheirs(basePath, gsdConflicts);
1164
- nativeAddPaths(basePath, gsdConflicts);
1165
- } catch (e) {
1166
- logError("recovery", `auto-resolve .gsd/ conflicts failed: ${(e as Error).message}`);
1167
- resolved = false;
1168
- }
1169
- if (resolved) {
1170
- try {
1171
- nativeCommit(
1172
- basePath,
1173
- "chore: auto-resolve .gsd/ state file conflicts",
1174
- );
1175
- ctx.ui.notify(
1176
- `Auto-resolved ${gsdConflicts.length} .gsd/ state file conflict(s) from prior merge.`,
1177
- "info",
1178
- );
1179
- } catch (e) {
1180
- logError("recovery", `auto-commit .gsd/ conflict resolution failed: ${(e as Error).message}`);
1181
- resolved = false;
1182
- }
1183
- }
1184
- if (!resolved) {
1185
- abortAndResetMerge(basePath, hasMergeHead, squashMsgPath);
1186
- ctx.ui.notify(
1187
- "Detected leftover merge state — auto-resolve failed, cleaned up. Re-deriving state.",
1188
- "warning",
1189
- );
1190
- }
1191
- } else {
1192
- // Code conflicts present — fail safe and preserve any manual resolution
1193
- // work instead of discarding it with merge --abort/reset --hard.
1194
- ctx.ui.notify(
1195
- "Detected leftover merge state with unresolved code conflicts. Auto-mode will pause without modifying the worktree so manual conflict resolution is preserved.",
1196
- "error",
1197
- );
1198
- return "blocked";
1199
- }
1200
- }
1201
- return "reconciled";
1202
- }
1026
+ export {
1027
+ reconcileMergeState,
1028
+ type MergeReconcileResult,
1029
+ } from "./state-reconciliation/drift/merge-state.js";
1203
1030
 
1204
1031
  // ─── Loop Remediation ─────────────────────────────────────────────────────────
1205
1032
 
@@ -56,3 +56,8 @@ export function recordToolInvocationError(toolName: string, errorMsg: string): v
56
56
  autoSession.lastToolInvocationError = `${toolName}: ${errorMsg}`;
57
57
  }
58
58
  }
59
+
60
+ export function clearToolInvocationError(): void {
61
+ if (!autoSession.active) return;
62
+ autoSession.lastToolInvocationError = null;
63
+ }
@@ -44,6 +44,7 @@ import {
44
44
  nativeDetectMainBranch,
45
45
  nativeCheckoutBranch,
46
46
  nativeBranchList,
47
+ nativeBranchExists,
47
48
  nativeBranchListMerged,
48
49
  nativeBranchDelete,
49
50
  nativeWorktreeRemove,
@@ -64,7 +65,7 @@ import { initRoutingHistory } from "./routing-history.js";
64
65
  import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
65
66
  import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
66
67
  import { snapshotSkills } from "./skill-discovery.js";
67
- import { isDbAvailable, getMilestone, openDatabase, getDbStatus } from "./gsd-db.js";
68
+ import { isDbAvailable, getMilestone, getAllMilestones, openDatabase, getDbStatus } from "./gsd-db.js";
68
69
  import { isClosedStatus } from "./status-guards.js";
69
70
  import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
70
71
  import { auditOrphanedPreflightStashes } from "./orphan-stash-audit.js";
@@ -101,6 +102,7 @@ import { getSessionModelOverride } from "./session-model-override.js";
101
102
  export interface BootstrapDeps {
102
103
  shouldUseWorktreeIsolation: (basePath?: string) => boolean;
103
104
  registerSigtermHandler: (basePath: string) => void;
105
+ registerAutoWorkerForSession: (basePath: string) => void;
104
106
  lockBase: () => string;
105
107
  buildLifecycle: () => WorktreeLifecycle;
106
108
  }
@@ -202,9 +204,15 @@ export function decideSurvivorAction(
202
204
  export function auditOrphanedMilestoneBranches(
203
205
  basePath: string,
204
206
  isolationMode: "worktree" | "branch" | "none",
207
+ gitDeps: {
208
+ branchList?: typeof nativeBranchList;
209
+ branchExists?: typeof nativeBranchExists;
210
+ } = {},
205
211
  ): { recovered: string[]; warnings: string[] } {
206
212
  const recovered: string[] = [];
207
213
  const warnings: string[] = [];
214
+ const branchList = gitDeps.branchList ?? nativeBranchList;
215
+ const branchExists = gitDeps.branchExists ?? nativeBranchExists;
208
216
 
209
217
  // Skip in none mode — no milestone branches are created
210
218
  if (isolationMode === "none") return { recovered, warnings };
@@ -213,15 +221,16 @@ export function auditOrphanedMilestoneBranches(
213
221
  if (!isDbAvailable()) return { recovered, warnings };
214
222
 
215
223
  let milestoneBranches: string[];
224
+ let milestoneBranchListAvailable = true;
216
225
  try {
217
- milestoneBranches = nativeBranchList(basePath, "milestone/*");
226
+ milestoneBranches = branchList(basePath, "milestone/*");
218
227
  } catch {
219
- // git branch list failed — skip audit
220
- return { recovered, warnings };
228
+ milestoneBranchListAvailable = false;
229
+ // git branch list failed — fall through with an empty branch set so the
230
+ // branch-less orphan pass can still run after per-milestone verification.
231
+ milestoneBranches = [];
221
232
  }
222
233
 
223
- if (milestoneBranches.length === 0) return { recovered, warnings };
224
-
225
234
  // Detect main branch for merge-check
226
235
  let mainBranch: string;
227
236
  try {
@@ -354,6 +363,74 @@ export function auditOrphanedMilestoneBranches(
354
363
  }
355
364
  }
356
365
 
366
+ // Second pass (#5879): catch worktree directories stranded by a previous
367
+ // audit that deleted the milestone/* branch but failed to remove the
368
+ // directory (or the dir was orphaned by a separate path entirely, e.g.
369
+ // postflight-stash-restore-failed during closeout). The branch-keyed loop
370
+ // above is invisible to these cases — `nativeBranchList` returns nothing
371
+ // for the milestone, so the dir-cleanup block at line ~310 is never
372
+ // reached.
373
+ //
374
+ // Keyed on milestones whose DB status is `complete`. We do not iterate
375
+ // over arbitrary directories under .gsd/worktrees/ to avoid touching
376
+ // dirs that belong to an in-progress milestone whose branch was deleted
377
+ // separately — those are handled by the in-progress orphan path above
378
+ // when the branch is present, and by `/gsd doctor` when it is not.
379
+ const seenMilestoneIds = new Set(
380
+ milestoneBranches.map((branch) => branch.replace(/^milestone\//, "")),
381
+ );
382
+ let completedMilestones: readonly { id: string; status: string }[] = [];
383
+ try {
384
+ completedMilestones = getAllMilestones();
385
+ } catch {
386
+ // DB read failure — skip the second pass; the first pass is still useful.
387
+ completedMilestones = [];
388
+ }
389
+ for (const m of completedMilestones) {
390
+ if (m.status !== "complete") continue;
391
+ if (seenMilestoneIds.has(m.id)) continue; // already processed in the branch loop
392
+ if (!milestoneBranchListAvailable) {
393
+ try {
394
+ if (branchExists(basePath, `milestone/${m.id}`)) continue;
395
+ } catch (err) {
396
+ warnings.push(
397
+ `Could not verify whether milestone/${m.id} still exists; skipping branch-less worktree cleanup for safety: ${err instanceof Error ? err.message : String(err)}`,
398
+ );
399
+ continue;
400
+ }
401
+ }
402
+ const wtDir = getWorktreeDir(basePath, m.id);
403
+ if (!existsSync(wtDir)) continue;
404
+ if (!isInsideWorktreesDir(basePath, wtDir)) {
405
+ warnings.push(
406
+ `Orphaned worktree directory for ${m.id} is outside .gsd/worktrees/ — skipping removal for safety.`,
407
+ );
408
+ continue;
409
+ }
410
+ // Try `git worktree remove` first in case the dir is still registered
411
+ // (defensive — usually it is not when we reach this branch-less pass).
412
+ try {
413
+ nativeWorktreeRemove(basePath, wtDir, true);
414
+ } catch (e) {
415
+ logWarning(
416
+ "engine",
417
+ `worktree remove failed (expected for branch-less orphans): ${e instanceof Error ? e.message : String(e)}`,
418
+ );
419
+ }
420
+ if (existsSync(wtDir)) {
421
+ try {
422
+ rmSync(wtDir, { recursive: true, force: true });
423
+ recovered.push(`Removed orphaned worktree directory for ${m.id} (branch already deleted).`);
424
+ } catch (err) {
425
+ warnings.push(
426
+ `Failed to remove orphaned worktree directory for ${m.id}: ${err instanceof Error ? err.message : String(err)}`,
427
+ );
428
+ }
429
+ } else {
430
+ recovered.push(`Removed orphaned worktree directory for ${m.id} (branch already deleted).`);
431
+ }
432
+ }
433
+
357
434
  return { recovered, warnings };
358
435
  }
359
436
 
@@ -533,6 +610,7 @@ export async function bootstrapAutoSession(
533
610
  const {
534
611
  shouldUseWorktreeIsolation,
535
612
  registerSigtermHandler,
613
+ registerAutoWorkerForSession,
536
614
  lockBase,
537
615
  buildLifecycle,
538
616
  } = deps;
@@ -722,6 +800,7 @@ export async function bootstrapAutoSession(
722
800
  // consult DB status and avoid clearing runtime units for milestones that
723
801
  // only have a failure-path SUMMARY on disk (#4663).
724
802
  await openProjectDbIfPresent(base);
803
+ registerAutoWorkerForSession(base);
725
804
 
726
805
  // Clean stale runtime unit files for completed milestones (#887).
727
806
  // DB-authoritative: when DB is available, require DB status to be closed
@@ -818,14 +897,18 @@ export async function bootstrapAutoSession(
818
897
  // worktree cleanup) was never run — the survivor branch must be merged.
819
898
  // Applies to both worktree and branch isolation modes.
820
899
  let hasSurvivorBranch = false;
900
+ let survivorMilestoneId = state.activeMilestone?.id ?? null;
901
+ if (!survivorMilestoneId && state.phase === "complete") {
902
+ survivorMilestoneId = findUnmergedCompletedMilestone(base, getIsolationMode(base));
903
+ }
821
904
  if (
822
- state.activeMilestone &&
905
+ survivorMilestoneId &&
823
906
  (state.phase === "pre-planning" || state.phase === "complete") &&
824
907
  getIsolationMode(base) !== "none" &&
825
908
  !detectWorktreeName(base) &&
826
909
  !base.includes(`${pathSep}.gsd${pathSep}worktrees${pathSep}`)
827
910
  ) {
828
- const milestoneBranch = `milestone/${state.activeMilestone.id}`;
911
+ const milestoneBranch = `milestone/${survivorMilestoneId}`;
829
912
  const { nativeBranchExists } = await import("./native-git-bridge.js");
830
913
  hasSurvivorBranch = nativeBranchExists(base, milestoneBranch);
831
914
  if (hasSurvivorBranch) {
@@ -869,7 +952,7 @@ export async function bootstrapAutoSession(
869
952
  // Re-evaluate via the helper — the discuss branch above may have cleared
870
953
  // hasSurvivorBranch after a successful promotion.
871
954
  if (decideSurvivorAction(hasSurvivorBranch, state.phase) === "finalize") {
872
- const mid = state.activeMilestone!.id;
955
+ const mid = survivorMilestoneId!;
873
956
  // Commit 68ef58a3c made `_mergeBranchMode` throw on wrong-branch
874
957
  // instead of returning false silently. Wrap the call so the throw is
875
958
  // converted into an error notify + clean bootstrap abort, not an
@@ -904,29 +987,24 @@ export async function bootstrapAutoSession(
904
987
  {
905
988
  const orphan = findUnmergedCompletedMilestone(base, getIsolationMode(base));
906
989
  if (orphan && orphan !== state.activeMilestone?.id) {
907
- const priorBasePath = s.basePath;
908
- const priorOriginalBasePath = s.originalBasePath;
909
- s.originalBasePath = base;
910
- s.basePath = getAutoWorktreePath(base, orphan) ?? base;
911
- const result = _mergeOrphanCompletedMilestone(buildLifecycle(), orphan, ctx.ui);
990
+ // ADR-016 phase 2 / B4 (#5622): the swap-run-revert protocol for
991
+ // the orphan-merge dance is owned by `adoptOrphanWorktree`. The
992
+ // verb snapshots prior `s.basePath` / `s.originalBasePath`, swaps
993
+ // into the orphan worktree, runs the merge callback under the
994
+ // swap, and reverts (or holds the swap) based on the result.
995
+ // Callers can no longer forget the revert step on failure — the
996
+ // pattern that originally motivated this verb.
997
+ const lifecycle = buildLifecycle();
998
+ const result = lifecycle.adoptOrphanWorktree(orphan, base, () =>
999
+ _mergeOrphanCompletedMilestone(lifecycle, orphan, ctx.ui),
1000
+ );
912
1001
  if (!result.merged) {
913
- s.basePath = base;
914
- s.originalBasePath = base;
915
- try {
916
- process.chdir(base);
917
- } catch (err) {
918
- logWarning("bootstrap", `could not restore cwd after orphan merge failure: ${err instanceof Error ? err.message : String(err)}`);
919
- }
1002
+ // Verb already restored basePath/originalBasePath to `base` and
1003
+ // chdir'd there. Return early.
920
1004
  return releaseLockAndReturn();
921
1005
  }
922
- if (!s.active) {
923
- s.basePath = priorBasePath || base;
924
- s.originalBasePath = priorOriginalBasePath || base;
925
- }
926
- if (result.merged) {
927
- invalidateAllCaches();
928
- state = await deriveState(base);
929
- }
1006
+ invalidateAllCaches();
1007
+ state = await deriveState(base);
930
1008
  }
931
1009
  }
932
1010
 
@@ -1040,7 +1118,10 @@ export async function bootstrapAutoSession(
1040
1118
  s.stepMode = requestedStepMode;
1041
1119
  s.verbose = verboseMode;
1042
1120
  s.cmdCtx = ctx;
1043
- s.basePath = base;
1121
+ // ADR-016 phase 2 / B2 (#5620): single owner of bootstrap basePath
1122
+ // mutation. Sets s.basePath = base and s.originalBasePath = base
1123
+ // (originalBasePath is empty on a fresh bootstrap).
1124
+ buildLifecycle().adoptSessionRoot(base);
1044
1125
  s.unitDispatchCount.clear();
1045
1126
  s.unitRecoveryCount.clear();
1046
1127
  s.lastBudgetAlertLevel = 0;
@@ -1098,7 +1179,9 @@ export async function bootstrapAutoSession(
1098
1179
  }
1099
1180
 
1100
1181
  // ── Auto-worktree setup ──
1101
- s.originalBasePath = base;
1182
+ // s.originalBasePath was set to `base` by `adoptSessionRoot(base)` above
1183
+ // (ADR-016 phase 2 / B2, #5620). The redundant assignment that used to
1184
+ // live here is gone.
1102
1185
 
1103
1186
  const isUnderGsdWorktrees = (p: string): boolean => {
1104
1187
  // Direct layout: /.gsd/worktrees/
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Auto-mode unit closeout metrics, activity capture, and ghost-run detection.
3
+
1
4
  /**
2
5
  * Unit closeout helper — consolidates the repeated pattern of
3
6
  * snapshotting metrics + saving activity log + extracting memories
@@ -24,6 +27,54 @@ export interface CloseoutOptions {
24
27
  gitError?: string;
25
28
  }
26
29
 
30
+ export interface UnitActivitySnapshot {
31
+ elapsedMs: number;
32
+ toolCalls: number;
33
+ assistantMessages: number;
34
+ }
35
+
36
+ export const GHOST_COMPLETION_MAX_ELAPSED_MS = 500;
37
+
38
+ export function snapshotUnitActivity(
39
+ ctx: ExtensionContext,
40
+ startedAt: number,
41
+ now = Date.now(),
42
+ ): UnitActivitySnapshot {
43
+ let toolCalls = 0;
44
+ let assistantMessages = 0;
45
+ const entries = ctx.sessionManager.getEntries() ?? [];
46
+
47
+ for (const entry of entries) {
48
+ if (entry.type !== "message") continue;
49
+ const msg = (entry as any).message;
50
+ if (!msg || msg.role !== "assistant") continue;
51
+ assistantMessages++;
52
+ if (!Array.isArray(msg.content)) continue;
53
+ for (const block of msg.content) {
54
+ if (block?.type === "toolCall") toolCalls++;
55
+ }
56
+ }
57
+
58
+ return {
59
+ elapsedMs: Math.max(0, now - startedAt),
60
+ toolCalls,
61
+ assistantMessages,
62
+ };
63
+ }
64
+
65
+ export function isSuspiciousGhostCompletion(
66
+ ctx: ExtensionContext,
67
+ startedAt: number,
68
+ maxElapsedMs = GHOST_COMPLETION_MAX_ELAPSED_MS,
69
+ ): boolean {
70
+ const activity = snapshotUnitActivity(ctx, startedAt);
71
+ return (
72
+ activity.elapsedMs < maxElapsedMs &&
73
+ activity.toolCalls === 0 &&
74
+ activity.assistantMessages === 0
75
+ );
76
+ }
77
+
27
78
  /**
28
79
  * Snapshot metrics, save activity log, and fire-and-forget memory extraction
29
80
  * for a completed unit. Returns the activity log file path (if any).