gsd-pi 2.57.0 → 2.58.0-dev.394cb18

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 (834) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +58 -35
  3. package/dist/headless-ui.d.ts +17 -0
  4. package/dist/headless-ui.js +97 -3
  5. package/dist/headless.js +67 -6
  6. package/dist/help-text.js +1 -0
  7. package/dist/onboarding.js +44 -0
  8. package/dist/resource-loader.js +16 -1
  9. package/dist/resources/agents/researcher.md +1 -1
  10. package/dist/resources/extensions/ask-user-questions.js +16 -3
  11. package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
  12. package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
  13. package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
  14. package/dist/resources/extensions/claude-code-cli/partial-builder.js +14 -6
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +59 -36
  16. package/dist/resources/extensions/context7/extension-manifest.json +1 -1
  17. package/dist/resources/extensions/get-secrets-from-user.js +8 -5
  18. package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
  19. package/dist/resources/extensions/google-search/index.js +2 -1
  20. package/dist/resources/extensions/gsd/auto/infra-errors.js +4 -0
  21. package/dist/resources/extensions/gsd/auto/phases.js +25 -21
  22. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  23. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -20
  24. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -5
  25. package/dist/resources/extensions/gsd/auto-model-selection.js +26 -3
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +16 -4
  27. package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
  28. package/dist/resources/extensions/gsd/auto-recovery.js +13 -5
  29. package/dist/resources/extensions/gsd/auto-start.js +35 -22
  30. package/dist/resources/extensions/gsd/auto-worktree.js +206 -14
  31. package/dist/resources/extensions/gsd/auto.js +4 -0
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -0
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +82 -9
  34. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
  35. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +42 -34
  36. package/dist/resources/extensions/gsd/bootstrap/system-context.js +66 -12
  37. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -0
  38. package/dist/resources/extensions/gsd/captures.js +56 -4
  39. package/dist/resources/extensions/gsd/codebase-generator.js +279 -0
  40. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  41. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  42. package/dist/resources/extensions/gsd/commands-codebase.js +115 -0
  43. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +41 -4
  44. package/dist/resources/extensions/gsd/complexity-classifier.js +8 -6
  45. package/dist/resources/extensions/gsd/db-writer.js +116 -8
  46. package/dist/resources/extensions/gsd/dispatch-guard.js +11 -1
  47. package/dist/resources/extensions/gsd/doctor-git-checks.js +76 -1
  48. package/dist/resources/extensions/gsd/doctor-proactive.js +34 -1
  49. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  50. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -4
  51. package/dist/resources/extensions/gsd/doctor.js +3 -1
  52. package/dist/resources/extensions/gsd/error-classifier.js +12 -10
  53. package/dist/resources/extensions/gsd/extension-manifest.json +16 -1
  54. package/dist/resources/extensions/gsd/forensics.js +123 -20
  55. package/dist/resources/extensions/gsd/git-service.js +105 -2
  56. package/dist/resources/extensions/gsd/gitignore.js +33 -0
  57. package/dist/resources/extensions/gsd/gsd-db.js +44 -10
  58. package/dist/resources/extensions/gsd/guided-flow.js +106 -44
  59. package/dist/resources/extensions/gsd/health-widget-core.js +31 -0
  60. package/dist/resources/extensions/gsd/health-widget.js +17 -0
  61. package/dist/resources/extensions/gsd/index.js +1 -1
  62. package/dist/resources/extensions/gsd/memory-extractor.js +7 -0
  63. package/dist/resources/extensions/gsd/migrate-external.js +8 -1
  64. package/dist/resources/extensions/gsd/milestone-validation-gates.js +45 -0
  65. package/dist/resources/extensions/gsd/model-cost-table.js +18 -0
  66. package/dist/resources/extensions/gsd/model-router.js +35 -1
  67. package/dist/resources/extensions/gsd/native-git-bridge.js +39 -0
  68. package/dist/resources/extensions/gsd/notifications.js +16 -1
  69. package/dist/resources/extensions/gsd/parallel-eligibility.js +13 -2
  70. package/dist/resources/extensions/gsd/parallel-merge.js +78 -5
  71. package/dist/resources/extensions/gsd/parallel-orchestrator.js +23 -6
  72. package/dist/resources/extensions/gsd/parsers-legacy.js +20 -3
  73. package/dist/resources/extensions/gsd/paths.js +45 -0
  74. package/dist/resources/extensions/gsd/preferences-models.js +14 -1
  75. package/dist/resources/extensions/gsd/preferences-types.js +3 -1
  76. package/dist/resources/extensions/gsd/preferences.js +42 -31
  77. package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
  78. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  80. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
  83. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
  84. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  86. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  87. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  89. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  90. package/dist/resources/extensions/gsd/repo-identity.js +205 -11
  91. package/dist/resources/extensions/gsd/rethink.js +5 -0
  92. package/dist/resources/extensions/gsd/roadmap-slices.js +5 -4
  93. package/dist/resources/extensions/gsd/state.js +85 -27
  94. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  95. package/dist/resources/extensions/gsd/tools/complete-task.js +34 -71
  96. package/dist/resources/extensions/gsd/tools/plan-milestone.js +12 -2
  97. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +29 -1
  98. package/dist/resources/extensions/gsd/tools/validate-milestone.js +18 -3
  99. package/dist/resources/extensions/gsd/triage-resolution.js +22 -7
  100. package/dist/resources/extensions/gsd/undo.js +2 -2
  101. package/dist/resources/extensions/gsd/unit-ownership.js +164 -33
  102. package/dist/resources/extensions/gsd/verdict-parser.js +20 -8
  103. package/dist/resources/extensions/gsd/watch/header-renderer.js +241 -0
  104. package/dist/resources/extensions/gsd/workflow-manifest.js +24 -5
  105. package/dist/resources/extensions/gsd/workflow-projections.js +95 -63
  106. package/dist/resources/extensions/gsd/workflow-reconcile.js +35 -5
  107. package/dist/resources/extensions/gsd/workspace-index.js +24 -0
  108. package/dist/resources/extensions/gsd/worktree-manager.js +105 -1
  109. package/dist/resources/extensions/gsd/worktree-resolver.js +20 -3
  110. package/dist/resources/extensions/mcp-client/index.js +11 -7
  111. package/dist/resources/extensions/ollama/index.js +112 -0
  112. package/dist/resources/extensions/ollama/model-capabilities.js +115 -0
  113. package/dist/resources/extensions/ollama/ollama-client.js +168 -0
  114. package/dist/resources/extensions/ollama/ollama-commands.js +194 -0
  115. package/dist/resources/extensions/ollama/ollama-discovery.js +69 -0
  116. package/dist/resources/extensions/ollama/ollama-tool.js +184 -0
  117. package/dist/resources/extensions/ollama/types.js +2 -0
  118. package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
  119. package/dist/resources/extensions/shared/interview-ui.js +11 -1
  120. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -3
  121. package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  122. package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  123. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  124. package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  125. package/dist/startup-model-validation.d.ts +39 -0
  126. package/dist/startup-model-validation.js +50 -0
  127. package/dist/web/standalone/.next/BUILD_ID +1 -1
  128. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  129. package/dist/web/standalone/.next/build-manifest.json +4 -4
  130. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  131. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  132. package/dist/web/standalone/.next/required-server-files.json +3 -3
  133. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  134. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  136. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  144. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  153. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  160. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  200. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  206. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  220. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  222. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  224. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  226. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/index.html +1 -1
  236. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  237. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  238. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  239. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  240. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  241. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  242. package/dist/web/standalone/.next/server/app/page.js +2 -2
  243. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  244. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  245. package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
  246. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  247. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/middleware.js +2 -2
  250. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  252. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  253. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  254. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  255. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +9 -0
  256. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  257. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  258. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  260. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  261. package/dist/web/standalone/.next/static/chunks/{webpack-4332cbd5dd1be584.js → webpack-a1c1e452c6b32d04.js} +1 -1
  262. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
  263. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  264. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  265. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  266. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  267. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  268. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  269. package/dist/web/standalone/server.js +1 -1
  270. package/dist/web-mode.js +2 -1
  271. package/dist/welcome-screen.d.ts +1 -0
  272. package/dist/welcome-screen.js +32 -6
  273. package/package.json +2 -2
  274. package/packages/daemon/src/cli.ts +49 -0
  275. package/packages/daemon/src/daemon.test.ts +104 -1
  276. package/packages/daemon/src/daemon.ts +24 -1
  277. package/packages/daemon/src/discord-bot.ts +73 -3
  278. package/packages/daemon/src/event-bridge.ts +15 -9
  279. package/packages/daemon/src/event-formatter.ts +30 -2
  280. package/packages/daemon/src/index.ts +9 -0
  281. package/packages/daemon/src/launchd.test.ts +356 -0
  282. package/packages/daemon/src/launchd.ts +242 -0
  283. package/packages/daemon/src/message-batcher.test.ts +2 -2
  284. package/packages/daemon/src/message-batcher.ts +9 -3
  285. package/packages/daemon/src/orchestrator.test.ts +1 -0
  286. package/packages/daemon/src/orchestrator.ts +106 -2
  287. package/packages/native/dist/ast/index.js +9 -5
  288. package/packages/native/dist/ast/types.js +2 -1
  289. package/packages/native/dist/clipboard/index.js +12 -7
  290. package/packages/native/dist/clipboard/types.js +2 -1
  291. package/packages/native/dist/diff/index.js +12 -7
  292. package/packages/native/dist/diff/types.js +2 -1
  293. package/packages/native/dist/fd/index.js +6 -3
  294. package/packages/native/dist/fd/types.js +2 -1
  295. package/packages/native/dist/glob/index.js +9 -5
  296. package/packages/native/dist/glob/types.js +2 -1
  297. package/packages/native/dist/grep/index.js +9 -5
  298. package/packages/native/dist/grep/types.js +2 -1
  299. package/packages/native/dist/gsd-parser/index.js +18 -11
  300. package/packages/native/dist/gsd-parser/types.js +2 -1
  301. package/packages/native/dist/highlight/index.js +12 -7
  302. package/packages/native/dist/highlight/types.js +2 -1
  303. package/packages/native/dist/html/index.js +6 -3
  304. package/packages/native/dist/html/types.js +2 -1
  305. package/packages/native/dist/image/index.js +10 -5
  306. package/packages/native/dist/image/types.js +7 -4
  307. package/packages/native/dist/index.js +70 -17
  308. package/packages/native/dist/json-parse/index.js +13 -8
  309. package/packages/native/dist/native.js +47 -10
  310. package/packages/native/dist/ps/index.js +15 -9
  311. package/packages/native/dist/ps/types.js +2 -1
  312. package/packages/native/dist/stream-process/index.js +12 -7
  313. package/packages/native/dist/text/index.js +24 -14
  314. package/packages/native/dist/text/types.js +5 -2
  315. package/packages/native/dist/truncate/index.js +12 -7
  316. package/packages/native/dist/ttsr/index.js +12 -7
  317. package/packages/native/dist/ttsr/types.js +2 -1
  318. package/packages/native/dist/xxhash/index.js +9 -5
  319. package/packages/native/package.json +19 -19
  320. package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
  321. package/packages/native/src/native.ts +9 -8
  322. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  323. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  324. package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
  325. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  326. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  327. package/packages/pi-agent-core/src/agent-loop.test.ts +45 -0
  328. package/packages/pi-agent-core/src/agent-loop.ts +3 -2
  329. package/packages/pi-agent-core/src/proxy.ts +1 -1
  330. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  331. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  332. package/packages/pi-ai/dist/index.d.ts +1 -0
  333. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  334. package/packages/pi-ai/dist/index.js +1 -0
  335. package/packages/pi-ai/dist/index.js.map +1 -1
  336. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  337. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -2
  338. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  339. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
  340. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
  341. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
  342. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
  343. package/packages/pi-ai/dist/types.d.ts +3 -3
  344. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  345. package/packages/pi-ai/dist/types.js.map +1 -1
  346. package/packages/pi-ai/dist/utils/json-parse.d.ts +3 -0
  347. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  348. package/packages/pi-ai/dist/utils/json-parse.js +24 -1
  349. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  350. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
  351. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
  352. package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
  353. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
  354. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
  355. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
  356. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
  357. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
  358. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  359. package/packages/pi-ai/src/index.ts +1 -0
  360. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
  361. package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
  362. package/packages/pi-ai/src/types.ts +3 -2
  363. package/packages/pi-ai/src/utils/json-parse.ts +28 -1
  364. package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
  365. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
  366. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  367. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
  369. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
  371. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
  373. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
  375. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
  376. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
  377. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
  378. package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/exec.js +3 -1
  380. package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
  382. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
  383. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
  384. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
  385. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
  386. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
  387. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
  388. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
  389. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
  390. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
  392. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
  393. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
  394. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
  395. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
  396. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
  397. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
  398. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
  400. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  402. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  404. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
  406. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
  407. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
  408. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
  409. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
  410. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
  411. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
  412. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
  413. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
  414. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/core/index.js +1 -1
  416. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  417. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  418. package/packages/pi-coding-agent/dist/core/lsp/index.js +3 -0
  419. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  420. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  421. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -0
  422. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  423. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  424. package/packages/pi-coding-agent/dist/core/messages.js +31 -2
  425. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  426. package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
  427. package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
  428. package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
  429. package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
  430. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  431. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  432. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
  434. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
  436. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
  438. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
  440. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
  442. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
  443. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
  444. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
  445. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +10 -3
  447. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  449. package/packages/pi-coding-agent/dist/core/tools/read.js +13 -4
  450. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  451. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
  452. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
  453. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
  454. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
  455. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  456. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  457. package/packages/pi-coding-agent/dist/index.js +1 -1
  458. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  459. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts.map +1 -1
  461. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +9 -8
  462. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  463. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  464. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +0 -3
  465. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  466. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -0
  467. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -1
  469. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  472. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  474. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  476. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  477. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +5 -2
  478. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  479. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts +1 -0
  480. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  481. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +4 -0
  482. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  483. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  484. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  485. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  486. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  487. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +4 -2
  488. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  489. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +2 -2
  490. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  491. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  492. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +8 -1
  493. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  494. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  495. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +2 -0
  496. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  497. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  498. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +4 -0
  499. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  500. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  501. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +26 -12
  502. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  503. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +4 -4
  504. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  505. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +3 -0
  506. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  507. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +46 -14
  508. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  509. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  510. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -8
  511. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  512. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -4
  513. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  514. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  515. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  516. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  517. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -3
  518. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  520. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +3 -2
  521. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  522. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  523. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -1
  524. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  525. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  526. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +16 -1
  527. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  528. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
  529. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  530. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +27 -4
  531. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  532. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  533. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +6 -0
  534. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  535. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  536. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  537. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +1 -0
  538. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
  539. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +5 -0
  540. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
  541. package/packages/pi-coding-agent/package.json +1 -1
  542. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
  543. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
  544. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
  545. package/packages/pi-coding-agent/src/core/exec.ts +3 -1
  546. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  547. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  548. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  549. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  550. package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
  551. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  552. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  553. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  554. package/packages/pi-coding-agent/src/core/index.ts +6 -0
  555. package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
  556. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
  557. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  558. package/packages/pi-coding-agent/src/core/messages.ts +29 -2
  559. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  560. package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
  561. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
  562. package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
  563. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
  564. package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
  565. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
  566. package/packages/pi-coding-agent/src/index.ts +6 -0
  567. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +9 -9
  568. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -2
  569. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +3 -1
  570. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +1 -1
  571. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  572. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  573. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +7 -2
  574. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +3 -0
  575. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  576. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +4 -3
  577. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +2 -2
  578. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -1
  579. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -0
  580. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +4 -0
  581. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +27 -13
  582. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +4 -4
  583. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +45 -14
  584. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -7
  585. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +4 -4
  586. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -2
  587. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +8 -3
  588. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +3 -2
  589. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +24 -1
  590. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +14 -1
  591. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +35 -3
  592. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +7 -0
  593. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  594. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
  595. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  596. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  597. package/packages/pi-tui/dist/terminal.js +9 -0
  598. package/packages/pi-tui/dist/terminal.js.map +1 -1
  599. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  600. package/packages/pi-tui/dist/tui.js +9 -0
  601. package/packages/pi-tui/dist/tui.js.map +1 -1
  602. package/packages/pi-tui/src/terminal.ts +14 -0
  603. package/packages/pi-tui/src/tui.ts +8 -0
  604. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  605. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  606. package/pkg/package.json +1 -1
  607. package/scripts/ensure-workspace-builds.cjs +45 -14
  608. package/src/resources/agents/researcher.md +1 -1
  609. package/src/resources/extensions/ask-user-questions.ts +21 -3
  610. package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
  611. package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
  612. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  613. package/src/resources/extensions/claude-code-cli/partial-builder.ts +13 -6
  614. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
  615. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
  616. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
  617. package/src/resources/extensions/context7/extension-manifest.json +1 -1
  618. package/src/resources/extensions/get-secrets-from-user.ts +8 -5
  619. package/src/resources/extensions/google-search/extension-manifest.json +1 -1
  620. package/src/resources/extensions/google-search/index.ts +2 -1
  621. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  622. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  623. package/src/resources/extensions/gsd/auto/phases.ts +43 -34
  624. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  625. package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
  626. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -5
  627. package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
  628. package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
  629. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  630. package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
  631. package/src/resources/extensions/gsd/auto-start.ts +35 -26
  632. package/src/resources/extensions/gsd/auto-worktree.ts +200 -11
  633. package/src/resources/extensions/gsd/auto.ts +5 -0
  634. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
  635. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +87 -9
  636. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
  637. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -35
  638. package/src/resources/extensions/gsd/bootstrap/system-context.ts +72 -12
  639. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
  640. package/src/resources/extensions/gsd/captures.ts +63 -3
  641. package/src/resources/extensions/gsd/codebase-generator.ts +351 -0
  642. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  643. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  644. package/src/resources/extensions/gsd/commands-codebase.ts +164 -0
  645. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +46 -4
  646. package/src/resources/extensions/gsd/complexity-classifier.ts +8 -6
  647. package/src/resources/extensions/gsd/db-writer.ts +140 -7
  648. package/src/resources/extensions/gsd/dispatch-guard.ts +12 -1
  649. package/src/resources/extensions/gsd/doctor-git-checks.ts +75 -1
  650. package/src/resources/extensions/gsd/doctor-proactive.ts +35 -1
  651. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  652. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
  653. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  654. package/src/resources/extensions/gsd/doctor.ts +3 -1
  655. package/src/resources/extensions/gsd/error-classifier.ts +13 -11
  656. package/src/resources/extensions/gsd/extension-manifest.json +16 -1
  657. package/src/resources/extensions/gsd/forensics.ts +144 -20
  658. package/src/resources/extensions/gsd/git-service.ts +119 -3
  659. package/src/resources/extensions/gsd/gitignore.ts +33 -0
  660. package/src/resources/extensions/gsd/gsd-db.ts +49 -8
  661. package/src/resources/extensions/gsd/guided-flow.ts +114 -45
  662. package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
  663. package/src/resources/extensions/gsd/health-widget.ts +17 -0
  664. package/src/resources/extensions/gsd/index.ts +1 -0
  665. package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
  666. package/src/resources/extensions/gsd/migrate-external.ts +9 -1
  667. package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
  668. package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
  669. package/src/resources/extensions/gsd/model-router.ts +35 -1
  670. package/src/resources/extensions/gsd/native-git-bridge.ts +41 -0
  671. package/src/resources/extensions/gsd/notifications.ts +16 -0
  672. package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
  673. package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
  674. package/src/resources/extensions/gsd/parallel-orchestrator.ts +23 -6
  675. package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
  676. package/src/resources/extensions/gsd/paths.ts +44 -0
  677. package/src/resources/extensions/gsd/preferences-models.ts +14 -1
  678. package/src/resources/extensions/gsd/preferences-types.ts +10 -1
  679. package/src/resources/extensions/gsd/preferences.ts +45 -29
  680. package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
  681. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  682. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  683. package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  684. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  685. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
  686. package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
  687. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  688. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  689. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  690. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  691. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  692. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  693. package/src/resources/extensions/gsd/repo-identity.ts +186 -11
  694. package/src/resources/extensions/gsd/rethink.ts +6 -0
  695. package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
  696. package/src/resources/extensions/gsd/state.ts +84 -32
  697. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +47 -0
  698. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  699. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
  700. package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
  701. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  702. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +488 -0
  703. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
  704. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
  705. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  706. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +4 -4
  707. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
  708. package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
  709. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
  710. package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
  711. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  712. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
  713. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
  714. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +47 -0
  715. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  716. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
  717. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  718. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
  719. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  720. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
  721. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
  722. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
  723. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
  724. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
  725. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  726. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
  727. package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
  728. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
  729. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
  730. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +134 -0
  731. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
  732. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  733. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +72 -0
  734. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +68 -0
  735. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  736. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
  737. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  738. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
  739. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
  740. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
  741. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  742. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
  743. package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
  744. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
  745. package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
  746. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
  747. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
  748. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +9 -8
  749. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
  750. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
  751. package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -0
  752. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  753. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +36 -0
  754. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  755. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  756. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
  757. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
  758. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
  759. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
  760. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  761. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
  762. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
  763. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
  764. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
  765. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
  766. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  767. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
  768. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
  769. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
  770. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
  771. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +44 -0
  772. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  773. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
  774. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  775. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
  776. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  777. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +27 -2
  778. package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +44 -2
  779. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  780. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
  781. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
  782. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
  783. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
  784. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
  785. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +175 -0
  786. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
  787. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
  788. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
  789. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
  790. package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
  791. package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
  792. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
  793. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -2
  794. package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
  795. package/src/resources/extensions/gsd/types.ts +4 -2
  796. package/src/resources/extensions/gsd/undo.ts +2 -2
  797. package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
  798. package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
  799. package/src/resources/extensions/gsd/watch/header-renderer.ts +275 -0
  800. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  801. package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
  802. package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
  803. package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
  804. package/src/resources/extensions/gsd/workspace-index.ts +30 -0
  805. package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
  806. package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
  807. package/src/resources/extensions/mcp-client/index.ts +13 -7
  808. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
  809. package/src/resources/extensions/ollama/index.ts +130 -0
  810. package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
  811. package/src/resources/extensions/ollama/ollama-client.ts +196 -0
  812. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  813. package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
  814. package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
  815. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
  816. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  817. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
  818. package/src/resources/extensions/ollama/types.ts +130 -0
  819. package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
  820. package/src/resources/extensions/shared/interview-ui.ts +12 -1
  821. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
  822. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
  823. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  824. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  825. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  826. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  827. package/dist/web/standalone/.next/static/chunks/6502.2305d0afd2385711.js +0 -9
  828. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  829. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  830. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  831. package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
  832. package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
  833. /package/dist/web/standalone/.next/static/{yowc5qPtuKxjOr22KmOAy → uDm3eO1oo9lDfY2TyoO9t}/_buildManifest.js +0 -0
  834. /package/dist/web/standalone/.next/static/{yowc5qPtuKxjOr22KmOAy → uDm3eO1oo9lDfY2TyoO9t}/_ssgManifest.js +0 -0
