gsd-pi 2.73.1 → 2.74.0-dev.0306a2e

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 (640) hide show
  1. package/dist/cli-web-branch.d.ts +4 -3
  2. package/dist/cli-web-branch.js +10 -7
  3. package/dist/cli.js +184 -206
  4. package/dist/headless-query.js +4 -1
  5. package/dist/help-text.js +23 -0
  6. package/dist/logo.d.ts +1 -1
  7. package/dist/logo.js +1 -1
  8. package/dist/onboarding.js +59 -53
  9. package/dist/resource-loader.js +2 -2
  10. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +68 -4
  11. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  12. package/dist/resources/extensions/gsd/auto/detect-stuck.js +11 -4
  13. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  14. package/dist/resources/extensions/gsd/auto/phases.js +173 -13
  15. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  16. package/dist/resources/extensions/gsd/auto-dispatch.js +22 -4
  17. package/dist/resources/extensions/gsd/auto-model-selection.js +105 -16
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +254 -15
  19. package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
  20. package/dist/resources/extensions/gsd/auto-start.js +23 -6
  21. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +13 -0
  22. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  23. package/dist/resources/extensions/gsd/auto-verification.js +186 -3
  24. package/dist/resources/extensions/gsd/auto.js +65 -12
  25. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
  26. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +41 -2
  27. package/dist/resources/extensions/gsd/commands/catalog.js +26 -1
  28. package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
  29. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
  30. package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
  31. package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
  32. package/dist/resources/extensions/gsd/commands-do.js +79 -0
  33. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  34. package/dist/resources/extensions/gsd/commands-handlers.js +8 -2
  35. package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
  36. package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  38. package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
  39. package/dist/resources/extensions/gsd/commands-ship.js +187 -0
  40. package/dist/resources/extensions/gsd/db-writer.js +3 -5
  41. package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -2
  42. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  43. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  44. package/dist/resources/extensions/gsd/git-service.js +49 -1
  45. package/dist/resources/extensions/gsd/graph-context.js +157 -0
  46. package/dist/resources/extensions/gsd/gsd-db.js +581 -2
  47. package/dist/resources/extensions/gsd/guided-flow.js +23 -0
  48. package/dist/resources/extensions/gsd/index.js +15 -2
  49. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  50. package/dist/resources/extensions/gsd/journal.js +27 -0
  51. package/dist/resources/extensions/gsd/md-importer.js +3 -4
  52. package/dist/resources/extensions/gsd/memory-store.js +19 -51
  53. package/dist/resources/extensions/gsd/metrics.js +19 -0
  54. package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
  55. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
  56. package/dist/resources/extensions/gsd/notification-widget.js +2 -2
  57. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  58. package/dist/resources/extensions/gsd/preferences-models.js +63 -3
  59. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  60. package/dist/resources/extensions/gsd/preferences-validation.js +130 -2
  61. package/dist/resources/extensions/gsd/preferences.js +26 -0
  62. package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
  63. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  64. package/dist/resources/extensions/gsd/state.js +66 -15
  65. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  66. package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
  67. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  68. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
  69. package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
  70. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  71. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  72. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  73. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  74. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  75. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  76. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  77. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  78. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  79. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  80. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  81. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  82. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  83. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
  84. package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
  85. package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
  86. package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
  87. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  88. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  89. package/dist/update-check.d.ts +1 -0
  90. package/dist/update-check.js +13 -5
  91. package/dist/update-cmd.js +4 -3
  92. package/dist/web/standalone/.next/BUILD_ID +1 -1
  93. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  94. package/dist/web/standalone/.next/build-manifest.json +3 -3
  95. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  96. package/dist/web/standalone/.next/required-server-files.json +3 -3
  97. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  98. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  108. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  110. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  112. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  124. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  136. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  166. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  186. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  188. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  190. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  192. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/index.html +1 -1
  202. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  203. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  204. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  205. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  207. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/page.js +2 -2
  209. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  211. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  212. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  213. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  215. package/dist/web/standalone/.next/server/middleware.js +2 -2
  216. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  218. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  219. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  220. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  221. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  222. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  223. package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  226. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  227. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  228. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  229. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  230. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  231. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  232. package/dist/web/standalone/server.js +1 -1
  233. package/package.json +3 -3
  234. package/packages/daemon/package.json +2 -2
  235. package/packages/mcp-server/dist/index.d.ts +3 -0
  236. package/packages/mcp-server/dist/index.d.ts.map +1 -1
  237. package/packages/mcp-server/dist/index.js +3 -0
  238. package/packages/mcp-server/dist/index.js.map +1 -1
  239. package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
  240. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
  241. package/packages/mcp-server/dist/readers/graph.js +655 -0
  242. package/packages/mcp-server/dist/readers/graph.js.map +1 -0
  243. package/packages/mcp-server/dist/readers/index.d.ts +2 -0
  244. package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
  245. package/packages/mcp-server/dist/readers/index.js +1 -0
  246. package/packages/mcp-server/dist/readers/index.js.map +1 -1
  247. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  248. package/packages/mcp-server/dist/server.js +65 -0
  249. package/packages/mcp-server/dist/server.js.map +1 -1
  250. package/packages/mcp-server/package.json +2 -2
  251. package/packages/mcp-server/src/index.ts +15 -0
  252. package/packages/mcp-server/src/readers/graph.test.ts +604 -0
  253. package/packages/mcp-server/src/readers/graph.ts +855 -0
  254. package/packages/mcp-server/src/readers/index.ts +12 -0
  255. package/packages/mcp-server/src/server.ts +83 -0
  256. package/packages/mcp-server/tsconfig.json +1 -0
  257. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
  258. package/packages/native/package.json +2 -2
  259. package/packages/native/tsconfig.tsbuildinfo +1 -0
  260. package/packages/pi-agent-core/package.json +1 -1
  261. package/packages/pi-agent-core/tsconfig.json +1 -0
  262. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
  263. package/packages/pi-ai/dist/index.d.ts +2 -9
  264. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  265. package/packages/pi-ai/dist/index.js +2 -9
  266. package/packages/pi-ai/dist/index.js.map +1 -1
  267. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  268. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  269. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  270. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  271. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  272. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  273. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  274. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  275. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  276. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  277. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  278. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  279. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  280. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  281. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  282. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  283. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  284. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  285. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  286. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  287. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  288. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  289. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  290. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  291. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  292. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  293. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  294. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  295. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  296. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  297. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  298. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  299. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  300. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  301. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  302. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  303. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  304. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  305. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  306. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  307. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  308. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  309. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  310. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  311. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  312. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  313. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  314. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  315. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  316. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  317. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  318. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  319. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  320. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  321. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  322. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  323. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  324. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  325. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  326. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  327. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  328. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  329. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  330. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  331. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  332. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  333. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  334. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  335. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  336. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  337. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  338. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  339. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  340. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  341. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  342. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  343. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  344. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  345. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  346. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  347. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  348. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  350. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  351. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  352. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  353. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  354. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  355. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  356. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  357. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  358. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  359. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  360. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  361. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  362. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  363. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  364. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  365. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  366. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  367. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  368. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  369. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  370. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  371. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  372. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  373. package/packages/pi-ai/dist/models/index.js +80 -0
  374. package/packages/pi-ai/dist/models/index.js.map +1 -0
  375. package/packages/pi-ai/dist/models.d.ts +1 -36
  376. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  377. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  378. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  379. package/packages/pi-ai/dist/models.js +3 -112
  380. package/packages/pi-ai/dist/models.js.map +1 -1
  381. package/packages/pi-ai/dist/models.test.js +6 -5
  382. package/packages/pi-ai/dist/models.test.js.map +1 -1
  383. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  384. package/packages/pi-ai/dist/utils/overflow.js +12 -0
  385. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  386. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts +2 -0
  387. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts.map +1 -0
  388. package/packages/pi-ai/dist/utils/tests/overflow.test.js +50 -0
  389. package/packages/pi-ai/dist/utils/tests/overflow.test.js.map +1 -0
  390. package/packages/pi-ai/package.json +1 -1
  391. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  392. package/packages/pi-ai/src/index.ts +5 -9
  393. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  394. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  395. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  396. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  397. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  398. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  399. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  400. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  401. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  402. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  403. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  404. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  405. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  406. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  407. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  408. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  409. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  410. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  411. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  412. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  413. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  414. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  415. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  416. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  417. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  418. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  419. package/packages/pi-ai/src/models/index.ts +106 -0
  420. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  421. package/packages/pi-ai/src/models.test.ts +6 -5
  422. package/packages/pi-ai/src/models.ts +3 -153
  423. package/packages/pi-ai/src/utils/overflow.ts +14 -1
  424. package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
  425. package/packages/pi-ai/tsconfig.json +1 -0
  426. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
  427. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +721 -8
  428. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/core/compaction/utils.js +5 -5
  430. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  431. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts +2 -0
  432. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts.map +1 -0
  433. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +45 -0
  434. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -0
  435. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  436. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  437. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  438. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  439. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  440. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  441. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  442. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +12 -2
  443. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  444. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +65 -28
  445. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  446. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts +2 -1
  447. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  448. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +9 -3
  449. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  450. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts +2 -0
  451. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts.map +1 -0
  452. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +52 -0
  453. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -0
  454. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  455. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +305 -20
  456. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  457. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  458. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  459. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  460. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  461. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +13 -0
  462. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  463. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +59 -6
  464. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  465. package/packages/pi-coding-agent/package.json +1 -1
  466. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +884 -8
  467. package/packages/pi-coding-agent/src/core/compaction/utils.ts +5 -5
  468. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +50 -0
  469. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  470. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  471. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +78 -32
  472. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +73 -0
  473. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +9 -3
  474. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +381 -39
  475. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  476. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +79 -6
  477. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  478. package/packages/pi-coding-agent/tsconfig.json +3 -2
  479. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
  480. package/packages/pi-tui/dist/__tests__/tui.test.js +60 -1
  481. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  482. package/packages/pi-tui/dist/tui.d.ts +8 -0
  483. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  484. package/packages/pi-tui/dist/tui.js +32 -3
  485. package/packages/pi-tui/dist/tui.js.map +1 -1
  486. package/packages/pi-tui/package.json +1 -1
  487. package/packages/pi-tui/src/__tests__/tui.test.ts +76 -1
  488. package/packages/pi-tui/src/tui.ts +31 -3
  489. package/packages/pi-tui/tsconfig.json +1 -0
  490. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  491. package/packages/rpc-client/package.json +1 -1
  492. package/packages/rpc-client/tsconfig.json +1 -0
  493. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
  494. package/pkg/package.json +1 -1
  495. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +107 -5
  496. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +111 -2
  497. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  498. package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
  499. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
  500. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  501. package/src/resources/extensions/gsd/auto/phases.ts +213 -13
  502. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  503. package/src/resources/extensions/gsd/auto-dispatch.ts +26 -10
  504. package/src/resources/extensions/gsd/auto-model-selection.ts +151 -16
  505. package/src/resources/extensions/gsd/auto-post-unit.ts +278 -16
  506. package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
  507. package/src/resources/extensions/gsd/auto-start.ts +30 -6
  508. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +17 -0
  509. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  510. package/src/resources/extensions/gsd/auto-verification.ts +225 -3
  511. package/src/resources/extensions/gsd/auto.ts +72 -16
  512. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
  513. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +52 -2
  514. package/src/resources/extensions/gsd/commands/catalog.ts +26 -1
  515. package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
  516. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
  517. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  518. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  519. package/src/resources/extensions/gsd/commands-do.ts +109 -0
  520. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  521. package/src/resources/extensions/gsd/commands-handlers.ts +8 -2
  522. package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
  523. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  524. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  525. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  526. package/src/resources/extensions/gsd/commands-ship.ts +219 -0
  527. package/src/resources/extensions/gsd/db-writer.ts +3 -5
  528. package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -2
  529. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  530. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  531. package/src/resources/extensions/gsd/git-service.ts +68 -0
  532. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  533. package/src/resources/extensions/gsd/gsd-db.ts +788 -3
  534. package/src/resources/extensions/gsd/guided-flow.ts +32 -0
  535. package/src/resources/extensions/gsd/index.ts +18 -2
  536. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  537. package/src/resources/extensions/gsd/journal.ts +30 -0
  538. package/src/resources/extensions/gsd/md-importer.ts +3 -5
  539. package/src/resources/extensions/gsd/memory-store.ts +31 -62
  540. package/src/resources/extensions/gsd/metrics.ts +26 -0
  541. package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
  542. package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
  543. package/src/resources/extensions/gsd/notification-widget.ts +2 -2
  544. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  545. package/src/resources/extensions/gsd/preferences-models.ts +61 -3
  546. package/src/resources/extensions/gsd/preferences-types.ts +44 -0
  547. package/src/resources/extensions/gsd/preferences-validation.ts +130 -2
  548. package/src/resources/extensions/gsd/preferences.ts +28 -0
  549. package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
  550. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  551. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  552. package/src/resources/extensions/gsd/state.ts +80 -17
  553. package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  554. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +9 -5
  555. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  556. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +53 -0
  557. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  558. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +51 -2
  559. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  560. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  561. package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
  562. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  563. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  564. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  565. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  566. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
  567. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +142 -0
  568. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  569. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  570. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +42 -0
  571. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -2
  572. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -2
  573. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +68 -8
  574. package/src/resources/extensions/gsd/tests/derive-state.test.ts +3 -3
  575. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
  576. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  577. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +137 -1
  578. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  579. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  580. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  581. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  582. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +68 -1
  583. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  584. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  585. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +91 -2
  586. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
  587. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  588. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  589. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  590. package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -0
  591. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  592. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  593. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -7
  594. package/src/resources/extensions/gsd/tests/token-profile.test.ts +9 -6
  595. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  596. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  597. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  598. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  599. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  600. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  601. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  602. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  603. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  604. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  605. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +179 -0
  606. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  607. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
  608. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
  609. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  610. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
  611. package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
  612. package/src/resources/extensions/gsd/types.ts +14 -1
  613. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  614. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  615. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  616. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  617. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  618. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  619. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  620. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  621. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  622. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  623. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  624. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  625. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  626. package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
  627. package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
  628. package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
  629. package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
  630. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  631. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  632. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  633. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  634. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  635. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  636. package/packages/pi-ai/dist/models.generated.js +0 -14343
  637. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  638. package/packages/pi-ai/src/models.generated.ts +0 -14345
  639. /package/dist/web/standalone/.next/static/{Qr27MOHx0lxRGnJvlhxxu → tqdo0yKKYz6fJXQnIgbdx}/_buildManifest.js +0 -0
  640. /package/dist/web/standalone/.next/static/{Qr27MOHx0lxRGnJvlhxxu → tqdo0yKKYz6fJXQnIgbdx}/_ssgManifest.js +0 -0
