gsd-pi 2.71.0 → 2.72.0-dev.3118184

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 (578) hide show
  1. package/README.md +69 -19
  2. package/dist/cli.js +88 -6
  3. package/dist/headless-events.d.ts +2 -0
  4. package/dist/headless-events.js +7 -0
  5. package/dist/headless.js +16 -3
  6. package/dist/mcp-server.js +40 -17
  7. package/dist/onboarding.js +10 -0
  8. package/dist/provider-migrations.d.ts +10 -0
  9. package/dist/provider-migrations.js +12 -0
  10. package/dist/resource-loader.js +139 -13
  11. package/dist/resources/GSD-WORKFLOW.md +1 -1
  12. package/dist/resources/agents/debugger.md +58 -0
  13. package/dist/resources/agents/doc-writer.md +43 -0
  14. package/dist/resources/agents/git-ops.md +56 -0
  15. package/dist/resources/agents/javascript-pro.md +46 -271
  16. package/dist/resources/agents/planner.md +55 -0
  17. package/dist/resources/agents/refactorer.md +47 -0
  18. package/dist/resources/agents/reviewer.md +48 -0
  19. package/dist/resources/agents/security.md +59 -0
  20. package/dist/resources/agents/tester.md +50 -0
  21. package/dist/resources/agents/typescript-pro.md +41 -235
  22. package/dist/resources/extensions/async-jobs/await-tool.js +7 -4
  23. package/dist/resources/extensions/async-jobs/job-manager.js +28 -3
  24. package/dist/resources/extensions/claude-code-cli/partial-builder.js +40 -12
  25. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +142 -14
  26. package/dist/resources/extensions/gsd/auto/infra-errors.js +34 -0
  27. package/dist/resources/extensions/gsd/auto/loop.js +116 -2
  28. package/dist/resources/extensions/gsd/auto/phases.js +5 -1
  29. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  30. package/dist/resources/extensions/gsd/auto-dashboard.js +22 -16
  31. package/dist/resources/extensions/gsd/auto-model-selection.js +10 -2
  32. package/dist/resources/extensions/gsd/auto-post-unit.js +6 -0
  33. package/dist/resources/extensions/gsd/auto-prompts.js +88 -33
  34. package/dist/resources/extensions/gsd/auto-recovery.js +11 -0
  35. package/dist/resources/extensions/gsd/auto-start.js +34 -7
  36. package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
  37. package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
  38. package/dist/resources/extensions/gsd/auto.js +81 -19
  39. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
  40. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -11
  41. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +63 -51
  42. package/dist/resources/extensions/gsd/bootstrap/system-context.js +6 -0
  43. package/dist/resources/extensions/gsd/commands/context.js +15 -6
  44. package/dist/resources/extensions/gsd/commands/dispatcher.js +12 -2
  45. package/dist/resources/extensions/gsd/commands/handlers/auto.js +10 -33
  46. package/dist/resources/extensions/gsd/commands/handlers/core.js +56 -11
  47. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +15 -6
  48. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +4 -10
  49. package/dist/resources/extensions/gsd/commands-handlers.js +4 -1
  50. package/dist/resources/extensions/gsd/context-injector.js +1 -1
  51. package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -7
  52. package/dist/resources/extensions/gsd/dashboard-overlay.js +8 -3
  53. package/dist/resources/extensions/gsd/definition-io.js +15 -0
  54. package/dist/resources/extensions/gsd/dispatch-guard.js +22 -1
  55. package/dist/resources/extensions/gsd/doctor-providers.js +23 -0
  56. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +6 -3
  57. package/dist/resources/extensions/gsd/error-classifier.js +5 -2
  58. package/dist/resources/extensions/gsd/forensics.js +19 -6
  59. package/dist/resources/extensions/gsd/gate-registry.js +208 -0
  60. package/dist/resources/extensions/gsd/git-service.js +11 -8
  61. package/dist/resources/extensions/gsd/gitignore.js +12 -6
  62. package/dist/resources/extensions/gsd/gsd-db.js +90 -6
  63. package/dist/resources/extensions/gsd/guided-flow.js +5 -10
  64. package/dist/resources/extensions/gsd/key-manager.js +2 -0
  65. package/dist/resources/extensions/gsd/metrics.js +1 -0
  66. package/dist/resources/extensions/gsd/milestone-actions.js +10 -4
  67. package/dist/resources/extensions/gsd/milestone-validation-gates.js +11 -12
  68. package/dist/resources/extensions/gsd/notification-overlay.js +42 -13
  69. package/dist/resources/extensions/gsd/notification-store.js +56 -5
  70. package/dist/resources/extensions/gsd/notification-widget.js +5 -13
  71. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +8 -3
  72. package/dist/resources/extensions/gsd/pre-execution-checks.js +35 -2
  73. package/dist/resources/extensions/gsd/preferences-skills.js +2 -34
  74. package/dist/resources/extensions/gsd/preferences-types.js +15 -0
  75. package/dist/resources/extensions/gsd/preferences.js +16 -3
  76. package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
  77. package/dist/resources/extensions/gsd/prompt-validation.js +126 -0
  78. package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -3
  79. package/dist/resources/extensions/gsd/prompts/discuss.md +123 -12
  80. package/dist/resources/extensions/gsd/prompts/execute-task.md +22 -19
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  82. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
  83. package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
  84. package/dist/resources/extensions/gsd/prompts/queue.md +3 -2
  85. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  86. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
  87. package/dist/resources/extensions/gsd/session-model-override.js +25 -0
  88. package/dist/resources/extensions/gsd/shortcut-defs.js +40 -0
  89. package/dist/resources/extensions/gsd/state.js +29 -2
  90. package/dist/resources/extensions/gsd/tools/complete-slice.js +52 -1
  91. package/dist/resources/extensions/gsd/tools/complete-task.js +51 -1
  92. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +4 -1
  93. package/dist/resources/extensions/gsd/workflow-projections.js +7 -0
  94. package/dist/resources/extensions/gsd/worktree-manager.js +30 -3
  95. package/dist/resources/extensions/gsd/write-intercept.js +10 -1
  96. package/dist/resources/extensions/ollama/index.js +17 -10
  97. package/dist/resources/extensions/ollama/ollama-client.js +35 -6
  98. package/dist/resources/extensions/ollama/ollama-discovery.js +32 -6
  99. package/dist/resources/extensions/shared/gsd-phase-state.js +35 -0
  100. package/dist/resources/extensions/subagent/agents.js +8 -0
  101. package/dist/resources/extensions/subagent/index.js +17 -0
  102. package/dist/resources/skills/create-skill/SKILL.md +2 -0
  103. package/dist/startup-model-validation.d.ts +0 -1
  104. package/dist/startup-model-validation.js +6 -2
  105. package/dist/web/standalone/.next/BUILD_ID +1 -1
  106. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  107. package/dist/web/standalone/.next/build-manifest.json +3 -3
  108. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  109. package/dist/web/standalone/.next/required-server-files.json +3 -3
  110. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  111. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  121. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  137. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  149. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  169. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  179. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  185. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  199. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  201. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  203. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +3 -3
  205. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/index.html +1 -1
  215. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  216. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  217. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  218. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  220. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/page.js +2 -2
  222. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  224. package/dist/web/standalone/.next/server/chunks/2331.js +16 -16
  225. package/dist/web/standalone/.next/server/chunks/4741.js +12 -12
  226. package/dist/web/standalone/.next/server/chunks/5822.js +2 -2
  227. package/dist/web/standalone/.next/server/chunks/63.js +8 -8
  228. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  229. package/dist/web/standalone/.next/server/edge-runtime-webpack.js +2 -0
  230. package/dist/web/standalone/.next/server/functions-config-manifest.json +0 -9
  231. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/middleware-manifest.json +29 -2
  233. package/dist/web/standalone/.next/server/middleware.js +4 -12
  234. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  236. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  237. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  238. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  239. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  240. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  241. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  242. package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  245. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  246. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  247. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  248. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  249. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  250. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  251. package/dist/web/standalone/server.js +1 -1
  252. package/package.json +1 -1
  253. package/packages/mcp-server/dist/server.d.ts +12 -1
  254. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  255. package/packages/mcp-server/dist/server.js +90 -42
  256. package/packages/mcp-server/dist/server.js.map +1 -1
  257. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  258. package/packages/mcp-server/dist/workflow-tools.js +22 -12
  259. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  260. package/packages/mcp-server/src/server.ts +110 -38
  261. package/packages/mcp-server/src/workflow-tools.test.ts +110 -0
  262. package/packages/mcp-server/src/workflow-tools.ts +32 -12
  263. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  264. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  265. package/packages/pi-ai/dist/models.custom.d.ts +105 -0
  266. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -1
  267. package/packages/pi-ai/dist/models.custom.js +97 -0
  268. package/packages/pi-ai/dist/models.custom.js.map +1 -1
  269. package/packages/pi-ai/dist/models.generated.d.ts +648 -140
  270. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  271. package/packages/pi-ai/dist/models.generated.js +867 -370
  272. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  273. package/packages/pi-ai/dist/models.generated.test.d.ts +2 -0
  274. package/packages/pi-ai/dist/models.generated.test.d.ts.map +1 -0
  275. package/packages/pi-ai/dist/models.generated.test.js +334 -0
  276. package/packages/pi-ai/dist/models.generated.test.js.map +1 -0
  277. package/packages/pi-ai/dist/models.test.js +105 -0
  278. package/packages/pi-ai/dist/models.test.js.map +1 -1
  279. package/packages/pi-ai/dist/providers/amazon-bedrock.js +11 -2
  280. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  281. package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts +2 -0
  282. package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts.map +1 -0
  283. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +20 -0
  284. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -0
  285. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +4 -1
  286. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  287. package/packages/pi-ai/dist/providers/anthropic-shared.js +8 -3
  288. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  289. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +44 -1
  290. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  291. package/packages/pi-ai/dist/providers/anthropic.d.ts +2 -1
  292. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  293. package/packages/pi-ai/dist/providers/anthropic.js +7 -4
  294. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  295. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/providers/openai-completions.js +11 -0
  297. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  298. package/packages/pi-ai/dist/types.d.ts +1 -1
  299. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  300. package/packages/pi-ai/dist/types.js.map +1 -1
  301. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +5 -1
  303. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  304. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.d.ts +2 -0
  305. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.d.ts.map +1 -0
  306. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +57 -0
  307. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -0
  308. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  309. package/packages/pi-ai/src/models.custom.ts +98 -0
  310. package/packages/pi-ai/src/models.generated.test.ts +373 -0
  311. package/packages/pi-ai/src/models.generated.ts +867 -370
  312. package/packages/pi-ai/src/models.test.ts +135 -0
  313. package/packages/pi-ai/src/providers/amazon-bedrock.ts +13 -1
  314. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +32 -0
  315. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +55 -1
  316. package/packages/pi-ai/src/providers/anthropic-shared.ts +14 -3
  317. package/packages/pi-ai/src/providers/anthropic.ts +8 -4
  318. package/packages/pi-ai/src/providers/openai-completions.ts +14 -0
  319. package/packages/pi-ai/src/types.ts +1 -0
  320. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +71 -0
  321. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +4 -1
  322. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts +2 -0
  323. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts.map +1 -0
  324. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js +61 -0
  325. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js.map +1 -0
  326. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/agent-session.js +2 -1
  328. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +10 -0
  330. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/auth-storage.js +27 -0
  332. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +85 -0
  334. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts +2 -0
  336. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts.map +1 -0
  337. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js +64 -0
  338. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js.map +1 -0
  339. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/core/model-resolver.js +23 -18
  341. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts +8 -0
  343. package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts.map +1 -0
  344. package/packages/pi-coding-agent/dist/core/model-resolver.test.js +75 -0
  345. package/packages/pi-coding-agent/dist/core/model-resolver.test.js.map +1 -0
  346. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +5 -0
  347. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/retry-handler.js +55 -1
  349. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +57 -0
  351. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/core/sdk.d.ts +11 -0
  353. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/core/sdk.js +47 -5
  355. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/core/sdk.test.d.ts +2 -0
  357. package/packages/pi-coding-agent/dist/core/sdk.test.d.ts.map +1 -0
  358. package/packages/pi-coding-agent/dist/core/sdk.test.js +71 -0
  359. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -0
  360. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  361. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/index.js +1 -1
  363. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts +2 -0
  365. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts.map +1 -0
  366. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js +13 -0
  367. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js.map +1 -0
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -0
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +4 -0
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +24 -2
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +9 -2
  376. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +4 -0
  378. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +130 -12
  380. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  382. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +7 -2
  383. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.d.ts.map +1 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js +6 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  388. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -3
  389. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  390. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +4 -2
  391. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  392. package/packages/pi-coding-agent/package.json +1 -1
  393. package/packages/pi-coding-agent/src/core/agent-session-renderable-tools.test.ts +70 -0
  394. package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
  395. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +108 -0
  396. package/packages/pi-coding-agent/src/core/auth-storage.ts +30 -0
  397. package/packages/pi-coding-agent/src/core/model-resolver-initial-model-auth.test.ts +78 -0
  398. package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
  399. package/packages/pi-coding-agent/src/core/model-resolver.ts +23 -18
  400. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +83 -0
  401. package/packages/pi-coding-agent/src/core/retry-handler.ts +60 -1
  402. package/packages/pi-coding-agent/src/core/sdk.test.ts +89 -0
  403. package/packages/pi-coding-agent/src/core/sdk.ts +55 -9
  404. package/packages/pi-coding-agent/src/index.ts +1 -0
  405. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
  406. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +72 -0
  407. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +30 -2
  408. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +15 -6
  409. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +131 -12
  410. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +7 -2
  411. package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +6 -1
  412. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -3
  413. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +4 -2
  414. package/packages/pi-tui/dist/components/__tests__/editor.test.js +12 -0
  415. package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -1
  416. package/packages/pi-tui/dist/components/__tests__/input.test.js +12 -0
  417. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  418. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  419. package/packages/pi-tui/dist/keys.js +27 -0
  420. package/packages/pi-tui/dist/keys.js.map +1 -1
  421. package/packages/pi-tui/src/components/__tests__/editor.test.ts +18 -0
  422. package/packages/pi-tui/src/components/__tests__/input.test.ts +18 -0
  423. package/packages/pi-tui/src/keys.ts +32 -0
  424. package/pkg/package.json +1 -1
  425. package/src/resources/GSD-WORKFLOW.md +1 -1
  426. package/src/resources/agents/debugger.md +58 -0
  427. package/src/resources/agents/doc-writer.md +43 -0
  428. package/src/resources/agents/git-ops.md +56 -0
  429. package/src/resources/agents/javascript-pro.md +46 -271
  430. package/src/resources/agents/planner.md +55 -0
  431. package/src/resources/agents/refactorer.md +47 -0
  432. package/src/resources/agents/reviewer.md +48 -0
  433. package/src/resources/agents/security.md +59 -0
  434. package/src/resources/agents/tester.md +50 -0
  435. package/src/resources/agents/typescript-pro.md +41 -235
  436. package/src/resources/extensions/async-jobs/await-tool.test.ts +40 -7
  437. package/src/resources/extensions/async-jobs/await-tool.ts +7 -4
  438. package/src/resources/extensions/async-jobs/job-manager.ts +33 -3
  439. package/src/resources/extensions/claude-code-cli/partial-builder.ts +45 -12
  440. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +152 -13
  441. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +91 -2
  442. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +301 -6
  443. package/src/resources/extensions/gsd/auto/infra-errors.ts +38 -0
  444. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  445. package/src/resources/extensions/gsd/auto/loop.ts +134 -2
  446. package/src/resources/extensions/gsd/auto/phases.ts +6 -0
  447. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  448. package/src/resources/extensions/gsd/auto-dashboard.ts +29 -18
  449. package/src/resources/extensions/gsd/auto-model-selection.ts +9 -1
  450. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -0
  451. package/src/resources/extensions/gsd/auto-prompts.ts +111 -33
  452. package/src/resources/extensions/gsd/auto-recovery.ts +10 -0
  453. package/src/resources/extensions/gsd/auto-start.ts +41 -7
  454. package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
  455. package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
  456. package/src/resources/extensions/gsd/auto.ts +97 -20
  457. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
  458. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +10 -10
  459. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +79 -60
  460. package/src/resources/extensions/gsd/bootstrap/system-context.ts +7 -0
  461. package/src/resources/extensions/gsd/commands/context.ts +16 -5
  462. package/src/resources/extensions/gsd/commands/dispatcher.ts +14 -2
  463. package/src/resources/extensions/gsd/commands/handlers/auto.ts +10 -36
  464. package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -11
  465. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +17 -7
  466. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +4 -10
  467. package/src/resources/extensions/gsd/commands-handlers.ts +5 -1
  468. package/src/resources/extensions/gsd/context-injector.ts +1 -1
  469. package/src/resources/extensions/gsd/custom-workflow-engine.ts +4 -8
  470. package/src/resources/extensions/gsd/dashboard-overlay.ts +10 -3
  471. package/src/resources/extensions/gsd/definition-io.ts +18 -0
  472. package/src/resources/extensions/gsd/dispatch-guard.ts +23 -1
  473. package/src/resources/extensions/gsd/doctor-providers.ts +24 -0
  474. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +6 -3
  475. package/src/resources/extensions/gsd/error-classifier.ts +5 -2
  476. package/src/resources/extensions/gsd/forensics.ts +23 -7
  477. package/src/resources/extensions/gsd/gate-registry.ts +251 -0
  478. package/src/resources/extensions/gsd/git-service.ts +11 -8
  479. package/src/resources/extensions/gsd/gitignore.ts +12 -6
  480. package/src/resources/extensions/gsd/gsd-db.ts +105 -6
  481. package/src/resources/extensions/gsd/guided-flow.ts +5 -10
  482. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  483. package/src/resources/extensions/gsd/key-manager.ts +2 -0
  484. package/src/resources/extensions/gsd/metrics.ts +12 -1
  485. package/src/resources/extensions/gsd/milestone-actions.ts +10 -3
  486. package/src/resources/extensions/gsd/milestone-validation-gates.ts +11 -13
  487. package/src/resources/extensions/gsd/notification-overlay.ts +47 -14
  488. package/src/resources/extensions/gsd/notification-store.ts +54 -5
  489. package/src/resources/extensions/gsd/notification-widget.ts +5 -14
  490. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -3
  491. package/src/resources/extensions/gsd/pre-execution-checks.ts +39 -2
  492. package/src/resources/extensions/gsd/preferences-skills.ts +2 -36
  493. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  494. package/src/resources/extensions/gsd/preferences.ts +19 -6
  495. package/src/resources/extensions/gsd/prompt-loader.ts +6 -1
  496. package/src/resources/extensions/gsd/prompt-validation.ts +157 -0
  497. package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -3
  498. package/src/resources/extensions/gsd/prompts/discuss.md +123 -12
  499. package/src/resources/extensions/gsd/prompts/execute-task.md +22 -19
  500. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  501. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
  502. package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
  503. package/src/resources/extensions/gsd/prompts/queue.md +3 -2
  504. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  505. package/src/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
  506. package/src/resources/extensions/gsd/session-model-override.ts +36 -0
  507. package/src/resources/extensions/gsd/shortcut-defs.ts +56 -0
  508. package/src/resources/extensions/gsd/state.ts +33 -2
  509. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +27 -0
  510. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +25 -9
  511. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +28 -0
  512. package/src/resources/extensions/gsd/tests/block-db-writes.test.ts +63 -0
  513. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +39 -0
  514. package/src/resources/extensions/gsd/tests/complete-slice-gate-closure.test.ts +167 -0
  515. package/src/resources/extensions/gsd/tests/complete-slice-prompt-task-summary-layout.test.ts +18 -0
  516. package/src/resources/extensions/gsd/tests/definition-io.test.ts +57 -0
  517. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +53 -0
  518. package/src/resources/extensions/gsd/tests/doctor-heal-fixable-warnings.test.ts +14 -0
  519. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +36 -0
  520. package/src/resources/extensions/gsd/tests/execute-task-prompt-existing-artifact-guard.test.ts +33 -0
  521. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +104 -0
  522. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +62 -0
  523. package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +31 -0
  524. package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +27 -0
  525. package/src/resources/extensions/gsd/tests/gate-registry.test.ts +140 -0
  526. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +107 -5
  527. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +73 -0
  528. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +180 -0
  529. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +66 -1
  530. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +8 -6
  531. package/src/resources/extensions/gsd/tests/key-manager.test.ts +63 -0
  532. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +54 -0
  533. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +36 -51
  534. package/src/resources/extensions/gsd/tests/notification-store.test.ts +35 -0
  535. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +26 -0
  536. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +90 -0
  537. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -0
  538. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +18 -0
  539. package/src/resources/extensions/gsd/tests/plan-milestone-artifact-verification.test.ts +62 -0
  540. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +34 -0
  541. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +49 -0
  542. package/src/resources/extensions/gsd/tests/preferences-formatting.test.ts +87 -0
  543. package/src/resources/extensions/gsd/tests/preferences.test.ts +53 -0
  544. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +96 -1
  545. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +19 -0
  546. package/src/resources/extensions/gsd/tests/prompt-loader-working-directory.test.ts +19 -0
  547. package/src/resources/extensions/gsd/tests/prompt-system-gate-coverage.test.ts +208 -0
  548. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +16 -0
  549. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +97 -0
  550. package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +63 -5
  551. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +35 -0
  552. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +41 -0
  553. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +90 -0
  554. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +7 -0
  555. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +18 -0
  556. package/src/resources/extensions/gsd/tools/complete-slice.ts +63 -0
  557. package/src/resources/extensions/gsd/tools/complete-task.ts +63 -0
  558. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +4 -1
  559. package/src/resources/extensions/gsd/types.ts +26 -0
  560. package/src/resources/extensions/gsd/workflow-projections.ts +8 -0
  561. package/src/resources/extensions/gsd/worktree-manager.ts +29 -3
  562. package/src/resources/extensions/gsd/write-intercept.ts +10 -1
  563. package/src/resources/extensions/ollama/index.ts +17 -8
  564. package/src/resources/extensions/ollama/ollama-client.ts +35 -6
  565. package/src/resources/extensions/ollama/ollama-discovery.ts +37 -6
  566. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +28 -0
  567. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +54 -0
  568. package/src/resources/extensions/shared/gsd-phase-state.ts +42 -0
  569. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +48 -0
  570. package/src/resources/extensions/subagent/agents.ts +10 -0
  571. package/src/resources/extensions/subagent/index.ts +18 -0
  572. package/src/resources/extensions/subagent/tests/agents-conflicts.test.ts +33 -0
  573. package/src/resources/skills/create-skill/SKILL.md +2 -0
  574. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  575. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  576. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  577. /package/dist/web/standalone/.next/static/{nPky_WQC28aBD77eZsRAB → NzO79SOz9jHX-VY5-0t2O}/_buildManifest.js +0 -0
  578. /package/dist/web/standalone/.next/static/{nPky_WQC28aBD77eZsRAB → NzO79SOz9jHX-VY5-0t2O}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -27,36 +27,68 @@ One command. Walk away. Come back to a built project with clean git history.