@@ -4,6 +4,7 @@
4
4
  * Translates the Claude Agent SDK's `BetaRawMessageStreamEvent` sequence
5
5
  * into GSD's `AssistantMessageEvent` deltas for incremental TUI rendering.
6
6
  */
7
+ import { repairToolJson } from "@gsd/pi-ai";
7
8
  // ---------------------------------------------------------------------------
8
9
  // Content-block mapping helpers
9
10
  // ---------------------------------------------------------------------------
@@ -210,12 +211,19 @@ export class PartialMessageBuilder {
210
211
  block.arguments = JSON.parse(jsonStr);
211
212
  }
212
213
  catch {
213
- // Stream was truncated mid-tool-call JSON is garbage.
214
- // Preserve the raw string for diagnostics but signal the
215
- // malformation explicitly so downstream consumers can
216
- // distinguish this from a healthy tool completion (#2574).
217
- block.arguments = { _raw: jsonStr };
218
- return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial, malformedArguments: true };
214
+ // JSON.parse failed attempt repair for YAML-style bullet
215
+ // lists that LLMs copy from template formatting (#2660).
216
+ try {
217
+ block.arguments = JSON.parse(repairToolJson(jsonStr));
218
+ }
219
+ catch {
220
+ // Repair also failed — stream was truncated or garbage.
221
+ // Preserve the raw string for diagnostics but signal the
222
+ // malformation explicitly so downstream consumers can
223
+ // distinguish this from a healthy tool completion (#2574).
224
+ block.arguments = { _raw: jsonStr };
225
+ return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial, malformedArguments: true };
226
+ }
219
227
  }
