gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.fd2382b9f

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 (606) hide show
  1. package/README.md +186 -149
  2. package/dist/claude-cli-check.d.ts +10 -0
  3. package/dist/claude-cli-check.js +13 -3
  4. package/dist/headless-events.d.ts +1 -1
  5. package/dist/headless-events.js +5 -2
  6. package/dist/headless.js +5 -6
  7. package/dist/loader.js +0 -0
  8. package/dist/onboarding.js +39 -14
  9. package/dist/resources/extensions/ask-user-questions.js +17 -5
  10. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  11. package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
  12. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
  13. package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
  14. package/dist/resources/extensions/gsd/auto/loop.js +67 -4
  15. package/dist/resources/extensions/gsd/auto/phases.js +70 -47
  16. package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
  17. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
  18. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  19. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +15 -7
  21. package/dist/resources/extensions/gsd/auto-dispatch.js +112 -6
  22. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +10 -2
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +9 -7
  25. package/dist/resources/extensions/gsd/auto-prompts.js +151 -37
  26. package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
  27. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  28. package/dist/resources/extensions/gsd/auto-verification.js +3 -3
  29. package/dist/resources/extensions/gsd/auto-worktree.js +55 -1
  30. package/dist/resources/extensions/gsd/auto.js +50 -25
  31. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
  32. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +22 -4
  33. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  35. package/dist/resources/extensions/gsd/commands/catalog.js +67 -3
  36. package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -0
  37. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  38. package/dist/resources/extensions/gsd/commands/handlers/ops.js +16 -0
  39. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
  40. package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
  41. package/dist/resources/extensions/gsd/commands-debug.js +388 -0
  42. package/dist/resources/extensions/gsd/commands-do.js +1 -0
  43. package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
  44. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  45. package/dist/resources/extensions/gsd/commands-scan.js +94 -0
  46. package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
  47. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  48. package/dist/resources/extensions/gsd/db-writer.js +1 -0
  49. package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
  50. package/dist/resources/extensions/gsd/definition-loader.js +7 -0
  51. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  52. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  53. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  54. package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
  55. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
  56. package/dist/resources/extensions/gsd/doctor.js +7 -1
  57. package/dist/resources/extensions/gsd/error-classifier.js +6 -3
  58. package/dist/resources/extensions/gsd/escalation.js +321 -0
  59. package/dist/resources/extensions/gsd/forensics.js +26 -29
  60. package/dist/resources/extensions/gsd/git-service.js +0 -1
  61. package/dist/resources/extensions/gsd/graph.js +26 -2
  62. package/dist/resources/extensions/gsd/gsd-db.js +254 -29
  63. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  64. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  65. package/dist/resources/extensions/gsd/metrics.js +1 -0
  66. package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
  67. package/dist/resources/extensions/gsd/model-router.js +7 -1
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
  69. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  70. package/dist/resources/extensions/gsd/notifications.js +4 -0
  71. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  72. package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
  73. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  74. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  75. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  76. package/dist/resources/extensions/gsd/preferences.js +10 -10
  77. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  78. package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  79. package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
  80. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  81. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  82. package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
  83. package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  84. package/dist/resources/extensions/gsd/run-manager.js +37 -17
  85. package/dist/resources/extensions/gsd/state.js +47 -3
  86. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  87. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  88. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  89. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  90. package/dist/resources/extensions/gsd/uok/flags.js +7 -7
  91. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  92. package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
  93. package/dist/resources/extensions/gsd/workflow-install.js +327 -0
  94. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  95. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
  96. package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
  97. package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  98. package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  99. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  100. package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  101. package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  102. package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  103. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  104. package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  105. package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  106. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  107. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  108. package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  109. package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  110. package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  111. package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  112. package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  113. package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  114. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  115. package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  116. package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
  117. package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  118. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  119. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  120. package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  121. package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  122. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  123. package/dist/resources/extensions/remote-questions/commands.js +380 -0
  124. package/dist/resources/extensions/remote-questions/manager.js +39 -5
  125. package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
  126. package/dist/resources/extensions/shared/interview-ui.js +189 -1
  127. package/dist/resources/extensions/shared/layout-utils.js +17 -0
  128. package/dist/resources/extensions/shared/rtk-shared.js +47 -0
  129. package/dist/resources/extensions/shared/rtk.js +3 -46
  130. package/dist/resources/skills/create-workflow/SKILL.md +33 -6
  131. package/dist/rtk-shared.d.ts +10 -0
  132. package/dist/rtk-shared.js +47 -0
  133. package/dist/rtk.d.ts +2 -6
  134. package/dist/rtk.js +3 -48
  135. package/dist/shared/workspace-types.d.ts +52 -0
  136. package/dist/shared/workspace-types.js +1 -0
  137. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  138. package/dist/update-check.d.ts +10 -0
  139. package/dist/update-check.js +24 -3
  140. package/dist/web/standalone/.next/BUILD_ID +1 -1
  141. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  142. package/dist/web/standalone/.next/build-manifest.json +3 -3
  143. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  144. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  145. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  147. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  156. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  157. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  158. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  163. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/index.html +1 -1
  166. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  167. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  169. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  171. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  172. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  174. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  175. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  177. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  179. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  180. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  181. package/dist/web/standalone/.next/static/chunks/2826.02df9631042cc18e.js +9 -0
  182. package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-6c7cda3e318eedb6.js} +1 -1
  183. package/dist/web/standalone/.next/static/css/3e9cdadb4d23b8a4.css +1 -0
  184. package/dist/welcome-screen.js +48 -24
  185. package/dist/wizard.js +2 -2
  186. package/dist/worktree-cli.d.ts +6 -5
  187. package/dist/worktree-cli.js +23 -7
  188. package/package.json +3 -3
  189. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  190. package/packages/native/tsconfig.tsbuildinfo +1 -1
  191. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  192. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  193. package/packages/pi-ai/dist/models/capability-patches.js +3 -2
  194. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  195. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
  196. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
  197. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
  198. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
  199. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
  200. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
  201. package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
  202. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
  203. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
  204. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
  205. package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
  206. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
  207. package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
  208. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
  209. package/packages/pi-ai/dist/models/generated/groq.js +0 -153
  210. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
  211. package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
  212. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  213. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  214. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  215. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  216. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  217. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
  218. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
  219. package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
  220. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
  221. package/packages/pi-ai/dist/models.generated.test.js +17 -0
  222. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  223. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  224. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  225. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
  226. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  227. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  228. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  229. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  230. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  231. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  232. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  233. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
  234. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  235. package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
  236. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  237. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
  238. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  239. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  240. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  241. package/packages/pi-ai/dist/providers/anthropic.js +18 -1
  242. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  243. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  244. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  245. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  246. package/packages/pi-ai/package.json +1 -1
  247. package/packages/pi-ai/scripts/generate-models.ts +50 -0
  248. package/packages/pi-ai/src/models/capability-patches.ts +5 -2
  249. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
  250. package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
  251. package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
  252. package/packages/pi-ai/src/models/generated/groq.ts +0 -153
  253. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  254. package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
  255. package/packages/pi-ai/src/models.generated.test.ts +17 -0
  256. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  257. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
  258. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  259. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
  260. package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
  261. package/packages/pi-ai/src/providers/anthropic.ts +19 -1
  262. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  263. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  264. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
  265. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
  266. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
  267. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
  268. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
  269. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
  271. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
  273. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  275. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  277. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
  280. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
  282. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  290. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  292. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
  296. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  297. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
  298. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
  300. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
  304. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  305. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
  306. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
  307. package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
  308. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  309. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  310. package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
  311. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
  312. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  313. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  314. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  315. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
  316. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
  317. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
  318. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  319. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  320. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  321. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  322. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  323. package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
  324. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  325. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
  326. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  327. package/pkg/dist/modes/interactive/theme/theme.js +1 -75
  328. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  329. package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
  330. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  331. package/pkg/dist/modes/interactive/theme/themes.js +192 -24
  332. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  333. package/src/resources/extensions/ask-user-questions.ts +24 -6
  334. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  335. package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
  336. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
  337. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
  338. package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
  339. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  340. package/src/resources/extensions/gsd/auto/loop.ts +109 -3
  341. package/src/resources/extensions/gsd/auto/phases.ts +94 -60
  342. package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
  343. package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
  344. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  345. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  346. package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
  347. package/src/resources/extensions/gsd/auto-dispatch.ts +123 -5
  348. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  349. package/src/resources/extensions/gsd/auto-model-selection.ts +13 -2
  350. package/src/resources/extensions/gsd/auto-post-unit.ts +9 -7
  351. package/src/resources/extensions/gsd/auto-prompts.ts +178 -38
  352. package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
  353. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  354. package/src/resources/extensions/gsd/auto-verification.ts +3 -3
  355. package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
  356. package/src/resources/extensions/gsd/auto.ts +53 -28
  357. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  358. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -4
  359. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  360. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  361. package/src/resources/extensions/gsd/commands/catalog.ts +60 -3
  362. package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -0
  363. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  364. package/src/resources/extensions/gsd/commands/handlers/ops.ts +16 -0
  365. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
  366. package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
  367. package/src/resources/extensions/gsd/commands-debug.ts +484 -0
  368. package/src/resources/extensions/gsd/commands-do.ts +1 -0
  369. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  370. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  371. package/src/resources/extensions/gsd/commands-scan.ts +125 -0
  372. package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
  373. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  374. package/src/resources/extensions/gsd/db-writer.ts +3 -0
  375. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  376. package/src/resources/extensions/gsd/definition-loader.ts +7 -0
  377. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  378. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
  379. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  380. package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
  381. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
  382. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  383. package/src/resources/extensions/gsd/doctor.ts +7 -1
  384. package/src/resources/extensions/gsd/error-classifier.ts +6 -3
  385. package/src/resources/extensions/gsd/escalation.ts +367 -0
  386. package/src/resources/extensions/gsd/forensics.ts +25 -29
  387. package/src/resources/extensions/gsd/git-service.ts +0 -1
  388. package/src/resources/extensions/gsd/graph.ts +33 -3
  389. package/src/resources/extensions/gsd/gsd-db.ts +306 -29
  390. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  391. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  392. package/src/resources/extensions/gsd/metrics.ts +1 -0
  393. package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
  394. package/src/resources/extensions/gsd/model-router.ts +15 -1
  395. package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
  396. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  397. package/src/resources/extensions/gsd/notifications.ts +6 -0
  398. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  399. package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
  400. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  401. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  402. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  403. package/src/resources/extensions/gsd/preferences.ts +10 -10
  404. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  405. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  406. package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
  407. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  408. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  409. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  410. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  411. package/src/resources/extensions/gsd/run-manager.ts +53 -19
  412. package/src/resources/extensions/gsd/state.ts +50 -2
  413. package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  414. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
  415. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  416. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
  417. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  418. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  419. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
  420. package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
  421. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  422. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
  423. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  424. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  425. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  426. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
  427. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  428. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  429. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
  430. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
  431. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
  432. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  433. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  434. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
  435. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
  436. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
  437. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
  438. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  439. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  440. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
  441. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  442. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
  443. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
  444. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
  445. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  446. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
  447. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  448. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  449. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  450. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  451. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  452. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  453. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  455. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  456. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
  457. package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
  458. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  459. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  460. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
  461. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  462. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
  464. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  465. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  466. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  467. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  468. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  469. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  470. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
  471. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  472. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  473. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
  474. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
  475. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  476. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
  477. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  478. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  479. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  480. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
  481. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  482. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  483. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  484. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  485. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  486. package/src/resources/extensions/gsd/types.ts +62 -0
  487. package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
  488. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  489. package/src/resources/extensions/gsd/uok/flags.ts +7 -7
  490. package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
  491. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  492. package/src/resources/extensions/gsd/workflow-install.ts +423 -0
  493. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  494. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
  495. package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
  496. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  497. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  498. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  499. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  500. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  501. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  502. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  503. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  504. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  505. package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  506. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  507. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  508. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  509. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  510. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  511. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  512. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  513. package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  514. package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  515. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  516. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  517. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  518. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  519. package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  520. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  521. package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
  522. package/src/resources/extensions/gsd/workspace-index.ts +9 -4
  523. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  524. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  525. package/src/resources/extensions/remote-questions/manager.ts +49 -4
  526. package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
  527. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
  528. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  529. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  530. package/src/resources/extensions/shared/interview-ui.ts +195 -1
  531. package/src/resources/extensions/shared/layout-utils.ts +26 -0
  532. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  533. package/src/resources/extensions/shared/rtk.ts +12 -52
  534. package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
  535. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  536. package/src/resources/skills/create-workflow/SKILL.md +33 -6
  537. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
  538. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  539. package/packages/native/dist/ps/types.d.ts +0 -5
  540. package/packages/native/dist/ps/types.js +0 -2
  541. package/packages/native/src/ps/types.ts +0 -5
  542. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
  543. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
  544. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
  545. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
  546. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
  547. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
  548. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
  549. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
  550. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
  551. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
  552. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
  553. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
  554. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
  555. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
  556. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
  557. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
  558. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
  559. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
  560. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
  561. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
  562. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
  563. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
  564. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
  565. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
  566. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
  567. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
  568. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
  569. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
  570. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
  571. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
  572. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
  573. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
  574. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
  575. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
  576. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
  577. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
  578. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
  579. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
  580. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
  581. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
  582. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
  583. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
  584. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
  585. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
  586. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
  587. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
  588. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
  589. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
  590. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
  591. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
  592. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
  593. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
  594. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
  595. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
  596. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
  597. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
  598. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
  599. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
  600. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
  601. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
  602. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
  603. package/packages/pi-ai/oauth.d.ts +0 -1
  604. package/packages/pi-ai/oauth.js +0 -1
  605. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → jaWw1Jh0TYayjbfOrFe8D}/_buildManifest.js +0 -0
  606. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → jaWw1Jh0TYayjbfOrFe8D}/_ssgManifest.js +0 -0
