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
@@ -2,12 +2,14 @@
2
2
  // File Purpose: Behavior tests for auto-loop cleanup after paused provider exits.
3
3
  import { test } from "node:test";
4
4
  import assert from "node:assert/strict";
5
- import { mkdtempSync, rmSync } from "node:fs";
5
+ import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
6
6
  import { tmpdir } from "node:os";
7
7
  import { join } from "node:path";
8
8
 
9
- import { cleanupAfterLoopExit, rerootCommandSession } from "../auto.ts";
9
+ import { cleanupAfterLoopExit, rerootCommandSession, stopAuto } from "../auto.ts";
10
10
  import { autoSession } from "../auto-runtime-state.ts";
11
+ import { closeDatabase, insertMilestone, insertSlice, openDatabase } from "../gsd-db.ts";
12
+ import { WorktreeLifecycle } from "../worktree-lifecycle.ts";
11
13
 
12
14
  test("cleanupAfterLoopExit preserves paused auto badge after provider pause", async () => {
13
15
  const base = mkdtempSync(join(tmpdir(), "gsd-paused-cleanup-"));
@@ -41,7 +43,7 @@ test("cleanupAfterLoopExit preserves paused auto badge after provider pause", as
41
43
  }
42
44
  });
43
45
 
44
- test("cleanupAfterLoopExit clears status and widget when auto is not paused", async () => {
46
+ test("cleanupAfterLoopExit clears status without replacing the last auto surface", async () => {
45
47
  const statusCalls: unknown[] = [];
46
48
  const widgetCalls: unknown[] = [];
47
49
 
@@ -60,7 +62,16 @@ test("cleanupAfterLoopExit clears status and widget when auto is not paused", as
60
62
  } as any);
61
63
 
62
64
  assert.deepEqual(statusCalls, [["gsd-auto", undefined]]);
63
- assert.deepEqual(widgetCalls, [["gsd-progress", undefined]]);
65
+ assert.equal(
66
+ widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-progress" && args[1] === undefined),
67
+ false,
68
+ "cleanup must not clear the last meaningful auto progress surface",
69
+ );
70
+ assert.equal(
71
+ widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-outcome"),
72
+ false,
73
+ "cleanup must not replace the auto deck with a generic loop-ended card",
74
+ );
64
75
  assert.equal(autoSession.active, false);
65
76
  assert.equal(autoSession.paused, false);
66
77
  } finally {
@@ -68,6 +79,122 @@ test("cleanupAfterLoopExit clears status and widget when auto is not paused", as
68
79
  }
69
80
  });
70
81
 
82
+ test("cleanupAfterLoopExit preserves completion roll-up after stopAuto reset", async () => {
83
+ const statusCalls: unknown[] = [];
84
+ const widgetCalls: unknown[] = [];
85
+
86
+ autoSession.reset();
87
+ autoSession.active = true;
88
+ autoSession.paused = false;
89
+ autoSession.completionStopInProgress = true;
90
+ autoSession.resetAfterStop({ preserveCompletionSurface: true });
91
+
92
+ try {
93
+ await cleanupAfterLoopExit({
94
+ hasUI: true,
95
+ ui: {
96
+ setStatus: (...args: unknown[]) => statusCalls.push(args),
97
+ setWidget: (...args: unknown[]) => widgetCalls.push(args),
98
+ setHeader: () => {},
99
+ notify: () => {},
100
+ },
101
+ } as any);
102
+
103
+ assert.deepEqual(statusCalls, [["gsd-auto", undefined]]);
104
+ assert.equal(
105
+ widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-progress" && args[1] === undefined),
106
+ false,
107
+ "completion cleanup must not clear the roll-up progress widget",
108
+ );
109
+ assert.equal(
110
+ widgetCalls.some((args) => Array.isArray(args) && args[0] === "gsd-outcome"),
111
+ false,
112
+ "completion cleanup must not replace the roll-up with a generic outcome card",
113
+ );
114
+ assert.equal(autoSession.completionStopInProgress, false);
115
+ } finally {
116
+ autoSession.reset();
117
+ }
118
+ });
119
+
120
+ test("cleanupAfterLoopExit restores project root through lifecycle and preserves chdir", async (t) => {
121
+ const base = mkdtempSync(join(tmpdir(), "gsd-cleanup-lifecycle-"));
122
+ const worktree = join(base, ".gsd", "worktrees", "M001");
123
+ const previousCwd = process.cwd();
124
+ let restoreCalls = 0;
125
+ const originalRestore = WorktreeLifecycle.prototype.restoreToProjectRoot;
126
+ t.mock.method(WorktreeLifecycle.prototype, "restoreToProjectRoot", function (this: WorktreeLifecycle) {
127
+ restoreCalls += 1;
128
+ return originalRestore.call(this);
129
+ });
130
+
131
+ mkdirSync(worktree, { recursive: true });
132
+ autoSession.reset();
133
+ autoSession.active = true;
134
+ autoSession.basePath = worktree;
135
+ autoSession.originalBasePath = base;
136
+
137
+ try {
138
+ await cleanupAfterLoopExit({
139
+ ui: {
140
+ setStatus: () => {},
141
+ setWidget: () => {},
142
+ notify: () => {},
143
+ },
144
+ } as any);
145
+
146
+ assert.equal(restoreCalls, 1);
147
+ assert.equal(autoSession.basePath, base);
148
+ assert.equal(realpathSync(process.cwd()), realpathSync(base));
149
+ } finally {
150
+ autoSession.reset();
151
+ process.chdir(previousCwd);
152
+ rmSync(base, { recursive: true, force: true });
153
+ }
154
+ });
155
+
156
+ test("cleanupAfterLoopExit keeps cleanup best-effort when lifecycle restore throws", async (t) => {
157
+ const base = mkdtempSync(join(tmpdir(), "gsd-cleanup-restore-throw-"));
158
+ const worktree = join(base, ".gsd", "worktrees", "M001");
159
+ const previousCwd = process.cwd();
160
+ let restoreCalls = 0;
161
+ // ADR-016 phase 3 (#5693): the real `restoreToProjectRoot` assigns
162
+ // `s.basePath = s.originalBasePath` BEFORE any throwable work
163
+ // (rebuildGitService, cache invalidation). Mirror that ordering in the
164
+ // mock so the throw scenario reflects production: basePath is restored
165
+ // even when the verb throws partway through.
166
+ t.mock.method(WorktreeLifecycle.prototype, "restoreToProjectRoot", function (this: WorktreeLifecycle) {
167
+ restoreCalls += 1;
168
+ (this as unknown as { s: { basePath: string; originalBasePath: string } })
169
+ .s.basePath = (this as unknown as { s: { originalBasePath: string } }).s.originalBasePath;
170
+ throw new Error("restore failed");
171
+ });
172
+
173
+ mkdirSync(worktree, { recursive: true });
174
+ autoSession.reset();
175
+ autoSession.active = true;
176
+ autoSession.basePath = worktree;
177
+ autoSession.originalBasePath = base;
178
+
179
+ try {
180
+ await cleanupAfterLoopExit({
181
+ ui: {
182
+ setStatus: () => {},
183
+ setWidget: () => {},
184
+ notify: () => {},
185
+ },
186
+ } as any);
187
+
188
+ assert.equal(restoreCalls, 1);
189
+ assert.equal(autoSession.basePath, base);
190
+ assert.equal(realpathSync(process.cwd()), realpathSync(base));
191
+ } finally {
192
+ autoSession.reset();
193
+ process.chdir(previousCwd);
194
+ rmSync(base, { recursive: true, force: true });
195
+ }
196
+ });
197
+
71
198
  test("rerootCommandSession refreshes command workspace to project root", async () => {
72
199
  const calls: string[] = [];
73
200
  const result = await rerootCommandSession(
@@ -83,3 +210,163 @@ test("rerootCommandSession refreshes command workspace to project root", async (
83
210
  assert.deepEqual(result, { status: "ok" });
84
211
  assert.deepEqual(calls, ["/project/root"]);
85
212
  });
213
+
214
+ test("stopAuto completion closeout reroots session, restores cwd, and preserves final widget", async (t) => {
215
+ const base = mkdtempSync(join(tmpdir(), "gsd-completion-stop-"));
216
+ const previousCwd = process.cwd();
217
+ const widgetCalls: Array<[string, unknown]> = [];
218
+ const notifications: string[] = [];
219
+ const newSessionWorkspaces: string[] = [];
220
+ let restoreCalls = 0;
221
+ const originalRestore = WorktreeLifecycle.prototype.restoreToProjectRoot;
222
+ t.mock.method(WorktreeLifecycle.prototype, "restoreToProjectRoot", function (this: WorktreeLifecycle) {
223
+ restoreCalls += 1;
224
+ return originalRestore.call(this);
225
+ });
226
+ const milestoneDir = join(base, ".gsd", "milestones", "M003");
227
+ mkdirSync(milestoneDir, { recursive: true });
228
+ writeFileSync(join(milestoneDir, "M003-SUMMARY.md"), [
229
+ "---",
230
+ "id: M003",
231
+ 'title: "Budget tracking"',
232
+ "status: complete",
233
+ "key_decisions:",
234
+ " - Keep completion closeout in the same TUI surface.",
235
+ "key_files:",
236
+ " - src/resources/extensions/gsd/auto-dashboard.ts",
237
+ "lessons_learned:",
238
+ " - Milestone endings need report output, not auto-loop status.",
239
+ "---",
240
+ "",
241
+ "# M003: Budget tracking",
242
+ "",
243
+ "**Added budget warning output and provider roll-up details.**",
244
+ "",
245
+ "## Success Criteria Results",
246
+ "",
247
+ "Budget warnings appear at milestone completion.",
248
+ "",
249
+ "## Definition of Done Results",
250
+ "",
251
+ "Completion leaves the report surface visible.",
252
+ "",
253
+ "## Requirement Outcomes",
254
+ "",
255
+ "Users can see what shipped without opening a fresh session.",
256
+ "",
257
+ "## Deviations",
258
+ "",
259
+ "None.",
260
+ "",
261
+ "## Follow-ups",
262
+ "",
263
+ "None.",
264
+ "",
265
+ ].join("\n"), "utf-8");
266
+
267
+ autoSession.reset();
268
+ openDatabase(join(base, "gsd-test.db"));
269
+ insertMilestone({ id: "M003", title: "Budget tracking", status: "complete" });
270
+ insertSlice({ id: "S01", milestoneId: "M003", title: "Complete slice", status: "complete", sequence: 1 });
271
+ insertSlice({ id: "S02", milestoneId: "M003", title: "Done slice", status: "done", sequence: 2 });
272
+ insertSlice({ id: "S03", milestoneId: "M003", title: "Pending slice", status: "active", sequence: 3 });
273
+
274
+ autoSession.active = true;
275
+ autoSession.paused = false;
276
+ autoSession.basePath = join(base, ".gsd", "worktrees", "M003");
277
+ autoSession.originalBasePath = base;
278
+ autoSession.currentMilestoneId = "M003";
279
+ autoSession.autoStartTime = Date.now() - 60_000;
280
+ autoSession.cmdCtx = {
281
+ newSession: async ({ workspaceRoot }: { workspaceRoot: string }) => {
282
+ newSessionWorkspaces.push(workspaceRoot);
283
+ widgetCalls.push(["gsd-progress", undefined]);
284
+ return { cancelled: false };
285
+ },
286
+ sessionManager: {
287
+ getEntries: () => [
288
+ {
289
+ type: "message",
290
+ message: {
291
+ role: "assistant",
292
+ usage: { input: 100, cacheRead: 900 },
293
+ },
294
+ },
295
+ ],
296
+ },
297
+ getContextUsage: () => ({ percent: 0.9, contextWindow: 1_000_000 }),
298
+ model: { contextWindow: 1_000_000 },
299
+ } as any;
300
+
301
+ try {
302
+ await stopAuto(
303
+ {
304
+ hasUI: true,
305
+ ui: {
306
+ setStatus: () => {},
307
+ setWidget: (key: string, value: unknown) => {
308
+ widgetCalls.push([key, value]);
309
+ },
310
+ setHeader: () => {},
311
+ notify: (message: string) => {
312
+ notifications.push(message);
313
+ },
314
+ },
315
+ modelRegistry: { find: () => null },
316
+ } as any,
317
+ { events: { emit: () => {} } } as any,
318
+ "Milestone M003 complete",
319
+ {
320
+ completionWidget: {
321
+ milestoneId: "M003",
322
+ milestoneTitle: "Budget tracking",
323
+ },
324
+ },
325
+ );
326
+
327
+ assert.deepEqual(newSessionWorkspaces, [base], "completion stop must reroot command session to original project root");
328
+ assert.equal(restoreCalls, 1, "completion stop must restore project root through lifecycle");
329
+ assert.equal(realpathSync(process.cwd()), realpathSync(base), "completion stop must chdir back to project root");
330
+ assert.ok(
331
+ widgetCalls.some(([key, value]) => key === "gsd-progress" && typeof value === "function"),
332
+ "completion stop must install a final progress widget",
333
+ );
334
+ const lastProgressWidget = widgetCalls.filter(([key]) => key === "gsd-progress").at(-1);
335
+ assert.equal(typeof lastProgressWidget?.[1], "function", "completion stop must leave the final progress widget installed after reroot");
336
+ const factory = lastProgressWidget?.[1] as any;
337
+ const component = factory(
338
+ { requestRender() {} },
339
+ { fg: (_color: string, text: string) => text, bold: (text: string) => text },
340
+ );
341
+ const output = component.render(140).join("\n");
342
+ assert.match(output, /Milestone M003 roll-up/);
343
+ assert.match(output, /Outcome/);
344
+ assert.match(output, /Added budget warning output/);
345
+ assert.match(output, /Verification/);
346
+ assert.match(output, /Files: src\/resources\/extensions\/gsd\/auto-dashboard\.ts/);
347
+ assert.match(output, /Lessons: Milestone endings need report output/);
348
+ assert.match(output, /2\/3 slices/);
349
+ assert.match(output, /Next/);
350
+ assert.match(output, /Review the roll-up/);
351
+ assert.match(output, /\/gsd auto for next milestone/);
352
+ assert.doesNotMatch(output, /COMPLETE-MILESTONE/);
353
+ assert.doesNotMatch(output, /\/gsd auto to resume/);
354
+ assert.ok(
355
+ notifications.some(message => message.includes("Milestone M003 complete. Auto-mode finished this milestone.")),
356
+ "completion stop notification should describe completion, not an aborted pause",
357
+ );
358
+ assert.ok(
359
+ notifications.every(message => !message.includes("/gsd auto to resume")),
360
+ "completion stop notification must not tell users to resume a finished auto run",
361
+ );
362
+ assert.ok(
363
+ widgetCalls.every(([key, value]) => key !== "gsd-outcome" || value === undefined),
364
+ "completion stop should use the roll-up as the single final surface",
365
+ );
366
+ } finally {
367
+ try { closeDatabase(); } catch { /* noop */ }
368
+ autoSession.reset();
369
+ process.chdir(previousCwd);
370
+ rmSync(base, { recursive: true, force: true });
371
+ }
372
+ });
@@ -1,17 +1,21 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
3
 
4
- import { autoSession, getAutoRuntimeSnapshot } from "../auto-runtime-state.ts";
4
+ import {
5
+ autoSession,
6
+ clearToolInvocationError,
7
+ getAutoRuntimeSnapshot,
8
+ } from "../auto-runtime-state.ts";
5
9
 
6
10
  test("getAutoRuntimeSnapshot includes orchestration phase when available", () => {
7
11
  autoSession.reset();
8
12
  autoSession.active = true;
9
13
  autoSession.basePath = "/tmp/project";
10
14
  autoSession.orchestration = {
11
- async start() { return { kind: "advanced" as const }; },
12
- async advance() { return { kind: "advanced" as const }; },
13
- async resume() { return { kind: "advanced" as const }; },
14
- async stop() { return { kind: "stopped" as const }; },
15
+ async start() { return { kind: "stopped" as const, reason: "test" }; },
16
+ async advance() { return { kind: "stopped" as const, reason: "test" }; },
17
+ async resume() { return { kind: "stopped" as const, reason: "test" }; },
18
+ async stop() { return { kind: "stopped" as const, reason: "test" }; },
15
19
  getStatus() {
16
20
  return { phase: "running" as const, transitionCount: 3, lastTransitionAt: 123 };
17
21
  },
@@ -28,6 +32,17 @@ test("getAutoRuntimeSnapshot includes orchestration phase when available", () =>
28
32
  autoSession.reset();
29
33
  });
30
34
 
35
+ test("clearToolInvocationError clears stale tool error state for active auto sessions", () => {
36
+ autoSession.reset();
37
+ autoSession.active = true;
38
+ autoSession.lastToolInvocationError = "gsd_task_complete: simulated transient tool error";
39
+
40
+ clearToolInvocationError();
41
+
42
+ assert.equal(autoSession.lastToolInvocationError, null);
43
+ autoSession.reset();
44
+ });
45
+
31
46
  test("getAutoRuntimeSnapshot omits orchestration phase when seam not wired", () => {
32
47
  autoSession.reset();
33
48
 
@@ -100,6 +100,14 @@ test("bootstrap aborts before starting next milestone when completed orphan merg
100
100
  registerSigtermHandler: () => {},
101
101
  lockBase: () => base,
102
102
  buildLifecycle: () => ({
103
+ adoptSessionRoot: (sessionBase: string, originalBase?: string) => {
104
+ s.basePath = sessionBase;
105
+ if (originalBase !== undefined) {
106
+ s.originalBasePath = originalBase;
107
+ } else if (!s.originalBasePath) {
108
+ s.originalBasePath = sessionBase;
109
+ }
110
+ },
103
111
  exitMilestone: (milestoneId: string) => {
104
112
  mergeCalls.push(milestoneId);
105
113
  return {
@@ -109,6 +117,16 @@ test("bootstrap aborts before starting next milestone when completed orphan merg
109
117
  };
110
118
  },
111
119
  enterMilestone: () => ({ ok: true, mode: "none", path: base }),
120
+ // ADR-016 phase 2 / B4 (#5622): the orphan-merge dance now goes
121
+ // through `adoptOrphanWorktree`. The mock invokes the callback
122
+ // and returns its result without exercising the swap-revert
123
+ // protocol — this test only cares about the merge call being
124
+ // recorded and the bootstrap returning `false` on failure.
125
+ adoptOrphanWorktree: <T extends { merged: boolean }>(
126
+ _mid: string,
127
+ _base: string,
128
+ run: () => T,
129
+ ): T => run(),
112
130
  }) as any,
113
131
  },
114
132
  {
@@ -0,0 +1,68 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Regression tests for auto-unit closeout activity classification.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+
7
+ import {
8
+ isSuspiciousGhostCompletion,
9
+ snapshotUnitActivity,
10
+ } from "../auto-unit-closeout.ts";
11
+
12
+ function makeCtx(entries: unknown[]) {
13
+ return {
14
+ sessionManager: {
15
+ getEntries: () => entries,
16
+ },
17
+ } as any;
18
+ }
19
+
20
+ test("isSuspiciousGhostCompletion rejects fast completions with no assistant output or tools", () => {
21
+ const startedAt = Date.now();
22
+ const ctx = makeCtx([]);
23
+
24
+ assert.equal(isSuspiciousGhostCompletion(ctx, startedAt, 500), true);
25
+ });
26
+
27
+ test("isSuspiciousGhostCompletion allows fast completions with assistant output", () => {
28
+ const startedAt = Date.now();
29
+ const ctx = makeCtx([
30
+ {
31
+ type: "message",
32
+ message: {
33
+ role: "assistant",
34
+ content: [{ type: "text", text: "Done." }],
35
+ },
36
+ },
37
+ ]);
38
+
39
+ assert.equal(isSuspiciousGhostCompletion(ctx, startedAt, 500), false);
40
+ });
41
+
42
+ test("snapshotUnitActivity counts assistant messages and tool calls", () => {
43
+ const ctx = makeCtx([
44
+ {
45
+ type: "message",
46
+ message: {
47
+ role: "assistant",
48
+ content: [
49
+ { type: "text", text: "Working." },
50
+ { type: "toolCall", name: "read_file" },
51
+ ],
52
+ },
53
+ },
54
+ {
55
+ type: "message",
56
+ message: {
57
+ role: "user",
58
+ content: "continue",
59
+ },
60
+ },
61
+ ]);
62
+
63
+ assert.deepEqual(snapshotUnitActivity(ctx, 1_000, 1_250), {
64
+ elapsedMs: 250,
65
+ toolCalls: 1,
66
+ assistantMessages: 1,
67
+ });
68
+ });
@@ -0,0 +1,62 @@
1
+ // GSD-2 — ADR-005 Phase 2: Verify browser tool compatibility declarations.
2
+ //
3
+ // Locks in the declarations that always-image-producing browser tools
4
+ // (browser_screenshot, browser_zoom_region) carry `producesImages: true` so
5
+ // the model-router filters them out on providers without imageToolResults
6
+ // (OpenAI completions/responses, Azure, Mistral, Ollama). Conditional-image
7
+ // browser tools (navigation, forms, refs, intent, interaction) must NOT
8
+ // declare producesImages — they only attach error screenshots and filtering
9
+ // them would lose the whole tool surface for OpenAI users.
10
+
11
+ import test from "node:test";
12
+ import assert from "node:assert/strict";
13
+
14
+ import type { ExtensionAPI } from "@gsd/pi-coding-agent";
15
+
16
+ import { registerScreenshotTools } from "../../browser-tools/tools/screenshot.ts";
17
+ import { registerZoomTools } from "../../browser-tools/tools/zoom.ts";
18
+
19
+ interface CapturedToolDef {
20
+ name: string;
21
+ compatibility?: { producesImages?: boolean; schemaFeatures?: string[] };
22
+ }
23
+
24
+ function makeCapturingPi(): { pi: ExtensionAPI; tools: CapturedToolDef[] } {
25
+ const tools: CapturedToolDef[] = [];
26
+ const pi = {
27
+ registerTool(def: CapturedToolDef): void {
28
+ tools.push({ name: def.name, compatibility: def.compatibility });
29
+ },
30
+ } as unknown as ExtensionAPI;
31
+ return { pi, tools };
32
+ }
33
+
34
+ // Browser tool registration functions accept a `deps` object. None of the
35
+ // declarations under test reach for these deps at registration time — they
36
+ // only run inside execute(), which we never invoke. A bare object satisfies
37
+ // the type signature.
38
+ const stubDeps = {} as Parameters<typeof registerScreenshotTools>[1];
39
+
40
+ test("browser_screenshot declares producesImages: true", () => {
41
+ const { pi, tools } = makeCapturingPi();
42
+ registerScreenshotTools(pi, stubDeps);
43
+ const screenshot = tools.find((t) => t.name === "browser_screenshot");
44
+ assert.ok(screenshot, "browser_screenshot should be registered");
45
+ assert.equal(
46
+ screenshot.compatibility?.producesImages,
47
+ true,
48
+ "browser_screenshot must declare producesImages so it is filtered on providers without imageToolResults",
49
+ );
50
+ });
51
+
52
+ test("browser_zoom_region declares producesImages: true", () => {
53
+ const { pi, tools } = makeCapturingPi();
54
+ registerZoomTools(pi, stubDeps);
55
+ const zoom = tools.find((t) => t.name === "browser_zoom_region");
56
+ assert.ok(zoom, "browser_zoom_region should be registered");
57
+ assert.equal(
58
+ zoom.compatibility?.producesImages,
59
+ true,
60
+ "browser_zoom_region must declare producesImages so it is filtered on providers without imageToolResults",
61
+ );
62
+ });