27
27
 
28
28
  ---
29
29
 
30
- ## What's New in v2.68
30
+ ## What's New in v2.71
31
31
 
32
- ### MCP Workflow Tools
32
+ ### MCP Secure Env Collect
33
33
 
34
- - **Full workflow over MCP** — slice replanning, milestone management, slice completion, task completion, and core planning tools are now exposed over MCP for external integrations.
35
- - **Transport-gated MCP** — workflow tool availability adapts to provider transport capabilities automatically.
36
- - **Write gate enforcement** — workflow MCP respects write gates, preventing unauthorized state mutations from external clients.
34
+ - **Secure credential collection over MCP** — the new `secure_env_collect` tool uses MCP form elicitation to collect secrets (API keys, tokens) from external clients without exposing values in tool output. Masks input in interactive mode.
35
+ - **Hardened elicitation schema** — MCP elicitation schema handling is stricter, with proper validation and fallback for providers that don't support forms.
37
36
 
38
- ### Reliability & Recovery
37
+ ### MCP Reliability
39
38
 
40
- - **False degraded-mode fix** — eliminates spurious degraded-mode warnings when the DB hasn't been initialized yet.
41
- - **Stale session resume suppression** — prevents stale interrupted-session resume prompts from hijacking fresh sessions.
42
- - **Merge conflict recovery** — `autoCommitDirtyState` guarded with cwd restore on `MergeConflictError`.
43
- - **Auto-resume hardening** — `autoStartTime` restored on resume, managed resources resynced on auto resume.
39
+ - **Stream ordering preserved** — MCP tool output now renders in the correct order, fixing interleaved output in Claude Code and other MCP clients.
40
+ - **isError flag propagation** — workflow tool execution failures now correctly return `isError: true`, so MCP clients can distinguish success from failure.
41
+ - **Multi-round discuss questions** — new-project discuss phase supports multi-round questioning with structured question gates.
44
42
 