@@ -118,6 +118,25 @@ function openBrowser(url) {
118
118
  execFile(cmd, [url], () => { });
119
119
  }
120
120
  }
121
+ /**
122
+ * Persist the selected default provider to settings.json.
123
+ *
124
+ * This ensures first startup after onboarding prefers the provider the user
125
+ * just configured, instead of falling back to the first "available" provider
126
+ * (which can be influenced by unrelated env auth like AWS_PROFILE).
127
+ */
128
+ function persistDefaultProvider(providerId) {
129
+ const settingsPath = join(agentDir, 'settings.json');
130
+ try {
131
+ const raw = existsSync(settingsPath) ? JSON.parse(readFileSync(settingsPath, 'utf-8')) : {};
132
+ raw.defaultProvider = providerId;
133
+ mkdirSync(dirname(settingsPath), { recursive: true });
134
+ writeFileSync(settingsPath, JSON.stringify(raw, null, 2), 'utf-8');
135
+ }
136
+ catch {
137
+ // Non-fatal: startup fallback logic will still run.
138
+ }
139
+ }
121
140
  /** Sentinel returned by runStep when the user cancels — tells the caller
122
141
  * to abort the entire wizard. */
123
142
  const STEP_CANCELLED = Symbol('step-cancelled');
@@ -283,16 +302,8 @@ async function runLlmStep(p, pc, authStorage) {
283
302
  p.log.info('Your Claude subscription will be used for inference. No API key needed.');
284
303
  // Store sentinel so hasAuth('claude-code') returns true on future boots
285
304
  authStorage.set('claude-code', { type: 'api_key', key: 'cli' });
286
- // Persist claude-code as the default provider so the startup migration in
287
- // cli.ts does not need to fire and the user is not left on "anthropic".
288
- const settingsPath = join(agentDir, 'settings.json');
289
- try {
290
- const raw = existsSync(settingsPath) ? JSON.parse(readFileSync(settingsPath, 'utf-8')) : {};
291
- raw.defaultProvider = 'claude-code';
292
- mkdirSync(dirname(settingsPath), { recursive: true });
293
- writeFileSync(settingsPath, JSON.stringify(raw, null, 2), 'utf-8');
294
- }
295
- catch { /* non-fatal — startup migration will catch it */ }
305
+ // Persist claude-code so startup does not keep users on anthropic direct API.
306
+ persistDefaultProvider('claude-code');
296
307
  return true;
297
308
  }