220
228
  return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial };
221
229
  }
@@ -48,30 +48,45 @@ function getClaudePath() {
48
48
  return cachedClaudePath;
49
49
  }
50
50
  // ---------------------------------------------------------------------------
51
- // Prompt extraction
51
+ // Prompt construction
52
52
  // ---------------------------------------------------------------------------
53
53
  /**
54
- * Extract the last user prompt text from GSD's context messages.
55
- * The SDK manages its own conversation history — we only send
56
- * the latest user message as the prompt.
54
+ * Extract text content from a single message regardless of content shape.
57
55
  */
58
- function extractLastUserPrompt(context) {
59
- for (let i = context.messages.length - 1; i >= 0; i--) {
60
- const msg = context.messages[i];
61
- if (msg.role === "user") {
62
- if (typeof msg.content === "string")
63
- return msg.content;
64
- if (Array.isArray(msg.content)) {
65
- const textParts = msg.content
66
- .filter((part) => part.type === "text")
67
- .map((part) => part.text);
68
- if (textParts.length > 0)
69
- return textParts.join("\n");
70
- }
71
- }
56
+ function extractMessageText(msg) {
57
+ if (typeof msg.content === "string")
58
+ return msg.content;
59
+ if (Array.isArray(msg.content)) {
60
+ const textParts = msg.content
61
+ .filter((part) => part.type === "text")
62
+ .map((part) => part.text ?? part.thinking ?? "");
63
+ if (textParts.length > 0)
64
+ return textParts.join("\n");
72
65
  }
73
66
  return "";
74
67
  }
68
+ /**
69
+ * Build a full conversational prompt from GSD's context messages.
70
+ *
71
+ * Previous behaviour sent only the last user message, making every SDK
72
+ * call effectively stateless. This version serialises the complete
73
+ * conversation history (system prompt + all user/assistant turns) so
74
+ * Claude Code has full context for multi-turn continuity.
75
+ */
76
+ export function buildPromptFromContext(context) {
77
+ const parts = [];
78
+ if (context.systemPrompt) {
79
+ parts.push(`[System]\n${context.systemPrompt}`);
80
+ }
81
+ for (const msg of context.messages) {
82
+ const text = extractMessageText(msg);
83
+ if (!text)
84
+ continue;
85
+ const label = msg.role === "user" ? "User" : msg.role === "assistant" ? "Assistant" : "System";
86
+ parts.push(`[${label}]\n${text}`);
87
+ }
88
+ return parts.join("\n\n");
89
+ }
75
90
  // ---------------------------------------------------------------------------
76
91
  // Error helper
77
92
  // ---------------------------------------------------------------------------
@@ -102,6 +117,29 @@ export function makeStreamExhaustedErrorMessage(model, lastTextContent) {
102
117
  return message;
103
118
  }
104
119
  // ---------------------------------------------------------------------------
120
+ // SDK options builder
121
+ // ---------------------------------------------------------------------------
122
+ /**
123
+ * Build the options object passed to the Claude Agent SDK's `query()` call.
124
+ *
125
+ * Extracted for testability — callers can verify session persistence,
126
+ * beta flags, and other configuration without mocking the full SDK.
127
+ */
128
+ export function buildSdkOptions(modelId, prompt) {
129
+ return {
130
+ pathToClaudeCodeExecutable: getClaudePath(),
131
+ model: modelId,
132
+ includePartialMessages: true,
133
+ persistSession: true,
134
+ cwd: process.cwd(),
135
+ permissionMode: "bypassPermissions",
136
+ allowDangerouslySkipPermissions: true,
137
+ settingSources: ["project"],
138
+ systemPrompt: { type: "preset", preset: "claude_code" },
139
+ betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
140
+ };
141
+ }
142
+ // ---------------------------------------------------------------------------
105
143
  // streamSimple implementation
106
144
  // ---------------------------------------------------------------------------
107
145
  /**
@@ -133,21 +171,13 @@ async function pumpSdkMessages(model, context, options, stream) {
133
171
  if (options?.signal) {
134
172
  options.signal.addEventListener("abort", () => controller.abort(), { once: true });
135
173
  }
136
- const prompt = extractLastUserPrompt(context);
174
+ const prompt = buildPromptFromContext(context);
175
+ const sdkOpts = buildSdkOptions(modelId, prompt);
137
176
  const queryResult = sdk.query({
138
177
  prompt,
139
178
  options: {
140
- pathToClaudeCodeExecutable: getClaudePath(),
141
- model: modelId,
142
- includePartialMessages: true,
143
- persistSession: false,
179
+ ...sdkOpts,
144
180
  abortController: controller,
145
- cwd: process.cwd(),
146
- permissionMode: "bypassPermissions",
147
- allowDangerouslySkipPermissions: true,
148
- settingSources: ["project"],
149
- systemPrompt: { type: "preset", preset: "claude_code" },
150
- betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
151
181
  },
152
182
  });
153
183
  // Emit start with an empty partial
@@ -174,8 +204,6 @@ async function pumpSdkMessages(model, context, options, stream) {
174
204
  // -- Streaming partial messages --
175
205
  case "stream_event": {
176
206
  const partial = msg;
177
- if (partial.parent_tool_use_id !== null)
178
- break; // skip subagent
179
207
  const event = partial.event;
180
208
  // New assistant turn starts with message_start
181
209
  if (event.type === "message_start") {
@@ -200,8 +228,6 @@ async function pumpSdkMessages(model, context, options, stream) {
200
228
  // -- Complete assistant message (non-streaming fallback) --
201
229
  case "assistant": {
202
230
  const sdkAssistant = msg;
203
- if (sdkAssistant.parent_tool_use_id !== null)
204
- break;
205
231
  // Capture text content from complete messages
206
232
  for (const block of sdkAssistant.message.content) {
207
233
  if (block.type === "text") {
@@ -215,9 +241,6 @@ async function pumpSdkMessages(model, context, options, stream) {
215
241
  }
216
242
  // -- User message (synthetic tool result — signals turn boundary) --
217
243
  case "user": {
218
- const userMsg = msg;
219
- if (userMsg.parent_tool_use_id !== null)
220
- break;
221
244
  // Capture content from the completed turn before resetting
222
245
  if (builder) {
223
246
  for (const block of builder.message.content) {
@@ -7,6 +7,6 @@
7
7
  "requires": { "platform": ">=2.29.0" },
8
8
  "provides": {
9
9
  "tools": ["resolve_library", "get_library_docs"],
10
- "hooks": ["session_start"]
10
+ "hooks": ["session_start", "session_shutdown"]
11
11
  }
12
12
  }
@@ -31,6 +31,9 @@ function hydrateProcessEnv(key, value) {
31
31
  process.env[key] = value;
32
32
  }
33
33
  async function writeEnvKey(filePath, key, value) {
34
+ if (typeof value !== "string") {
35
+ throw new TypeError(`writeEnvKey expects a string value for key "${key}", got ${typeof value}`);
36
+ }
34
37
  let content = "";
35
38
  try {
36
39
  content = await readFile(filePath, "utf8");
@@ -334,19 +337,19 @@ export async function collectSecretsFromManifest(base, milestoneId, ctx) {
334
337
  for (const { key, value } of collected) {
335
338
  const entry = manifest.entries.find((e) => e.key === key);
336
339
  if (entry) {
337
- entry.status = value !== null ? "collected" : "skipped";
340
+ entry.status = value != null ? "collected" : "skipped";
338
341
  }
339
342
  }
340
343
  // (i) Write manifest back to disk
341
344
  await writeFile(manifestPath, formatSecretsManifest(manifest), "utf8");
342
345
  // (j) Apply collected values to destination
343
- const provided = collected.filter((c) => c.value !== null);
346
+ const provided = collected.filter((c) => c.value != null);
344
347
  const { applied } = await applySecrets(provided, destination, {
345
348
  envFilePath: resolve(ctx.cwd, ".env"),
346
349
  });
347
350
  const skipped = [
348
351
  ...alreadySkipped,
349
- ...collected.filter((c) => c.value === null).map((c) => c.key),
352
+ ...collected.filter((c) => c.value == null).map((c) => c.key),
350
353
  ];
351
354
  return { applied, skipped, existingSkipped };
352
355
  }
@@ -403,8 +406,8 @@ export default function secureEnv(pi) {
403
406
  const value = await collectOneSecret(ctx, i, params.keys.length, item.key, item.hint, item.guidance);
404
407
  collected.push({ key: item.key, value });
405
408
  }
406
- const provided = collected.filter((c) => c.value !== null);
407
- const skipped = collected.filter((c) => c.value === null).map((c) => c.key);
409
+ const provided = collected.filter((c) => c.value != null);
410
+ const skipped = collected.filter((c) => c.value == null).map((c) => c.key);
408
411
  // Apply to destination via shared helper
409
412
  const { applied, errors } = await applySecrets(provided, destination, {
410
413
  envFilePath: resolve(ctx.cwd, params.envFilePath ?? ".env"),
@@ -7,6 +7,6 @@
7
7
  "requires": { "platform": ">=2.29.0" },
8
8
  "provides": {
9
9
  "tools": ["google_search"],
10
- "hooks": ["session_start"]
10
+ "hooks": ["session_start", "session_shutdown"]
11
11
  }
12
12
  }
@@ -26,7 +26,7 @@ async function getClient() {
26
26
  */
27
27
  async function searchWithOAuth(query, accessToken, projectId, signal) {
28
28
  const model = process.env.GEMINI_SEARCH_MODEL || "gemini-2.5-flash";
29
- const url = `https://cloudcode-pa.googleapis.com/v1internal:streamGenerateContent`;
29
+ const url = `https://cloudcode-pa.googleapis.com/v1internal:streamGenerateContent?alt=sse`;
30
30
  const GEMINI_CLI_HEADERS = {
31
31
  ideType: "IDE_UNSPECIFIED",
32
32
  platform: "PLATFORM_UNSPECIFIED",
@@ -49,6 +49,7 @@ async function searchWithOAuth(query, accessToken, projectId, signal) {
49
49
  contents: [{ parts: [{ text: query }] }],
50
50
  tools: [{ googleSearch: {} }],
51
51
  },
52
+ userAgent: "pi-coding-agent",
52
53
  }),
53
54
  signal,
54
55
  });