45
- ### TUI & Developer Experience
43
+ ### Model Selection Hardening
46
44
 
47
- - **Contextual tips system** — TUI and web terminal now surface contextual tips based on workflow state.
48
- - **Claude Code MCP streaming** — real-time streaming and tool output rendering for Claude Code MCP connections.
45
+ - **Unconfigured models blocked** — models without a configured provider are filtered from selection surfaces, preventing dispatch failures.
46
+ - **Provider readiness required** — saved default model selection now verifies the provider is ready before accepting it.
47
+ - **Session override honored** — `/gsd model` selection persists as a session override across all dispatch phases.
48
+ - **Minimal context guard** — model override logic is skipped in minimal command contexts where it doesn't apply.
49
49
 
50
- ### Infrastructure
50
+ ### Auto-Mode Resilience
51
51
 
52
- - **Weekly model registry refresh** — CI workflow auto-regenerates the model registry on a weekly schedule.
53
- - **Codebase cache auto-refresh** — stale codebase cache is refreshed automatically without manual intervention.
52
+ - **Credential cooldown recovery** — auto-mode survives transient 429 rate-limit responses with structured cooldown errors and a bounded retry budget.
53
+ - **Fire-and-forget auto start** — auto start is detached from active turns to prevent blocking.
54
+ - **Scoped forensics** — stuck-loop forensics are now scoped to auto sessions only, preventing false positives in interactive use.
55
+
56
+ ### TUI Improvements
57
+
58
+ - **Overlay subscription fix** — resolved overlay subscription lifecycle and `Ctrl+Shift+P` shortcut conflict.
59
+ - **Improved overlays and shortcuts** — GSD overlays, keyboard shortcuts, and notification flows redesigned for consistency.
60
+ - **Pinned output restored** — pinned output bar displays above the editor during tool execution again.
61
+ - **Turn completion cleanup** — pinned latest output is cleared on turn completion, preventing stale output from persisting.
62
+ - **Secure input masking** — extension input values are masked in interactive mode when collecting secrets.
63
+
64
+ ### Provider Fixes
65
+
66
+ - **Full OAuth login URLs** — OAuth login URLs are now displayed in full instead of being truncated.
67
+ - **MiniMax bearer auth** — MiniMax Anthropic API requests use proper bearer authentication.
68
+ - **Case-insensitive tool rendering** — renderable tool matching is now case-insensitive, fixing missed tool output.
69
+ - **Headless idle timeout** — idle timeout is kept off during interactive tool execution in headless mode.
70
+
71
+ ### Reliability & Internals
72
+
73
+ - **TOCTOU file locking** — race conditions in event log and custom workflow graph file locking are fixed with proper atomic lock acquisition.
74
+ - **State derive refactor** — `deriveStateFromDb` god function extracted into composable, testable helpers.
75
+ - **Windows portability** — hardened cross-platform portability across runtime, tooling, and CI.
76
+ - **Model routing transparency** — dynamic routing is skipped for interactive dispatches; model changes are always shown in the banner.
77
+ - **Capability-aware routing (ADR-004)** — full implementation of capability scoring, `before_model_select` hook, and task metadata extraction.
78
+ - **Multi-model provider strategy (ADR-005)** — infrastructure for multi-provider model selection wired into live paths.
79
+ - **Anti-fabrication guardrails** — discuss prompts enforce turn-taking to prevent fabricated user responses.
80
+ - **Milestone worktree cleanup** — merged worktree cleanup uses the milestone branch instead of generic lookups.
81
+ - **Tool cache control** — `cache_control` breakpoints added to tool definitions for improved prompt caching.
54
82
 