298
309
  // ── Step 2: Which provider? ──────────────────────────────────────────────
@@ -345,7 +356,7 @@ async function runOAuthFlow(p, pc, authStorage, providerId, oauthMap) {
345
356
  const s = p.spinner();
346
357
  s.start(`Authenticating with ${providerName}...`);
347
358
  try {
348
- await authStorage.login(providerId, {
359
+ const loginCallbacks = {
349
360
  onAuth: (info) => {
350
361
  s.stop(`Opening browser for ${providerName}`);
351
362
  openBrowser(info.url);
@@ -377,7 +388,9 @@ async function runOAuthFlow(p, pc, authStorage, providerId, oauthMap) {
377
388
  return result;
378
389
  }
379
390
  : undefined,
380
- });
391
+ };
392
+ await authStorage.login(providerId, loginCallbacks);
393
+ persistDefaultProvider(providerId);
381
394
  p.log.success(`Authenticated with ${pc.green(providerName)}`);
382
395
  return true;
383
396
  }
@@ -416,6 +429,7 @@ async function runApiKeyFlow(p, pc, authStorage, providerId, providerLabel) {
416
429
  p.log.warn(`Key doesn't start with expected prefix (${expectedPrefixes.join(' or ')}). Saving anyway.`);
417
430
  }
418
431
  authStorage.set(providerId, { type: 'api_key', key: trimmed });
432
+ persistDefaultProvider(providerId);
419
433
  p.log.success(`API key saved for ${pc.green(providerLabel)}`);
420
434
  // Provider-specific post-setup hints
421
435
  if (providerId === 'openrouter') {
@@ -438,6 +452,7 @@ async function runOllamaLocalFlow(p, pc, authStorage) {
438
452
  s.stop(`Ollama is running at ${pc.green(host)}`);
439
453
  // Store a placeholder so the provider is recognized as authenticated
440
454
  authStorage.set('ollama', { type: 'api_key', key: 'ollama' });
455
+ persistDefaultProvider('ollama');
441
456
  p.log.success(`${pc.green('Ollama (Local)')} configured — no API key needed`);
442
457
  p.log.info(pc.dim('Models are discovered automatically from your local Ollama instance.'));
443
458
  return true;
@@ -460,6 +475,7 @@ async function runOllamaLocalFlow(p, pc, authStorage) {
460
475
  if (p.isCancel(proceed) || !proceed)
461
476
  return false;
462
477
  authStorage.set('ollama', { type: 'api_key', key: 'ollama' });
478
+ persistDefaultProvider('ollama');
463
479
  p.log.success(`${pc.green('Ollama (Local)')} saved — models will appear when Ollama is running`);
464
480
  return true;
465
481
  }
@@ -509,6 +525,7 @@ async function runCustomOpenAIFlow(p, pc, authStorage) {
509
525
  const trimmedModelId = modelId.trim();
510
526
  // Save API key to auth storage
511
527
  authStorage.set('custom-openai', { type: 'api_key', key: trimmedKey });
528
+ persistDefaultProvider('custom-openai');
512
529
  // Write or merge into models.json
513
530
  const modelsJsonPath = join(agentDir, 'models.json');
514
531
  let config = { providers: {} };
@@ -653,7 +670,9 @@ async function runToolKeysStep(p, pc, authStorage) {
653
670
  // ─── Remote Questions Step ────────────────────────────────────────────────────
654
671
  async function runRemoteQuestionsStep(p, pc, authStorage) {
655
672
  // Check existing config — use getCredentialsForProvider to skip empty-key entries
656
- const hasValidKey = (provider) => authStorage.getCredentialsForProvider(provider).some((c) => c.type === 'api_key' && c.key);
673
+ const hasValidKey = (provider) => authStorage
674
+ .getCredentialsForProvider(provider)
675
+ .some((c) => c.type === 'api_key' && typeof c.key === 'string' && c.key.length > 0);
657
676
  const hasDiscord = hasValidKey('discord_bot');
658
677
  const hasSlack = hasValidKey('slack_bot');
659
678
  const hasTelegram = hasValidKey('telegram_bot');
@@ -858,7 +877,13 @@ async function runDiscordChannelStep(p, pc, token) {
858
877
  try {
859
878
  const res = await fetch(`https://discord.com/api/v10/guilds/${guildId}/channels`, { headers, signal: AbortSignal.timeout(15_000) });
860
879
  const data = await res.json();
861
- channels = Array.isArray(data) ? data.filter((ch) => ch.type === 0 || ch.type === 5) : [];
880
+ channels = Array.isArray(data)
881
+ ? data.filter((ch) => typeof ch === 'object' &&
882
+ ch !== null &&
883
+ typeof ch.id === 'string' &&
884
+ typeof ch.name === 'string' &&
885
+ (ch.type === 0 || ch.type === 5))
886
+ : [];
862
887
  }
863
888
  catch {
864
889
  p.log.warn('Could not fetch channels — configure later with /gsd remote discord');
@@ -16,13 +16,16 @@ import { showInterviewRound, } from "./shared/tui.js";
16
16
  const OptionSchema = Type.Object({
17
17
  label: Type.String({ description: "User-facing label (1-5 words)" }),
18
18
  description: Type.String({ description: "One short sentence explaining impact/tradeoff if selected" }),
19
+ preview: Type.Optional(Type.String({
20
+ description: "Optional markdown content shown in a side-by-side preview panel when this option is highlighted. Use for showing code samples, config snippets, or detailed explanations. Keep under ~20 lines — longer content is truncated.",
21
+ })),
19
22
  });
20
23
  const QuestionSchema = Type.Object({
21
24
  id: Type.String({ description: "Stable identifier for mapping answers (snake_case)" }),
22
25
  header: Type.String({ description: "Short header label shown in the UI (12 or fewer chars)" }),
23
26
  question: Type.String({ description: "Single-sentence prompt shown to the user" }),
24
27
  options: Type.Array(OptionSchema, {
25
- description: 'Provide 2-3 mutually exclusive choices for single-select, or any number for multi-select. Put the recommended option first and suffix its label with "(Recommended)". Do not include an "Other" option for single-select; the client adds a free-form "None of the above" option automatically.',
28
+ description: 'Provide 2-3 mutually exclusive choices for single-select, or any number for multi-select. Put the recommended option first and suffix its label with "(Recommended)". Each option can include an optional "preview" field with markdown content shown in a side panel. Do not include an "Other" option for single-select; the client adds a free-form "None of the above" option automatically.',
26
29
  }),
27
30
  allowMultiple: Type.Optional(Type.Boolean({
28
31
  description: "If true, the user can select multiple options using SPACE to toggle and ENTER to confirm. No 'None of the above' option is added. Default: false.",
@@ -134,12 +137,14 @@ export default function AskUserQuestions(pi) {
134
137
  pi.registerTool({
135
138
  name: "ask_user_questions",
136
139
  label: "Request User Input",
137
- description: "Request user input for one to three short questions and wait for the response. Single-select questions have 2-3 mutually exclusive options with a free-form 'None of the above' added automatically. Multi-select questions (allowMultiple: true) let the user toggle multiple options with SPACE and confirm with ENTER.",
140
+ description: "Request user input for one to three short questions and wait for the response. Single-select questions have 2-3 mutually exclusive options with a free-form 'None of the above' added automatically. Multi-select questions (allowMultiple: true) let the user toggle multiple options with SPACE and confirm with ENTER. Options can include an optional 'preview' field with markdown content shown in a side-by-side panel when highlighted.",
138
141
  promptGuidelines: [
139
142
  "Use ask_user_questions when you need the user to choose between concrete alternatives before proceeding.",
140
143
  "Keep questions to 1 when possible; never exceed 3.",
141
144
  "For single-select: each question must have 2-3 options. Put the recommended option first with '(Recommended)' suffix. Do not include an 'Other' or 'None of the above' option - the client adds one automatically.",
142
145
  "For multi-select: set allowMultiple: true. The user can pick any number of options. No 'None of the above' is added.",
146
+ "When options involve code patterns, config choices, or architecture decisions, add a 'preview' field with markdown content (code blocks, lists, headers, etc.). The preview renders in a side-by-side panel when the option is highlighted.",
147
+ "Preview content is rendered in a fixed-height panel (max ~20 lines visible). Keep previews concise — show the most relevant snippet, not exhaustive examples. Longer content is truncated with a '+N lines hidden' indicator.",
143
148
  ],
144
149
  parameters: AskUserQuestionsParams,
145
150
  async execute(_toolCallId, params, signal, _onUpdate, ctx) {
@@ -274,6 +279,10 @@ export default function AskUserQuestions(pi) {
274
279
  const headers = qs.map((q) => q.header).join(", ");
275
280
  text += theme.fg("dim", ` (${headers})`);
276
281
  }
282
+ const previewCount = qs.reduce((acc, q) => acc + (q.options || []).filter((o) => o.preview).length, 0);
283
+ if (previewCount > 0) {
284
+ text += theme.fg("accent", ` [${previewCount} preview${previewCount !== 1 ? "s" : ""}]`);
285
+ }
277
286
  for (const q of qs) {
278
287
  const multiSel = !!q.allowMultiple;
279
288
  text += `\n ${theme.fg("text", q.question)}`;
@@ -307,10 +316,13 @@ export default function AskUserQuestions(pi) {
307
316
  lines.push(`${theme.fg("accent", q.header)}: ${theme.fg("dim", "(no answer)")}`);
308
317
  continue;
309
318
  }
310
- const answerText = answer.answers.length > 0 ? answer.answers.join(", ") : "(custom)";
319
+ const selected = answer.selected;
320
+ const answerText = Array.isArray(selected)
321
+ ? (selected.length > 0 ? selected.join(", ") : "(custom)")
322
+ : (selected || "(custom)");
311
323
  let line = `${theme.fg("success", "✓ ")}${theme.fg("accent", q.header)}: ${answerText}`;
312
- if (answer.user_note) {
313
- line += ` ${theme.fg("muted", `[note: ${answer.user_note}]`)}`;
324
+ if (answer.notes) {
325
+ line += ` ${theme.fg("muted", `[note: ${answer.notes}]`)}`;
314
326
  }
315
327
  lines.push(line);
316
328
  }
@@ -19,6 +19,15 @@ export const CLAUDE_CODE_MODELS = [
19
19
  contextWindow: 1_000_000,
20
20
  maxTokens: 128_000,
21
21
  },
22
+ {
23
+ id: "claude-opus-4-7",
24
+ name: "Claude Opus 4.7 (via Claude Code)",
25
+ reasoning: true,
26
+ input: ["text", "image"],
27
+ cost: ZERO_COST,
28
+ contextWindow: 1_000_000,
29
+ maxTokens: 128_000,
30
+ },
22
31
  {
23
32
  id: "claude-sonnet-4-6",
24
33
  name: "Claude Sonnet 4.6 (via Claude Code)",
@@ -9,6 +9,16 @@
9
9
  * and check the exit code + output for an authenticated session.
10
10
  */
11
11
  import { execFileSync } from "node:child_process";
12
+ /**
13
+ * Platform-correct binary name for the Claude Code CLI.
14
+ *
15
+ * On Windows, npm-global binaries are installed as `.cmd` shims and
16
+ * `execFileSync` does not auto-resolve the extension — calling bare
17
+ * `claude` would fail with ENOENT even when the CLI is installed and
18
+ * authenticated. Mirrors the `NPM_COMMAND` pattern in
19
+ * `src/resources/extensions/gsd/pre-execution-checks.ts`.
20
+ */
21
+ const CLAUDE_COMMAND = process.platform === "win32" ? "claude.cmd" : "claude";
12
22
  let cachedBinaryPresent = null;
13
23
  let cachedAuthed = null;
14
24
  let lastCheckMs = 0;
@@ -22,7 +32,7 @@ function refreshCache() {
22
32
  lastCheckMs = now;
23
33
  // Check binary presence
24
34
  try {
25
- execFileSync("claude", ["--version"], { timeout: 5_000, stdio: "pipe" });
35
+ execFileSync(CLAUDE_COMMAND, ["--version"], { timeout: 5_000, stdio: "pipe" });
26
36
  cachedBinaryPresent = true;
27
37
  }
28
38
  catch {
@@ -32,7 +42,7 @@ function refreshCache() {
32
42
  }
33
43
  // Check auth status — exit code 0 with non-error output means authenticated
34
44
  try {
35
- const output = execFileSync("claude", ["auth", "status"], { timeout: 5_000, stdio: "pipe" })
45
+ const output = execFileSync(CLAUDE_COMMAND, ["auth", "status"], { timeout: 5_000, stdio: "pipe" })
36
46
  .toString()
37
47
  .toLowerCase();
38
48
  // The CLI outputs "not logged in", "no credentials", or similar when unauthenticated
@@ -6,12 +6,14 @@
6
6
  * AssistantMessageEvents for TUI rendering, then strips tool-call blocks from
7
7
  * the final AssistantMessage so GSD's agent loop doesn't try to dispatch them.
8
8
  */
9
- import { EventStream, mapThinkingLevelToEffort, supportsAdaptiveThinking } from "@gsd/pi-ai";
9
+ import { EventStream } from "@gsd/pi-ai";
10
10
  import { execSync } from "node:child_process";
11
11
  import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
12
12
  import { buildWorkflowMcpServers } from "../gsd/workflow-mcp.js";
13
13
  import { showInterviewRound } from "../shared/tui.js";
14
+ /** Label used for the free-text fallback option in single-choice elicitation questions. */
14
15
  const OTHER_OPTION_LABEL = "None of the above";
16
+ /** Regex pattern that identifies field names and descriptions that should be treated as sensitive/secure inputs. */
15
17
  const SENSITIVE_FIELD_PATTERN = /(password|passphrase|secret|token|api[_\s-]*key|private[_\s-]*key|credential)/i;
16
18
  // ---------------------------------------------------------------------------
17
19
  // Stream factory
@@ -29,6 +31,7 @@ function createAssistantStream() {
29
31
  throw new Error("Unexpected event type for final result");
30
32
  });
31
33
  }
34
+ /** Extract a human-readable error string from an SDK result message. */
32
35
  export function getResultErrorMessage(result) {
33
36
  if ("errors" in result && Array.isArray(result.errors) && result.errors.length > 0) {
34
37
  return result.errors.join("; ");
@@ -41,10 +44,13 @@ export function getResultErrorMessage(result) {
41
44
  // ---------------------------------------------------------------------------
42
45
  // Claude binary resolution
43
46
  // ---------------------------------------------------------------------------
47
+ /** Cached result of the `which`/`where claude` lookup so the shell is only spawned once per process. */
44
48
  let cachedClaudePath = null;
49
+ /** Return the shell command used to locate the `claude` binary on the given platform. */
45
50
  export function getClaudeLookupCommand(platform = process.platform) {
46
51
  return platform === "win32" ? "where claude" : "which claude";
47
52
  }
53
+ /** Extract the first line of `which`/`where` output as the resolved binary path. */
48
54
  export function parseClaudeLookupOutput(output) {
49
55
  return output
50
56
  .toString()
@@ -123,6 +129,7 @@ export function buildPromptFromContext(context) {
123
129
  }
124
130
  return parts.join("\n\n");
125
131
  }
132
+ /** Strip the `data:<mime>;base64,` prefix from a data URI, returning only the raw base64 payload. */
126
133
  function stripDataUriPrefix(value) {
127
134
  const commaIndex = value.indexOf(",");
128
135
  if (value.startsWith("data:") && commaIndex !== -1) {
@@ -130,10 +137,12 @@ function stripDataUriPrefix(value) {
130
137
  }
131
138
  return value;
132
139
  }
140
+ /** Extract the MIME type from a data URI string, or return `null` if the value is not a valid data URI. */
133
141
  function inferMimeTypeFromDataUri(value) {
134
142
  const match = /^data:([^;,]+);base64,/.exec(value);
135
143
  return match?.[1] ?? null;
136
144
  }
145
+ /** Collect all base64 image blocks from user messages in the context for inclusion in the SDK prompt. */
137
146
  export function extractImageBlocksFromContext(context) {
138
147
  const imageBlocks = [];
139
148
  for (const msg of context.messages) {
@@ -162,6 +171,7 @@ export function extractImageBlocksFromContext(context) {
162
171
  }
163
172
  return imageBlocks;
164
173
  }
174
+ /** Build the SDK query prompt, wrapping image blocks into an async iterable user message when present. */
165
175
  export function buildSdkQueryPrompt(context, textPrompt = buildPromptFromContext(context)) {
166
176
  const imageBlocks = extractImageBlocksFromContext(context);
167
177
  if (imageBlocks.length === 0) {
@@ -183,6 +193,7 @@ export function buildSdkQueryPrompt(context, textPrompt = buildPromptFromContext
183
193
  // ---------------------------------------------------------------------------
184
194
  // Error helper
185
195
  // ---------------------------------------------------------------------------
196
+ /** Build a minimal error `AssistantMessage` with the given model ID and error text. */
186
197
  function makeErrorMessage(model, errorMsg) {
187
198
  return {
188
199
  role: "assistant",
@@ -209,6 +220,7 @@ export function makeStreamExhaustedErrorMessage(model, lastTextContent) {
209
220
  }
210
221
  return message;
211
222
  }
223
+ /** Extract the string labels from an array of SDK elicitation option objects, filtering out blank entries. */
212
224
  function readElicitationChoices(options) {
213
225
  if (!Array.isArray(options))
214
226
  return [];
@@ -216,6 +228,7 @@ function readElicitationChoices(options) {
216
228
  .map((option) => (typeof option?.const === "string" ? option.const : typeof option?.title === "string" ? option.title : ""))
217
229
  .filter((option) => option.length > 0);
218
230
  }
231
+ /** Parse an SDK elicitation request into structured multiple-choice questions, or null if the schema is unsupported. */
219
232
  export function parseAskUserQuestionsElicitation(request) {
220
233
  if (request.mode && request.mode !== "form")
221
234
  return null;
@@ -265,6 +278,7 @@ export function parseAskUserQuestionsElicitation(request) {
265
278
  }
266
279
  return questions.length > 0 ? questions : null;
267
280
  }
281
+ /** Return true if the elicitation field should be treated as sensitive and rendered as a secure/password input. */
268
282
  function isSecureElicitationField(requestMessage, fieldId, field) {
269
283
  if (field.format === "password")
270
284
  return true;
@@ -283,6 +297,7 @@ function isSecureElicitationField(requestMessage, fieldId, field) {
283
297
  .toLowerCase();
284
298
  return SENSITIVE_FIELD_PATTERN.test(haystack);
285
299
  }
300
+ /** Parse an SDK elicitation request into free-text input field descriptors, or null if unsupported. */
286
301
  export function parseTextInputElicitation(request) {
287
302
  if (request.mode && request.mode !== "form")
288
303
  return null;
@@ -315,6 +330,7 @@ export function parseTextInputElicitation(request) {
315
330
  }
316
331
  return fields.length > 0 ? fields : null;
317
332
  }
333
+ /** Convert a TUI interview round result into the SDK elicitation content map. */
318
334
  export function roundResultToElicitationContent(questions, result) {
319
335
  const content = {};
320
336
  for (const question of questions) {
@@ -334,6 +350,7 @@ export function roundResultToElicitationContent(questions, result) {
334
350
  }
335
351
  return content;
336
352
  }
353
+ /** Build the dialog title string for a multiple-choice elicitation question, combining server name, header, and question text. */
337
354
  function buildElicitationPromptTitle(request, question) {
338
355
  const parts = [
339
356
  request.serverName ? `[${request.serverName}]` : "",
@@ -342,6 +359,7 @@ function buildElicitationPromptTitle(request, question) {
342
359
  ].filter((part) => part && part.trim().length > 0);
343
360
  return parts.join("\n\n");
344
361
  }
362
+ /** Drive each multiple-choice elicitation question through the extension UI's `select` dialog, collecting answers into an SDK result. */
345
363
  async function promptElicitationWithDialogs(request, questions, ui, signal) {
346
364
  const content = {};
347
365
  for (const question of questions) {
@@ -379,6 +397,7 @@ async function promptElicitationWithDialogs(request, questions, ui, signal) {
379
397
  }
380
398
  return { action: "accept", content };
381
399
  }
400
+ /** Build the dialog title string for a free-text input field, combining server name, field title, and description. */
382
401
  function buildTextInputPromptTitle(request, field) {
383
402
  const parts = [
384
403
  request.serverName ? `[${request.serverName}]` : "",
@@ -387,6 +406,7 @@ function buildTextInputPromptTitle(request, field) {
387
406
  ].filter((part) => typeof part === "string" && part.trim().length > 0);
388
407
  return parts.join("\n\n");
389
408
  }
409
+ /** Derive a placeholder hint for a free-text input field from its description, falling back to "Required" or "Leave empty to skip". */
390
410
  function buildTextInputPlaceholder(field) {
391
411
  const desc = field.description.trim();
392
412
  if (!desc)
@@ -400,6 +420,7 @@ function buildTextInputPlaceholder(field) {
400
420
  const hint = formatLine.replace(/^format:\s*/i, "").trim();
401
421
  return hint.length > 0 ? hint : field.required ? "Required" : "Leave empty to skip";
402
422
  }
423
+ /** Collect each free-text input field via the extension UI's `input` dialog, returning the filled SDK elicitation result. */
403
424
  async function promptTextInputElicitation(request, fields, ui, signal) {
404
425
  const content = {};
405
426
  for (const field of fields) {
@@ -411,6 +432,7 @@ async function promptTextInputElicitation(request, fields, ui, signal) {
411
432
  }
412
433
  return { action: "accept", content };
413
434
  }
435
+ /** Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available. */
414
436
  export function createClaudeCodeElicitationHandler(ui) {
415
437
  if (!ui)
416
438
  return undefined;
@@ -482,6 +504,42 @@ export async function resolveClaudePermissionMode(env = process.env) {
482
504
  }
483
505
  return "bypassPermissions";
484
506
  }
507
+ // NOTE: These helpers intentionally mirror @gsd/pi-ai anthropic-shared
508
+ // behavior so this extension remains typecheck-stable even when the published
509
+ // @gsd/pi-ai barrel lags behind monorepo source exports.
510
+ /** Return true for model IDs that support the adaptive thinking API (Opus 4.6/4.7, Sonnet 4.6/4.7, Haiku 4.5). */
511
+ function modelSupportsAdaptiveThinking(modelId) {
512
+ return (modelId.includes("opus-4-6")
513
+ || modelId.includes("opus-4.6")
514
+ || modelId.includes("opus-4-7")
515
+ || modelId.includes("opus-4.7")
516
+ || modelId.includes("sonnet-4-6")
517
+ || modelId.includes("sonnet-4.6")
518
+ || modelId.includes("sonnet-4-7")
519
+ || modelId.includes("sonnet-4.7")
520
+ || modelId.includes("haiku-4-5")
521
+ || modelId.includes("haiku-4.5"));
522
+ }
523
+ /** Map a GSD thinking level to the Anthropic effort value, clamping xhigh to max for models that lack native xhigh support. */
524
+ function mapThinkingLevelToAnthropicEffort(level, modelId) {
525
+ switch (level) {
526
+ case "minimal":
527
+ case "low":
528
+ return "low";
529
+ case "medium":
530
+ return "medium";
531
+ case "high":
532
+ return "high";
533
+ case "xhigh":
534
+ if (modelId.includes("opus-4-7") || modelId.includes("opus-4.7"))
535
+ return "xhigh";
536
+ if (modelId.includes("opus-4-6") || modelId.includes("opus-4.6"))
537
+ return "max";
538
+ return "high";
539
+ default:
540
+ return "high";
541
+ }
542
+ }
485
543
  /**
486
544
  * Build the options object passed to the Claude Agent SDK's `query()` call.
487
545
  *
@@ -513,8 +571,17 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
513
571
  "Bash(pwd)",
514
572
  ...(mcpServers ? Object.keys(mcpServers).map((serverName) => `mcp__${serverName}__*`) : []),
515
573
  ];
516
- const effort = reasoning && supportsAdaptiveThinking(modelId)
517
- ? mapThinkingLevelToEffort(reasoning, modelId)
574
+ const supportsAdaptive = modelSupportsAdaptiveThinking(modelId);
575
+ const effort = reasoning && supportsAdaptive
576
+ ? mapThinkingLevelToAnthropicEffort(reasoning, modelId)
577
+ : undefined;
578
+ // Bug B: SDK requires thinking:{type:"adaptive"} alongside effort for adaptive thinking to activate.
579
+ // Bug C: SDK requires thinking:{type:"disabled"} to actually stop adaptive thinking when reasoning is off;
580
+ // omitting the field leaves the SDK in its adaptive default (or persisted session state).
581
+ const thinkingConfig = supportsAdaptive
582
+ ? effort
583
+ ? { thinking: { type: "adaptive" } }
584
+ : { thinking: { type: "disabled" } }
518
585
  : undefined;
519
586
  return {
520
587
  pathToClaudeCodeExecutable: getClaudePath(),
@@ -529,11 +596,13 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
529
596
  disallowedTools,
530
597
  ...(allowedTools.length > 0 ? { allowedTools } : {}),
531
598
  ...(mcpServers ? { mcpServers } : {}),
532
- betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
599
+ betas: (modelId.includes("sonnet") || modelId.includes("opus-4-7") || modelId.includes("opus-4.7")) ? ["context-1m-2025-08-07"] : [],
600
+ ...(thinkingConfig ?? {}),
533
601
  ...(effort ? { effort } : {}),
534
602
  ...sdkExtraOptions,
535
603
  };
536
604
  }
605
+ /** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
537
606
  function normalizeToolResultContent(content) {
538
607
  if (typeof content === "string") {
539
608
  return [{ type: "text", text: content }];
@@ -568,6 +637,7 @@ function normalizeToolResultContent(content) {
568
637
  }
569
638
  return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
570
639
  }
640
+ /** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
571
641
  export function extractToolResultsFromSdkUserMessage(message) {
572
642
  const extracted = [];
573
643
  const seen = new Set();
@@ -612,6 +682,7 @@ export function extractToolResultsFromSdkUserMessage(message) {
612
682
  }
613
683
  return extracted;
614
684
  }
685
+ /** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
615
686
  function attachExternalResultsToToolBlocks(toolBlocks, toolResultsById) {
616
687
  for (const block of toolBlocks) {
617
688
  if (block.type !== "toolCall" && block.type !== "serverToolUse")
@@ -659,6 +730,7 @@ export function streamViaClaudeCode(model, context, options) {
659
730
  void pumpSdkMessages(model, context, options, stream);
660
731
  return stream;
661
732
  }
733
+ /** Async pump that drives the Claude Agent SDK's async-iterable message stream and pushes events into `stream`. */
662
734
  async function pumpSdkMessages(model, context, options, stream) {
663
735
  const modelId = model.id;
664
736
  let builder = null;
@@ -16,6 +16,7 @@ const ENOENT_PATH_RE = /ENOENT[^']*'([^']+)'/;
16
16
  *
17
17
  * Rule 1: Same error string twice in a row → stuck immediately.
18
18
  * Rule 2: Same unit key 3+ consecutive times → stuck (preserves prior behavior).
19
+ * Rule 2b: Same unit key appears 3+ times anywhere in the active window → stuck.
19
20
  * Rule 3: Oscillation A→B→A→B in last 4 entries → stuck.
20
21
  * Rule 4: Same ENOENT path in any 2 entries within the window → stuck (#3575).
21
22
  * Missing files don't self-heal between retries — retrying wastes budget.
@@ -48,6 +49,14 @@ export function detectStuck(window) {
48
49
  };
49
50
  }
50
51
  }
52
+ // Rule 2b: Same unit key 3+ times anywhere in the active window
53
+ const countInWindow = window.filter((entry) => entry.key === last.key).length;
54
+ if (countInWindow >= 3) {
55
+ return {
56
+ stuck: true,
57
+ reason: `${last.key} derived ${countInWindow} times in last ${window.length} attempts without progress${suffix}`,
58
+ };
59
+ }
51
60
  // Rule 3: Oscillation (A→B→A→B in last 4)
52
61
  if (window.length >= 4) {
53
62
  const w = window.slice(-4);
@@ -17,6 +17,7 @@ import { logWarning } from "../workflow-logger.js";
17
17
  import { gsdRoot } from "../paths.js";
18
18
  import { resolveUokFlags } from "../uok/flags.js";
19
19
  import { scheduleSidecarQueue } from "../uok/execution-graph.js";
20
+ import { ExecutionGraphScheduler } from "../uok/execution-graph.js";
20
21
  import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
21
22
  import { join } from "node:path";
22
23
  // ── Stuck detection persistence (#3704) ──────────────────────────────────
@@ -78,17 +79,73 @@ function checkMemoryPressure() {
78
79
  const pct = heapMB / limitMB;
79
80
  return { pressured: pct > MEMORY_PRESSURE_THRESHOLD, heapMB, limitMB, pct };
80
81
  }
82
+ function resolveDispatchNodeKind(unitType, sidecarItem) {
83
+ if (sidecarItem?.kind === "hook")
84
+ return "hook";
85
+ if (sidecarItem?.kind === "triage")
86
+ return "verification";
87
+ if (sidecarItem?.kind === "quick-task")
88
+ return "team-worker";
89
+ if (unitType.startsWith("hook/"))
90
+ return "hook";
91
+ if (unitType === "reactive-execute")
92
+ return "subagent";
93
+ if (unitType === "gate-evaluate"
94
+ || unitType === "validate-milestone"
95
+ || unitType === "run-uat"
96
+ || unitType === "complete-slice") {
97
+ return "verification";
98
+ }
99
+ if (unitType === "replan-slice" || unitType === "reassess-roadmap") {
100
+ return "reprocess";
101
+ }
102
+ return "unit";
103
+ }
104
+ async function runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem) {
105
+ if (dispatchContract === "legacy-direct") {
106
+ return runUnitPhase(ic, iterData, loopState, sidecarItem);
107
+ }
108
+ const scheduler = new ExecutionGraphScheduler();
109
+ let outcome = null;
110
+ const executeNode = async () => {
111
+ outcome = await runUnitPhase(ic, iterData, loopState, sidecarItem);
112
+ };
113
+ const kinds = [
114
+ "unit",
115
+ "hook",
116
+ "subagent",
117
+ "team-worker",
118
+ "verification",
119
+ "reprocess",
120
+ ];
121
+ for (const kind of kinds)
122
+ scheduler.registerHandler(kind, executeNode);
123
+ const nodeId = `dispatch:${ic.iteration}:${iterData.unitType}:${iterData.unitId}`;
124
+ await scheduler.run([
125
+ {
126
+ id: nodeId,
127
+ kind: resolveDispatchNodeKind(iterData.unitType, sidecarItem),
128
+ dependsOn: [],
129
+ metadata: {
130
+ unitType: iterData.unitType,
131
+ unitId: iterData.unitId,
132
+ },
133
+ },
134
+ ], { parallel: false, maxWorkers: 1 });
135
+ return outcome ?? { action: "break", reason: "scheduler-dispatch-missing-result" };
136
+ }
81
137
  /**
82
138
  * Main auto-mode execution loop. Iterates: derive → dispatch → guards →
83
139
  * runUnit → finalize → repeat. Exits when s.active becomes false or a
84
140
  * terminal condition is reached.
85
141
  *
86
142
  * This is the linear replacement for the recursive
87
- * dispatchNextUnit → handleAgentEnd → dispatchNextUnit chain.
143
+ * dispatchNextUnit → resolveAgentEnd → dispatchNextUnit chain.
88
144
  */
89
- export async function autoLoop(ctx, pi, s, deps) {
145
+ export async function autoLoop(ctx, pi, s, deps, options) {
90
146
  debugLog("autoLoop", { phase: "enter" });
91
147
  let iteration = 0;
148
+ const dispatchContract = options?.dispatchContract ?? "legacy-direct";
92
149
  // Load persisted stuck state so counters survive session restarts (#3704)
93
150
  const persisted = loadStuckState(s.basePath);
94
151
  const loopState = {
@@ -273,7 +330,7 @@ export async function autoLoop(ctx, pi, s, deps) {
273
330
  break;
274
331
  }
275
332
  // ── Unit execution (shared with dev path) ──
276
- const unitPhaseResult = await runUnitPhase(ic, iterData, loopState);
333
+ const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState);
277
334
  deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
278
335
  unitType: iterData.unitType,
279
336
  unitId: iterData.unitId,
@@ -410,7 +467,7 @@ export async function autoLoop(ctx, pi, s, deps) {
410
467
  sidecarKind: sidecarItem.kind,
411
468
  });
412
469
  }
413
- const unitPhaseResult = await runUnitPhase(ic, iterData, loopState, sidecarItem);
470
+ const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem);
414
471
  deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
415
472
  unitType: iterData.unitType,
416
473
  unitId: iterData.unitId,
@@ -528,3 +585,9 @@ export async function autoLoop(ctx, pi, s, deps) {
528
585
  _clearCurrentResolve();
529
586
  debugLog("autoLoop", { phase: "exit", totalIterations: iteration });
530
587
  }
588
+ export async function runUokKernelLoop(ctx, pi, s, deps) {
589
+ return autoLoop(ctx, pi, s, deps, { dispatchContract: "uok-scheduler" });
590
+ }
591
+ export async function runLegacyAutoLoop(ctx, pi, s, deps) {
592
+ return autoLoop(ctx, pi, s, deps, { dispatchContract: "legacy-direct" });
593
+ }