@@ -41,5 +41,9 @@ export function isInfrastructureError(err) {
41
41
  if (msg.includes(code))
42
42
  return code;
43
43
  }
44
+ // SQLite WAL corruption is not transient — retrying burns LLM budget
45
+ // for guaranteed failures (#2823).
46
+ if (msg.includes("database disk image is malformed"))
47
+ return "SQLITE_CORRUPT";
44
48
  return null;
45
49
  }
@@ -13,7 +13,7 @@ import { runUnit } from "./run-unit.js";
13
13
  import { debugLog } from "../debug-logger.js";
14
14
  import { PROJECT_FILES } from "../detection.js";
15
15
  import { MergeConflictError } from "../git-service.js";
16
- import { join } from "node:path";
16
+ import { join, basename } from "node:path";
17
17
  import { existsSync, cpSync } from "node:fs";
18
18
  import { logWarning, logError } from "../workflow-logger.js";
19
19
  import { gsdRoot } from "../paths.js";
@@ -146,7 +146,7 @@ export async function runPreDispatch(ic, loopState) {
146
146
  if (mid && s.currentMilestoneId && mid !== s.currentMilestoneId) {
147
147
  deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "milestone-transition", data: { from: s.currentMilestoneId, to: mid } });
148
148
  ctx.ui.notify(`Milestone ${s.currentMilestoneId} complete. Advancing to ${mid}: ${midTitle}.`, "info");