55
83
  See the full [Changelog](./CHANGELOG.md) for details on every release.
56
84
 
57
85
  <details>
58
- <summary>Previous highlights (v2.67 and earlier)</summary>
86
+ <summary>Previous highlights (v2.70 and earlier)</summary>
59
87
 
88
+ - **Full workflow over MCP (v2.68)** — slice replanning, milestone management, slice completion, task completion, and core planning tools exposed over MCP
89
+ - **Transport-gated MCP (v2.68)** — workflow tool availability adapts to provider transport capabilities automatically
90
+ - **Contextual tips system (v2.68)** — TUI and web terminal surface contextual tips based on workflow state
91
+ - **Ask user questions over MCP (v2.70)** — interactive questions exposed via elicitation for external integrations
60
92
  - **Tiered Context Injection (M005)** — relevance-scoped context with 65%+ token reduction
61
93
  - **Resilient transient error recovery** — defers to Core RetryHandler and fixes cmdCtx race conditions
62
94
  - **Anthropic subscription routing** — auto-routed through Claude Code CLI provider with proper display names
@@ -591,8 +623,10 @@ The best practice for working in teams is to ensure unique milestone names acros
591
623
  # ── GSD: Runtime / Ephemeral (per-developer, per-session) ──────────────────
592
624
  # Crash detection sentinel — PID lock, written per auto-mode session
