gsd-pi 2.81.0 → 2.82.0-dev.ed17d078d

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 (503) hide show
  1. package/README.md +60 -30
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  4. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  5. package/dist/resources/extensions/gsd/auto/loop.js +111 -8
  6. package/dist/resources/extensions/gsd/auto/orchestrator.js +113 -6
  7. package/dist/resources/extensions/gsd/auto/phases.js +199 -97
  8. package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
  9. package/dist/resources/extensions/gsd/auto/session.js +9 -0
  10. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
  11. package/dist/resources/extensions/gsd/auto-dashboard.js +182 -178
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +14 -11
  13. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -1
  14. package/dist/resources/extensions/gsd/auto-prompts.js +11 -3
  15. package/dist/resources/extensions/gsd/auto-recovery.js +6 -181
  16. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  17. package/dist/resources/extensions/gsd/auto-start.js +20 -23
  18. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  19. package/dist/resources/extensions/gsd/auto-verification.js +12 -6
  20. package/dist/resources/extensions/gsd/auto-worktree.js +8 -0
  21. package/dist/resources/extensions/gsd/auto.js +386 -106
  22. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +13 -6
  23. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +13 -2
  24. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  25. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  26. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -1
  27. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  28. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
  29. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  30. package/dist/resources/extensions/gsd/context-store.js +112 -0
  31. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  32. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  33. package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
  34. package/dist/resources/extensions/gsd/git-service.js +2 -1
  35. package/dist/resources/extensions/gsd/gsd-db.js +7 -23
  36. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  37. package/dist/resources/extensions/gsd/health-widget.js +4 -10
  38. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  39. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  40. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  41. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  42. package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
  43. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  44. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  45. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  46. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  47. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  48. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  49. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  50. package/dist/resources/extensions/gsd/native-git-bridge.js +14 -14
  51. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  52. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  53. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  54. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  55. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  56. package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
  57. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  58. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  59. package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
  60. package/dist/resources/extensions/gsd/session-lock.js +40 -0
  61. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
  62. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +247 -0
  63. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +50 -0
  64. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +87 -0
  65. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
  66. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
  67. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
  68. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
  69. package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
  70. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
  71. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
  72. package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
  73. package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
  74. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  75. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  76. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  77. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  78. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  79. package/dist/resources/extensions/gsd/worktree-lifecycle.js +722 -316
  80. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  81. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  82. package/dist/web/standalone/.next/BUILD_ID +1 -1
  83. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  84. package/dist/web/standalone/.next/build-manifest.json +3 -3
  85. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  86. package/dist/web/standalone/.next/required-server-files.json +3 -3
  87. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  88. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  98. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  126. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  146. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  162. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/index.html +1 -1
  192. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  193. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  194. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  195. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  197. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/page.js +2 -2
  199. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  201. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  202. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  203. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/middleware.js +2 -2
  205. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  207. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  208. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  209. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  210. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  211. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  215. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  216. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  217. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  218. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  219. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  220. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  221. package/dist/web/standalone/server.js +1 -1
  222. package/dist/welcome-screen.d.ts +0 -7
  223. package/dist/welcome-screen.js +60 -69
  224. package/package.json +3 -2
  225. package/packages/daemon/package.json +2 -2
  226. package/packages/mcp-server/README.md +2 -0
  227. package/packages/mcp-server/package.json +2 -2
  228. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  229. package/packages/native/package.json +1 -1
  230. package/packages/pi-agent-core/package.json +1 -1
  231. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  232. package/packages/pi-ai/dist/index.d.ts +2 -2
  233. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  234. package/packages/pi-ai/dist/index.js +1 -1
  235. package/packages/pi-ai/dist/index.js.map +1 -1
  236. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  237. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  239. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  240. package/packages/pi-ai/package.json +1 -1
  241. package/packages/pi-ai/src/index.ts +7 -2
  242. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  243. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  244. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  245. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  250. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
  251. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  253. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  255. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  256. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  257. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  268. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  296. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  298. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  301. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  303. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  305. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  306. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  307. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  308. package/packages/pi-coding-agent/package.json +1 -1
  309. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  310. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  311. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
  312. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  313. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  314. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  315. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  316. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  317. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  318. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
  319. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
  320. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  321. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  322. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  323. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  324. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  325. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  326. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  327. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  328. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  329. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  330. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  331. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  332. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  333. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  334. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  335. package/packages/pi-tui/dist/tui.js +5 -0
  336. package/packages/pi-tui/dist/tui.js.map +1 -1
  337. package/packages/pi-tui/package.json +1 -1
  338. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  339. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  340. package/packages/pi-tui/src/tui.ts +6 -0
  341. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  342. package/packages/rpc-client/package.json +1 -1
  343. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  344. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  345. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  346. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  347. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  348. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  349. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  350. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  351. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  352. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  353. package/pkg/package.json +1 -1
  354. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  355. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  356. package/src/resources/extensions/gsd/auto/contracts.ts +46 -11
  357. package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
  358. package/src/resources/extensions/gsd/auto/loop.ts +113 -9
  359. package/src/resources/extensions/gsd/auto/orchestrator.ts +118 -6
  360. package/src/resources/extensions/gsd/auto/phases.ts +158 -19
  361. package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
  362. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  363. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  364. package/src/resources/extensions/gsd/auto-dashboard.ts +230 -183
  365. package/src/resources/extensions/gsd/auto-dispatch.ts +15 -1
  366. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -1
  367. package/src/resources/extensions/gsd/auto-prompts.ts +11 -3
  368. package/src/resources/extensions/gsd/auto-recovery.ts +7 -209
  369. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  370. package/src/resources/extensions/gsd/auto-start.ts +22 -22
  371. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  372. package/src/resources/extensions/gsd/auto-verification.ts +12 -6
  373. package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
  374. package/src/resources/extensions/gsd/auto.ts +424 -106
  375. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +21 -6
  376. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -2
  377. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  378. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  379. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -1
  380. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  381. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
  382. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  383. package/src/resources/extensions/gsd/context-store.ts +120 -1
  384. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  385. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  386. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  387. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  388. package/src/resources/extensions/gsd/git-service.ts +2 -0
  389. package/src/resources/extensions/gsd/gsd-db.ts +7 -23
  390. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  391. package/src/resources/extensions/gsd/health-widget.ts +6 -10
  392. package/src/resources/extensions/gsd/journal.ts +2 -0
  393. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  394. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  395. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  396. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  397. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
  398. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  399. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  400. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  401. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  402. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  403. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  404. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  405. package/src/resources/extensions/gsd/native-git-bridge.ts +14 -13
  406. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  407. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  408. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  409. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  410. package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  411. package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
  412. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  413. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  414. package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
  415. package/src/resources/extensions/gsd/session-lock.ts +41 -0
  416. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  417. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +337 -0
  418. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +69 -0
  419. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +109 -0
  420. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  421. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  422. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  423. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  424. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  425. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  426. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
  427. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  428. package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
  429. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  430. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  431. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +99 -0
  432. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +729 -176
  433. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +408 -4
  434. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +291 -4
  435. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
  436. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +18 -0
  437. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  438. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  439. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  440. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
  441. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  442. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  443. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  444. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +20 -2
  445. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +44 -0
  446. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  447. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  448. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  449. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
  450. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  451. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  452. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +26 -0
  453. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  454. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  456. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  457. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
  458. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  459. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  460. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  461. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  462. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  464. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
  465. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  466. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  467. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  468. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  469. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
  470. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  471. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  472. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +2 -2
  473. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
  474. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
  475. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  476. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
  477. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
  478. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  479. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +24 -0
  480. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +65 -58
  481. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +952 -0
  482. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
  483. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
  484. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  485. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  486. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +6 -0
  487. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +158 -58
  488. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +572 -118
  489. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  490. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +18 -0
  491. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  492. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  493. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  494. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  495. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  496. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1151 -524
  497. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  498. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  499. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  500. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  501. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
  502. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → YEvjuT-fsFfYQhDSWtueS}/_buildManifest.js +0 -0
  503. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → YEvjuT-fsFfYQhDSWtueS}/_ssgManifest.js +0 -0