149
- deps.sendDesktopNotification("GSD", `Milestone ${s.currentMilestoneId} complete!`, "success", "milestone");
149
+ deps.sendDesktopNotification("GSD", `Milestone ${s.currentMilestoneId} complete!`, "success", "milestone", basename(s.originalBasePath || s.basePath));
150
150
  deps.logCmuxEvent(prefs, `Milestone ${s.currentMilestoneId} complete. Advancing to ${mid}.`, "success");
151
151
  const vizPrefs = prefs;
152
152
  if (vizPrefs?.auto_visualize) {
@@ -255,7 +255,7 @@ export async function runPreDispatch(ic, loopState) {
255
255
  }
256
256
  // PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
257
257
  }
258
- deps.sendDesktopNotification("GSD", "All milestones complete!", "success", "milestone");
258
+ deps.sendDesktopNotification("GSD", "All milestones complete!", "success", "milestone", basename(s.originalBasePath || s.basePath));
259
259
  deps.logCmuxEvent(prefs, "All milestones complete.", "success");
260
260
  await deps.stopAuto(ctx, pi, "All milestones complete");
261
261
  }
@@ -269,7 +269,7 @@ export async function runPreDispatch(ic, loopState) {
269
269
  const blockerMsg = `Blocked: ${state.blockers.join(", ")}`;
270
270
  await deps.stopAuto(ctx, pi, blockerMsg);
271
271
  ctx.ui.notify(`${blockerMsg}. Fix and run /gsd auto.`, "warning");
272
- deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention");
272
+ deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention", basename(s.originalBasePath || s.basePath));
273
273
  deps.logCmuxEvent(prefs, blockerMsg, "error");
274
274
  }