@@ -71,8 +71,8 @@ const OTHER_PROVIDERS = [
71
71
  ];
72
72
  // ─── Dynamic imports ──────────────────────────────────────────────────────────
73
73
  /**
74
- * Dynamically import @clack/prompts and picocolors.
75
- * Dynamic import with fallback so the module doesn't crash if they're missing.
74
+ * Dynamically import @clack/prompts.
75
+ * Dynamic import with fallback so the module doesn't crash if it's missing.
76
76
  */
77
77
  async function loadClack() {
78
78
  try {
@@ -82,10 +82,23 @@ async function loadClack() {
82
82
  throw new Error('[gsd] @clack/prompts not found — onboarding wizard requires this dependency');
83
83
  }
84
84
  }
85
+ /**
86
+ * Build the PicoModule color surface from chalk. Chalk is already a
87
+ * dependency of the CLI; this adapter keeps the onboarding call sites stable
88
+ * while removing the redundant picocolors dep.
89
+ */
85
90
  async function loadPico() {
86
91
  try {
87
- const mod = await import('picocolors');
88
- return mod.default ?? mod;
92
+ const { default: chalk } = await import('chalk');
93
+ return {
94
+ cyan: (s) => chalk.cyan(s),
95
+ green: (s) => chalk.green(s),
96
+ yellow: (s) => chalk.yellow(s),
97
+ dim: (s) => chalk.dim(s),
98
+ bold: (s) => chalk.bold(s),
99
+ red: (s) => chalk.red(s),
100
+ reset: (s) => chalk.reset(s),
101
+ };
89
102
  }
90
103
  catch {
91
104
  // Fallback: return identity functions
@@ -105,9 +118,29 @@ function openBrowser(url) {
105
118
  execFile(cmd, [url], () => { });
106
119
  }
107
120
  }
108
- /** Check if an error is a clack cancel signal */
109
- function isCancelError(p, err) {
110
- return p.isCancel(err);
121
+ /** Sentinel returned by runStep when the user cancels tells the caller
122
+ * to abort the entire wizard. */
123
+ const STEP_CANCELLED = Symbol('step-cancelled');
124
+ /**
125
+ * Run a single onboarding step with shared error handling:
126
+ * - user cancel (Ctrl+C) → p.cancel(cancelMessage), returns STEP_CANCELLED
127
+ * - other error → p.log.warn + optional info follow-up, returns null
128
+ * - success → the step's return value
129
+ */
130
+ async function runStep(p, warnLabel, fn, opts = {}) {
131
+ try {
132
+ return await fn();
133
+ }
134
+ catch (err) {
135
+ if (p.isCancel(err)) {
136
+ p.cancel(opts.cancelMessage ?? 'Setup cancelled.');
137
+ return STEP_CANCELLED;
138
+ }
139
+ p.log.warn(`${warnLabel}: ${err instanceof Error ? err.message : String(err)}`);
140
+ if (opts.errorInfo)
141
+ p.log.info(opts.errorInfo);
142
+ return null;
143
+ }
111
144
  }
112
145
  // ─── Public API ───────────────────────────────────────────────────────────────
113
146
  /**
@@ -160,55 +193,28 @@ export async function runOnboarding(authStorage) {
160
193
  process.stderr.write(renderLogo(pc.cyan));
161
194
  p.intro(pc.bold('Welcome to GSD — let\'s get you set up'));
162
195
  // ── LLM Provider Selection ────────────────────────────────────────────────
163
- let llmConfigured = false;
164
- try {
165
- llmConfigured = await runLlmStep(p, pc, authStorage);
166
- }
167
- catch (err) {
168
- // User cancelled (Ctrl+C in clack throws) or unexpected error
169
- if (isCancelError(p, err)) {
170
- p.cancel('Setup cancelled — you can run /login inside GSD later.');
171
- return;
172
- }
173
- p.log.warn(`LLM setup failed: ${err instanceof Error ? err.message : String(err)}`);
174
- p.log.info('You can configure your LLM provider later with /login inside GSD.');
175
- }
196
+ const llmResult = await runStep(p, 'LLM setup failed', () => runLlmStep(p, pc, authStorage), {
197
+ cancelMessage: 'Setup cancelled — you can run /login inside GSD later.',
198
+ errorInfo: 'You can configure your LLM provider later with /login inside GSD.',
199
+ });
200
+ if (llmResult === STEP_CANCELLED)
201
+ return;
202
+ const llmConfigured = llmResult ?? false;
176
203
  // ── Web Search Provider ──────────────────────────────────────────────────
177
- let searchConfigured = null;
178
- try {
179
- searchConfigured = await runWebSearchStep(p, pc, authStorage, llmConfigured);
180
- }
181
- catch (err) {
182
- if (isCancelError(p, err)) {
183
- p.cancel('Setup cancelled.');
184
- return;
185
- }
186
- p.log.warn(`Web search setup failed: ${err instanceof Error ? err.message : String(err)}`);
187
- }
204
+ const searchResult = await runStep(p, 'Web search setup failed', () => runWebSearchStep(p, pc, authStorage, llmConfigured));
205
+ if (searchResult === STEP_CANCELLED)
206
+ return;
207
+ const searchConfigured = searchResult;
188
208
  // ── Remote Questions ─────────────────────────────────────────────────────
189
- let remoteConfigured = null;
190
- try {
191
- remoteConfigured = await runRemoteQuestionsStep(p, pc, authStorage);
192
- }
193
- catch (err) {
194
- if (isCancelError(p, err)) {
195
- p.cancel('Setup cancelled.');
196
- return;
197
- }
198
- p.log.warn(`Remote questions setup failed: ${err instanceof Error ? err.message : String(err)}`);
199
- }
209
+ const remoteResult = await runStep(p, 'Remote questions setup failed', () => runRemoteQuestionsStep(p, pc, authStorage));
210
+ if (remoteResult === STEP_CANCELLED)
211
+ return;
212
+ const remoteConfigured = remoteResult;
200
213
  // ── Tool API Keys ─────────────────────────────────────────────────────────
201
- let toolKeyCount = 0;
202
- try {
203
- toolKeyCount = await runToolKeysStep(p, pc, authStorage);
204
- }
205
- catch (err) {
206
- if (isCancelError(p, err)) {
207
- p.cancel('Setup cancelled.');
208
- return;
209
- }
210
- p.log.warn(`Tool key setup failed: ${err instanceof Error ? err.message : String(err)}`);
211
- }
214
+ const toolResult = await runStep(p, 'Tool key setup failed', () => runToolKeysStep(p, pc, authStorage));
215
+ if (toolResult === STEP_CANCELLED)
216
+ return;
217
+ const toolKeyCount = toolResult ?? 0;
212
218
  // ── Summary ───────────────────────────────────────────────────────────────
213
219
  const summaryLines = [];
214
220
  if (llmConfigured) {
@@ -358,7 +358,7 @@ function reconcileMergedNodeModules(agentNodeModules, hoisted, internal) {
358
358
  if (entry.name.startsWith('.'))
359
359
  continue;
360
360
  try {
361
- symlinkSync(join(hoisted, entry.name), join(agentNodeModules, entry.name));
361
+ symlinkSync(join(hoisted, entry.name), join(agentNodeModules, entry.name), 'junction');
362
362
  linkedCount++;
363
363
  }
364
364
  catch { /* skip individual */ }
@@ -382,7 +382,7 @@ function reconcileMergedNodeModules(agentNodeModules, hoisted, internal) {
382
382
  }
383
383
  catch { /* didn't exist — will create below */ }
384
384
  try {
385
- symlinkSync(join(internal, entry.name), link);
385
+ symlinkSync(join(internal, entry.name), link, 'junction');
386
386
  linkedCount++;
387
387
  }
388
388
  catch { /* skip individual */ }
@@ -6,7 +6,7 @@
6
6
  * AssistantMessageEvents for TUI rendering, then strips tool-call blocks from
7
7
  * the final AssistantMessage so GSD's agent loop doesn't try to dispatch them.
8
8
  */
9
- import { EventStream } from "@gsd/pi-ai";
9
+ import { EventStream, mapThinkingLevelToEffort, supportsAdaptiveThinking } from "@gsd/pi-ai";
10
10
  import { execSync } from "node:child_process";
11
11
  import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
12
12
  import { buildWorkflowMcpServers } from "../gsd/workflow-mcp.js";
@@ -123,6 +123,63 @@ export function buildPromptFromContext(context) {
123
123
  }
124
124
  return parts.join("\n\n");
125
125
  }
126
+ function stripDataUriPrefix(value) {
127
+ const commaIndex = value.indexOf(",");
128
+ if (value.startsWith("data:") && commaIndex !== -1) {
129
+ return value.slice(commaIndex + 1);
130
+ }
131
+ return value;
132
+ }
133
+ function inferMimeTypeFromDataUri(value) {
134
+ const match = /^data:([^;,]+);base64,/.exec(value);
135
+ return match?.[1] ?? null;
136
+ }
137
+ export function extractImageBlocksFromContext(context) {
138
+ const imageBlocks = [];
139
+ for (const msg of context.messages) {
140
+ if (msg.role !== "user" || !Array.isArray(msg.content))
141
+ continue;
142
+ for (const part of msg.content) {
143
+ if (!part || typeof part !== "object")
144
+ continue;
145
+ const block = part;
146
+ if (block.type !== "image" || typeof block.data !== "string")
147
+ continue;
148
+ const mimeType = typeof block.mimeType === "string" && block.mimeType.length > 0
149
+ ? block.mimeType
150
+ : inferMimeTypeFromDataUri(block.data);
151
+ if (!mimeType)
152
+ continue;
153
+ imageBlocks.push({
154
+ type: "image",
155
+ source: {
156
+ type: "base64",
157
+ media_type: mimeType,
158
+ data: stripDataUriPrefix(block.data),
159
+ },
160
+ });
161
+ }
162
+ }
163
+ return imageBlocks;
164
+ }
165
+ export function buildSdkQueryPrompt(context, textPrompt = buildPromptFromContext(context)) {
166
+ const imageBlocks = extractImageBlocksFromContext(context);
167
+ if (imageBlocks.length === 0) {
168
+ return textPrompt;
169
+ }
170
+ const content = [...imageBlocks];
171
+ if (textPrompt) {
172
+ content.push({ type: "text", text: textPrompt });
173
+ }
174
+ const sdkMessage = {
175
+ type: "user",
176
+ message: { role: "user", content },
177
+ parent_tool_use_id: null,
178
+ };
179
+ return (async function* () {
180
+ yield sdkMessage;
181
+ })();
182
+ }
126
183
  // ---------------------------------------------------------------------------
127
184
  // Error helper
128
185
  // ---------------------------------------------------------------------------
@@ -437,6 +494,7 @@ export async function resolveClaudePermissionMode(env = process.env) {
437
494
  * behaviour pass `permissionMode: "bypassPermissions"` explicitly.
438
495
  */
439
496
  export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
497
+ const { reasoning, ...sdkExtraOptions } = extraOptions;
440
498
  const mcpServers = buildWorkflowMcpServers();
441
499
  const permissionMode = overrides?.permissionMode ?? "bypassPermissions";
442
500
  const disallowedTools = ["AskUserQuestion"];
@@ -455,6 +513,9 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
455
513
  "Bash(pwd)",
456
514
  ...(mcpServers ? Object.keys(mcpServers).map((serverName) => `mcp__${serverName}__*`) : []),
457
515
  ];
516
+ const effort = reasoning && supportsAdaptiveThinking(modelId)
517
+ ? mapThinkingLevelToEffort(reasoning, modelId)
518
+ : undefined;
458
519
  return {
459
520
  pathToClaudeCodeExecutable: getClaudePath(),
460
521
  model: modelId,
@@ -469,7 +530,8 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
469
530
  ...(allowedTools.length > 0 ? { allowedTools } : {}),
470
531
  ...(mcpServers ? { mcpServers } : {}),
471
532
  betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
472
- ...extraOptions,
533
+ ...(effort ? { effort } : {}),
534
+ ...sdkExtraOptions,
473
535
  };
474
536
  }
