gsd-pi 2.75.0-next.9c0ec0ba1 → 2.76.0-dev.b072ebb73

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 (680) hide show
  1. package/README.md +145 -125
  2. package/dist/claude-cli-check.d.ts +10 -0
  3. package/dist/claude-cli-check.js +13 -3
  4. package/dist/onboarding.d.ts +20 -1
  5. package/dist/onboarding.js +60 -25
  6. package/dist/resources/agents/researcher.md +1 -1
  7. package/dist/resources/extensions/ask-user-questions.js +6 -3
  8. package/dist/resources/extensions/claude-code-cli/readiness.js +34 -2
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -2
  10. package/dist/resources/extensions/gsd/auto/phases.js +48 -6
  11. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -8
  13. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -2
  14. package/dist/resources/extensions/gsd/auto-dispatch.js +87 -9
  15. package/dist/resources/extensions/gsd/auto-model-selection.js +27 -6
  16. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -5
  17. package/dist/resources/extensions/gsd/auto-prompts.js +188 -44
  18. package/dist/resources/extensions/gsd/auto-recovery.js +48 -0
  19. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  20. package/dist/resources/extensions/gsd/auto-verification.js +33 -0
  21. package/dist/resources/extensions/gsd/auto-worktree.js +71 -2
  22. package/dist/resources/extensions/gsd/auto.js +25 -3
  23. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
  24. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
  25. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +131 -0
  26. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  27. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +12 -0
  28. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  29. package/dist/resources/extensions/gsd/bootstrap/system-context.js +84 -10
  30. package/dist/resources/extensions/gsd/commands/catalog.js +15 -7
  31. package/dist/resources/extensions/gsd/commands/handlers/core.js +58 -24
  32. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  33. package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
  34. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  35. package/dist/resources/extensions/gsd/commands-config.js +5 -0
  36. package/dist/resources/extensions/gsd/commands-extract-learnings.js +200 -77
  37. package/dist/resources/extensions/gsd/commands-memory.js +462 -0
  38. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +39 -11
  39. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  40. package/dist/resources/extensions/gsd/db-writer.js +89 -16
  41. package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  42. package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
  43. package/dist/resources/extensions/gsd/doctor-git-checks.js +50 -32
  44. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  45. package/dist/resources/extensions/gsd/doctor-providers.js +51 -5
  46. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -1
  47. package/dist/resources/extensions/gsd/doctor.js +7 -1
  48. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -0
  49. package/dist/resources/extensions/gsd/error-classifier.js +5 -2
  50. package/dist/resources/extensions/gsd/escalation.js +321 -0
  51. package/dist/resources/extensions/gsd/graph.js +26 -0
  52. package/dist/resources/extensions/gsd/gsd-db.js +517 -32
  53. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  54. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  55. package/dist/resources/extensions/gsd/hook-emitter.js +108 -0
  56. package/dist/resources/extensions/gsd/init-wizard.js +86 -45
  57. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
  58. package/dist/resources/extensions/gsd/memory-backfill.js +126 -0
  59. package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
  60. package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
  61. package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
  62. package/dist/resources/extensions/gsd/memory-relations.js +189 -0
  63. package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
  64. package/dist/resources/extensions/gsd/memory-store.js +318 -6
  65. package/dist/resources/extensions/gsd/metrics.js +1 -0
  66. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  67. package/dist/resources/extensions/gsd/model-router.js +12 -5
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +121 -5
  69. package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
  70. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  71. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  72. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  73. package/dist/resources/extensions/gsd/pre-execution-checks.js +98 -8
  74. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  75. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  76. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  77. package/dist/resources/extensions/gsd/prompts/add-tests.md +1 -0
  78. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  81. package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -3
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  84. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  85. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -0
  86. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  87. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  88. package/dist/resources/extensions/gsd/state.js +90 -7
  89. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -1
  90. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  91. package/dist/resources/extensions/gsd/tools/memory-tools.js +331 -0
  92. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  93. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  94. package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
  95. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +14 -0
  96. package/dist/resources/extensions/gsd/uok/flags.js +1 -1
  97. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  98. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  99. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -0
  100. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  101. package/dist/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  102. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  103. package/dist/resources/extensions/remote-questions/manager.js +11 -1
  104. package/dist/resources/extensions/search-the-web/command-search-provider.js +4 -1
  105. package/dist/resources/extensions/search-the-web/native-search.js +13 -2
  106. package/dist/resources/skills/api-design/SKILL.md +190 -0
  107. package/dist/resources/skills/create-mcp-server/SKILL.md +121 -0
  108. package/dist/resources/skills/decompose-into-slices/SKILL.md +139 -0
  109. package/dist/resources/skills/dependency-upgrade/SKILL.md +158 -0
  110. package/dist/resources/skills/design-an-interface/SKILL.md +102 -0
  111. package/dist/resources/skills/forensics/SKILL.md +153 -0
  112. package/dist/resources/skills/grill-me/SKILL.md +93 -0
  113. package/dist/resources/skills/handoff/SKILL.md +121 -0
  114. package/dist/resources/skills/observability/SKILL.md +174 -0
  115. package/dist/resources/skills/security-review/SKILL.md +181 -0
  116. package/dist/resources/skills/spike-wrap-up/SKILL.md +138 -0
  117. package/dist/resources/skills/tdd/SKILL.md +112 -0
  118. package/dist/resources/skills/verify-before-complete/SKILL.md +97 -0
  119. package/dist/resources/skills/write-docs/SKILL.md +81 -0
  120. package/dist/resources/skills/write-milestone-brief/SKILL.md +135 -0
  121. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  122. package/dist/web/standalone/.next/BUILD_ID +1 -1
  123. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  124. package/dist/web/standalone/.next/build-manifest.json +3 -3
  125. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  126. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  127. package/dist/web/standalone/.next/required-server-files.json +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  146. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  179. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  191. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +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.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/index.html +1 -1
  211. package/dist/web/standalone/.next/server/app/index.rsc +3 -3
  212. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  213. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  214. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  216. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  217. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  219. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  220. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  221. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  223. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  225. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  226. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  227. package/dist/web/standalone/.next/static/chunks/{2826.02df9631042cc18e.js → 2826.e59e8578e2e28639.js} +2 -2
  228. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  229. package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
  230. package/dist/web/standalone/.next/static/chunks/{webpack-6c7cda3e318eedb6.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  231. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  232. package/dist/web/standalone/server.js +1 -1
  233. package/dist/welcome-screen.js +48 -24
  234. package/package.json +1 -1
  235. package/packages/daemon/package.json +2 -2
  236. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  237. package/packages/mcp-server/dist/server.js +12 -10
  238. package/packages/mcp-server/dist/server.js.map +1 -1
  239. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  240. package/packages/mcp-server/dist/session-manager.js +8 -1
  241. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  242. package/packages/mcp-server/dist/workflow-tools.d.ts +2 -1
  243. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  244. package/packages/mcp-server/dist/workflow-tools.js +306 -71
  245. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  246. package/packages/mcp-server/package.json +2 -2
  247. package/packages/mcp-server/src/mcp-server.test.ts +40 -4
  248. package/packages/mcp-server/src/server.ts +12 -10
  249. package/packages/mcp-server/src/session-manager.ts +10 -3
  250. package/packages/mcp-server/src/workflow-tools.test.ts +346 -1
  251. package/packages/mcp-server/src/workflow-tools.ts +359 -75
  252. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  253. package/packages/native/package.json +1 -1
  254. package/packages/pi-agent-core/dist/agent-loop.js +12 -0
  255. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  256. package/packages/pi-agent-core/dist/types.d.ts +30 -0
  257. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  258. package/packages/pi-agent-core/dist/types.js.map +1 -1
  259. package/packages/pi-agent-core/package.json +1 -1
  260. package/packages/pi-agent-core/src/agent-loop.ts +14 -0
  261. package/packages/pi-agent-core/src/types.ts +34 -0
  262. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  263. package/packages/pi-ai/dist/index.d.ts +1 -0
  264. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  265. package/packages/pi-ai/dist/index.js +1 -0
  266. package/packages/pi-ai/dist/index.js.map +1 -1
  267. package/packages/pi-ai/dist/models/generated/index.d.ts +17 -0
  268. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  269. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  270. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  271. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  272. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  273. package/packages/pi-ai/dist/models.generated.test.js +1 -0
  274. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  275. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  276. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  277. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -7
  278. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  279. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  280. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  281. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  282. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  283. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  284. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  285. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts +2 -0
  286. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts.map +1 -0
  287. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +13 -0
  288. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -0
  289. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +19 -0
  290. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  291. package/packages/pi-ai/dist/providers/anthropic-shared.js +25 -1
  292. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  293. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  294. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  295. package/packages/pi-ai/dist/providers/anthropic.js +23 -2
  296. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  297. package/packages/pi-ai/dist/providers/api-family.d.ts +27 -0
  298. package/packages/pi-ai/dist/providers/api-family.d.ts.map +1 -0
  299. package/packages/pi-ai/dist/providers/api-family.js +47 -0
  300. package/packages/pi-ai/dist/providers/api-family.js.map +1 -0
  301. package/packages/pi-ai/dist/providers/api-family.test.d.ts +2 -0
  302. package/packages/pi-ai/dist/providers/api-family.test.d.ts.map +1 -0
  303. package/packages/pi-ai/dist/providers/api-family.test.js +101 -0
  304. package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -0
  305. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +12 -2
  307. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  308. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +164 -14
  309. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  310. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +15 -3
  312. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  313. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts +2 -0
  314. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts.map +1 -0
  315. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +67 -0
  316. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -0
  317. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +16 -3
  319. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  320. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts +2 -0
  321. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts.map +1 -0
  322. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +67 -0
  323. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -0
  324. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +2 -0
  325. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +1 -0
  326. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +289 -0
  327. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +1 -0
  328. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  329. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  330. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  331. package/packages/pi-ai/package.json +1 -1
  332. package/packages/pi-ai/scripts/generate-models.ts +12 -0
  333. package/packages/pi-ai/src/index.ts +1 -0
  334. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  335. package/packages/pi-ai/src/models.generated.test.ts +1 -0
  336. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  337. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -8
  338. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  339. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -0
  340. package/packages/pi-ai/src/providers/anthropic-shared.ts +30 -1
  341. package/packages/pi-ai/src/providers/anthropic.ts +25 -2
  342. package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
  343. package/packages/pi-ai/src/providers/api-family.ts +57 -0
  344. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +200 -23
  345. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +12 -2
  346. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +84 -0
  347. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +15 -5
  348. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +84 -0
  349. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +16 -5
  350. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +363 -0
  351. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  352. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  353. package/packages/pi-coding-agent/dist/cli/args.d.ts +6 -0
  354. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/cli/args.js +14 -4
  356. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/cli/args.test.d.ts +2 -0
  358. package/packages/pi-coding-agent/dist/cli/args.test.d.ts.map +1 -0
  359. package/packages/pi-coding-agent/dist/cli/args.test.js +38 -0
  360. package/packages/pi-coding-agent/dist/cli/args.test.js.map +1 -0
  361. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/agent-session.js +25 -2
  363. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +7 -0
  365. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/auth-storage.js +25 -0
  367. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +38 -0
  369. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  371. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  373. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/core/extensions/loader.js +4 -0
  377. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  378. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +34 -2
  379. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  380. package/packages/pi-coding-agent/dist/core/extensions/runner.js +233 -0
  381. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  382. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +200 -3
  383. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  384. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts +53 -0
  386. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts.map +1 -0
  387. package/packages/pi-coding-agent/dist/core/hooks-runner.js +337 -0
  388. package/packages/pi-coding-agent/dist/core/hooks-runner.js.map +1 -0
  389. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts +2 -0
  390. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +234 -0
  392. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -0
  393. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  394. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  396. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts +2 -0
  398. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts.map +1 -0
  399. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js +40 -0
  400. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js.map +1 -0
  401. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  402. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  404. package/packages/pi-coding-agent/dist/core/retry-handler.js +4 -1
  405. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  406. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -0
  407. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/core/sdk.js +33 -5
  409. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +55 -0
  411. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  414. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  416. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  417. package/packages/pi-coding-agent/dist/main.js +3 -0
  418. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  419. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  420. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  421. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  422. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  424. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  426. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  428. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +1 -0
  430. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  431. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +1 -0
  432. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  437. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +13 -9
  438. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  439. package/packages/pi-coding-agent/package.json +1 -1
  440. package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
  441. package/packages/pi-coding-agent/src/cli/args.ts +21 -6
  442. package/packages/pi-coding-agent/src/core/agent-session.ts +27 -2
  443. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +42 -0
  444. package/packages/pi-coding-agent/src/core/auth-storage.ts +25 -0
  445. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  446. package/packages/pi-coding-agent/src/core/extensions/index.ts +16 -0
  447. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  448. package/packages/pi-coding-agent/src/core/extensions/runner.ts +353 -1
  449. package/packages/pi-coding-agent/src/core/extensions/types.ts +253 -2
  450. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +269 -0
  451. package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
  452. package/packages/pi-coding-agent/src/core/index.ts +10 -0
  453. package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
  454. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  455. package/packages/pi-coding-agent/src/core/retry-handler.ts +4 -1
  456. package/packages/pi-coding-agent/src/core/sdk.ts +48 -5
  457. package/packages/pi-coding-agent/src/core/settings-manager.ts +57 -0
  458. package/packages/pi-coding-agent/src/index.ts +16 -0
  459. package/packages/pi-coding-agent/src/main.ts +4 -0
  460. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  461. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  462. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  463. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +1 -0
  464. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +1 -0
  465. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +13 -9
  466. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  467. package/packages/pi-tui/package.json +1 -1
  468. package/packages/rpc-client/package.json +1 -1
  469. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +1 -0
  470. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  471. package/pkg/dist/modes/interactive/theme/theme-schema.js +1 -0
  472. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  473. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  474. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  475. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  476. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  477. package/pkg/dist/modes/interactive/theme/themes.js +13 -9
  478. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  479. package/pkg/package.json +1 -1
  480. package/src/resources/agents/researcher.md +1 -1
  481. package/src/resources/extensions/ask-user-questions.ts +7 -4
  482. package/src/resources/extensions/claude-code-cli/readiness.ts +36 -2
  483. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +59 -1
  484. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +66 -0
  485. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -10
  486. package/src/resources/extensions/gsd/auto/phases.ts +52 -6
  487. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  488. package/src/resources/extensions/gsd/auto-dashboard.ts +46 -5
  489. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  490. package/src/resources/extensions/gsd/auto-dispatch.ts +96 -4
  491. package/src/resources/extensions/gsd/auto-model-selection.ts +37 -6
  492. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -5
  493. package/src/resources/extensions/gsd/auto-prompts.ts +225 -45
  494. package/src/resources/extensions/gsd/auto-recovery.ts +47 -0
  495. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  496. package/src/resources/extensions/gsd/auto-verification.ts +33 -0
  497. package/src/resources/extensions/gsd/auto-worktree.ts +81 -1
  498. package/src/resources/extensions/gsd/auto.ts +27 -2
  499. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  500. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
  501. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +163 -0
  502. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  503. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -0
  504. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  505. package/src/resources/extensions/gsd/bootstrap/system-context.ts +89 -10
  506. package/src/resources/extensions/gsd/commands/catalog.ts +15 -7
  507. package/src/resources/extensions/gsd/commands/handlers/core.ts +63 -27
  508. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  509. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
  510. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  511. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  512. package/src/resources/extensions/gsd/commands-extract-learnings.ts +262 -78
  513. package/src/resources/extensions/gsd/commands-memory.ts +551 -0
  514. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +48 -11
  515. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  516. package/src/resources/extensions/gsd/db-writer.ts +91 -17
  517. package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  518. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  519. package/src/resources/extensions/gsd/doctor-git-checks.ts +51 -30
  520. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  521. package/src/resources/extensions/gsd/doctor-providers.ts +59 -6
  522. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -1
  523. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  524. package/src/resources/extensions/gsd/doctor.ts +7 -1
  525. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +2 -0
  526. package/src/resources/extensions/gsd/error-classifier.ts +5 -2
  527. package/src/resources/extensions/gsd/escalation.ts +367 -0
  528. package/src/resources/extensions/gsd/graph.ts +33 -0
  529. package/src/resources/extensions/gsd/gsd-db.ts +617 -32
  530. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  531. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  532. package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
  533. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  534. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  535. package/src/resources/extensions/gsd/memory-backfill.ts +140 -0
  536. package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
  537. package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
  538. package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
  539. package/src/resources/extensions/gsd/memory-relations.ts +240 -0
  540. package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
  541. package/src/resources/extensions/gsd/memory-store.ts +377 -7
  542. package/src/resources/extensions/gsd/metrics.ts +1 -0
  543. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  544. package/src/resources/extensions/gsd/model-router.ts +21 -5
  545. package/src/resources/extensions/gsd/native-git-bridge.ts +118 -6
  546. package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
  547. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  548. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  549. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  550. package/src/resources/extensions/gsd/pre-execution-checks.ts +100 -12
  551. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  552. package/src/resources/extensions/gsd/preferences-types.ts +9 -1
  553. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  554. package/src/resources/extensions/gsd/prompts/add-tests.md +1 -0
  555. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  556. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  557. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  558. package/src/resources/extensions/gsd/prompts/execute-task.md +16 -3
  559. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  560. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  561. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  562. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -0
  563. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  564. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  565. package/src/resources/extensions/gsd/state.ts +95 -6
  566. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -1
  567. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  568. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +49 -0
  569. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  570. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +95 -1
  571. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  572. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  573. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  574. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +54 -0
  575. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +335 -21
  576. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  577. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  578. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  579. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +42 -0
  580. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -4
  581. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -3
  582. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  583. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +306 -1
  584. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  585. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +145 -8
  586. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +62 -0
  587. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  588. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  589. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  590. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +90 -0
  591. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +117 -0
  592. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  593. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +32 -1
  594. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +72 -5
  595. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  596. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  597. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -1
  598. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +35 -0
  599. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
  600. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  601. package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
  602. package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
  603. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
  604. package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
  605. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  606. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
  607. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  608. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  609. package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
  610. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  611. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
  612. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  613. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  614. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  615. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  616. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  617. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  618. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +317 -1
  619. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  620. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  621. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  622. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +159 -8
  623. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  624. package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
  625. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +41 -4
  626. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  627. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  628. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  629. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  630. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  631. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  632. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +54 -0
  633. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  634. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  635. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  636. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +1 -1
  637. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -3
  638. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  639. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  640. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +97 -0
  641. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  642. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  643. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  644. package/src/resources/extensions/gsd/tools/memory-tools.ts +410 -0
  645. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  646. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  647. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  648. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +14 -0
  649. package/src/resources/extensions/gsd/types.ts +62 -0
  650. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  651. package/src/resources/extensions/gsd/uok/flags.ts +1 -1
  652. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  653. package/src/resources/extensions/gsd/workflow-logger.ts +4 -1
  654. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  655. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -0
  656. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  657. package/src/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  658. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  659. package/src/resources/extensions/remote-questions/manager.ts +13 -1
  660. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  661. package/src/resources/extensions/search-the-web/command-search-provider.ts +4 -1
  662. package/src/resources/extensions/search-the-web/native-search.ts +13 -3
  663. package/src/resources/skills/api-design/SKILL.md +190 -0
  664. package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
  665. package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
  666. package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
  667. package/src/resources/skills/design-an-interface/SKILL.md +102 -0
  668. package/src/resources/skills/forensics/SKILL.md +153 -0
  669. package/src/resources/skills/grill-me/SKILL.md +93 -0
  670. package/src/resources/skills/handoff/SKILL.md +121 -0
  671. package/src/resources/skills/observability/SKILL.md +174 -0
  672. package/src/resources/skills/security-review/SKILL.md +181 -0
  673. package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
  674. package/src/resources/skills/tdd/SKILL.md +112 -0
  675. package/src/resources/skills/verify-before-complete/SKILL.md +97 -0
  676. package/src/resources/skills/write-docs/SKILL.md +81 -0
  677. package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
  678. package/dist/web/standalone/.next/static/css/3e9cdadb4d23b8a4.css +0 -1
  679. /package/dist/web/standalone/.next/static/{JncJywFxCugMuXGs56m-b → pBwmOoye64ZrRp-_rf0v1}/_buildManifest.js +0 -0
  680. /package/dist/web/standalone/.next/static/{JncJywFxCugMuXGs56m-b → pBwmOoye64ZrRp-_rf0v1}/_ssgManifest.js +0 -0
@@ -37,7 +37,7 @@ interface RemoteResultDetails {
37
37
  threadUrl?: string;
38
38
  status?: string;
39
39
  questions?: Question[];
40
- response?: import("./remote-questions/types.js").RemoteAnswer;
40
+ response?: RoundResult;
41
41
  error?: boolean;
42
42
  }
43
43
 
@@ -435,10 +435,13 @@ export default function AskUserQuestions(pi: ExtensionAPI) {
435
435
  lines.push(`${theme.fg("accent", q.header)}: ${theme.fg("dim", "(no answer)")}`);
436
436
  continue;
437
437
  }
438
- const answerText = answer.answers.length > 0 ? answer.answers.join(", ") : "(custom)";
438
+ const selected = answer.selected;
439
+ const answerText = Array.isArray(selected)
440
+ ? (selected.length > 0 ? selected.join(", ") : "(custom)")
441
+ : (selected || "(custom)");
439
442
  let line = `${theme.fg("success", "✓ ")}${theme.fg("accent", q.header)}: ${answerText}`;
440
- if (answer.user_note) {
441
- line += ` ${theme.fg("muted", `[note: ${answer.user_note}]`)}`;
443
+ if (answer.notes) {
444
+ line += ` ${theme.fg("muted", `[note: ${answer.notes}]`)}`;
442
445
  }
443
446
  lines.push(line);
444
447
  }
@@ -11,6 +11,40 @@
11
11
 
12
12
  import { execFileSync } from "node:child_process";
13
13
 
14
+ /**
15
+ * Candidate executable names for the Claude Code CLI.
16
+ *
17
+ * Keep the explicit win32 ternary selector for regression coverage (Issue #4424):
18
+ * Node's execFileSync must target `claude.cmd` directly on Windows.
19
+ */
20
+ const CLAUDE_COMMAND = process.platform === "win32" ? "claude.cmd" : "claude";
21
+
22
+ /**
23
+ * Windows installs vary: some environments expose `claude.cmd` (npm shim),
24
+ * others expose a `claude` shim on PATH (for example Git Bash wrappers).
25
+ * Try both to avoid false "not installed" results in readiness checks.
26
+ */
27
+ const CLAUDE_COMMAND_CANDIDATES = process.platform === "win32" ? [CLAUDE_COMMAND, "claude"] : [CLAUDE_COMMAND];
28
+
29
+ function execClaude(args: string[]): Buffer {
30
+ let lastError: unknown;
31
+ for (const command of CLAUDE_COMMAND_CANDIDATES) {
32
+ try {
33
+ return execFileSync(command, args, { timeout: 5_000, stdio: "pipe" });
34
+ } catch (error) {
35
+ lastError = error;
36
+ const code = (error as NodeJS.ErrnoException | undefined)?.code;
37
+ // Windows Git Bash can surface `.cmd` spawn failures as EINVAL instead
38
+ // of ENOENT. Treat both as "try next candidate".
39
+ if (code === "ENOENT" || code === "EINVAL") {
40
+ continue;
41
+ }
42
+ throw error;
43
+ }
44
+ }
45
+ throw lastError ?? new Error(`Claude CLI executable not found (tried: ${CLAUDE_COMMAND_CANDIDATES.join(", ")})`);
46
+ }
47
+
14
48
  let cachedBinaryPresent: boolean | null = null;
15
49
  let cachedAuthed: boolean | null = null;
16
50
  let lastCheckMs = 0;
@@ -27,7 +61,7 @@ function refreshCache(): void {
27
61
 
28
62
  // Check binary presence
29
63
  try {
30
- execFileSync("claude", ["--version"], { timeout: 5_000, stdio: "pipe" });
64
+ execClaude(["--version"]);
31
65
  cachedBinaryPresent = true;
32
66
  } catch {
33
67
  cachedBinaryPresent = false;
@@ -37,7 +71,7 @@ function refreshCache(): void {
37
71
 
38
72
  // Check auth status — exit code 0 with non-error output means authenticated
39
73
  try {
40
- const output = execFileSync("claude", ["auth", "status"], { timeout: 5_000, stdio: "pipe" })
74
+ const output = execClaude(["auth", "status"])
41
75
  .toString()
42
76
  .toLowerCase();
43
77
  // The CLI outputs "not logged in", "no credentials", or similar when unauthenticated
@@ -31,6 +31,7 @@ import type {
31
31
  SDKUserMessage,
32
32
  } from "./sdk-types.js";
33
33
 
34
+ /** A single content block returned by an external (SDK-executed) tool call. */
34
35
  export interface ExternalToolResultContentBlock {
35
36
  type: string;
36
37
  text?: string;
@@ -38,25 +39,30 @@ export interface ExternalToolResultContentBlock {
38
39
  mimeType?: string;
39
40
  }
40
41
 
42
+ /** The full result payload returned by an external tool, including content blocks and error status. */
41
43
  export interface ExternalToolResultPayload {
42
44
  content: ExternalToolResultContentBlock[];
43
45
  details?: Record<string, unknown>;
44
46
  isError: boolean;
45
47
  }
46
48
 
49
+ /** A `ToolCall` block augmented with the external result attached by the SDK synthetic user message. */
47
50
  type ToolCallWithExternalResult = ToolCall & {
48
51
  externalResult?: ExternalToolResultPayload;
49
52
  };
50
53
 
54
+ /** `SimpleStreamOptions` extended with an optional extension UI context for elicitation dialogs. */
51
55
  interface ClaudeCodeStreamOptions extends SimpleStreamOptions {
52
56
  extensionUIContext?: ExtensionUIContext;
53
57
  }
54
58
 
59
+ /** A single selectable option within an SDK elicitation schema field. */
55
60
  interface SdkElicitationRequestOption {
56
61
  const?: string;
57
62
  title?: string;
58
63
  }
59
64
 
65
+ /** JSON-Schema-like descriptor for a single field within an SDK elicitation request schema. */
60
66
  interface SdkElicitationFieldSchema {
61
67
  type?: string;
62
68
  title?: string;
@@ -69,6 +75,7 @@ interface SdkElicitationFieldSchema {
69
75
  };
70
76
  }
71
77
 
78
+ /** The full elicitation request object received from an MCP server via the Claude Agent SDK. */
72
79
  interface SdkElicitationRequest {
73
80
  serverName: string;
74
81
  message: string;
@@ -80,15 +87,18 @@ interface SdkElicitationRequest {
80
87
  };
81
88
  }
82
89
 
90
+ /** The result returned by an elicitation handler back to the Claude Agent SDK. */
83
91
  interface SdkElicitationResult {
84
92
  action: "accept" | "decline" | "cancel";
85
93
  content?: Record<string, string | string[]>;
86
94
  }
87
95
 
96
+ /** A TUI `Question` extended with an optional note-field ID for "None of the above" free-text capture. */
88
97
  interface ParsedElicitationQuestion extends Question {
89
98
  noteFieldId?: string;
90
99
  }
91
100
 
101
+ /** Descriptor for a single free-text input field parsed from an SDK elicitation form schema. */
92
102
  interface ParsedTextInputField {
93
103
  id: string;
94
104
  title: string;
@@ -97,6 +107,7 @@ interface ParsedTextInputField {
97
107
  secure: boolean;
98
108
  }
99
109
 
110
+ /** A base64-encoded image block in the format accepted by the Claude Agent SDK input message. */
100
111
  interface SDKInputImageBlock {
101
112
  type: "image";
102
113
  source: {
@@ -106,13 +117,16 @@ interface SDKInputImageBlock {
106
117
  };
107
118
  }
108
119
 
120
+ /** A plain-text block in the format accepted by the Claude Agent SDK input message. */
109
121
  interface SDKInputTextBlock {
110
122
  type: "text";
111
123
  text: string;
112
124
  }
113
125
 
126
+ /** Union of content block types that may appear in a Claude Agent SDK user input message. */
114
127
  type SDKInputUserContentBlock = SDKInputImageBlock | SDKInputTextBlock;
115
128
 
129
+ /** A synthetic user message in the Claude Agent SDK's async-iterable prompt format, used when images are present. */
116
130
  interface SDKInputUserMessage {
117
131
  type: "user";
118
132
  message: {
@@ -122,7 +136,9 @@ interface SDKInputUserMessage {
122
136
  parent_tool_use_id: null;
123
137
  }
124
138
 
139
+ /** Label used for the free-text fallback option in single-choice elicitation questions. */
125
140
  const OTHER_OPTION_LABEL = "None of the above";
141
+ /** Regex pattern that identifies field names and descriptions that should be treated as sensitive/secure inputs. */
126
142
  const SENSITIVE_FIELD_PATTERN = /(password|passphrase|secret|token|api[_\s-]*key|private[_\s-]*key|credential)/i;
127
143
 
128
144
  // ---------------------------------------------------------------------------
@@ -144,6 +160,7 @@ function createAssistantStream(): AssistantMessageEventStream {
144
160
  ) as AssistantMessageEventStream;
145
161
  }
146
162
 
163
+ /** Extract a human-readable error string from an SDK result message. */
147
164
  export function getResultErrorMessage(result: SDKResultMessage): string {
148
165
  if ("errors" in result && Array.isArray(result.errors) && result.errors.length > 0) {
149
166
  return result.errors.join("; ");
@@ -160,12 +177,15 @@ export function getResultErrorMessage(result: SDKResultMessage): string {
160
177
  // Claude binary resolution
161
178
  // ---------------------------------------------------------------------------
162
179
 
180
+ /** Cached result of the `which`/`where claude` lookup so the shell is only spawned once per process. */
163
181
  let cachedClaudePath: string | null = null;
164
182
 
183
+ /** Return the shell command used to locate the `claude` binary on the given platform. */
165
184
  export function getClaudeLookupCommand(platform: NodeJS.Platform = process.platform): string {
166
185
  return platform === "win32" ? "where claude" : "which claude";
167
186
  }
168
187
 
188
+ /** Extract the first line of `which`/`where` output as the resolved binary path. */
169
189
  export function parseClaudeLookupOutput(output: Buffer | string): string {
170
190
  return output
171
191
  .toString()
@@ -248,6 +268,7 @@ export function buildPromptFromContext(context: Context): string {
248
268
  return parts.join("\n\n");
249
269
  }
250
270
 
271
+ /** Strip the `data:<mime>;base64,` prefix from a data URI, returning only the raw base64 payload. */
251
272
  function stripDataUriPrefix(value: string): string {
252
273
  const commaIndex = value.indexOf(",");
253
274
  if (value.startsWith("data:") && commaIndex !== -1) {
@@ -256,11 +277,13 @@ function stripDataUriPrefix(value: string): string {
256
277
  return value;
257
278
  }
258
279
 
280
+ /** Extract the MIME type from a data URI string, or return `null` if the value is not a valid data URI. */
259
281
  function inferMimeTypeFromDataUri(value: string): string | null {
260
282
  const match = /^data:([^;,]+);base64,/.exec(value);
261
283
  return match?.[1] ?? null;
262
284
  }
263
285
 
286
+ /** Collect all base64 image blocks from user messages in the context for inclusion in the SDK prompt. */
264
287
  export function extractImageBlocksFromContext(context: Context): SDKInputImageBlock[] {
265
288
  const imageBlocks: SDKInputImageBlock[] = [];
266
289
 
@@ -291,6 +314,7 @@ export function extractImageBlocksFromContext(context: Context): SDKInputImageBl
291
314
  return imageBlocks;
292
315
  }
293
316
 
317
+ /** Build the SDK query prompt, wrapping image blocks into an async iterable user message when present. */
294
318
  export function buildSdkQueryPrompt(
295
319
  context: Context,
296
320
  textPrompt: string = buildPromptFromContext(context),
@@ -320,6 +344,7 @@ export function buildSdkQueryPrompt(
320
344
  // Error helper
321
345
  // ---------------------------------------------------------------------------
322
346
 
347
+ /** Build a minimal error `AssistantMessage` with the given model ID and error text. */
323
348
  function makeErrorMessage(model: string, errorMsg: string): AssistantMessage {
324
349
  return {
325
350
  role: "assistant",
@@ -348,6 +373,7 @@ export function makeStreamExhaustedErrorMessage(model: string, lastTextContent:
348
373
  return message;
349
374
  }
350
375
 
376
+ /** Extract the string labels from an array of SDK elicitation option objects, filtering out blank entries. */
351
377
  function readElicitationChoices(options: SdkElicitationRequestOption[] | undefined): string[] {
352
378
  if (!Array.isArray(options)) return [];
353
379
  return options
@@ -355,6 +381,7 @@ function readElicitationChoices(options: SdkElicitationRequestOption[] | undefin
355
381
  .filter((option): option is string => option.length > 0);
356
382
  }
357
383
 
384
+ /** Parse an SDK elicitation request into structured multiple-choice questions, or null if the schema is unsupported. */
358
385
  export function parseAskUserQuestionsElicitation(
359
386
  request: Pick<SdkElicitationRequest, "mode" | "requestedSchema">,
360
387
  ): ParsedElicitationQuestion[] | null {
@@ -408,6 +435,7 @@ export function parseAskUserQuestionsElicitation(
408
435
  return questions.length > 0 ? questions : null;
409
436
  }
410
437
 
438
+ /** Return true if the elicitation field should be treated as sensitive and rendered as a secure/password input. */
411
439
  function isSecureElicitationField(
412
440
  requestMessage: string,
413
441
  fieldId: string,
@@ -431,6 +459,7 @@ function isSecureElicitationField(
431
459
  return SENSITIVE_FIELD_PATTERN.test(haystack);
432
460
  }
433
461
 
462
+ /** Parse an SDK elicitation request into free-text input field descriptors, or null if unsupported. */
434
463
  export function parseTextInputElicitation(
435
464
  request: Pick<SdkElicitationRequest, "message" | "mode" | "requestedSchema">,
436
465
  ): ParsedTextInputField[] | null {
@@ -469,6 +498,7 @@ export function parseTextInputElicitation(
469
498
  return fields.length > 0 ? fields : null;
470
499
  }
471
500
 
501
+ /** Convert a TUI interview round result into the SDK elicitation content map. */
472
502
  export function roundResultToElicitationContent(
473
503
  questions: ParsedElicitationQuestion[],
474
504
  result: RoundResult,
@@ -495,6 +525,7 @@ export function roundResultToElicitationContent(
495
525
  return content;
496
526
  }
497
527
 
528
+ /** Build the dialog title string for a multiple-choice elicitation question, combining server name, header, and question text. */
498
529
  function buildElicitationPromptTitle(request: SdkElicitationRequest, question: ParsedElicitationQuestion): string {
499
530
  const parts = [
500
531
  request.serverName ? `[${request.serverName}]` : "",
@@ -504,6 +535,7 @@ function buildElicitationPromptTitle(request: SdkElicitationRequest, question: P
504
535
  return parts.join("\n\n");
505
536
  }
506
537
 
538
+ /** Drive each multiple-choice elicitation question through the extension UI's `select` dialog, collecting answers into an SDK result. */
507
539
  async function promptElicitationWithDialogs(
508
540
  request: SdkElicitationRequest,
509
541
  questions: ParsedElicitationQuestion[],
@@ -550,6 +582,7 @@ async function promptElicitationWithDialogs(
550
582
  return { action: "accept", content };
551
583
  }
552
584
 
585
+ /** Build the dialog title string for a free-text input field, combining server name, field title, and description. */
553
586
  function buildTextInputPromptTitle(request: SdkElicitationRequest, field: ParsedTextInputField): string {
554
587
  const parts = [
555
588
  request.serverName ? `[${request.serverName}]` : "",
@@ -559,6 +592,7 @@ function buildTextInputPromptTitle(request: SdkElicitationRequest, field: Parsed
559
592
  return parts.join("\n\n");
560
593
  }
561
594
 
595
+ /** Derive a placeholder hint for a free-text input field from its description, falling back to "Required" or "Leave empty to skip". */
562
596
  function buildTextInputPlaceholder(field: ParsedTextInputField): string | undefined {
563
597
  const desc = field.description.trim();
564
598
  if (!desc) return field.required ? "Required" : "Leave empty to skip";
@@ -573,6 +607,7 @@ function buildTextInputPlaceholder(field: ParsedTextInputField): string | undefi
573
607
  return hint.length > 0 ? hint : field.required ? "Required" : "Leave empty to skip";
574
608
  }
575
609
 
610
+ /** Collect each free-text input field via the extension UI's `input` dialog, returning the filled SDK elicitation result. */
576
611
  async function promptTextInputElicitation(
577
612
  request: SdkElicitationRequest,
578
613
  fields: ParsedTextInputField[],
@@ -596,6 +631,7 @@ async function promptTextInputElicitation(
596
631
  return { action: "accept", content };
597
632
  }
598
633
 
634
+ /** Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available. */
599
635
  export function createClaudeCodeElicitationHandler(
600
636
  ui: ExtensionUIContext | undefined,
601
637
  ): ((request: SdkElicitationRequest, options: { signal: AbortSignal }) => Promise<SdkElicitationResult>) | undefined {
@@ -682,6 +718,7 @@ export async function resolveClaudePermissionMode(
682
718
  // NOTE: These helpers intentionally mirror @gsd/pi-ai anthropic-shared
683
719
  // behavior so this extension remains typecheck-stable even when the published
684
720
  // @gsd/pi-ai barrel lags behind monorepo source exports.
721
+ /** Return true for model IDs that support the adaptive thinking API (Opus 4.6/4.7, Sonnet 4.6/4.7, Haiku 4.5). */
685
722
  function modelSupportsAdaptiveThinking(modelId: string): boolean {
686
723
  return (
687
724
  modelId.includes("opus-4-6")
@@ -690,9 +727,14 @@ function modelSupportsAdaptiveThinking(modelId: string): boolean {
690
727
  || modelId.includes("opus-4.7")
691
728
  || modelId.includes("sonnet-4-6")
692
729
  || modelId.includes("sonnet-4.6")
730
+ || modelId.includes("sonnet-4-7")
731
+ || modelId.includes("sonnet-4.7")
732
+ || modelId.includes("haiku-4-5")
733
+ || modelId.includes("haiku-4.5")
693
734
  );
694
735
  }
695
736
 
737
+ /** Map a GSD thinking level to the Anthropic effort value, clamping xhigh to max for models that lack native xhigh support. */
696
738
  function mapThinkingLevelToAnthropicEffort(level: ThinkingLevel | undefined, modelId: string): "low" | "medium" | "high" | "xhigh" | "max" {
697
739
  switch (level) {
698
740
  case "minimal":
@@ -747,10 +789,21 @@ export function buildSdkOptions(
747
789
  "Bash(pwd)",
748
790
  ...(mcpServers ? Object.keys(mcpServers).map((serverName) => `mcp__${serverName}__*`) : []),
749
791
  ];
792
+ const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
750
793
  const effort =
751
- reasoning && modelSupportsAdaptiveThinking(modelId)
794
+ reasoning && supportsAdaptive
752
795
  ? mapThinkingLevelToAnthropicEffort(reasoning, modelId)
753
796
  : undefined;
797
+
798
+ // Bug B: SDK requires thinking:{type:"adaptive"} alongside effort for adaptive thinking to activate.
799
+ // Bug C: SDK requires thinking:{type:"disabled"} to actually stop adaptive thinking when reasoning is off;
800
+ // omitting the field leaves the SDK in its adaptive default (or persisted session state).
801
+ const thinkingConfig = supportsAdaptive
802
+ ? effort
803
+ ? { thinking: { type: "adaptive" } }
804
+ : { thinking: { type: "disabled" } }
805
+ : undefined;
806
+
754
807
  return {
755
808
  pathToClaudeCodeExecutable: getClaudePath(),
756
809
  model: modelId,
@@ -765,11 +818,13 @@ export function buildSdkOptions(
765
818
  ...(allowedTools.length > 0 ? { allowedTools } : {}),
766
819
  ...(mcpServers ? { mcpServers } : {}),
767
820
  betas: (modelId.includes("sonnet") || modelId.includes("opus-4-7") || modelId.includes("opus-4.7")) ? ["context-1m-2025-08-07"] : [],
821
+ ...(thinkingConfig ?? {}),
768
822
  ...(effort ? { effort } : {}),
769
823
  ...sdkExtraOptions,
770
824
  };
771
825
  }
772
826
 
827
+ /** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
773
828
  function normalizeToolResultContent(content: unknown): ExternalToolResultContentBlock[] {
774
829
  if (typeof content === "string") {
775
830
  return [{ type: "text", text: content }];
@@ -812,6 +867,7 @@ function normalizeToolResultContent(content: unknown): ExternalToolResultContent
812
867
  return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
813
868
  }
814
869
 
870
+ /** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
815
871
  export function extractToolResultsFromSdkUserMessage(message: SDKUserMessage): Array<{
816
872
  toolUseId: string;
817
873
  result: ExternalToolResultPayload;
@@ -862,6 +918,7 @@ export function extractToolResultsFromSdkUserMessage(message: SDKUserMessage): A
862
918
  return extracted;
863
919
  }
864
920
 
921
+ /** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
865
922
  function attachExternalResultsToToolBlocks(
866
923
  toolBlocks: AssistantMessage["content"],
867
924
  toolResultsById: ReadonlyMap<string, ExternalToolResultPayload>,
@@ -920,6 +977,7 @@ export function streamViaClaudeCode(
920
977
  return stream;
921
978
  }
922
979
 
980
+ /** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
923
981
  async function pumpSdkMessages(
924
982
  model: Model<any>,
925
983
  context: Context,
@@ -469,6 +469,72 @@ describe("stream-adapter — session persistence (#2859)", () => {
469
469
  assert.equal("effort" in options, false);
470
470
  });
471
471
 
472
+ // --- Bug fixes #4392: thinking field & model coverage ---
473
+
474
+ test("buildSdkOptions sets thinking disabled when reasoning is undefined on adaptive model (#4392)", () => {
475
+ // Bug C: thinkingLevel="off" means reasoning===undefined; SDK needs thinking:{type:"disabled"}
476
+ const options = buildSdkOptions("claude-sonnet-4-6", "test", undefined, {});
477
+ assert.deepEqual(
478
+ (options as any).thinking,
479
+ { type: "disabled" },
480
+ "thinking must be {type:'disabled'} when reasoning is undefined so SDK stops adaptive thinking",
481
+ );
482
+ });
483
+
484
+ test("buildSdkOptions omits effort when reasoning is undefined (thinking disabled) (#4392)", () => {
485
+ // Bug C corollary: no effort when thinking is off
486
+ const options = buildSdkOptions("claude-sonnet-4-6", "test", undefined, {});
487
+ assert.equal("effort" in options, false, "effort must not be set when reasoning is undefined");
488
+ });
489
+
490
+ test("buildSdkOptions sets thinking adaptive when reasoning is provided (#4392)", () => {
491
+ // Bug B: when effort is set, thinking:{type:"adaptive"} must also be present
492
+ const options = buildSdkOptions("claude-opus-4-6", "test", undefined, { reasoning: "high" });
493
+ assert.deepEqual(
494
+ (options as any).thinking,
495
+ { type: "adaptive" },
496
+ "thinking must be {type:'adaptive'} alongside effort when reasoning is set",
497
+ );
498
+ });
499
+
500
+ test("buildSdkOptions includes both effort and thinking.type=adaptive when reasoning is set (#4392)", () => {
501
+ // Bug B: both fields must be present together
502
+ const options = buildSdkOptions("claude-opus-4-6", "test", undefined, { reasoning: "high" });
503
+ assert.equal(options.effort, "high", "effort must be set");
504
+ assert.deepEqual((options as any).thinking, { type: "adaptive" }, "thinking must be adaptive");
505
+ });
506
+
507
+ test("buildSdkOptions maps reasoning to effort for sonnet-4-7 (modelSupportsAdaptiveThinking #4392)", () => {
508
+ // Bug D: sonnet-4-7 was missing from modelSupportsAdaptiveThinking
509
+ const options = buildSdkOptions("claude-sonnet-4-7", "test", undefined, { reasoning: "high" });
510
+ assert.equal(options.effort, "high", "sonnet-4-7 must support adaptive thinking and map effort");
511
+ });
512
+
513
+ test("buildSdkOptions maps reasoning to effort for haiku-4-5 (modelSupportsAdaptiveThinking #4392)", () => {
514
+ // Bug D: haiku-4-5 was missing from modelSupportsAdaptiveThinking
515
+ const options = buildSdkOptions("claude-haiku-4-5", "test", undefined, { reasoning: "high" });
516
+ assert.equal(options.effort, "high", "haiku-4-5 must support adaptive thinking and map effort");
517
+ });
518
+
519
+ test("buildSdkOptions maps reasoning to effort for sonnet-4.7 dot-form (modelSupportsAdaptiveThinking #4392)", () => {
520
+ // Dot-form aliases (e.g. claude-sonnet-4.7) must also be recognised
521
+ const options = buildSdkOptions("claude-sonnet-4.7", "test", undefined, { reasoning: "high" });
522
+ assert.equal(options.effort, "high", "claude-sonnet-4.7 must support adaptive thinking and map effort");
523
+ });
524
+
525
+ test("buildSdkOptions maps reasoning to effort for haiku-4.5 dot-form (modelSupportsAdaptiveThinking #4392)", () => {
526
+ // Dot-form aliases (e.g. claude-haiku-4.5) must also be recognised
527
+ const options = buildSdkOptions("claude-haiku-4.5", "test", undefined, { reasoning: "high" });
528
+ assert.equal(options.effort, "high", "claude-haiku-4.5 must support adaptive thinking and map effort");
529
+ });
530
+
531
+ test("buildSdkOptions does not set thinking field for non-adaptive model when reasoning is undefined (#4392)", () => {
532
+ // Non-adaptive models (e.g. claude-sonnet-4-20250514) don't use the thinking API at all;
533
+ // no thinking field should be set when reasoning is undefined
534
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test", undefined, {});
535
+ assert.equal("thinking" in options, false, "non-adaptive models must not receive a thinking field");
536
+ });
537
+
472
538
  test("buildSdkOptions includes workflow MCP server config when env is set", () => {
473
539
  const prev = {
474
540
  GSD_WORKFLOW_MCP_COMMAND: process.env.GSD_WORKFLOW_MCP_COMMAND,
@@ -16,7 +16,7 @@ import type {
16
16
  VerificationContext,
17
17
  VerificationResult,
18
18
  } from "../auto-verification.js";
19
- import type { DispatchAction } from "../auto-dispatch.js";
19
+ import type { DispatchAction, DispatchContext } from "../auto-dispatch.js";
20
20
  import type { WorktreeResolver } from "../worktree-resolver.js";
21
21
  import type { CmuxLogLevel } from "../../cmux/index.js";
22
22
  import type { JournalEntry } from "../journal.js";
@@ -145,15 +145,7 @@ export interface LoopDeps {
145
145
  } | null>;
146
146
 
147
147
  // Dispatch
148
- resolveDispatch: (dctx: {
149
- basePath: string;
150
- mid: string;
151
- midTitle: string;
152
- state: GSDState;
153
- prefs: GSDPreferences | undefined;
154
- session?: AutoSession;
155
- structuredQuestionsAvailable?: "true" | "false";
156
- }) => Promise<DispatchAction>;
148
+ resolveDispatch: (dctx: DispatchContext) => Promise<DispatchAction>;
157
149
  runPreDispatchHooks: (
158
150
  unitType: string,
159
151
  unitId: string,
@@ -50,6 +50,7 @@ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "
50
50
  import { getEligibleSlices } from "../slice-parallel-eligibility.js";
51
51
  import { startSliceParallel } from "../slice-parallel-orchestrator.js";
52
52
  import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
53
+ import type { MinimalModelRegistry } from "../context-budget.js";
53
54
  import { ensurePlanV2Graph } from "../uok/plan-v2.js";
54
55
  import { resolveUokFlags } from "../uok/flags.js";
55
56
  import { UokGateRunner } from "../uok/gate-runner.js";
@@ -857,6 +858,8 @@ export async function runDispatch(
857
858
  prefs,
858
859
  session: s,
859
860
  structuredQuestionsAvailable,
861
+ sessionContextWindow: ctx.model?.contextWindow,
862
+ modelRegistry: ctx.modelRegistry as MinimalModelRegistry | undefined,
860
863
  });
861
864
 
862
865
  if (dispatchResult.action === "stop") {
@@ -1128,16 +1131,42 @@ export async function runGuards(
1128
1131
  s.lastBudgetAlertLevel =
1129
1132
  newBudgetAlertLevel as AutoSession["lastBudgetAlertLevel"];
1130
1133
 
1131
- if (threshold.pct === 100 && budgetEnforcementAction !== "none") {
1134
+ // Emit Layer 2 budget_threshold event (post-plan hook recommendation).
1135
+ // Extensions / Layer 0 shell hooks may return an action override.
1136
+ let hookAction: "pause" | "downgrade" | "continue" | undefined;
1137
+ try {
1138
+ const { emitBudgetThreshold } = await import("../hook-emitter.js");
1139
+ const hookResult = await emitBudgetThreshold({
1140
+ fraction: budgetPct,
1141
+ spent: totalCost,
1142
+ limit: budgetCeiling,
1143
+ });
1144
+ if (hookResult?.action) hookAction = hookResult.action;
1145
+ } catch (hookErr) {
1146
+ logWarning("engine", `budget_threshold hook emission failed: ${(hookErr as Error).message}`);
1147
+ }
1148
+
1149
+ // Apply hook override to enforcement action. "continue" → "none" (no enforcement),
1150
+ // "pause" and "downgrade" map to the matching enforcement path below.
1151
+ let effectiveAction = budgetEnforcementAction;
1152
+ if (hookAction === "continue") {
1153
+ effectiveAction = "none";
1154
+ } else if (hookAction === "pause") {
1155
+ effectiveAction = "pause";
1156
+ } else if (hookAction === "downgrade") {
1157
+ effectiveAction = "warn";
1158
+ }
1159
+
1160
+ if (threshold.pct === 100 && effectiveAction !== "none") {
1132
1161
  // 100% — special enforcement logic (halt/pause/warn)
1133
1162
  const msg = `Budget ceiling ${deps.formatCost(budgetCeiling)} reached (spent ${deps.formatCost(totalCost)}).`;
1134
- if (budgetEnforcementAction === "halt") {
1163
+ if (effectiveAction === "halt") {
1135
1164
  deps.sendDesktopNotification("GSD", msg, "error", "budget", basename(s.originalBasePath || s.basePath));
1136
1165
  await deps.stopAuto(ctx, pi, "Budget ceiling reached");
1137
1166
  debugLog("autoLoop", { phase: "exit", reason: "budget-halt" });
1138
1167
  return { action: "break", reason: "budget-halt" };
1139
1168
  }
1140
- if (budgetEnforcementAction === "pause") {
1169
+ if (effectiveAction === "pause") {
1141
1170
  ctx.ui.notify(
1142
1171
  `${msg} Pausing auto-mode — /gsd auto to override and continue.`,
1143
1172
  "warning",
@@ -1586,21 +1615,24 @@ export async function runUnitPhase(
1586
1615
  }
1587
1616
 
1588
1617
  if (unitResult.status === "cancelled") {
1618
+ const errorCategory = unitResult.errorContext?.category;
1589
1619
  // Provider-error pause: pauseAuto already handled cleanup and scheduled
1590
1620
  // recovery. Don't hard-stop — just break out of the loop (#2762).
1591
- if (unitResult.errorContext?.category === "provider") {
1621
+ if (errorCategory === "provider") {
1592
1622
  await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1593
- debugLog("autoLoop", { phase: "exit", reason: "provider-pause", isTransient: unitResult.errorContext.isTransient });
1623
+ debugLog("autoLoop", { phase: "exit", reason: "provider-pause", isTransient: unitResult.errorContext?.isTransient });
1594
1624
  return { action: "break", reason: "provider-pause" };
1595
1625
  }
1596
1626
  // Timeout category covers two distinct scenarios:
1597
1627
  // 1. Session creation timeout (120s) — transient, auto-resume with backoff
1598
1628
  // 2. Unit hard timeout (30min+) — stuck agent, pause for manual review
1629
+ // Transient session-failed covers recoverable newSession failures and should
1630
+ // pause instead of hard-stopping.
1599
1631
  // Structural errors (TypeError, is not a function) are NOT transient
1600
1632
  // and must hard-stop to avoid infinite retry loops.
1601
1633
  if (
1602
1634
  unitResult.errorContext?.isTransient &&
1603
- unitResult.errorContext?.category === "timeout"
1635
+ errorCategory === "timeout"
1604
1636
  ) {
1605
1637
  const isSessionCreationTimeout = unitResult.errorContext.message?.includes("Session creation timed out");
1606
1638
 
@@ -1663,6 +1695,20 @@ export async function runUnitPhase(
1663
1695
  await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1664
1696
  return { action: "break", reason: "unit-hard-timeout" };
1665
1697
  }
1698
+ if (
1699
+ unitResult.errorContext?.isTransient &&
1700
+ errorCategory === "session-failed"
1701
+ ) {
1702
+ ctx.ui.notify(
1703
+ `Session creation failed transiently for ${unitType} ${unitId}: ${unitResult.errorContext?.message ?? "unknown"}. Pausing auto-mode (recoverable).`,
1704
+ "warning",
1705
+ );
1706
+ debugLog("autoLoop", { phase: "session-start-transient-pause", unitType, unitId, category: errorCategory });
1707
+ await deps.pauseAuto(ctx, pi);
1708
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1709
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1710
+ return { action: "break", reason: "session-timeout" };
1711
+ }
1666
1712
  // All other cancelled states (structural errors, non-transient failures): hard stop
1667
1713
  if (s.currentUnit) {
1668
1714
  await deps.closeoutUnit(
@@ -43,6 +43,16 @@ export function resolveExpectedArtifactPath(
43
43
  return dir ? join(dir, buildMilestoneFileName(mid, "ROADMAP")) : null;
44
44
  }
45
45
  case "research-slice": {
46
+ // #4414: Sentinel unitId "{mid}/parallel-research" fans out across
47
+ // multiple slices. Resolve to a milestone-level placeholder path so
48
+ // blocker escalation has somewhere to write. Verification for this
49
+ // sentinel is handled directly in verifyExpectedArtifact.
50
+ if (sid === "parallel-research") {
51
+ const mdir = resolveMilestonePath(base, mid);
52
+ return mdir
53
+ ? join(mdir, buildMilestoneFileName(mid, "PARALLEL-BLOCKER"))
54
+ : null;
55
+ }
46
56
  const dir = resolveSlicePath(base, mid, sid!);
47
57
  return dir ? join(dir, buildSliceFileName(sid!, "RESEARCH")) : null;
48
58
  }
@@ -50,6 +60,11 @@ export function resolveExpectedArtifactPath(
50
60
  const dir = resolveSlicePath(base, mid, sid!);
51
61
  return dir ? join(dir, buildSliceFileName(sid!, "PLAN")) : null;
52
62
  }
63
+ case "refine-slice": {
64
+ // ADR-011: refine-slice expands a sketch and writes the same PLAN.md as plan-slice.
65
+ const dir = resolveSlicePath(base, mid, sid!);
66
+ return dir ? join(dir, buildSliceFileName(sid!, "PLAN")) : null;
67
+ }
53
68
  case "reassess-roadmap": {
54
69
  const dir = resolveSlicePath(base, mid, sid!);
55
70
  return dir ? join(dir, buildSliceFileName(sid!, "ASSESSMENT")) : null;
@@ -109,9 +124,14 @@ export function diagnoseExpectedArtifact(
109
124
  case "plan-milestone":
110
125
  return `${relMilestoneFile(base, mid, "ROADMAP")} (milestone roadmap)`;
111
126
  case "research-slice":
127
+ if (sid === "parallel-research") {
128
+ return `${relMilestoneFile(base, mid, "PARALLEL-BLOCKER")} (parallel slice research sentinel)`;
129
+ }
112
130
  return `${relSliceFile(base, mid, sid!, "RESEARCH")} (slice research)`;
113
131
  case "plan-slice":
114
132
  return `${relSliceFile(base, mid, sid!, "PLAN")} (slice plan)`;
133
+ case "refine-slice":
134
+ return `${relSliceFile(base, mid, sid!, "PLAN")} (refined slice plan from sketch)`;
115
135
  case "execute-task": {
116
136
  return `Task ${tid} marked [x] in ${relSliceFile(base, mid, sid!, "PLAN")} + summary written`;
117
137
  }