275
275
  else {
@@ -326,7 +326,7 @@ export async function runPreDispatch(ic, loopState) {
326
326
  }
327
327
  // PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
328
328
  }
329
- deps.sendDesktopNotification("GSD", `Milestone ${mid} complete!`, "success", "milestone");
329
+ deps.sendDesktopNotification("GSD", `Milestone ${mid} complete!`, "success", "milestone", basename(s.originalBasePath || s.basePath));
330
330
  deps.logCmuxEvent(prefs, `Milestone ${mid} complete.`, "success");
331
331
  await closeoutAndStop(ctx, pi, s, deps, `Milestone ${mid} complete`);
332
332
  debugLog("autoLoop", { phase: "exit", reason: "milestone-complete" });
@@ -338,7 +338,7 @@ export async function runPreDispatch(ic, loopState) {
338
338
  const blockerMsg = `Blocked: ${state.blockers.join(", ")}`;
339
339
  await closeoutAndStop(ctx, pi, s, deps, blockerMsg);
340
340
  ctx.ui.notify(`${blockerMsg}. Fix and run /gsd auto.`, "warning");
341
- deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention");
341
+ deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention", basename(s.originalBasePath || s.basePath));
342
342
  deps.logCmuxEvent(prefs, blockerMsg, "error");
343
343
  debugLog("autoLoop", { phase: "exit", reason: "blocked" });
344
344
  deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "blocked", blockers: state.blockers } });
@@ -520,28 +520,28 @@ export async function runGuards(ic, mid) {
520
520
  // 100% — special enforcement logic (halt/pause/warn)
521
521
  const msg = `Budget ceiling ${deps.formatCost(budgetCeiling)} reached (spent ${deps.formatCost(totalCost)}).`;
522
522
  if (budgetEnforcementAction === "halt") {
523
- deps.sendDesktopNotification("GSD", msg, "error", "budget");
523
+ deps.sendDesktopNotification("GSD", msg, "error", "budget", basename(s.originalBasePath || s.basePath));
524
524
  await deps.stopAuto(ctx, pi, "Budget ceiling reached");
525
525
  debugLog("autoLoop", { phase: "exit", reason: "budget-halt" });
526
526
  return { action: "break", reason: "budget-halt" };
527
527
  }
528
528
  if (budgetEnforcementAction === "pause") {
529
529
  ctx.ui.notify(`${msg} Pausing auto-mode — /gsd auto to override and continue.`, "warning");
530
- deps.sendDesktopNotification("GSD", msg, "warning", "budget");
530
+ deps.sendDesktopNotification("GSD", msg, "warning", "budget", basename(s.originalBasePath || s.basePath));
531
531
  deps.logCmuxEvent(prefs, msg, "warning");
532
532
  await deps.pauseAuto(ctx, pi);
533
533
  debugLog("autoLoop", { phase: "exit", reason: "budget-pause" });
534
534
  return { action: "break", reason: "budget-pause" };
535
535
  }
536
536
  ctx.ui.notify(`${msg} Continuing (enforcement: warn).`, "warning");
537
- deps.sendDesktopNotification("GSD", msg, "warning", "budget");
537
+ deps.sendDesktopNotification("GSD", msg, "warning", "budget", basename(s.originalBasePath || s.basePath));
538
538
  deps.logCmuxEvent(prefs, msg, "warning");
539
539
  }
540
540
  else if (threshold.pct < 100) {
541
541
  // Sub-100% — simple notification
542
542
  const msg = `${threshold.label}: ${deps.formatCost(totalCost)} / ${deps.formatCost(budgetCeiling)}`;
543
543
  ctx.ui.notify(msg, threshold.notifyLevel);
544
- deps.sendDesktopNotification("GSD", msg, threshold.notifyLevel, "budget");
544
+ deps.sendDesktopNotification("GSD", msg, threshold.notifyLevel, "budget", basename(s.originalBasePath || s.basePath));
545
545
  deps.logCmuxEvent(prefs, msg, threshold.cmuxLevel);
546
546
  }
547
547
  }
@@ -561,7 +561,7 @@ export async function runGuards(ic, mid) {
561
561
  contextUsage.percent >= contextThreshold) {
562
562
  const msg = `Context window at ${contextUsage.percent}% (threshold: ${contextThreshold}%). Pausing to prevent truncated output.`;
563
563
  ctx.ui.notify(`${msg} Run /gsd auto to continue (will start fresh session).`, "warning");
564
- deps.sendDesktopNotification("GSD", `Context ${contextUsage.percent}% — paused`, "warning", "attention");
564
+ deps.sendDesktopNotification("GSD", `Context ${contextUsage.percent}% — paused`, "warning", "attention", basename(s.originalBasePath || s.basePath));
565
565
  await deps.pauseAuto(ctx, pi);
566
566
  debugLog("autoLoop", { phase: "exit", reason: "context-window" });
567
567
  return { action: "break", reason: "context-window" };
@@ -646,6 +646,12 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
646
646
  lastProgressKind: "dispatch",
647
647
  recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
648
648
  });
649
+ // Select and apply model (with tier escalation on retry — normal units only)
650
+ const modelResult = await deps.selectAndApplyModel(ctx, pi, unitType, unitId, s.basePath, prefs, s.verbose, s.autoModeStartModel, sidecarItem ? undefined : { isRetry, previousTier });
651
+ s.currentUnitRouting =
652
+ modelResult.routing;
653
+ s.currentUnitModel =
654
+ modelResult.appliedModel;
649
655
  // Status bar + progress widget
650
656
  ctx.ui.setStatus("gsd-auto", "auto");
651
657
  if (mid)
@@ -709,12 +715,6 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
709
715
  const msg = reorderErr instanceof Error ? reorderErr.message : String(reorderErr);
710
716
  logWarning("engine", "Prompt reorder failed", { error: msg });
711
717
  }
712
- // Select and apply model (with tier escalation on retry — normal units only)
713
- const modelResult = await deps.selectAndApplyModel(ctx, pi, unitType, unitId, s.basePath, prefs, s.verbose, s.autoModeStartModel, sidecarItem ? undefined : { isRetry, previousTier });
714
- s.currentUnitRouting =
715
- modelResult.routing;
716
- s.currentUnitModel =
717
- modelResult.appliedModel;
718
718
  // Apply sidecar/pre-dispatch hook model override (takes priority over standard model selection)