593
625
  .gsd/auto.lock
594
- # Auto-mode dispatch tracker — prevents re-running completed units
595
- .gsd/completed-units.json
626
+ # Auto-mode dispatch tracker — prevents re-running completed units (includes archived per-milestone files)
627
+ .gsd/completed-units*.json
628
+ # State manifest — workflow state for recovery
629
+ .gsd/state-manifest.json
596
630
  # Derived state cache — regenerated from plan/roadmap files on disk
597
631
  .gsd/STATE.md
598
632
  # Per-developer token/cost accumulator
@@ -605,6 +639,14 @@ The best practice for working in teams is to ensure unique milestone names acros
605
639
  .gsd/worktrees/
606
640
  # Parallel orchestration IPC and worker status
607
641
  .gsd/parallel/
642
+ # SQLite database and WAL sidecars — checkpoint state, forensics data
643
+ .gsd/gsd.db*
644
+ # Daily-rotated event journal — structured event log for forensics
645
+ .gsd/journal/
646
+ # Doctor run history — diagnostic check results
647
+ .gsd/doctor-history.jsonl
648
+ # Workflow event log — structured event stream
649
+ .gsd/event-log.jsonl
608
650
  # Generated HTML reports (regenerable via /gsd export --html)
609
651
  .gsd/reports/
610
652
  # Session-specific interrupted-work markers
@@ -725,6 +767,14 @@ Use expensive models where quality matters (planning, complex execution) and che
725
767
 
726
768
  ---
727
769
 
770
+ ## Ecosystem
771
+
772
+ | Project | Description |
773
+ | ------- | ----------- |
774
+ | [GSD2 Config Utility](https://github.com/jeremymcs/gsd2-config) | Standalone configuration tool for managing GSD preferences, providers, and API keys |
775
+
776
+ ---
777
+
728
778
  ## Star History
729
779
 
730
780
  <a href="https://star-history.com/#gsd-build/gsd-2&Date">
package/dist/cli.js CHANGED
@@ -5,8 +5,8 @@ import { agentDir, sessionsDir, authFilePath } from './app-paths.js';
5
5
  import { initResources, buildResourceLoader, getNewerManagedResourceVersion } from './resource-loader.js';
6
6
  import { ensureManagedTools } from './tool-bootstrap.js';
7
7
  import { loadStoredEnvKeys } from './wizard.js';
8
- import { migratePiCredentials } from './pi-migration.js';
9
- import { validateConfiguredModel } from './startup-model-validation.js';
8
+ import { migratePiCredentials, getPiDefaultModelAndProvider } from './pi-migration.js';
9
+ import { shouldMigrateAnthropicToClaudeCode } from './provider-migrations.js';
10
10
  import { shouldRunOnboarding, runOnboarding } from './onboarding.js';
11
11
  import chalk from 'chalk';
12
12
  import { checkForUpdates } from './update-check.js';
@@ -101,6 +101,41 @@ function parseCliArgs(argv) {
101
101
  }
102
102
  return flags;
103
103
  }
104
+ /**
105
+ * Validate the configured default model against the registry and reset it if
106
+ * it no longer exists. Must run AFTER extensions have registered their
107
+ * providers so that extension models (e.g. pi-claude-cli) are visible.
108
+ */
109
+ function validateConfiguredModel(modelRegistry, settingsManager) {
110
+ const configuredProvider = settingsManager.getDefaultProvider();
111
+ const configuredModel = settingsManager.getDefaultModel();
112
+ const allModels = modelRegistry.getAll();
113
+ const availableModels = modelRegistry.getAvailable();
114
+ const configuredExists = configuredProvider && configuredModel &&
115
+ allModels.some((m) => m.provider === configuredProvider && m.id === configuredModel);
116
+ const configuredAvailable = configuredProvider && configuredModel &&
117
+ availableModels.some((m) => m.provider === configuredProvider && m.id === configuredModel);
118
+ if (!configuredModel || !configuredExists) {
119
+ // Model not configured at all, or removed from registry — pick a fallback.
120
+ // Only fires when the model is genuinely unknown (not just temporarily unavailable).
121
+ const piDefault = getPiDefaultModelAndProvider();
122
+ const preferred = (piDefault
123
+ ? availableModels.find((m) => m.provider === piDefault.provider && m.id === piDefault.model)
124
+ : undefined) ||
125
+ availableModels.find((m) => m.provider === 'openai' && m.id === 'gpt-5.4') ||
126
+ availableModels.find((m) => m.provider === 'openai') ||
127
+ availableModels.find((m) => m.provider === 'anthropic' && m.id === 'claude-opus-4-6') ||
128
+ availableModels.find((m) => m.provider === 'anthropic' && m.id.includes('opus')) ||
129
+ availableModels.find((m) => m.provider === 'anthropic') ||
130
+ availableModels[0];
131
+ if (preferred) {
132
+ settingsManager.setDefaultModelAndProvider(preferred.provider, preferred.id);
133
+ }
134
+ }
135
+ if (settingsManager.getDefaultThinkingLevel() !== 'off' && !configuredExists) {
136
+ settingsManager.setDefaultThinkingLevel('off');
137
+ }
138
+ }
104
139
  const cliFlags = parseCliArgs(process.argv);
105
140
  const isPrintMode = cliFlags.print || cliFlags.mode !== undefined;
106
141
  // Early resource-skew check — must run before TTY gate so version mismatch