@@ -4,9 +4,14 @@
4
4
  import test from "node:test";
5
5
  import assert from "node:assert/strict";
6
6
 
7
- import { createAutoOrchestrator } from "../auto/orchestrator.js";
7
+ import { createAutoOrchestrator, STUCK_WINDOW_SIZE } from "../auto/orchestrator.js";
8
8
  import type { AutoOrchestratorDeps } from "../auto/contracts.js";
9
9
  import type { GSDState } from "../types.js";
10
+ import { createWiredDispatchAdapter } from "../auto.js";
11
+ import { resolveDispatch, type DispatchContext } from "../auto-dispatch.js";
12
+ import { RuleRegistry, setRegistry, resetRegistry } from "../rule-registry.js";
13
+ import type { UnifiedRule } from "../rule-types.js";
14
+ import { supportsStructuredQuestions } from "../workflow-mcp.js";
10
15
 
11
16
  function makeState(): GSDState {
12
17
  return {
@@ -62,9 +67,13 @@ function makeDeps(overrides: Partial<AutoOrchestratorDeps> = {}): { deps: AutoOr
62
67
  async cleanupOnStop() { calls.push("worktree.cleanup"); },
63
68
  },
64
69
  health: {
70
+ checkResourcesStale() {
71
+ calls.push("health.stale");
72
+ return null;
73
+ },
65
74
  async preAdvanceGate() {
66
75
  calls.push("health.pre");
67
- return { allow: true };
76
+ return { kind: "pass" };
68
77
  },
69
78
  async postAdvanceRecord() { calls.push("health.post"); },
70
79
  },
@@ -75,6 +84,9 @@ function makeDeps(overrides: Partial<AutoOrchestratorDeps> = {}): { deps: AutoOr
75
84
  notifications: {
76
85
  async notifyLifecycle(event) { calls.push(`notify:${event.name}`); },
77
86
  },
87
+ uokGate: {
88
+ async emit(input) { calls.push(`gate:${input.gateId}:${input.outcome}`); },
89
+ },
78
90
  };
79
91
 
80
92
  return { deps: { ...deps, ...overrides }, calls };
@@ -87,6 +99,7 @@ test("start() advances and records active unit", async () => {
87
99
  const result = await orchestrator.start({ basePath: "/tmp/project", trigger: "manual" });
88
100
 
89
101
  assert.equal(result.kind, "advanced");
102
+ assert.deepEqual(result.unit, { unitType: "execute-task", unitId: "T01" });
90
103
  const status = orchestrator.getStatus();
91
104
  assert.equal(status.phase, "running");
92
105
  assert.deepEqual(status.activeUnit, { unitType: "execute-task", unitId: "T01" });
@@ -95,9 +108,10 @@ test("start() advances and records active unit", async () => {
95
108
  });
96
109
 
97
110
  test("advance() returns blocked when health gate denies", async () => {
98
- const { deps } = makeDeps({
111
+ const { deps, calls } = makeDeps({
99
112
  health: {
100
- async preAdvanceGate() { return { allow: false, reason: "doctor-block" }; },
113
+ checkResourcesStale: () => null,
114
+ async preAdvanceGate() { return { kind: "fail", reason: "doctor-block" }; },
101
115
  async postAdvanceRecord() {},
102
116
  },
103
117
  });
@@ -107,6 +121,69 @@ test("advance() returns blocked when health gate denies", async () => {
107
121
 
108
122
  assert.equal(result.kind, "blocked");
109
123
  assert.equal(result.reason, "doctor-block");
124
+ assert.equal(result.action, "pause");
125
+ assert.ok(calls.includes("gate:pre-dispatch-health-gate:manual-attention"));
126
+ });
127
+
128
+ test("advance() returns blocked stop when resources are stale", async () => {
129
+ const { deps, calls } = makeDeps({
130
+ health: {
131
+ checkResourcesStale: () => "resources changed since session start",
132
+ async preAdvanceGate() { return { kind: "pass" }; },
133
+ async postAdvanceRecord() {},
134
+ },
135
+ });
136
+ const orchestrator = createAutoOrchestrator(deps);
137
+
138
+ const result = await orchestrator.advance();
139
+
140
+ assert.equal(result.kind, "blocked");
141
+ assert.equal(result.reason, "resources changed since session start");
142
+ assert.equal(result.action, "stop");
143
+ assert.ok(calls.includes("gate:resource-version-guard:fail"));
144
+ assert.ok(!calls.includes("health.pre"));
145
+ assert.ok(!calls.includes("state.reconcile"));
146
+ });
147
+
148
+ test("advance() continues past pre-dispatch health gate when it throws", async () => {
149
+ const { deps, calls } = makeDeps({
150
+ health: {
151
+ checkResourcesStale: () => null,
152
+ async preAdvanceGate() { return { kind: "threw", error: new Error("boom") }; },
153
+ async postAdvanceRecord() {},
154
+ },
155
+ });
156
+ const orchestrator = createAutoOrchestrator(deps);
157
+
158
+ const result = await orchestrator.advance();
159
+
160
+ assert.equal(result.kind, "advanced");
161
+ assert.ok(calls.includes("gate:pre-dispatch-health-gate:manual-attention"));
162
+ assert.ok(calls.includes("state.reconcile"));
163
+ assert.ok(calls.includes("dispatch.decide"));
164
+ });
165
+
166
+ test("advance() forwards fixesApplied into pre-dispatch-health-gate pass findings", async () => {
167
+ let observed = "";
168
+ const { deps } = makeDeps({
169
+ health: {
170
+ checkResourcesStale: () => null,
171
+ async preAdvanceGate() { return { kind: "pass", fixesApplied: ["fix-a", "fix-b"] }; },
172
+ async postAdvanceRecord() {},
173
+ },
174
+ uokGate: {
175
+ async emit(input) {
176
+ if (input.gateId === "pre-dispatch-health-gate" && input.outcome === "pass") {
177
+ observed = input.findings ?? "";
178
+ }
179
+ },
180
+ },
181
+ });
182
+ const orchestrator = createAutoOrchestrator(deps);
183
+
184
+ await orchestrator.advance();
185
+
186
+ assert.equal(observed, "fix-a, fix-b");
110
187
  });
111
188
 
112
189
  test("advance() follows the ADR-015 invariant sequence before journaling advance", async () => {
@@ -116,9 +193,13 @@ test("advance() follows the ADR-015 invariant sequence before journaling advance
116
193
  const result = await orchestrator.advance();
117
194
 
118
195
  assert.equal(result.kind, "advanced");
196
+ assert.deepEqual(result.unit, { unitType: "execute-task", unitId: "T01" });
119
197
  assert.deepEqual(calls, [
120
198
  "runtime.lock",
199
+ "health.stale",
200
+ "gate:resource-version-guard:pass",
121
201
  "health.pre",
202
+ "gate:pre-dispatch-health-gate:pass",
122
203
  "state.reconcile",
123
204
  "dispatch.decide",
124
205
  "tool.compile",
@@ -144,6 +225,7 @@ test("advance() blocks before dispatch when State Reconciliation blocks", async
144
225
 
145
226
  assert.equal(result.kind, "blocked");
146
227
  assert.equal(result.reason, "state drift blocked");
228
+ assert.equal(result.action, "pause");
147
229
  assert.ok(!calls.includes("dispatch.decide"));
148
230
  assert.ok(calls.includes("journal:advance-blocked"));
149
231
  });
@@ -163,6 +245,7 @@ test("advance() blocks before Runtime persistence when Tool Contract fails", asy
163
245
 
164
246
  assert.equal(result.kind, "blocked");
165
247
  assert.equal(result.reason, "unknown Unit");
248
+ assert.equal(result.action, "pause");
166
249
  assert.ok(!calls.includes("worktree.prepare"));
167
250
  assert.ok(!calls.includes("journal:advance"));
168
251
  assert.ok(calls.includes("journal:advance-blocked"));
@@ -185,6 +268,7 @@ test("advance() blocks before Runtime persistence when Worktree Safety fails", a
185
268
 
186
269
  assert.equal(result.kind, "blocked");
187
270
  assert.equal(result.reason, "worktree invalid");
271
+ assert.equal(result.action, "pause");
188
272
  assert.ok(!calls.includes("journal:advance"));
189
273
  assert.ok(!calls.includes("worktree.sync"));
190
274
  assert.ok(calls.includes("journal:advance-blocked"));
@@ -232,8 +316,10 @@ test("advance() is idempotent for the same active unit", async () => {
232
316
  const second = await orchestrator.advance();
233
317
 
234
318
  assert.equal(first.kind, "advanced");
319
+ assert.deepEqual(first.unit, { unitType: "execute-task", unitId: "T01" });
235
320
  assert.equal(second.kind, "blocked");
236
321
  assert.equal(second.reason, "idempotent advance: unit already active");
322
+ assert.equal(second.action, "stop");
237
323
 
238
324
  const prepareCalls = calls.filter((c) => c === "worktree.prepare").length;
239
325
  assert.equal(prepareCalls, 1);
@@ -468,3 +554,321 @@ test("stop() cleans up worktree and transitions to stopped", async () => {
468
554
  assert.ok(calls.includes("journal:stop"));
469
555
  assert.ok(calls.includes("notify:stop"));
470
556
  });
557
+
558
+ // ────────────────────────────────────────────────────────────────────────
559
+ // Stuck-loop ring buffer (issue #5787)
560
+ // ────────────────────────────────────────────────────────────────────────
561
+
562
+ test("STUCK_WINDOW_SIZE matches the legacy auto/phases.ts constant", () => {
563
+ assert.equal(STUCK_WINDOW_SIZE, 6);
564
+ });
565
+
566
+ test("stuck-loop: empty ring on a freshly constructed orchestrator advances normally", async () => {
567
+ const { deps } = makeDeps();
568
+ const orchestrator = createAutoOrchestrator(deps);
569
+
570
+ const result = await orchestrator.advance();
571
+
572
+ assert.equal(result.kind, "advanced");
573
+ });
574
+
575
+ test("stuck-loop: partial fill of mixed units does not block", async () => {
576
+ // Alternate A/B for STUCK_WINDOW_SIZE rounds. No single key saturates the
577
+ // window, so neither idempotency nor stuck-loop should fire.
578
+ let i = 0;
579
+ const sequence = ["A", "B", "A", "B", "A", "B"];
580
+ const { deps } = makeDeps({
581
+ dispatch: {
582
+ async decideNextUnit() {
583
+ const id = sequence[i++ % sequence.length];
584
+ return { unitType: "execute-task", unitId: id, reason: "ready", preconditions: [] };
585
+ },
586
+ },
587
+ });
588
+ const orchestrator = createAutoOrchestrator(deps);
589
+
590
+ for (let round = 0; round < STUCK_WINDOW_SIZE; round++) {
591
+ const result = await orchestrator.advance();
592
+ assert.equal(result.kind, "advanced", `round ${round} should advance, got ${result.kind}`);
593
+ }
594
+ });
595
+
596
+ test("stuck-loop: ring saturated with same unit blocks with action 'stop' and stuck-loop reason", async () => {
597
+ // Dispatch picks the same unit every time. The first advance succeeds.
598
+ // Calls 2..STUCK_WINDOW_SIZE-1 are idempotency-blocked while the ring fills.
599
+ // The STUCK_WINDOW_SIZE'th call sees a saturated ring and returns stuck-loop.
600
+ const { deps } = makeDeps();
601
+ const orchestrator = createAutoOrchestrator(deps);
602
+
603
+ const results: Awaited<ReturnType<typeof orchestrator.advance>>[] = [];
604
+ for (let i = 0; i < STUCK_WINDOW_SIZE; i++) {
605
+ results.push(await orchestrator.advance());
606
+ }
607
+
608
+ // First call advances.
609
+ assert.equal(results[0].kind, "advanced");
610
+
611
+ // Intermediate calls are blocked by idempotency (not stuck-loop yet).
612
+ for (let i = 1; i < STUCK_WINDOW_SIZE - 1; i++) {
613
+ const r = results[i];
614
+ assert.equal(r.kind, "blocked", `round ${i} should be blocked`);
615
+ if (r.kind !== "blocked") return;
616
+ assert.equal(r.reason, "idempotent advance: unit already active");
617
+ assert.equal(r.action, "stop");
618
+ }
619
+
620
+ // The final call (ring now holds STUCK_WINDOW_SIZE copies) returns stuck-loop.
621
+ const last = results[STUCK_WINDOW_SIZE - 1];
622
+ assert.equal(last.kind, "blocked");
623
+ if (last.kind !== "blocked") return;
624
+ assert.equal(last.action, "stop");
625
+ assert.equal(last.reason, `stuck-loop: execute-task:T01 picked ${STUCK_WINDOW_SIZE} times`);
626
+ });
627
+
628
+ test("stuck-loop: idempotency block continues to fire with its own reason before saturation", async () => {
629
+ // Two identical calls should produce idempotent (not stuck-loop). Ensures the
630
+ // existing idempotency block is not absorbed by the new check.
631
+ const { deps } = makeDeps();
632
+ const orchestrator = createAutoOrchestrator(deps);
633
+
634
+ const first = await orchestrator.advance();
635
+ const second = await orchestrator.advance();
636
+
637
+ assert.equal(first.kind, "advanced");
638
+ assert.equal(second.kind, "blocked");
639
+ assert.equal(second.reason, "idempotent advance: unit already active");
640
+ assert.equal(second.action, "stop");
641
+ });
642
+
643
+ test("stuck-loop: start() resets the ring so a fresh saturation cycle is required", async () => {
644
+ // Fill the ring to one short of saturation, then start() — the ring should
645
+ // be cleared, and the next advance must succeed instead of going stuck.
646
+ const { deps } = makeDeps();
647
+ const orchestrator = createAutoOrchestrator(deps);
648
+
649
+ for (let i = 0; i < STUCK_WINDOW_SIZE - 1; i++) {
650
+ await orchestrator.advance();
651
+ }
652
+
653
+ const restarted = await orchestrator.start({ basePath: "/tmp/project", trigger: "manual" });
654
+ assert.equal(restarted.kind, "advanced");
655
+
656
+ // Immediately after start(), the next advance is idempotent (one element in
657
+ // ring), not stuck-loop, confirming the ring was reset.
658
+ const next = await orchestrator.advance();
659
+ assert.equal(next.kind, "blocked");
660
+ assert.equal(next.reason, "idempotent advance: unit already active");
661
+ });
662
+
663
+ test("stuck-loop: resume() resets the ring", async () => {
664
+ const { deps } = makeDeps();
665
+ const orchestrator = createAutoOrchestrator(deps);
666
+
667
+ for (let i = 0; i < STUCK_WINDOW_SIZE - 1; i++) {
668
+ await orchestrator.advance();
669
+ }
670
+
671
+ const resumed = await orchestrator.resume();
672
+ assert.equal(resumed.kind, "advanced");
673
+
674
+ const next = await orchestrator.advance();
675
+ assert.equal(next.kind, "blocked");
676
+ assert.equal(next.reason, "idempotent advance: unit already active");
677
+ });
678
+
679
+ test("stuck-loop: stop() resets the ring", async () => {
680
+ const { deps } = makeDeps();
681
+ const orchestrator = createAutoOrchestrator(deps);
682
+
683
+ for (let i = 0; i < STUCK_WINDOW_SIZE - 1; i++) {
684
+ await orchestrator.advance();
685
+ }
686
+
687
+ const stopped = await orchestrator.stop("user-request");
688
+ assert.equal(stopped.kind, "stopped");
689
+
690
+ // Ring is cleared by stop(). A subsequent advance is a fresh first-touch.
691
+ const next = await orchestrator.advance();
692
+ assert.equal(next.kind, "advanced");
693
+ });
694
+
695
+ test("stuck-loop: journal records the stuck-loop reason on advance-blocked", async () => {
696
+ const { deps, calls } = makeDeps();
697
+ const orchestrator = createAutoOrchestrator(deps);
698
+
699
+ for (let i = 0; i < STUCK_WINDOW_SIZE; i++) {
700
+ await orchestrator.advance();
701
+ }
702
+
703
+ assert.ok(calls.includes("journal:advance-blocked"));
704
+ });
705
+
706
+ // ─── #5789 parity: wired dispatch adapter mirrors runDispatch's resolveDispatch call ───
707
+
708
+ test("wired DispatchAdapter forwards session-derived dispatch inputs identically to runDispatch", async () => {
709
+ const stateSnapshot = makeState();
710
+
711
+ // Install a capturing registry so we observe the DispatchContext both code paths
712
+ // build, and force a deterministic dispatch action so the parity assertion is
713
+ // about *inputs*, not rule evaluation.
714
+ const captured: DispatchContext[] = [];
715
+ const captureRule: UnifiedRule = {
716
+ name: "test-capture",
717
+ when: "dispatch",
718
+ evaluation: "first-match",
719
+ where: async (ctx: DispatchContext) => {
720
+ captured.push(ctx);
721
+ return {
722
+ action: "dispatch" as const,
723
+ unitType: "execute-task",
724
+ unitId: "T01",
725
+ prompt: "parity-fixture",
726
+ };
727
+ },
728
+ then: (r: unknown) => r,
729
+ };
730
+ setRegistry(new RuleRegistry([captureRule]));
731
+
732
+ try {
733
+ // Mock ExtensionContext + ExtensionAPI with the surface the wired adapter touches.
734
+ const fakeModelRegistry = {
735
+ getAll: () => [],
736
+ getProviderAuthMode: (_provider: string) => "apiKey" as const,
737
+ };
738
+ const ctx = {
739
+ model: {
740
+ provider: "anthropic",
741
+ baseUrl: "https://api.anthropic.com",
742
+ contextWindow: 200_000,
743
+ },
744
+ modelRegistry: fakeModelRegistry,
745
+ } as any;
746
+ const pi = {
747
+ getActiveTools: () => ["read_file", "write_file"],
748
+ } as any;
749
+ const basePath = "/tmp/parity-fixture";
750
+
751
+ // Path A — wired adapter (what createWiredAutoOrchestrationModule uses).
752
+ const adapter = createWiredDispatchAdapter(ctx, pi, basePath);
753
+ const adapterResult = await adapter.decideNextUnit({ stateSnapshot });
754
+
755
+ // Path B — direct resolveDispatch call mirroring phases.ts:runDispatch.
756
+ // Inline the same derivations runDispatch uses so any drift here is a parity break.
757
+ const prefs = undefined; // loadEffectiveGSDPreferences returns null for /tmp/parity-fixture.
758
+ const provider = ctx.model?.provider;
759
+ const authMode = provider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
760
+ ? ctx.modelRegistry.getProviderAuthMode(provider)
761
+ : undefined;
762
+ const activeTools = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
763
+ const structuredQuestionsAvailable: "true" | "false" =
764
+ prefs !== undefined && (prefs as { planning_depth?: string }).planning_depth === "deep"
765
+ ? "false"
766
+ : supportsStructuredQuestions(activeTools, {
767
+ authMode,
768
+ baseUrl: ctx.model?.baseUrl,
769
+ })
770
+ ? "true"
771
+ : "false";
772
+
773
+ const builtDirectCtx: DispatchContext = {
774
+ basePath,
775
+ mid: stateSnapshot.activeMilestone!.id,
776
+ midTitle: stateSnapshot.activeMilestone!.title,
777
+ state: stateSnapshot,
778
+ prefs,
779
+ structuredQuestionsAvailable,
780
+ sessionContextWindow: ctx.model?.contextWindow,
781
+ sessionProvider: ctx.model?.provider,
782
+ modelRegistry: ctx.modelRegistry,
783
+ };
784
+ const directAction = await resolveDispatch(builtDirectCtx);
785
+
786
+ // Two contexts captured: one per resolveDispatch call.
787
+ assert.equal(captured.length, 2, "expected two captured dispatch contexts");
788
+ const [adapterCtx, directCtx] = captured;
789
+
790
+ // Parity assertion: session-derived fields are identical.
791
+ assert.equal(adapterCtx.structuredQuestionsAvailable, directCtx.structuredQuestionsAvailable);
792
+ assert.equal(adapterCtx.sessionContextWindow, directCtx.sessionContextWindow);
793
+ assert.equal(adapterCtx.sessionProvider, directCtx.sessionProvider);
794
+ assert.equal(adapterCtx.modelRegistry, directCtx.modelRegistry);
795
+ assert.equal(adapterCtx.basePath, directCtx.basePath);
796
+ assert.equal(adapterCtx.mid, directCtx.mid);
797
+ assert.equal(adapterCtx.midTitle, directCtx.midTitle);
798
+
799
+ // Dispatch action equality: both flows reach the same dispatch decision.
800
+ assert.ok(adapterResult);
801
+ assert.equal(adapterResult.unitType, "execute-task");
802
+ assert.equal(adapterResult.unitId, "T01");
803
+ assert.equal(adapterResult.reason, "test-capture");
804
+ assert.equal(directAction.action, "dispatch");
805
+ if (directAction.action === "dispatch") {
806
+ assert.equal(directAction.unitType, adapterResult.unitType);
807
+ assert.equal(directAction.unitId, adapterResult.unitId);
808
+ assert.equal(directAction.matchedRule, adapterResult.reason);
809
+ }
810
+ } finally {
811
+ resetRegistry();
812
+ }
813
+ });
814
+
815
+ test("wired DispatchAdapter prefers caller-supplied dispatch inputs over ctx-derived values", async () => {
816
+ const stateSnapshot = makeState();
817
+ const captured: DispatchContext[] = [];
818
+ const captureRule: UnifiedRule = {
819
+ name: "test-capture-overrides",
820
+ when: "dispatch",
821
+ evaluation: "first-match",
822
+ where: async (ctx: DispatchContext) => {
823
+ captured.push(ctx);
824
+ return {
825
+ action: "dispatch" as const,
826
+ unitType: "execute-task",
827
+ unitId: "T01",
828
+ prompt: "override-fixture",
829
+ };
830
+ },
831
+ then: (r: unknown) => r,
832
+ };
833
+ setRegistry(new RuleRegistry([captureRule]));
834
+
835
+ try {
836
+ const ctxModelRegistry = {
837
+ getAll: () => [],
838
+ getProviderAuthMode: (_provider: string) => "apiKey" as const,
839
+ };
840
+ const overrideModelRegistry = {
841
+ getAll: () => [],
842
+ getProviderAuthMode: (_provider: string) => "oauth" as const,
843
+ };
844
+ const ctx = {
845
+ model: {
846
+ provider: "anthropic",
847
+ baseUrl: "https://api.anthropic.com",
848
+ contextWindow: 200_000,
849
+ },
850
+ modelRegistry: ctxModelRegistry,
851
+ } as any;
852
+ const pi = {
853
+ getActiveTools: () => [],
854
+ } as any;
855
+ const adapter = createWiredDispatchAdapter(ctx, pi, "/tmp/parity-fixture");
856
+
857
+ const result = await adapter.decideNextUnit({
858
+ stateSnapshot,
859
+ structuredQuestionsAvailable: "true",
860
+ sessionContextWindow: 500_000,
861
+ sessionProvider: "openai",
862
+ modelRegistry: overrideModelRegistry,
863
+ });
864
+
865
+ assert.ok(result);
866
+ assert.equal(captured.length, 1, "expected one captured dispatch context");
867
+ assert.equal(captured[0].structuredQuestionsAvailable, "true");
868
+ assert.equal(captured[0].sessionContextWindow, 500_000);
869
+ assert.equal(captured[0].sessionProvider, "openai");
870
+ assert.equal(captured[0].modelRegistry, overrideModelRegistry);
871
+ } finally {
872
+ resetRegistry();
873
+ }
874
+ });