719
719
  const hookModelOverride = sidecarItem?.model ?? iterData.hookModelOverride;
720
720
  if (hookModelOverride) {
@@ -806,7 +806,11 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
806
806
  // ── Immediate unit closeout (metrics, activity log, memory) ────────
807
807
  // Run right after runUnit() returns so telemetry is never lost to a
808
808
  // crash between iterations.
809
- await deps.closeoutUnit(ctx, s.basePath, unitType, unitId, s.currentUnit.startedAt, deps.buildSnapshotOpts(unitType, unitId));
809
+ // Guard: stopAuto() may have nulled s.currentUnit via s.reset() while
810
+ // this coroutine was suspended at `await runUnit(...)` (#2939).
811
+ if (s.currentUnit) {
812
+ await deps.closeoutUnit(ctx, s.basePath, unitType, unitId, s.currentUnit.startedAt, deps.buildSnapshotOpts(unitType, unitId));
813
+ }
810
814
  // ── Zero tool-call guard (#1833) ──────────────────────────────────
811
815
  // An execute-task agent that completes with 0 tool calls made no
812
816
  // real changes — its summary is hallucinated. Treat as failed so
@@ -814,7 +818,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
814
818
  if (unitType === "execute-task") {
815
819
  const currentLedger = deps.getLedger();
816
820
  if (currentLedger?.units) {
817
- const lastUnit = [...currentLedger.units].reverse().find((u) => u.type === unitType && u.id === unitId && u.startedAt === s.currentUnit.startedAt);
821
+ const lastUnit = [...currentLedger.units].reverse().find((u) => u.type === unitType && u.id === unitId && u.startedAt === s.currentUnit?.startedAt);
818
822
  if (lastUnit && lastUnit.toolCalls === 0) {
819
823
  debugLog("runUnitPhase", {
820
824
  phase: "zero-tool-calls",
@@ -825,7 +829,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
825
829
  ctx.ui.notify(`${unitType} ${unitId} completed with 0 tool calls — hallucinated summary, will retry`, "warning");
826
830
  // Fall through to next iteration where dispatch will re-derive
827
831
  // and re-dispatch this task.
828
- return { action: "next", data: { unitStartedAt: s.currentUnit.startedAt } };
832
+ return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
829
833
  }
830
834
  }
831
835
  }
@@ -840,7 +844,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
840
844
  s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
841
845
  }
842
846
  deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitResult.status, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
843
- return { action: "next", data: { unitStartedAt: s.currentUnit.startedAt } };
847
+ return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
844
848
  }
845
849
  // ─── runFinalize ──────────────────────────────────────────────────────────────
846
850
  /**
@@ -42,7 +42,7 @@ export function resolveExpectedArtifactPath(unitType, unitId, base) {
42
42
  }
43
43
  case "run-uat": {
44
44
  const dir = resolveSlicePath(base, mid, sid);
45
- return dir ? join(dir, buildSliceFileName(sid, "UAT")) : null;
45
+ return dir ? join(dir, buildSliceFileName(sid, "ASSESSMENT")) : null;
46
46
  }
47
47
  case "execute-task": {
48
48
  const dir = resolveSlicePath(base, mid, sid);
@@ -105,7 +105,7 @@ export function diagnoseExpectedArtifact(unitType, unitId, base) {
105
105
  case "reassess-roadmap":
106
106
  return `${relSliceFile(base, mid, sid, "ASSESSMENT")} (roadmap reassessment)`;
107
107
  case "run-uat":
108
- return `${relSliceFile(base, mid, sid, "UAT")} (UAT result)`;
108
+ return `${relSliceFile(base, mid, sid, "ASSESSMENT")} (UAT assessment result)`;
109
109
  case "validate-milestone":
110
110
  return `${relMilestoneFile(base, mid, "VALIDATION")} (milestone validation report)`;
111
111
  case "complete-milestone":
@@ -458,6 +458,13 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
458
458
  : theme.fg("dim", elapsed))
459
459
  : "";
460
460
  lines.push(rightAlign(headerLeft, headerRight, width));
461
+ // Worktree/branch right-aligned below header
462
+ if (worktreeName && cachedBranch) {
463
+ lines.push(rightAlign("", theme.fg("dim", `${worktreeName} (${cachedBranch})`), width));
464
+ }
465
+ else if (cachedBranch) {
466
+ lines.push(rightAlign("", theme.fg("dim", cachedBranch), width));
467
+ }
461
468
  // Show health signal details when degraded (yellow/red)
462
469
  if (score.level !== "green" && score.signals.length > 0 && widgetMode !== "min") {
463
470
  // Show up to 3 most relevant signals in compact form
@@ -564,10 +571,10 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
564
571
  const hasContext = !!(mid || (slice && unitType !== "research-milestone" && unitType !== "plan-milestone"));
565
572
  if (mid) {
566
573
  const modelTag = modelDisplay ? theme.fg("muted", ` ${modelDisplay}`) : "";
567
- lines.push(truncateToWidth(`${pad}${theme.fg("dim", mid.title)}${modelTag}`, width));
574
+ lines.push(truncateToWidth(`${pad}${theme.fg("dim", mid.title)}${modelTag}`, width, "…"));
568
575
  }
569
576
  if (slice && unitType !== "research-milestone" && unitType !== "plan-milestone") {
570
- lines.push(truncateToWidth(`${pad}${theme.fg("text", theme.bold(`${slice.id}: ${slice.title}`))}`, width));
577
+ lines.push(truncateToWidth(`${pad}${theme.fg("text", theme.bold(`${slice.id}: ${slice.title}`))}`, width, "…"));
571
578
  }
572
579
  if (hasContext)
573
580
  lines.push("");
@@ -605,6 +612,11 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
605
612
  // Build right column: task checklist
606
613
  const rightLines = [];
607
614
  const maxVisibleTasks = 8;
615
+ // Max visible chars for task title text (before ANSI theming)
616
+ const maxTaskTitleLen = 45;
617
+ function truncTitle(s) {
618
+ return s.length > maxTaskTitleLen ? s.slice(0, maxTaskTitleLen - 1) + "…" : s;
619
+ }
608
620
  function formatTaskLine(t, isCurrent) {
609
621
  const glyph = t.done
610
622
  ? theme.fg("success", "*")
@@ -616,11 +628,12 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
616
628
  : t.done
617
629
  ? theme.fg("muted", t.id)
618
630
  : theme.fg("dim", t.id);
631
+ const short = truncTitle(t.title);
619
632
  const title = isCurrent
620
- ? theme.fg("text", t.title)
633
+ ? theme.fg("text", short)
621
634
  : t.done
622
- ? theme.fg("muted", t.title)
623
- : theme.fg("text", t.title);
635
+ ? theme.fg("muted", short)
636
+ : theme.fg("text", short);
624
637
  return `${glyph} ${id}: ${title}`;
625
638
  }
626
639
  if (useTwoCol && taskDetailsCol) {
@@ -642,7 +655,7 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
642
655
  if (maxRows > 0) {
643
656
  lines.push("");
644
657
  for (let i = 0; i < maxRows; i++) {
645
- const left = padToWidth(truncateToWidth(leftLines[i] ?? "", leftColWidth), leftColWidth);
658
+ const left = padToWidth(truncateToWidth(leftLines[i] ?? "", leftColWidth, "…"), leftColWidth);
646
659
  const right = rightLines[i] ?? "";
647
660
  lines.push(`${left}${right}`);
648
661
  }
@@ -652,7 +665,7 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
652
665
  if (leftLines.length > 0) {
653
666
  lines.push("");
654
667
  for (const l of leftLines)
655
- lines.push(truncateToWidth(l, width));
668
+ lines.push(truncateToWidth(l, width, "…"));
656
669
  }
657
670
  }
658
671
  // ── Footer: simplified stats + pwd + last commit + hints ────────
@@ -682,24 +695,28 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
682
695
  lines.push(rightAlign("", theme.fg("dim", cachedRtkLabel), width));
683
696
  }
684
697
  }
685
- // PWD line with last commit info right-aligned
698
+ // Last commit info
686
699
  const lastCommit = getLastCommit(accessors.getBasePath());
687
- const commitStr = lastCommit
688
- ? theme.fg("dim", `${lastCommit.timeAgo} ago: ${lastCommit.message}`)
700
+ const maxCommitLen = 65;
701
+ const commitMsg = lastCommit
702
+ ? lastCommit.message.length > maxCommitLen
703
+ ? lastCommit.message.slice(0, maxCommitLen - 1) + "…"
704
+ : lastCommit.message
689
705
  : "";
690
- const pwdStr = theme.fg("dim", widgetPwd);
691
- if (commitStr) {
692
- lines.push(rightAlign(`${pad}${pwdStr}`, truncateToWidth(commitStr, Math.floor(width * 0.45)), width));
693
- }
694
- else {
695
- lines.push(`${pad}${pwdStr}`);
696
- }
697
706
  // Hints line
698
707
  const hintParts = [];
699
708
  hintParts.push("esc pause");
700
709
  hintParts.push(process.platform === "darwin" ? "⌃⌥G dashboard" : "Ctrl+Alt+G dashboard");
701
710
  const hintStr = theme.fg("dim", hintParts.join(" | "));
702
- lines.push(rightAlign("", hintStr, width));
711
+ const commitStr = lastCommit
712
+ ? theme.fg("dim", `${lastCommit.timeAgo} ago: ${commitMsg}`)
713
+ : "";
714
+ if (commitStr) {
715
+ lines.push(rightAlign(`${pad}${commitStr}`, hintStr, width));
716
+ }
717
+ else {
718
+ lines.push(rightAlign("", hintStr, width));
719
+ }
703
720
  lines.push(...ui.bar());
704
721
  cachedLines = lines;
705
722
  cachedWidth = width;
@@ -723,12 +740,12 @@ function rightAlign(left, right, width) {
723
740
  const leftVis = visibleWidth(left);
724
741
  const rightVis = visibleWidth(right);
725
742
  const gap = Math.max(1, width - leftVis - rightVis);
726
- return truncateToWidth(left + " ".repeat(gap) + right, width);
743
+ return truncateToWidth(left + " ".repeat(gap) + right, width, "…");
727
744
  }
728
745
  /** Pad a string with trailing spaces to fill exactly `colWidth` (ANSI-aware). */
729
746
  function padToWidth(s, colWidth) {
730
747
  const vis = visibleWidth(s);
731
748
  if (vis >= colWidth)
732
- return truncateToWidth(s, colWidth);
749
+ return truncateToWidth(s, colWidth, "…");
733
750
  return s + " ".repeat(colWidth - vis);
734
751
  }
@@ -13,6 +13,7 @@ import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted
13
13
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
14
14
  import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
15
15
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
16
+ import { logError } from "./workflow-logger.js";
16
17
  import { join } from "node:path";
17
18
  import { hasImplementationArtifacts } from "./auto-recovery.js";
18
19
  import { buildDiscussMilestonePrompt, buildResearchMilestonePrompt, buildPlanMilestonePrompt, buildResearchSlicePrompt, buildPlanSlicePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReplanSlicePrompt, buildRunUatPrompt, buildReassessRoadmapPrompt, buildRewriteDocsPrompt, buildReactiveExecutePrompt, buildGateEvaluatePrompt, checkNeedsReassessment, checkNeedsRunUat, } from "./auto-prompts.js";
@@ -59,6 +60,20 @@ export function setRewriteCount(basePath, count) {
59
60
  mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
60
61
  writeFileSync(filePath, JSON.stringify({ count, updatedAt: new Date().toISOString() }) + "\n");
61
62
  }
63
+ // ─── Helpers ─────────────────────────────────────────────────────────────
64
+ /**
65
+ * Returns true when the verification_operational value indicates that no
66
+ * operational verification is needed. Covers common phrasings the planning
67
+ * agent may use: "None", "None required", "N/A", "Not applicable", etc.
68
+ *
69
+ * @see https://github.com/gsd-build/gsd-2/issues/2931
70
+ */
71
+ export function isVerificationNotApplicable(value) {
72
+ const v = (value ?? "").toLowerCase().trim();
73
+ if (!v || v === "none")
74
+ return true;
75
+ return /^(?:none[\s._-]*(?:required|needed|planned)?|n\/?a|not[\s._-]+(?:applicable|required|needed)|no[\s._-]+operational[\s\S]*)$/i.test(v);
76
+ }
62
77
  // ─── Rules ────────────────────────────────────────────────────────────────
63
78
  export const DISPATCH_RULES = [
64
79
  {
@@ -383,7 +398,7 @@ export const DISPATCH_RULES = [
383
398
  }
384
399
  catch (err) {
385
400
  // Non-fatal — fall through to sequential execution
386
- process.stderr.write(`gsd-reactive: graph derivation failed: ${err.message}\n`);
401
+ logError("dispatch", "reactive graph derivation failed", { error: err.message });
387
402
  return null;
388
403
  }
389
404
  },
@@ -526,16 +541,16 @@ export const DISPATCH_RULES = [
526
541
  if (isDbAvailable()) {
527
542
  const milestone = getMilestone(mid);
528
543
  if (milestone?.verification_operational &&
529
- milestone.verification_operational.toLowerCase() !== "none") {
544
+ !isVerificationNotApplicable(milestone.verification_operational)) {
530
545
  const validationPath = resolveMilestoneFile(basePath, mid, "VALIDATION");
531
546
  if (validationPath) {
532
547
  const validationContent = await loadFile(validationPath);
533
548
  if (validationContent) {
534
- // Accept either the structured template format (table with MET/N/A)
549
+ // Accept either the structured template format (table with MET/N/A/SATISFIED)
535
550
  // or prose evidence patterns the validation agent may emit.
536
551
  const structuredMatch = validationContent.includes("Operational") &&
537
- (validationContent.includes("MET") || validationContent.includes("N/A"));
538
- const proseMatch = /[Oo]perational[\s:][^\n]*(?:pass|verified|confirmed|met|complete|true|yes|addressed|covered|n\/a|not\s+applicable)/i.test(validationContent);
552
+ (validationContent.includes("MET") || validationContent.includes("N/A") || validationContent.includes("SATISFIED"));
553
+ const proseMatch = /[Oo]perational[\s\S]{0,500}?(?:✅|pass|verified|confirmed|met|complete|true|yes|addressed|covered|satisfied|partially|n\/a|not[\s-]+applicable)/i.test(validationContent);
539
554
  const hasOperationalCheck = structuredMatch || proseMatch;
540
555
  if (!hasOperationalCheck) {
541
556
  return {