@@ -233,6 +268,14 @@ if (cliFlags.messages[0] === 'sessions') {
233
268
  rl.question(chalk.bold(' Enter session number to resume (or q to quit): '), resolve);
234
269
  });
235
270
  rl.close();
271
+ // Clean up stdin state left by readline.createInterface().
272
+ // Without this, downstream TUI initialization gets corrupted listeners and exhibits
273
+ // duplicate terminal I/O. Match the pattern used after onboarding cleanup.
274
+ process.stdin.removeAllListeners('data');
275
+ process.stdin.removeAllListeners('keypress');
276
+ if (process.stdin.setRawMode)
277
+ process.stdin.setRawMode(false);
278
+ process.stdin.pause();
236
279
  const choice = parseInt(answer, 10);
237
280
  if (isNaN(choice) || choice < 1 || choice > toShow.length) {
238
281
  process.stderr.write(chalk.dim('Cancelled.\n'));
@@ -285,7 +328,7 @@ const { resolveModelsJsonPath } = await import('./models-resolver.js');
285
328
  const modelsJsonPath = resolveModelsJsonPath();
286
329
  const modelRegistry = new ModelRegistry(authStorage, modelsJsonPath);
287
330
  markStartup('ModelRegistry');
288
- const settingsManager = SettingsManager.create(agentDir);
331
+ const settingsManager = SettingsManager.create(process.cwd(), agentDir);
289
332
  applySecurityOverrides(settingsManager);
290
333
  markStartup('SettingsManager.create');
291
334
  // Run onboarding wizard on first launch (no LLM provider configured)
@@ -311,8 +354,22 @@ if (!isPrintMode) {
311
354
  if (!isPrintMode && process.stdout.columns && process.stdout.columns < 40) {
312
355
  process.stderr.write(chalk.yellow(`[gsd] Terminal width is ${process.stdout.columns} columns (minimum recommended: 40). Output may be unreadable.\n`));
313
356
  }
314
- // --list-models: print available models and exit (no TTY needed)
357
+ // --list-models: load extensions so that extension-registered providers (e.g.
358
+ // pi-claude-cli) appear in the listing, then flush their pending registrations
359
+ // into the model registry before printing.
315
360
  if (cliFlags.listModels !== undefined) {
361
+ exitIfManagedResourcesAreNewer(agentDir);
362
+ initResources(agentDir);
363
+ const listModelsLoader = new DefaultResourceLoader({
364
+ agentDir,
365
+ additionalExtensionPaths: cliFlags.extensions.length > 0 ? cliFlags.extensions : undefined,
366
+ });
367
+ await listModelsLoader.reload();
368
+ const listModelsExtensions = listModelsLoader.getExtensions();
369
+ for (const { name, config } of listModelsExtensions.runtime.pendingProviderRegistrations) {
370
+ modelRegistry.registerProvider(name, config);
371
+ }
372
+ listModelsExtensions.runtime.pendingProviderRegistrations = [];
316
373
  const models = modelRegistry.getAvailable();
317
374
  if (models.length === 0) {
318
375
  console.log('No models available. Set API keys in environment variables.');
@@ -401,7 +458,11 @@ if (isPrintMode) {
401
458
  // Migrate anthropic OAuth users to claude-code provider when CLI is available (#3772).
402
459
  // Anthropic blocks third-party apps from using subscription quotas — routing through
403
460
  // the local claude CLI binary is TOS-compliant.
404
- if (modelRegistry.isProviderRequestReady('claude-code') && settingsManager.getDefaultProvider() === 'anthropic') {
461
+ if (shouldMigrateAnthropicToClaudeCode({
462
+ authStorage,
463
+ isClaudeCodeReady: modelRegistry.isProviderRequestReady('claude-code'),
464
+ defaultProvider: settingsManager.getDefaultProvider(),
465
+ })) {
405
466
  const currentModelId = settingsManager.getDefaultModel();
406
467
  if (currentModelId) {
407
468
  const ccModel = modelRegistry.find('claude-code', currentModelId);
@@ -448,6 +509,10 @@ if (isPrintMode) {
448
509
  process.stderr.write(`[gsd] ${prefix}: ${err.error}\n`);
449
510
  }
450
511
  }
512
+ // Validate configured model now that extension providers are registered.
513
+ // Must run after createAgentSession() which flushes pendingProviderRegistrations
514
+ // so extension models (e.g. pi-claude-cli) are visible in the registry.
515
+ validateConfiguredModel(modelRegistry, settingsManager);
451
516
  // Apply --model override if specified
452
517
  if (cliFlags.model) {
453
518
  const available = modelRegistry.getAvailable();
@@ -466,6 +531,15 @@ if (isPrintMode) {
466
531
  if (mode === 'mcp') {
467
532
  printStartupTimings();
468
533
  const { startMcpServer } = await import('./mcp-server.js');
534
+ // Activate every registered tool before starting the MCP transport.
535
+ // `session.agent.state.tools` is the *active* subset, not the full
536
+ // registry — if we expose only the active set, extension-registered
537
+ // tools (gsd workflow, browser-tools, mac-tools, search-the-web, …)
538
+ // are invisible to MCP clients. Flipping the active set to every
539
+ // known tool name makes `state.tools` mirror the full registry for
540
+ // this MCP session, which is what an external client expects.
541
+ const allToolNames = session.getAllTools().map((t) => t.name);
542
+ session.setActiveToolsByName(allToolNames);
469
543
  await startMcpServer({
470
544
  tools: session.agent.state.tools ?? [],
471
545
  version: process.env.GSD_VERSION || '0.0.0',
@@ -576,7 +650,11 @@ markStartup('createAgentSession');
576
650
  // Migrate anthropic OAuth users to claude-code provider when CLI is available (#3772).
577
651
  // Anthropic blocks third-party apps from using subscription quotas — routing through
578
652
  // the local claude CLI binary is TOS-compliant.
579
- if (modelRegistry.isProviderRequestReady('claude-code') && settingsManager.getDefaultProvider() === 'anthropic') {
653
+ if (shouldMigrateAnthropicToClaudeCode({
654
+ authStorage,
655
+ isClaudeCodeReady: modelRegistry.isProviderRequestReady('claude-code'),
656
+ defaultProvider: settingsManager.getDefaultProvider(),
657
+ })) {
580
658
  const currentModelId = settingsManager.getDefaultModel();
581
659
  if (currentModelId) {
582
660
  const ccModel = modelRegistry.find('claude-code', currentModelId);
@@ -622,6 +700,10 @@ if (extensionsResult.errors.length > 0) {
622
700
  process.stderr.write(`[gsd] ${prefix}: ${err.error}\n`);
623
701
  }
624
702
  }
703
+ // Validate configured model now that extension providers are registered.
704
+ // Must run after createAgentSession() which flushes pendingProviderRegistrations
705
+ // so extension models (e.g. pi-claude-cli) are visible in the registry.
706
+ validateConfiguredModel(modelRegistry, settingsManager);
625
707
  // Restore scoped models from settings on startup.
626
708
  // The upstream InteractiveMode reads enabledModels from settings when /scoped-models is opened,
627
709
  // but doesn't apply them to the session at startup — so Ctrl+P cycles all models instead of
@@ -43,6 +43,8 @@ export declare const NEW_MILESTONE_IDLE_TIMEOUT_MS = 120000;
43
43
  export declare function isTerminalNotification(event: Record<string, unknown>): boolean;
44
44
  export declare function isBlockedNotification(event: Record<string, unknown>): boolean;
45
45
  export declare function isMilestoneReadyNotification(event: Record<string, unknown>): boolean;
46
+ export declare function isInteractiveHeadlessTool(toolName: string | undefined): boolean;
47
+ export declare function shouldArmHeadlessIdleTimeout(toolCallCount: number, interactiveToolCount: number): boolean;
46
48
  export declare const FIRE_AND_FORGET_METHODS: Set<string>;
47
49
  export declare const QUICK_COMMANDS: Set<string>;
48
50
  export declare function isQuickCommand(command: string): boolean;
@@ -65,6 +65,7 @@ export const IDLE_TIMEOUT_MS = 15_000;
65
65
  // between tool calls (e.g. after mkdir, before writing files). Use a
66
66
  // longer idle timeout to avoid killing the session prematurely (#808).
67
67
  export const NEW_MILESTONE_IDLE_TIMEOUT_MS = 120_000;
68
+ const INTERACTIVE_HEADLESS_TOOLS = new Set(['ask_user_questions', 'secure_env_collect']);
68
69
  export function isTerminalNotification(event) {
69
70
  if (event.type !== 'extension_ui_request' || event.method !== 'notify')
70
71
  return false;
@@ -83,6 +84,12 @@ export function isMilestoneReadyNotification(event) {
83
84
  return false;
84
85
  return /milestone\s+m\d+.*ready/i.test(String(event.message ?? ''));
85
86
  }
87
+ export function isInteractiveHeadlessTool(toolName) {
88
+ return INTERACTIVE_HEADLESS_TOOLS.has(String(toolName ?? ''));
89
+ }
90
+ export function shouldArmHeadlessIdleTimeout(toolCallCount, interactiveToolCount) {
91
+ return toolCallCount > 0 && interactiveToolCount === 0;
92
+ }
86
93
  // ---------------------------------------------------------------------------
87
94
  // Quick Command Detection
88
95
  // ---------------------------------------------------------------------------
package/dist/headless.js CHANGED
@@ -17,7 +17,7 @@ import { resolve } from 'node:path';
17
17
  import { RpcClient, SessionManager } from '@gsd/pi-coding-agent';
18
18
  import { getProjectSessionsDir } from './project-sessions.js';
19
19
  import { loadAndValidateAnswerFile, AnswerInjector } from './headless-answers.js';
20
- import { isTerminalNotification, isBlockedNotification, isMilestoneReadyNotification, isQuickCommand, FIRE_AND_FORGET_METHODS, IDLE_TIMEOUT_MS, NEW_MILESTONE_IDLE_TIMEOUT_MS, EXIT_SUCCESS, EXIT_ERROR, EXIT_BLOCKED, EXIT_CANCELLED, mapStatusToExitCode, } from './headless-events.js';
20
+ import { isTerminalNotification, isBlockedNotification, isMilestoneReadyNotification, isQuickCommand, FIRE_AND_FORGET_METHODS, IDLE_TIMEOUT_MS, NEW_MILESTONE_IDLE_TIMEOUT_MS, isInteractiveHeadlessTool, shouldArmHeadlessIdleTimeout, EXIT_SUCCESS, EXIT_ERROR, EXIT_BLOCKED, EXIT_CANCELLED, mapStatusToExitCode, } from './headless-events.js';
21
21
  import { VALID_OUTPUT_FORMATS } from './headless-types.js';
22
22
  import { handleExtensionUIRequest, formatProgress, formatThinkingLine, formatTextStart, formatTextEnd, formatThinkingStart, formatThinkingEnd, startSupervisedStdinReader, } from './headless-ui.js';
23
23
  import { loadContext, bootstrapGsdProject, } from './headless-context.js';
@@ -282,6 +282,7 @@ async function runHeadlessOnce(options, restartCount) {
282
282
  let exitCode = 0;
283
283
  let milestoneReady = false; // tracks "Milestone X ready." for auto-chaining
284
284
  const recentEvents = [];
285
+ const interactiveToolCallIds = new Set();
285
286
  // JSON batch mode: cost aggregation (cumulative-max pattern per K004)
286
287
  let cumulativeCostUsd = 0;
287
288
  let cumulativeInputTokens = 0;
@@ -365,7 +366,7 @@ async function runHeadlessOnce(options, restartCount) {
365
366
  function resetIdleTimer() {
366
367
  if (idleTimer)
367
368
  clearTimeout(idleTimer);
368
- if (toolCallCount > 0) {
369
+ if (shouldArmHeadlessIdleTimeout(toolCallCount, interactiveToolCallIds.size)) {
369
370
  idleTimer = setTimeout(() => {
370
371
  completed = true;
371
372
  resolveCompletion();
@@ -386,13 +387,25 @@ async function runHeadlessOnce(options, restartCount) {
386
387
  client.onEvent((event) => {
387
388
  const eventObj = event;
388
389
  trackEvent(eventObj);
390
+ const eventType = String(eventObj.type ?? '');
391
+ if (eventType === 'tool_execution_start') {
392
+ const toolCallId = String(eventObj.toolCallId ?? eventObj.id ?? '');
393
+ if (toolCallId && isInteractiveHeadlessTool(String(eventObj.toolName ?? ''))) {
394
+ interactiveToolCallIds.add(toolCallId);
395
+ }
396
+ }
397
+ else if (eventType === 'tool_execution_end') {
398
+ const toolCallId = String(eventObj.toolCallId ?? eventObj.id ?? '');
399
+ if (toolCallId) {
400
+ interactiveToolCallIds.delete(toolCallId);
401
+ }
402
+ }
389
403
  resetIdleTimer();
390
404
  // Answer injector: observe events for question metadata
391
405
  injector?.observeEvent(eventObj);
392
406
  // --json / --output-format stream-json: forward events as JSONL to stdout (filtered if --events)
393
407
  // --output-format json (batch mode): suppress streaming, track cost for final result
394
408
  if (options.json && options.outputFormat === 'stream-json') {
395
- const eventType = String(eventObj.type ?? '');
396
409
  if (!options.eventFilter || options.eventFilter.has(eventType)) {
397
410
  process.stdout.write(JSON.stringify(eventObj) + '\n');
398
411
  }
@@ -1,10 +1,15 @@
1
- // MCP SDK subpath imports use wildcard exports (./*) that NodeNext resolves
2
- // at runtime but TypeScript cannot statically type-check. We construct the
3
- // specifiers dynamically so tsc treats them as `any`.
4
- // Use createRequire to resolve wildcard subpaths CJS resolver auto-appends
5
- // .js, which the ESM wildcard export map does not (#3603).
6
- import { createRequire } from 'node:module';
7
- const _require = createRequire(import.meta.url);
1
+ // MCP SDK subpath imports use wildcard exports (./*) in @modelcontextprotocol/sdk's
2
+ // package.json export map. The wildcard maps "./foo" "./dist/cjs/foo" (no .js
3
+ // suffix), so bare subpath specifiers like `${MCP_PKG}/server/stdio` resolve to
4
+ // a non-existent file. Historically the workaround (#3603) used createRequire so
5
+ // the CJS resolver could auto-append `.js`; that no longer works with current
6
+ // Node + SDK releases (#3914) — `_require.resolve` also fails with
7
+ // "Cannot find module .../dist/cjs/server/stdio".
8
+ //
9
+ // The reliable convention (matching packages/mcp-server/{server,cli}.ts) is to
10
+ // write the `.js` suffix explicitly on every wildcard subpath. Specifiers are
11
+ // built via a template string so TypeScript's NodeNext resolver treats them as
12
+ // `any` and skips static checking.
8
13
  const MCP_PKG = '@modelcontextprotocol/sdk';
9
14
  /**
10
15
  * Starts a native MCP (Model Context Protocol) server over stdin/stdout.
@@ -22,9 +27,9 @@ const MCP_PKG = '@modelcontextprotocol/sdk';
22
27
  */
23
28
  export async function startMcpServer(options) {
24
29
  const { tools, version = '0.0.0' } = options;
25
- const serverMod = await import(`${MCP_PKG}/server`);
26
- const stdioMod = await import(_require.resolve(`${MCP_PKG}/server/stdio`));
27
- const typesMod = await import(_require.resolve(`${MCP_PKG}/types`));
30
+ const serverMod = await import(`${MCP_PKG}/server/index.js`);
31
+ const stdioMod = await import(`${MCP_PKG}/server/stdio.js`);
32
+ const typesMod = await import(`${MCP_PKG}/types.js`);
28
33
  const Server = serverMod.Server;
29
34
  const StdioServerTransport = stdioMod.StdioServerTransport;
30
35
  const { ListToolsRequestSchema, CallToolRequestSchema } = typesMod;
@@ -42,8 +47,14 @@ export async function startMcpServer(options) {
42
47
  inputSchema: t.parameters,
43
48
  })),
44
49
  }));
45
- // tools/call — execute the requested tool and return content blocks
46
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
50
+ // tools/call — execute the requested tool and return content blocks.
51
+ //
52
+ // The MCP SDK passes an `extra` argument to request handlers that includes
53
+ // an AbortSignal scoped to the RPC request (cancelled when the client
54
+ // cancels the tool call or the transport closes). Threading it into
55
+ // AgentTool.execute ensures long-running tools (Bash, WebFetch, grep on
56
+ // huge trees) actually stop when the client gives up on the result.
57
+ server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
47
58
  const { name, arguments: args } = request.params;
48
59
  const tool = toolMap.get(name);
49
60
  if (!tool) {
@@ -52,20 +63,32 @@ export async function startMcpServer(options) {
52
63
  content: [{ type: 'text', text: `Unknown tool: ${name}` }],
53
64
  };
54
65
  }
66
+ const signal = extra?.signal;
55
67
  try {
56
- const result = await tool.execute(`mcp-${Date.now()}`, args ?? {}, undefined, // no AbortSignal
57
- undefined);
58
- // Convert AgentToolResult content blocks to MCP content format
68
+ const result = await tool.execute(`mcp-${Date.now()}`, args ?? {}, signal, undefined);
69
+ // Convert AgentToolResult content blocks to MCP content format.
70
+ // text and image pass through; any other shape is serialized as text
71
+ // so the client sees the payload rather than an empty response.
59
72
  const content = result.content.map((block) => {
60
73
  if (block.type === 'text')
61
74
  return { type: 'text', text: block.text ?? '' };
62
- if (block.type === 'image')
63
- return { type: 'image', data: block.data ?? '', mimeType: block.mimeType ?? 'image/png' };
75
+ if (block.type === 'image') {
76
+ return {
77
+ type: 'image',
78
+ data: block.data ?? '',
79
+ mimeType: block.mimeType ?? 'image/png',
80
+ };
81
+ }
82
+ // Preserve unknown block types (resource, resource_link, audio, ...)
83
+ // by stringifying into a text block so clients see the payload.
64
84
  return { type: 'text', text: JSON.stringify(block) };
65
85
  });
66
86
  return { content };
67
87
  }
68
88
  catch (err) {
89
+ // AbortError from a cancelled tool surfaces as a normal error — MCP
90
+ // clients interpret `isError: true` as a failed call, which is the
91
+ // correct behaviour for a cancelled request.
69
92
  const message = err instanceof Error ? err.message : String(err);
70
93
  return { isError: true, content: [{ type: 'text', text: message }] };
71
94
  }
@@ -277,6 +277,16 @@ async function runLlmStep(p, pc, authStorage) {
277
277
  p.log.info('Your Claude subscription will be used for inference. No API key needed.');
278
278
  // Store sentinel so hasAuth('claude-code') returns true on future boots
279
279
  authStorage.set('claude-code', { type: 'api_key', key: 'cli' });
280
+ // Persist claude-code as the default provider so the startup migration in
281
+ // cli.ts does not need to fire and the user is not left on "anthropic".
282
+ const settingsPath = join(agentDir, 'settings.json');
283
+ try {
284
+ const raw = existsSync(settingsPath) ? JSON.parse(readFileSync(settingsPath, 'utf-8')) : {};
285
+ raw.defaultProvider = 'claude-code';
286
+ mkdirSync(dirname(settingsPath), { recursive: true });
287
+ writeFileSync(settingsPath, JSON.stringify(raw, null, 2), 'utf-8');
288
+ }
289
+ catch { /* non-fatal — startup migration will catch it */ }
280
290
  return true;
281
291
  }
282
292
  // ── Step 2: Which provider? ──────────────────────────────────────────────
@@ -0,0 +1,10 @@
1
+ import type { AuthStorage } from "@gsd/pi-coding-agent";
2
+ type AnthropicMigrationDeps = {
3
+ authStorage: Pick<AuthStorage, "getCredentialsForProvider">;
4
+ isClaudeCodeReady: boolean;
5
+ defaultProvider: string | undefined;
6
+ env?: NodeJS.ProcessEnv;
7
+ };
8
+ export declare function hasDirectAnthropicApiKey(authStorage: Pick<AuthStorage, "getCredentialsForProvider">, env?: NodeJS.ProcessEnv): boolean;
9
+ export declare function shouldMigrateAnthropicToClaudeCode({ authStorage, isClaudeCodeReady, defaultProvider, env, }: AnthropicMigrationDeps): boolean;
10
+ export {};
@@ -0,0 +1,12 @@
1
+ export function hasDirectAnthropicApiKey(authStorage, env = process.env) {
2
+ if ((env.ANTHROPIC_API_KEY ?? "").trim()) {
3
+ return true;
4
+ }
5
+ return authStorage.getCredentialsForProvider("anthropic").some((credential) => credential?.type === "api_key" && typeof credential?.key === "string" && credential.key.trim().length > 0);
6
+ }
7
+ export function shouldMigrateAnthropicToClaudeCode({ authStorage, isClaudeCodeReady, defaultProvider, env = process.env, }) {
8
+ if (!isClaudeCodeReady || defaultProvider !== "anthropic") {
9
+ return false;
10
+ }
11
+ return !hasDirectAnthropicApiKey(authStorage, env);
12
+ }