475
537
  function normalizeToolResultContent(content) {
@@ -617,14 +679,16 @@ async function pumpSdkMessages(model, context, options, stream) {
617
679
  options.signal.addEventListener("abort", () => controller.abort(), { once: true });
618
680
  }
619
681
  const prompt = buildPromptFromContext(context);
682
+ const queryPrompt = buildSdkQueryPrompt(context, prompt);
620
683
  const permissionMode = await resolveClaudePermissionMode();
621
684
  const sdkOpts = buildSdkOptions(modelId, prompt, { permissionMode }, typeof options?.extensionUIContext === "object"
622
685
  ? {
686
+ reasoning: options?.reasoning,
623
687
  onElicitation: createClaudeCodeElicitationHandler(options?.extensionUIContext),
624
688
  }
625
- : {});
689
+ : { reasoning: options?.reasoning });
626
690
  const queryResult = sdk.query({
627
- prompt,
691
+ prompt: queryPrompt,
628
692
  options: {
629
693
  ...sdkOpts,
630
694
  abortController: controller,
@@ -13,6 +13,8 @@ import { join } from "node:path";
13
13
  import { GSDError, GSD_IO_ERROR } from "./errors.js";
14
14
  const SEQ_PREFIX_RE = /^(\d+)-/;
15
15
  import { gsdRoot } from "./paths.js";
16
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
17
+ import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
16
18
  const activityLogState = new Map();
17
19
  /**
18
20
  * Clear accumulated activity log state (#611).
@@ -110,6 +112,20 @@ export function saveActivityLog(ctx, basePath, unitType, unitId) {
110
112
  }
111
113
  state.nextSeq += 1;
112
114
  state.lastSnapshotKeyByUnit.set(unitKey, key);
115
+ if (isUnifiedAuditEnabled()) {
116
+ emitUokAuditEvent(basePath, buildAuditEnvelope({
117
+ traceId: `activity:${unitType}:${unitId}`,
118
+ turnId: unitId,
119
+ category: "execution",
120
+ type: "activity-log-saved",
121
+ payload: {
122
+ unitType,
123
+ unitId,
124
+ filePath,
125
+ entryCount: entries.length,
126
+ },
127
+ }));
128
+ }
113
129
  return filePath;
114
130
  }
115
131
  catch (e) {
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Leaf node in the import DAG.
5
5
  */
6
+ import { summarizeLogs } from "../workflow-logger.js";
6
7
  /**
7
8
  * Pattern matching ENOENT errors with a file path.
8
9
  * Matches: "ENOENT: no such file or directory, access '/path/to/file'"
@@ -22,13 +23,19 @@ const ENOENT_PATH_RE = /ENOENT[^']*'([^']+)'/;
22
23
  export function detectStuck(window) {
23
24
  if (window.length < 2)
24
25
  return null;
26
+ // Peek (not drain) the workflow-logger buffer so stuck reasons can surface
27
+ // the underlying diagnostic context (projection failures, DB degradations,
28
+ // reconcile warnings) that usually explains *why* the loop is stuck. The
29
+ // auto-loop's finalize step owns the buffer lifecycle — this is read-only.
30
+ const loggerSummary = summarizeLogs();
31
+ const suffix = loggerSummary ? ` — ${loggerSummary}` : "";
25
32
  const last = window[window.length - 1];
26
33
  const prev = window[window.length - 2];
27
34
  // Rule 1: Same error repeated consecutively
28
35
  if (last.error && prev.error && last.error === prev.error) {
29
36
  return {
30
37
  stuck: true,
31
- reason: `Same error repeated: ${last.error.slice(0, 200)}`,
38
+ reason: `Same error repeated: ${last.error.slice(0, 200)}${suffix}`,
32
39
  };
33
40
  }
34
41
  // Rule 2: Same unit 3+ consecutive times
@@ -37,7 +44,7 @@ export function detectStuck(window) {
37
44
  if (lastThree.every((u) => u.key === last.key)) {
38
45
  return {
39
46
  stuck: true,
40
- reason: `${last.key} derived 3 consecutive times without progress`,
47
+ reason: `${last.key} derived 3 consecutive times without progress${suffix}`,
41
48
  };
42
49
  }
43
50
  }
@@ -49,7 +56,7 @@ export function detectStuck(window) {
49
56
  w[0].key !== w[1].key) {
50
57
  return {
51
58
  stuck: true,
52
- reason: `Oscillation detected: ${w[0].key} ↔ ${w[1].key}`,
59
+ reason: `Oscillation detected: ${w[0].key} ↔ ${w[1].key}${suffix}`,
53
60
  };
54
61
  }
55
62
  }
@@ -67,7 +74,7 @@ export function detectStuck(window) {
67
74
  if (count >= 2) {
68
75
  return {
69
76
  stuck: true,
70
- reason: `Missing file referenced twice: ${filePath} (ENOENT)`,
77
+ reason: `Missing file referenced twice: ${filePath} (ENOENT)${suffix}`,
71
78
  };
72
79
  }
73
80
  enoentPaths.set(filePath, count);
@@ -15,6 +15,8 @@ import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterM
15
15
  import { resolveEngine } from "../engine-resolver.js";
16
16
  import { logWarning } from "../workflow-logger.js";
17
17
  import { gsdRoot } from "../paths.js";
18
+ import { resolveUokFlags } from "../uok/flags.js";
19
+ import { scheduleSidecarQueue } from "../uok/execution-graph.js";
18
20
  import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
19
21
  import { join } from "node:path";
20
22
  // ── Stuck detection persistence (#3704) ──────────────────────────────────
@@ -104,6 +106,40 @@ export async function autoLoop(ctx, pi, s, deps) {
104
106
  const flowId = randomUUID();
105
107
  let seqCounter = 0;
106
108
  const nextSeq = () => ++seqCounter;
109
+ const turnId = randomUUID();
110
+ s.currentTraceId = flowId;
111
+ s.currentTurnId = turnId;
112
+ const turnStartedAt = new Date().toISOString();
113
+ let observedUnitType;
114
+ let observedUnitId;
115
+ let turnFinished = false;
116
+ const finishTurn = (status, failureClass = "none", error) => {
117
+ if (turnFinished)
118
+ return;
119
+ turnFinished = true;
120
+ deps.uokObserver?.onTurnResult({
121
+ traceId: flowId,
122
+ turnId,
123
+ iteration,
124
+ unitType: observedUnitType,
125
+ unitId: observedUnitId,
126
+ status,
127
+ failureClass,
128
+ phaseResults: [],
129
+ error,
130
+ startedAt: turnStartedAt,
131
+ finishedAt: new Date().toISOString(),
132
+ });
133
+ s.currentTraceId = null;
134
+ s.currentTurnId = null;
135
+ };
136
+ deps.uokObserver?.onTurnStart({
137
+ traceId: flowId,
138
+ turnId,
139
+ iteration,
140
+ basePath: s.basePath,
141
+ startedAt: turnStartedAt,
142
+ });
107
143
  if (iteration > MAX_LOOP_ITERATIONS) {
108
144
  debugLog("autoLoop", {
109
145
  phase: "exit",
@@ -111,6 +147,7 @@ export async function autoLoop(ctx, pi, s, deps) {
111
147
  iteration,
112
148
  });
113
149
  await deps.stopAuto(ctx, pi, `Safety: loop exceeded ${MAX_LOOP_ITERATIONS} iterations — possible runaway`);
150
+ finishTurn("stopped", "manual-attention", "max-iterations");
114
151
  break;
115
152
  }
116
153
  // ── Memory pressure check (#3331) ──
@@ -123,19 +160,30 @@ export async function autoLoop(ctx, pi, s, deps) {
123
160
  await deps.stopAuto(ctx, pi, `Memory pressure: heap at ${mem.heapMB}MB / ${mem.limitMB}MB (${Math.round(mem.pct * 100)}%). ` +
124
161
  `Stopping gracefully to prevent OOM kill after ${iteration} iterations. ` +
125
162
  `Resume with /gsd auto to continue from where you left off.`);
163
+ finishTurn("stopped", "timeout", "memory-pressure");
126
164
  break;
127
165
  }
128
166
  }
129
167
  if (!s.cmdCtx) {
130
168
  debugLog("autoLoop", { phase: "exit", reason: "no-cmdCtx" });
169
+ finishTurn("stopped", "manual-attention", "missing-command-context");
131
170
  break;
132
171
  }
133
172
  try {
134
173
  // ── Blanket try/catch: one bad iteration must not kill the session
135
174
  const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
175
+ const uokFlags = resolveUokFlags(prefs);
136
176
  // ── Check sidecar queue before deriveState ──
137
177
  let sidecarItem;
138
178
  if (s.sidecarQueue.length > 0) {
179
+ if (uokFlags.executionGraph && s.sidecarQueue.length > 1) {
180
+ try {
181
+ s.sidecarQueue = await scheduleSidecarQueue(s.sidecarQueue);
182
+ }
183
+ catch (err) {
184
+ logWarning("dispatch", `sidecar queue scheduling failed: ${err instanceof Error ? err.message : String(err)}`);
185
+ }
186
+ }
139
187
  sidecarItem = s.sidecarQueue.shift();
140
188
  debugLog("autoLoop", {
141
189
  phase: "sidecar-dequeue",
@@ -210,25 +258,49 @@ export async function autoLoop(ctx, pi, s, deps) {
210
258
  isRetry: false,
211
259
  previousTier: undefined,
212
260
  };
261
+ observedUnitType = iterData.unitType;
262
+ observedUnitId = iterData.unitId;
213
263
  // ── Progress widget (mirrors dev path in runDispatch) ──
214
264
  deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state);
215
265
  // ── Guards (shared with dev path) ──
216
266
  const guardsResult = await runGuards(ic, s.currentMilestoneId ?? "workflow");
217
- if (guardsResult.action === "break")
267
+ deps.uokObserver?.onPhaseResult("guard", guardsResult.action, {
268
+ unitType: iterData.unitType,
269
+ unitId: iterData.unitId,
270
+ });
271
+ if (guardsResult.action === "break") {
272
+ finishTurn("stopped", "manual-attention", "guard-break");
218
273
  break;
274
+ }
219
275
  // ── Unit execution (shared with dev path) ──
220
276
  const unitPhaseResult = await runUnitPhase(ic, iterData, loopState);
221
- if (unitPhaseResult.action === "break")
277
+ deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
278
+ unitType: iterData.unitType,
279
+ unitId: iterData.unitId,
280
+ });
281
+ if (unitPhaseResult.action === "break") {
282
+ finishTurn("stopped", "execution", "unit-break");
222
283
  break;
284
+ }
223
285
  // ── Verify first, then reconcile (only mark complete on pass) ──
224
286
  debugLog("autoLoop", { phase: "custom-engine-verify", iteration, unitId: iterData.unitId });
225
287
  const verifyResult = await policy.verify(iterData.unitType, iterData.unitId, { basePath: s.basePath });
226
288
  if (verifyResult === "pause") {
227
289
  await deps.pauseAuto(ctx, pi);
290
+ deps.uokObserver?.onPhaseResult("custom-engine", "pause", {
291
+ unitType: iterData.unitType,
292
+ unitId: iterData.unitId,
293
+ });
294
+ finishTurn("paused", "manual-attention", "custom-engine-verify-pause");
228
295
  break;
229
296
  }
230
297
  if (verifyResult === "retry") {
231
298
  debugLog("autoLoop", { phase: "custom-engine-verify-retry", iteration, unitId: iterData.unitId });
299
+ deps.uokObserver?.onPhaseResult("custom-engine", "retry", {
300
+ unitType: iterData.unitType,
301
+ unitId: iterData.unitId,
302
+ });
303
+ finishTurn("retry");
232
304
  continue;
233
305
  }
234
306
  // Verification passed — mark step complete
@@ -248,37 +320,73 @@ export async function autoLoop(ctx, pi, s, deps) {
248
320
  debugLog("autoLoop", { phase: "iteration-complete", iteration });
249
321
  if (reconcileResult.outcome === "milestone-complete") {
250
322
  await deps.stopAuto(ctx, pi, "Workflow complete");
323
+ deps.uokObserver?.onPhaseResult("custom-engine", "milestone-complete", {
324
+ unitType: iterData.unitType,
325
+ unitId: iterData.unitId,
326
+ });
327
+ finishTurn("completed");
251
328
  break;
252
329
  }
253
330
  if (reconcileResult.outcome === "pause") {
254
331
  await deps.pauseAuto(ctx, pi);
332
+ deps.uokObserver?.onPhaseResult("custom-engine", "pause", {
333
+ unitType: iterData.unitType,
334
+ unitId: iterData.unitId,
335
+ });
336
+ finishTurn("paused", "manual-attention");
255
337
  break;
256
338
  }
257
339
  if (reconcileResult.outcome === "stop") {
258
340
  await deps.stopAuto(ctx, pi, reconcileResult.reason ?? "Engine stopped");
341
+ deps.uokObserver?.onPhaseResult("custom-engine", "stop", {
342
+ unitType: iterData.unitType,
343
+ unitId: iterData.unitId,
344
+ reason: reconcileResult.reason,
345
+ });
346
+ finishTurn("stopped", "manual-attention", reconcileResult.reason);
259
347
  break;
260
348
  }
349
+ deps.uokObserver?.onPhaseResult("custom-engine", "continue", {
350
+ unitType: iterData.unitType,
351
+ unitId: iterData.unitId,
352
+ });
353
+ finishTurn("completed");
261
354
  continue;
262
355
  }
263
356
  if (!sidecarItem) {
264
357
  // ── Phase 1: Pre-dispatch ─────────────────────────────────────────
265
358
  const preDispatchResult = await runPreDispatch(ic, loopState);
266
- if (preDispatchResult.action === "break")
359
+ deps.uokObserver?.onPhaseResult("pre-dispatch", preDispatchResult.action);
360
+ if (preDispatchResult.action === "break") {
361
+ finishTurn("stopped", "manual-attention", "pre-dispatch-break");
267
362
  break;
268
- if (preDispatchResult.action === "continue")
363
+ }
364
+ if (preDispatchResult.action === "continue") {
365
+ finishTurn("skipped");
269
366
  continue;
367
+ }
270
368
  const preData = preDispatchResult.data;
271
369
  // ── Phase 2: Guards ───────────────────────────────────────────────
272
370
  const guardsResult = await runGuards(ic, preData.mid);
273
- if (guardsResult.action === "break")
371
+ deps.uokObserver?.onPhaseResult("guard", guardsResult.action);
372
+ if (guardsResult.action === "break") {
373
+ finishTurn("stopped", "manual-attention", "guard-break");
274
374
  break;
375
+ }
275
376
  // ── Phase 3: Dispatch ─────────────────────────────────────────────
276
377
  const dispatchResult = await runDispatch(ic, preData, loopState);
277
- if (dispatchResult.action === "break")
378
+ deps.uokObserver?.onPhaseResult("dispatch", dispatchResult.action);
379
+ if (dispatchResult.action === "break") {
380
+ finishTurn("stopped", "manual-attention", "dispatch-break");
278
381
  break;
279
- if (dispatchResult.action === "continue")
382
+ }
383
+ if (dispatchResult.action === "continue") {
384
+ finishTurn("skipped");
280
385
  continue;
386
+ }
281
387
  iterData = dispatchResult.data;
388
+ observedUnitType = iterData.unitType;
389
+ observedUnitId = iterData.unitId;
282
390
  }
283
391
  else {
284
392
  // ── Sidecar path: use values from the sidecar item directly ──
@@ -294,21 +402,46 @@ export async function autoLoop(ctx, pi, s, deps) {
294
402
  midTitle: sidecarState.activeMilestone?.title,
295
403
  isRetry: false, previousTier: undefined,
296
404
  };
405
+ observedUnitType = iterData.unitType;
406
+ observedUnitId = iterData.unitId;
407
+ deps.uokObserver?.onPhaseResult("dispatch", "sidecar", {
408
+ unitType: iterData.unitType,
409
+ unitId: iterData.unitId,
410
+ sidecarKind: sidecarItem.kind,
411
+ });
297
412
  }
298
413
  const unitPhaseResult = await runUnitPhase(ic, iterData, loopState, sidecarItem);
299
- if (unitPhaseResult.action === "break")
414
+ deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
415
+ unitType: iterData.unitType,
416
+ unitId: iterData.unitId,
417
+ });
418
+ if (unitPhaseResult.action === "break") {
419
+ finishTurn("stopped", "execution", "unit-break");
300
420
  break;
421
+ }
301
422
  // ── Phase 5: Finalize ───────────────────────────────────────────────
302
423
  const finalizeResult = await runFinalize(ic, iterData, loopState, sidecarItem);
303
- if (finalizeResult.action === "break")
424
+ deps.uokObserver?.onPhaseResult("finalize", finalizeResult.action, {
425
+ unitType: iterData.unitType,
426
+ unitId: iterData.unitId,
427
+ });
428
+ if (finalizeResult.action === "break") {
429
+ const finalizeFailureClass = finalizeResult.reason === "git-closeout-failure"
430
+ ? "git"
431
+ : "closeout";
432
+ finishTurn("stopped", finalizeFailureClass, "finalize-break");
304
433
  break;
305
- if (finalizeResult.action === "continue")
434
+ }
435
+ if (finalizeResult.action === "continue") {
436
+ finishTurn("retry");
306
437
  continue;
438
+ }
307
439
  consecutiveErrors = 0; // Iteration completed successfully
308
440
  consecutiveCooldowns = 0;
309
441
  recentErrorMessages.length = 0;
310
442
  deps.emitJournalEvent({ ts: new Date().toISOString(), flowId, seq: nextSeq(), eventType: "iteration-end", data: { iteration } });
311
443
  debugLog("autoLoop", { phase: "iteration-complete", iteration });
444
+ finishTurn("completed");
312
445
  }
313
446
  catch (loopErr) {
314
447
  // ── Blanket catch: absorb unexpected exceptions, apply graduated recovery ──
@@ -330,6 +463,7 @@ export async function autoLoop(ctx, pi, s, deps) {
330
463
  });
331
464
  ctx.ui.notify(`Auto-mode stopped: infrastructure error ${infraCode} — ${msg}`, "error");
332
465
  await deps.stopAuto(ctx, pi, `Infrastructure error (${infraCode}): not recoverable by retry`);
466
+ finishTurn("failed", "execution", msg);
333
467
  break;
334
468
  }
335
469
  // ── Credential cooldown: wait and retry with bounded budget ──
@@ -358,6 +492,7 @@ export async function autoLoop(ctx, pi, s, deps) {
358
492
  : COOLDOWN_FALLBACK_WAIT_MS;
359
493
  ctx.ui.notify(`Credentials in cooldown (${consecutiveCooldowns}/${MAX_COOLDOWN_RETRIES}) — waiting ${Math.round(waitMs / 1000)}s before retrying.`, "warning");
360
494
  await new Promise(resolve => setTimeout(resolve, waitMs));
495
+ finishTurn("retry", "timeout", msg);
361
496
  continue; // Retry iteration without incrementing consecutiveErrors
362
497
  }
363
498
  consecutiveErrors++;
@@ -375,6 +510,7 @@ export async function autoLoop(ctx, pi, s, deps) {
375
510
  .join("\n");
376
511
  ctx.ui.notify(`Auto-mode stopped: ${consecutiveErrors} consecutive iteration failures:\n${errorHistory}`, "error");
377
512
  await deps.stopAuto(ctx, pi, `${consecutiveErrors} consecutive iteration failures`);
513
+ finishTurn("failed", "execution", msg);
378
514
  break;
379
515
  }
380
516
  else if (consecutiveErrors === 2) {
@@ -386,6 +522,7 @@ export async function autoLoop(ctx, pi, s, deps) {
386
522
  // 1st error: log and retry — transient failures happen
387
523
  ctx.ui.notify(`Iteration error: ${msg}. Retrying.`, "warning");
388
524
  }
525
+ finishTurn("retry", "execution", msg);
389
526
  }
390
527
  }
391
528
  _clearCurrentResolve();