gsd-pi 2.57.0-dev.f22a903 → 2.58.0-dev.394cb18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +58 -35
  3. package/dist/headless-ui.d.ts +17 -0
  4. package/dist/headless-ui.js +97 -3
  5. package/dist/headless.js +67 -6
  6. package/dist/help-text.js +1 -0
  7. package/dist/onboarding.js +44 -0
  8. package/dist/resource-loader.js +16 -1
  9. package/dist/resources/agents/researcher.md +1 -1
  10. package/dist/resources/extensions/ask-user-questions.js +16 -3
  11. package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
  12. package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
  13. package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
  14. package/dist/resources/extensions/claude-code-cli/partial-builder.js +14 -6
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +59 -36
  16. package/dist/resources/extensions/context7/extension-manifest.json +1 -1
  17. package/dist/resources/extensions/get-secrets-from-user.js +8 -5
  18. package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
  19. package/dist/resources/extensions/google-search/index.js +2 -1
  20. package/dist/resources/extensions/gsd/auto/phases.js +25 -21
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -20
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -2
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +26 -3
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +16 -4
  26. package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
  27. package/dist/resources/extensions/gsd/auto-recovery.js +13 -5
  28. package/dist/resources/extensions/gsd/auto-start.js +35 -22
  29. package/dist/resources/extensions/gsd/auto-worktree.js +199 -12
  30. package/dist/resources/extensions/gsd/auto.js +4 -0
  31. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -0
  32. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -8
  33. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +42 -34
  35. package/dist/resources/extensions/gsd/bootstrap/system-context.js +66 -12
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -0
  37. package/dist/resources/extensions/gsd/captures.js +56 -4
  38. package/dist/resources/extensions/gsd/codebase-generator.js +279 -0
  39. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  40. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  41. package/dist/resources/extensions/gsd/commands-codebase.js +115 -0
  42. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +41 -4
  43. package/dist/resources/extensions/gsd/complexity-classifier.js +8 -6
  44. package/dist/resources/extensions/gsd/db-writer.js +116 -8
  45. package/dist/resources/extensions/gsd/doctor-git-checks.js +76 -1
  46. package/dist/resources/extensions/gsd/doctor-proactive.js +34 -1
  47. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  48. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -4
  49. package/dist/resources/extensions/gsd/doctor.js +3 -1
  50. package/dist/resources/extensions/gsd/error-classifier.js +12 -10
  51. package/dist/resources/extensions/gsd/extension-manifest.json +16 -1
  52. package/dist/resources/extensions/gsd/forensics.js +123 -20
  53. package/dist/resources/extensions/gsd/git-service.js +105 -2
  54. package/dist/resources/extensions/gsd/gitignore.js +33 -0
  55. package/dist/resources/extensions/gsd/gsd-db.js +36 -9
  56. package/dist/resources/extensions/gsd/guided-flow.js +106 -44
  57. package/dist/resources/extensions/gsd/health-widget-core.js +31 -0
  58. package/dist/resources/extensions/gsd/health-widget.js +17 -0
  59. package/dist/resources/extensions/gsd/index.js +1 -1
  60. package/dist/resources/extensions/gsd/memory-extractor.js +7 -0
  61. package/dist/resources/extensions/gsd/migrate-external.js +8 -1
  62. package/dist/resources/extensions/gsd/milestone-validation-gates.js +45 -0
  63. package/dist/resources/extensions/gsd/model-cost-table.js +18 -0
  64. package/dist/resources/extensions/gsd/model-router.js +35 -1
  65. package/dist/resources/extensions/gsd/native-git-bridge.js +39 -0
  66. package/dist/resources/extensions/gsd/notifications.js +16 -1
  67. package/dist/resources/extensions/gsd/parallel-eligibility.js +13 -2
  68. package/dist/resources/extensions/gsd/parallel-merge.js +78 -5
  69. package/dist/resources/extensions/gsd/parsers-legacy.js +20 -3
  70. package/dist/resources/extensions/gsd/paths.js +45 -0
  71. package/dist/resources/extensions/gsd/preferences-models.js +14 -1
  72. package/dist/resources/extensions/gsd/preferences-types.js +3 -1
  73. package/dist/resources/extensions/gsd/preferences.js +13 -16
  74. package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  77. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
  80. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  84. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  85. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  86. package/dist/resources/extensions/gsd/repo-identity.js +205 -11
  87. package/dist/resources/extensions/gsd/rethink.js +5 -0
  88. package/dist/resources/extensions/gsd/roadmap-slices.js +5 -4
  89. package/dist/resources/extensions/gsd/state.js +85 -27
  90. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  91. package/dist/resources/extensions/gsd/tools/complete-task.js +34 -71
  92. package/dist/resources/extensions/gsd/tools/plan-milestone.js +12 -2
  93. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +29 -1
  94. package/dist/resources/extensions/gsd/tools/validate-milestone.js +14 -3
  95. package/dist/resources/extensions/gsd/triage-resolution.js +22 -7
  96. package/dist/resources/extensions/gsd/undo.js +2 -2
  97. package/dist/resources/extensions/gsd/unit-ownership.js +164 -33
  98. package/dist/resources/extensions/gsd/verdict-parser.js +20 -8
  99. package/dist/resources/extensions/gsd/watch/header-renderer.js +241 -0
  100. package/dist/resources/extensions/gsd/workflow-manifest.js +24 -5
  101. package/dist/resources/extensions/gsd/workflow-projections.js +95 -63
  102. package/dist/resources/extensions/gsd/workflow-reconcile.js +35 -5
  103. package/dist/resources/extensions/gsd/workspace-index.js +24 -0
  104. package/dist/resources/extensions/gsd/worktree-manager.js +105 -1
  105. package/dist/resources/extensions/gsd/worktree-resolver.js +20 -3
  106. package/dist/resources/extensions/mcp-client/index.js +11 -7
  107. package/dist/resources/extensions/ollama/index.js +112 -0
  108. package/dist/resources/extensions/ollama/model-capabilities.js +115 -0
  109. package/dist/resources/extensions/ollama/ollama-client.js +168 -0
  110. package/dist/resources/extensions/ollama/ollama-commands.js +194 -0
  111. package/dist/resources/extensions/ollama/ollama-discovery.js +69 -0
  112. package/dist/resources/extensions/ollama/ollama-tool.js +184 -0
  113. package/dist/resources/extensions/ollama/types.js +2 -0
  114. package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
  115. package/dist/resources/extensions/shared/interview-ui.js +11 -1
  116. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -3
  117. package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  118. package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  119. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  120. package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  121. package/dist/startup-model-validation.d.ts +39 -0
  122. package/dist/startup-model-validation.js +50 -0
  123. package/dist/web/standalone/.next/BUILD_ID +1 -1
  124. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  125. package/dist/web/standalone/.next/build-manifest.json +3 -3
  126. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  127. package/dist/web/standalone/.next/react-loadable-manifest.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 +2 -2
  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_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/index.html +1 -1
  201. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  202. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  204. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  206. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  207. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  209. package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
  210. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  213. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  214. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  215. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +9 -0
  216. package/dist/web/standalone/.next/static/chunks/{webpack-61d3afac6d0f0ce7.js → webpack-a1c1e452c6b32d04.js} +1 -1
  217. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
  218. package/dist/web-mode.js +2 -1
  219. package/dist/welcome-screen.d.ts +1 -0
  220. package/dist/welcome-screen.js +32 -6
  221. package/package.json +2 -2
  222. package/packages/daemon/src/cli.ts +49 -0
  223. package/packages/daemon/src/daemon.test.ts +104 -1
  224. package/packages/daemon/src/daemon.ts +24 -1
  225. package/packages/daemon/src/discord-bot.ts +73 -3
  226. package/packages/daemon/src/event-bridge.ts +15 -9
  227. package/packages/daemon/src/event-formatter.ts +30 -2
  228. package/packages/daemon/src/index.ts +9 -0
  229. package/packages/daemon/src/launchd.test.ts +356 -0
  230. package/packages/daemon/src/launchd.ts +242 -0
  231. package/packages/daemon/src/message-batcher.test.ts +2 -2
  232. package/packages/daemon/src/message-batcher.ts +9 -3
  233. package/packages/daemon/src/orchestrator.test.ts +1 -0
  234. package/packages/daemon/src/orchestrator.ts +106 -2
  235. package/packages/native/dist/ast/index.js +9 -5
  236. package/packages/native/dist/ast/types.js +2 -1
  237. package/packages/native/dist/clipboard/index.js +12 -7
  238. package/packages/native/dist/clipboard/types.js +2 -1
  239. package/packages/native/dist/diff/index.js +12 -7
  240. package/packages/native/dist/diff/types.js +2 -1
  241. package/packages/native/dist/fd/index.js +6 -3
  242. package/packages/native/dist/fd/types.js +2 -1
  243. package/packages/native/dist/glob/index.js +9 -5
  244. package/packages/native/dist/glob/types.js +2 -1
  245. package/packages/native/dist/grep/index.js +9 -5
  246. package/packages/native/dist/grep/types.js +2 -1
  247. package/packages/native/dist/gsd-parser/index.js +18 -11
  248. package/packages/native/dist/gsd-parser/types.js +2 -1
  249. package/packages/native/dist/highlight/index.js +12 -7
  250. package/packages/native/dist/highlight/types.js +2 -1
  251. package/packages/native/dist/html/index.js +6 -3
  252. package/packages/native/dist/html/types.js +2 -1
  253. package/packages/native/dist/image/index.js +10 -5
  254. package/packages/native/dist/image/types.js +7 -4
  255. package/packages/native/dist/index.js +70 -17
  256. package/packages/native/dist/json-parse/index.js +13 -8
  257. package/packages/native/dist/native.js +47 -10
  258. package/packages/native/dist/ps/index.js +15 -9
  259. package/packages/native/dist/ps/types.js +2 -1
  260. package/packages/native/dist/stream-process/index.js +12 -7
  261. package/packages/native/dist/text/index.js +24 -14
  262. package/packages/native/dist/text/types.js +5 -2
  263. package/packages/native/dist/truncate/index.js +12 -7
  264. package/packages/native/dist/ttsr/index.js +12 -7
  265. package/packages/native/dist/ttsr/types.js +2 -1
  266. package/packages/native/dist/xxhash/index.js +9 -5
  267. package/packages/native/package.json +19 -19
  268. package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
  269. package/packages/native/src/native.ts +9 -8
  270. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  271. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  272. package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
  273. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  274. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  275. package/packages/pi-agent-core/src/agent-loop.test.ts +45 -0
  276. package/packages/pi-agent-core/src/agent-loop.ts +3 -2
  277. package/packages/pi-agent-core/src/proxy.ts +1 -1
  278. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  279. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  280. package/packages/pi-ai/dist/index.d.ts +1 -0
  281. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  282. package/packages/pi-ai/dist/index.js +1 -0
  283. package/packages/pi-ai/dist/index.js.map +1 -1
  284. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  285. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -2
  286. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  287. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
  288. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
  289. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
  290. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
  291. package/packages/pi-ai/dist/types.d.ts +3 -3
  292. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  293. package/packages/pi-ai/dist/types.js.map +1 -1
  294. package/packages/pi-ai/dist/utils/json-parse.d.ts +3 -0
  295. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/utils/json-parse.js +24 -1
  297. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  298. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
  299. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
  300. package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
  301. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
  302. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
  303. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
  304. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
  305. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
  306. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  307. package/packages/pi-ai/src/index.ts +1 -0
  308. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
  309. package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
  310. package/packages/pi-ai/src/types.ts +3 -2
  311. package/packages/pi-ai/src/utils/json-parse.ts +28 -1
  312. package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
  313. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
  314. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  315. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
  317. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
  319. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
  321. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
  323. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
  324. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
  325. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
  326. package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/exec.js +3 -1
  328. package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
  330. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
  331. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
  332. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
  333. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
  336. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
  338. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
  339. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
  340. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
  341. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
  342. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
  343. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
  344. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
  345. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
  346. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
  348. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  350. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  352. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
  354. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
  355. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
  356. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
  357. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
  358. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
  359. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
  360. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
  361. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
  362. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/index.js +1 -1
  364. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/lsp/index.js +3 -0
  367. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -0
  370. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/messages.js +31 -2
  373. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
  375. package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
  376. package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
  377. package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
  378. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  380. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
  382. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
  384. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
  386. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
  388. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
  390. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
  392. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
  393. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  394. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +10 -3
  395. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  396. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/tools/read.js +13 -4
  398. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
  400. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
  401. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
  402. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
  403. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  404. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  405. package/packages/pi-coding-agent/dist/index.js +1 -1
  406. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts.map +1 -1
  409. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +9 -8
  410. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  411. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +0 -3
  413. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  414. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -0
  415. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  416. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -1
  417. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
  419. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  420. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  421. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  422. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  423. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  424. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +5 -2
  426. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts +1 -0
  428. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +4 -0
  430. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  431. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  432. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +4 -2
  436. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +2 -2
  438. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  439. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  440. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +8 -1
  441. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  442. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  443. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +2 -0
  444. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  445. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +4 -0
  447. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  449. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +26 -12
  450. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  451. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +4 -4
  452. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +3 -0
  454. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  455. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +46 -14
  456. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  457. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  458. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -8
  459. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -4
  461. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  462. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  463. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  464. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  465. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -3
  466. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  467. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +3 -2
  469. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -1
  472. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  474. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +16 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  476. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
  477. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  478. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +27 -4
  479. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  480. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  481. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +6 -0
  482. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  483. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  484. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  485. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +1 -0
  486. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
  487. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +5 -0
  488. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
  489. package/packages/pi-coding-agent/package.json +1 -1
  490. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
  491. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
  492. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
  493. package/packages/pi-coding-agent/src/core/exec.ts +3 -1
  494. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  495. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  496. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  497. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  498. package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
  499. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  500. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  501. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  502. package/packages/pi-coding-agent/src/core/index.ts +6 -0
  503. package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
  504. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
  505. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  506. package/packages/pi-coding-agent/src/core/messages.ts +29 -2
  507. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  508. package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
  509. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
  510. package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
  511. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
  512. package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
  513. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
  514. package/packages/pi-coding-agent/src/index.ts +6 -0
  515. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +9 -9
  516. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -2
  517. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +3 -1
  518. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +1 -1
  519. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  520. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  521. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +7 -2
  522. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +3 -0
  523. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  524. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +4 -3
  525. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +2 -2
  526. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -1
  527. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -0
  528. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +4 -0
  529. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +27 -13
  530. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +4 -4
  531. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +45 -14
  532. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -7
  533. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +4 -4
  534. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -2
  535. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +8 -3
  536. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +3 -2
  537. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +24 -1
  538. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +14 -1
  539. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +35 -3
  540. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +7 -0
  541. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  542. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
  543. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  544. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  545. package/packages/pi-tui/dist/terminal.js +9 -0
  546. package/packages/pi-tui/dist/terminal.js.map +1 -1
  547. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  548. package/packages/pi-tui/dist/tui.js +9 -0
  549. package/packages/pi-tui/dist/tui.js.map +1 -1
  550. package/packages/pi-tui/src/terminal.ts +14 -0
  551. package/packages/pi-tui/src/tui.ts +8 -0
  552. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  553. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  554. package/pkg/package.json +1 -1
  555. package/scripts/ensure-workspace-builds.cjs +45 -14
  556. package/src/resources/agents/researcher.md +1 -1
  557. package/src/resources/extensions/ask-user-questions.ts +21 -3
  558. package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
  559. package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
  560. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  561. package/src/resources/extensions/claude-code-cli/partial-builder.ts +13 -6
  562. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
  563. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
  564. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
  565. package/src/resources/extensions/context7/extension-manifest.json +1 -1
  566. package/src/resources/extensions/get-secrets-from-user.ts +8 -5
  567. package/src/resources/extensions/google-search/extension-manifest.json +1 -1
  568. package/src/resources/extensions/google-search/index.ts +2 -1
  569. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  570. package/src/resources/extensions/gsd/auto/phases.ts +43 -34
  571. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  572. package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
  573. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -2
  574. package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
  575. package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
  576. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  577. package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
  578. package/src/resources/extensions/gsd/auto-start.ts +35 -26
  579. package/src/resources/extensions/gsd/auto-worktree.ts +193 -9
  580. package/src/resources/extensions/gsd/auto.ts +5 -0
  581. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
  582. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +85 -8
  583. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
  584. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -35
  585. package/src/resources/extensions/gsd/bootstrap/system-context.ts +72 -12
  586. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
  587. package/src/resources/extensions/gsd/captures.ts +63 -3
  588. package/src/resources/extensions/gsd/codebase-generator.ts +351 -0
  589. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  590. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  591. package/src/resources/extensions/gsd/commands-codebase.ts +164 -0
  592. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +46 -4
  593. package/src/resources/extensions/gsd/complexity-classifier.ts +8 -6
  594. package/src/resources/extensions/gsd/db-writer.ts +140 -7
  595. package/src/resources/extensions/gsd/doctor-git-checks.ts +75 -1
  596. package/src/resources/extensions/gsd/doctor-proactive.ts +35 -1
  597. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  598. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
  599. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  600. package/src/resources/extensions/gsd/doctor.ts +3 -1
  601. package/src/resources/extensions/gsd/error-classifier.ts +13 -11
  602. package/src/resources/extensions/gsd/extension-manifest.json +16 -1
  603. package/src/resources/extensions/gsd/forensics.ts +144 -20
  604. package/src/resources/extensions/gsd/git-service.ts +119 -3
  605. package/src/resources/extensions/gsd/gitignore.ts +33 -0
  606. package/src/resources/extensions/gsd/gsd-db.ts +43 -7
  607. package/src/resources/extensions/gsd/guided-flow.ts +114 -45
  608. package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
  609. package/src/resources/extensions/gsd/health-widget.ts +17 -0
  610. package/src/resources/extensions/gsd/index.ts +1 -0
  611. package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
  612. package/src/resources/extensions/gsd/migrate-external.ts +9 -1
  613. package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
  614. package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
  615. package/src/resources/extensions/gsd/model-router.ts +35 -1
  616. package/src/resources/extensions/gsd/native-git-bridge.ts +41 -0
  617. package/src/resources/extensions/gsd/notifications.ts +16 -0
  618. package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
  619. package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
  620. package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
  621. package/src/resources/extensions/gsd/paths.ts +44 -0
  622. package/src/resources/extensions/gsd/preferences-models.ts +14 -1
  623. package/src/resources/extensions/gsd/preferences-types.ts +10 -1
  624. package/src/resources/extensions/gsd/preferences.ts +13 -15
  625. package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
  626. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  627. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  628. package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  629. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  630. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
  631. package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
  632. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  633. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  634. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  635. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  636. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  637. package/src/resources/extensions/gsd/repo-identity.ts +186 -11
  638. package/src/resources/extensions/gsd/rethink.ts +6 -0
  639. package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
  640. package/src/resources/extensions/gsd/state.ts +84 -32
  641. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +47 -0
  642. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  643. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
  644. package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
  645. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  646. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +488 -0
  647. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
  648. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
  649. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  650. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +4 -4
  651. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
  652. package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
  653. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
  654. package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
  655. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  656. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
  657. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
  658. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  659. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
  660. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  661. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
  662. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  663. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
  664. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
  665. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
  666. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
  667. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
  668. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  669. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
  670. package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
  671. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
  672. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
  673. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +134 -0
  674. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
  675. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  676. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +72 -0
  677. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +68 -0
  678. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  679. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
  680. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  681. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
  682. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
  683. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
  684. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  685. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
  686. package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
  687. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
  688. package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
  689. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
  690. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
  691. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
  692. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
  693. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  694. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +29 -0
  695. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  696. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  697. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
  698. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
  699. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
  700. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
  701. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  702. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
  703. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
  704. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
  705. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
  706. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
  707. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  708. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
  709. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
  710. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
  711. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
  712. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +44 -0
  713. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  714. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
  715. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  716. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
  717. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  718. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +4 -1
  719. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  720. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
  721. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
  722. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
  723. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
  724. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
  725. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
  726. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
  727. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
  728. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
  729. package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
  730. package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
  731. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
  732. package/src/resources/extensions/gsd/tools/validate-milestone.ts +20 -2
  733. package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
  734. package/src/resources/extensions/gsd/types.ts +4 -2
  735. package/src/resources/extensions/gsd/undo.ts +2 -2
  736. package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
  737. package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
  738. package/src/resources/extensions/gsd/watch/header-renderer.ts +275 -0
  739. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  740. package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
  741. package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
  742. package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
  743. package/src/resources/extensions/gsd/workspace-index.ts +30 -0
  744. package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
  745. package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
  746. package/src/resources/extensions/mcp-client/index.ts +13 -7
  747. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
  748. package/src/resources/extensions/ollama/index.ts +130 -0
  749. package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
  750. package/src/resources/extensions/ollama/ollama-client.ts +196 -0
  751. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  752. package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
  753. package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
  754. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
  755. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  756. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
  757. package/src/resources/extensions/ollama/types.ts +130 -0
  758. package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
  759. package/src/resources/extensions/shared/interview-ui.ts +12 -1
  760. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
  761. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
  762. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  763. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  764. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  765. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  766. package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +0 -9
  767. package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
  768. package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
  769. /package/dist/web/standalone/.next/static/{OS7_z6QaL6uqp8q5pjHSJ → uDm3eO1oo9lDfY2TyoO9t}/_buildManifest.js +0 -0
  770. /package/dist/web/standalone/.next/static/{OS7_z6QaL6uqp8q5pjHSJ → uDm3eO1oo9lDfY2TyoO9t}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  [![npm version](https://img.shields.io/npm/v/gsd-pi?style=for-the-badge&logo=npm&logoColor=white&color=CB3837)](https://www.npmjs.com/package/gsd-pi)
8
8
  [![npm downloads](https://img.shields.io/npm/dm/gsd-pi?style=for-the-badge&logo=npm&logoColor=white&color=CB3837)](https://www.npmjs.com/package/gsd-pi)
9
9
  [![GitHub stars](https://img.shields.io/github/stars/gsd-build/GSD-2?style=for-the-badge&logo=github&color=181717)](https://github.com/gsd-build/GSD-2)
10
- [![Discord](https://img.shields.io/badge/Discord-Join%20us-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/gsd)
10
+ [![Discord](https://img.shields.io/badge/Discord-Join%20us-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/nKXTsAcmbT)
11
11
  [![License](https://img.shields.io/badge/license-MIT-blue?style=for-the-badge)](LICENSE)
12
12
  [![$GSD Token](https://img.shields.io/badge/$GSD-Dexscreener-1C1C1C?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgZmlsbD0iIzAwRkYwMCIvPjwvc3ZnPg==&logoColor=00FF00)](https://dexscreener.com/solana/dwudwjvan7bzkw9zwlbyv6kspdlvhwzrqy6ebk8xzxkv)
13
13
 
package/dist/cli.js CHANGED
@@ -5,7 +5,8 @@ import { agentDir, sessionsDir, authFilePath } from './app-paths.js';
5
5
  import { initResources, buildResourceLoader, getNewerManagedResourceVersion } from './resource-loader.js';
6
6
  import { ensureManagedTools } from './tool-bootstrap.js';
7
7
  import { loadStoredEnvKeys } from './wizard.js';
8
- import { getPiDefaultModelAndProvider, migratePiCredentials } from './pi-migration.js';
8
+ import { migratePiCredentials } from './pi-migration.js';
9
+ import { validateConfiguredModel } from './startup-model-validation.js';
9
10
  import { shouldRunOnboarding, runOnboarding } from './onboarding.js';
10
11
  import chalk from 'chalk';
11
12
  import { checkForUpdates } from './update-check.js';
@@ -136,6 +137,7 @@ const hasSubcommand = cliFlags.messages.length > 0;
136
137
  if (!process.stdin.isTTY && !isPrintMode && !hasSubcommand && !cliFlags.listModels && !cliFlags.web) {
137
138
  process.stderr.write('[gsd] Error: Interactive mode requires a terminal (TTY).\n');
138
139
  process.stderr.write('[gsd] Non-interactive alternatives:\n');
140
+ process.stderr.write('[gsd] gsd auto Auto-mode (pipeable, no TUI)\n');
139
141
  process.stderr.write('[gsd] gsd --print "your message" Single-shot prompt\n');
140
142
  process.stderr.write('[gsd] gsd --mode rpc JSON-RPC over stdin/stdout\n');
141
143
  process.stderr.write('[gsd] gsd --mode mcp MCP server over stdin/stdout\n');
@@ -248,6 +250,22 @@ if (cliFlags.messages[0] === 'headless') {
248
250
  await runHeadless(parseHeadlessArgs(process.argv));
249
251
  process.exit(0);
250
252
  }
253
+ // `gsd auto [args...]` — shorthand for `gsd headless auto [args...]` (#2732)
254
+ // Without this, `gsd auto` falls through to the interactive TUI which hangs
255
+ // when stdin/stdout are piped (non-TTY environments).
256
+ if (cliFlags.messages[0] === 'auto') {
257
+ await ensureRtkBootstrap();
258
+ const { runHeadless, parseHeadlessArgs } = await import('./headless.js');
259
+ // Rewrite argv so parseHeadlessArgs sees: [node, gsd, headless, auto, ...rest]
260
+ const rewrittenArgv = [
261
+ process.argv[0],
262
+ process.argv[1],
263
+ 'headless',
264
+ ...cliFlags.messages, // ['auto', ...extra args]
265
+ ];
266
+ await runHeadless(parseHeadlessArgs(rewrittenArgv));
267
+ process.exit(0);
268
+ }
251
269
  // Pi's tool bootstrap can mis-detect already-installed fd/rg on some systems
252
270
  // because spawnSync(..., ["--version"]) returns EPERM despite a zero exit code.
253
271
  // Provision local managed binaries first so Pi sees them without probing PATH.
@@ -328,38 +346,6 @@ if (cliFlags.listModels !== undefined) {
328
346
  }
329
347
  process.exit(0);
330
348
  }
331
- // Validate configured model on startup — catches stale settings from prior installs
332
- // (e.g. grok-2 which no longer exists) and fresh installs with no settings.
333
- // Only resets the default when the configured model no longer exists in the registry;
334
- // never overwrites a valid user choice.
335
- const configuredProvider = settingsManager.getDefaultProvider();
336
- const configuredModel = settingsManager.getDefaultModel();
337
- const allModels = modelRegistry.getAll();
338
- const availableModels = modelRegistry.getAvailable();
339
- const configuredExists = configuredProvider && configuredModel &&
340
- allModels.some((m) => m.provider === configuredProvider && m.id === configuredModel);
341
- const configuredAvailable = configuredProvider && configuredModel &&
342
- availableModels.some((m) => m.provider === configuredProvider && m.id === configuredModel);
343
- if (!configuredModel || !configuredExists) {
344
- // Model not configured at all, or removed from registry — pick a fallback.
345
- // Only fires when the model is genuinely unknown (not just temporarily unavailable).
346
- const piDefault = getPiDefaultModelAndProvider();
347
- const preferred = (piDefault
348
- ? availableModels.find((m) => m.provider === piDefault.provider && m.id === piDefault.model)
349
- : undefined) ||
350
- availableModels.find((m) => m.provider === 'openai' && m.id === 'gpt-5.4') ||
351
- availableModels.find((m) => m.provider === 'openai') ||
352
- availableModels.find((m) => m.provider === 'anthropic' && m.id === 'claude-opus-4-6') ||
353
- availableModels.find((m) => m.provider === 'anthropic' && m.id.includes('opus')) ||
354
- availableModels.find((m) => m.provider === 'anthropic') ||
355
- availableModels[0];
356
- if (preferred) {
357
- settingsManager.setDefaultModelAndProvider(preferred.provider, preferred.id);
358
- }
359
- }
360
- if (settingsManager.getDefaultThinkingLevel() !== 'off' && !configuredExists) {
361
- settingsManager.setDefaultThinkingLevel('off');
362
- }
363
349
  // GSD always uses quiet startup — the gsd extension renders its own branded header
364
350
  if (!settingsManager.getQuietStartup()) {
365
351
  settingsManager.setQuietStartup(true);
@@ -405,6 +391,10 @@ if (isPrintMode) {
405
391
  resourceLoader,
406
392
  });
407
393
  markStartup('createAgentSession');
394
+ // Validate configured model AFTER extensions have registered their models (#2626).
395
+ // Before this, extension-provided models (e.g. claude-code/*) were not yet in the
396
+ // registry, causing the user's valid choice to be silently overwritten.
397
+ validateConfiguredModel(modelRegistry, settingsManager);
408
398
  if (extensionsResult.errors.length > 0) {
409
399
  for (const err of extensionsResult.errors) {
410
400
  // Downgrade conflicts with built-in tools to warnings (#1347)
@@ -488,6 +478,19 @@ if (!cliFlags.worktree && !isPrintMode) {
488
478
  catch { /* non-fatal */ }
489
479
  }
490
480
  // ---------------------------------------------------------------------------
481
+ // Auto-redirect: `gsd auto` with piped stdout → headless mode (#2732)
482
+ // When stdout is not a TTY (e.g. `gsd auto | cat`, `gsd auto > file`),
483
+ // the TUI cannot render and the process hangs. Redirect to headless mode
484
+ // which handles non-interactive output gracefully.
485
+ // ---------------------------------------------------------------------------
486
+ if (cliFlags.messages[0] === 'auto' && !process.stdout.isTTY) {
487
+ await ensureRtkBootstrap();
488
+ const { runHeadless, parseHeadlessArgs } = await import('./headless.js');
489
+ process.stderr.write('[gsd] stdout is not a terminal — running auto-mode in headless mode.\n');
490
+ await runHeadless(parseHeadlessArgs(['node', 'gsd', 'headless', ...cliFlags.messages.slice(1)]));
491
+ process.exit(0);
492
+ }
493
+ // ---------------------------------------------------------------------------
491
494
  // Interactive mode — normal TTY session
492
495
  // ---------------------------------------------------------------------------
493
496
  await ensureRtkBootstrap();
@@ -524,6 +527,10 @@ const { session, extensionsResult } = await createAgentSession({
524
527
  resourceLoader,
525
528
  });
526
529
  markStartup('createAgentSession');
530
+ // Validate configured model AFTER extensions have registered their models (#2626).
531
+ // Before this, extension-provided models (e.g. claude-code/*) were not yet in the
532
+ // registry, causing the user's valid choice to be silently overwritten.
533
+ validateConfiguredModel(modelRegistry, settingsManager);
527
534
  if (extensionsResult.errors.length > 0) {
528
535
  for (const err of extensionsResult.errors) {
529
536
  const isSuperseded = err.error.includes("supersedes");
@@ -572,24 +579,40 @@ if (enabledModelPatterns && enabledModelPatterns.length > 0) {
572
579
  session.setScopedModels(scopedModels);
573
580
  }
574
581
  }
575
- if (!process.stdin.isTTY) {
576
- process.stderr.write('[gsd] Error: Interactive mode requires a terminal (TTY).\n');
582
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
583
+ const missing = !process.stdin.isTTY && !process.stdout.isTTY
584
+ ? 'stdin and stdout are'
585
+ : !process.stdin.isTTY
586
+ ? 'stdin is'
587
+ : 'stdout is';
588
+ process.stderr.write(`[gsd] Error: Interactive mode requires a terminal (TTY) but ${missing} not a TTY.\n`);
577
589
  process.stderr.write('[gsd] Non-interactive alternatives:\n');
590
+ process.stderr.write('[gsd] gsd auto Auto-mode (pipeable, no TUI)\n');
578
591
  process.stderr.write('[gsd] gsd --print "your message" Single-shot prompt\n');
579
592
  process.stderr.write('[gsd] gsd --web [path] Browser-only web mode\n');
580
593
  process.stderr.write('[gsd] gsd --mode rpc JSON-RPC over stdin/stdout\n');
581
594
  process.stderr.write('[gsd] gsd --mode mcp MCP server over stdin/stdout\n');
582
595
  process.stderr.write('[gsd] gsd --mode text "message" Text output mode\n');
596
+ process.stderr.write('[gsd] gsd headless Auto-mode without TUI\n');
583
597
  process.exit(1);
584
598
  }
585
599
  // Welcome screen — shown on every fresh interactive session before TUI takes over.
586
600
  // Skip when the first-run banner was already printed in loader.ts (prevents double banner).
587
601
  if (!process.env.GSD_FIRST_RUN_BANNER) {
588
602
  const { printWelcomeScreen } = await import('./welcome-screen.js');
603
+ let remoteChannel;
604
+ try {
605
+ const { resolveRemoteConfig } = await import('./resources/extensions/remote-questions/config.js');
606
+ const rc = resolveRemoteConfig();
607
+ if (rc)
608
+ remoteChannel = rc.channel;
609
+ }
610
+ catch { /* non-fatal */ }
589
611
  printWelcomeScreen({
590
612
  version: process.env.GSD_VERSION || '0.0.0',
591
613
  modelName: settingsManager.getDefaultModel() || undefined,
592
614
  provider: settingsManager.getDefaultProvider() || undefined,
615
+ remoteChannel,
593
616
  });
594
617
  }
595
618
  const interactiveMode = new InteractiveMode(session);
@@ -40,8 +40,25 @@ export declare function handleExtensionUIRequest(event: ExtensionUIRequest, clie
40
40
  export declare function formatProgress(event: Record<string, unknown>, ctx: ProgressContext): string | null;
41
41
  /**
42
42
  * Format a thinking preview line from accumulated LLM text deltas.
43
+ * Used as a fallback when streaming is not enabled — shows a truncated one-liner.
43
44
  */
44
45
  export declare function formatThinkingLine(text: string): string;
46
+ /**
47
+ * Format a text_start marker — printed once when the assistant begins a text block.
48
+ */
49
+ export declare function formatTextStart(): string;
50
+ /**
51
+ * Format a text_end marker — printed after the last text_delta.
52
+ */
53
+ export declare function formatTextEnd(): string;
54
+ /**
55
+ * Format a thinking_start marker.
56
+ */
57
+ export declare function formatThinkingStart(): string;
58
+ /**
59
+ * Format a thinking_end marker.
60
+ */
61
+ export declare function formatThinkingEnd(): string;
45
62
  /**
46
63
  * Format a cost line (used for periodic cost updates in verbose mode).
47
64
  */
@@ -40,24 +40,45 @@ const c = colorsDisabled ? noColor() : _c;
40
40
  export function summarizeToolArgs(toolName, toolInput) {
41
41
  const name = String(toolName ?? '');
42
42
  const input = (toolInput && typeof toolInput === 'object') ? toolInput : {};
43
+ // Helper: extract file path from either 'path' or 'file_path' (tools use both)
44
+ const filePath = () => shortPath(input.path ?? input.file_path) || '';
43
45
  switch (name) {
44
46
  case 'Read':
45
47
  case 'read':
46
- return shortPath(input.file_path) || '';
48
+ return filePath();
47
49
  case 'Write':
48
50
  case 'write':
49
- return shortPath(input.file_path) || '';
51
+ return filePath();
50
52
  case 'Edit':
51
53
  case 'edit':
52
- return shortPath(input.file_path) || '';
54
+ return filePath();
55
+ case 'hashline_edit':
56
+ return filePath();
53
57
  case 'Bash':
54
58
  case 'bash': {
55
59
  const cmd = String(input.command ?? '');
56
60
  return cmd.length > 80 ? cmd.slice(0, 77) + '...' : cmd;
57
61
  }
62
+ case 'async_bash': {
63
+ const cmd = String(input.command ?? '');
64
+ return cmd.length > 80 ? cmd.slice(0, 77) + '...' : cmd;
65
+ }
66
+ case 'await_job': {
67
+ const jobs = input.jobs;
68
+ if (Array.isArray(jobs) && jobs.length > 0)
69
+ return jobs.join(', ');
70
+ return '';
71
+ }
72
+ case 'cancel_job':
73
+ return String(input.job_id ?? '');
58
74
  case 'Glob':
59
75
  case 'glob':
60
76
  return String(input.pattern ?? '');
77
+ case 'find': {
78
+ const pat = String(input.pattern ?? '');
79
+ const p = shortPath(input.path);
80
+ return p ? `${pat} in ${p}` : pat;
81
+ }
61
82
  case 'Grep':
62
83
  case 'grep':
63
84
  case 'Search':
@@ -66,12 +87,32 @@ export function summarizeToolArgs(toolName, toolInput) {
66
87
  const g = input.glob ? ` ${input.glob}` : '';
67
88
  return `${pat}${g}`;
68
89
  }
90
+ case 'ls':
91
+ return shortPath(input.path) || '';
92
+ case 'lsp': {
93
+ const action = String(input.action ?? '');
94
+ const file = shortPath(input.file);
95
+ const sym = input.symbol ? ` ${input.symbol}` : '';
96
+ return file ? `${action} ${file}${sym}` : action;
97
+ }
69
98
  case 'Task':
70
99
  case 'task': {
71
100
  const desc = String(input.description ?? input.prompt ?? '');
72
101
  return desc.length > 60 ? desc.slice(0, 57) + '...' : desc;
73
102
  }
103
+ case 'subagent': {
104
+ const agent = String(input.agent ?? '');
105
+ const t = String(input.task ?? '');
106
+ const summary = t.length > 50 ? t.slice(0, 47) + '...' : t;
107
+ return agent ? `${agent}: ${summary}` : summary;
108
+ }
109
+ case 'browser_navigate':
110
+ return String(input.url ?? '');
74
111
  default: {
112
+ // GSD tools: show milestone/slice/task IDs when present
113
+ if (name.startsWith('gsd_')) {
114
+ return summarizeGsdTool(name, input);
115
+ }
75
116
  // Fallback: show first string-valued key up to 60 chars
76
117
  for (const v of Object.values(input)) {
77
118
  if (typeof v === 'string' && v.length > 0) {
@@ -82,6 +123,31 @@ export function summarizeToolArgs(toolName, toolInput) {
82
123
  }
83
124
  }
84
125
  }
126
+ /** Summarize GSD extension tool args into a compact identifier string. */
127
+ function summarizeGsdTool(name, input) {
128
+ const parts = [];
129
+ if (input.milestoneId)
130
+ parts.push(String(input.milestoneId));
131
+ if (input.sliceId)
132
+ parts.push(String(input.sliceId));
133
+ if (input.taskId)
134
+ parts.push(String(input.taskId));
135
+ if (parts.length > 0) {
136
+ const id = parts.join('/');
137
+ // For completion tools, add the one-liner if present
138
+ if (name.includes('complete') && typeof input.oneLiner === 'string') {
139
+ const ol = input.oneLiner.length > 50 ? input.oneLiner.slice(0, 47) + '...' : input.oneLiner;
140
+ return `${id} ${ol}`;
141
+ }
142
+ return id;
143
+ }
144
+ // Fallback for GSD tools without IDs (e.g. gsd_decision_save)
145
+ if (input.decision) {
146
+ const d = String(input.decision);
147
+ return d.length > 60 ? d.slice(0, 57) + '...' : d;
148
+ }
149
+ return '';
150
+ }
85
151
  function shortPath(p) {
86
152
  if (typeof p !== 'string')
87
153
  return '';
@@ -220,12 +286,40 @@ export function formatProgress(event, ctx) {
220
286
  }
221
287
  /**
222
288
  * Format a thinking preview line from accumulated LLM text deltas.
289
+ * Used as a fallback when streaming is not enabled — shows a truncated one-liner.
223
290
  */
224
291
  export function formatThinkingLine(text) {
225
292
  const trimmed = text.replace(/\s+/g, ' ').trim();
226
293
  const truncated = trimmed.length > 120 ? trimmed.slice(0, 117) + '...' : trimmed;
227
294
  return `${c.dim}${c.italic}[thinking] ${truncated}${c.reset}`;
228
295
  }
296
+ // ---------------------------------------------------------------------------
297
+ // Streaming Text / Thinking Formatters
298
+ // ---------------------------------------------------------------------------
299
+ /**
300
+ * Format a text_start marker — printed once when the assistant begins a text block.
301
+ */
302
+ export function formatTextStart() {
303
+ return `${c.dim}[text]${c.reset}`;
304
+ }
305
+ /**
306
+ * Format a text_end marker — printed after the last text_delta.
307
+ */
308
+ export function formatTextEnd() {
309
+ return ''; // empty — newline handled by caller
310
+ }
311
+ /**
312
+ * Format a thinking_start marker.
313
+ */
314
+ export function formatThinkingStart() {
315
+ return `${c.dim}${c.italic}[thinking]${c.reset}`;
316
+ }
317
+ /**
318
+ * Format a thinking_end marker.
319
+ */
320
+ export function formatThinkingEnd() {
321
+ return ''; // empty — newline handled by caller
322
+ }
229
323
  /**
230
324
  * Format a cost line (used for periodic cost updates in verbose mode).
231
325
  */
package/dist/headless.js CHANGED
@@ -19,7 +19,7 @@ import { getProjectSessionsDir } from './project-sessions.js';
19
19
  import { loadAndValidateAnswerFile, AnswerInjector } from './headless-answers.js';
20
20
  import { isTerminalNotification, isBlockedNotification, isMilestoneReadyNotification, isQuickCommand, FIRE_AND_FORGET_METHODS, IDLE_TIMEOUT_MS, NEW_MILESTONE_IDLE_TIMEOUT_MS, EXIT_SUCCESS, EXIT_ERROR, EXIT_BLOCKED, EXIT_CANCELLED, mapStatusToExitCode, } from './headless-events.js';
21
21
  import { VALID_OUTPUT_FORMATS } from './headless-types.js';
22
- import { handleExtensionUIRequest, formatProgress, formatThinkingLine, startSupervisedStdinReader, } from './headless-ui.js';
22
+ import { handleExtensionUIRequest, formatProgress, formatThinkingLine, formatTextStart, formatTextEnd, formatThinkingStart, formatThinkingEnd, startSupervisedStdinReader, } from './headless-ui.js';
23
23
  import { loadContext, bootstrapGsdProject, } from './headless-context.js';
24
24
  /**
25
25
  * Resolve a session prefix to a single session.
@@ -291,6 +291,9 @@ async function runHeadlessOnce(options, restartCount) {
291
291
  const toolStartTimes = new Map();
292
292
  let lastCostData;
293
293
  let thinkingBuffer = '';
294
+ // Streaming state: tracks whether we're inside a text or thinking block
295
+ let inTextBlock = false;
296
+ let inThinkingBlock = false;
294
297
  // Emit HeadlessJsonResult to stdout for --output-format json batch mode
295
298
  function emitBatchJsonResult() {
296
299
  if (options.outputFormat !== 'json')
@@ -430,11 +433,58 @@ async function runHeadlessOnce(options, restartCount) {
430
433
  };
431
434
  }
432
435
  }
433
- // Accumulate thinking text from message_update text_delta events
436
+ // Stream assistant text and thinking deltas in verbose mode
434
437
  if (eventType === 'message_update') {
435
438
  const ame = eventObj.assistantMessageEvent;
436
- if (ame?.type === 'text_delta') {
437
- thinkingBuffer += String(ame.text ?? '');
439
+ if (ame && options.verbose) {
440
+ const ameType = String(ame.type ?? '');
441
+ // --- Text streaming ---
442
+ if (ameType === 'text_start') {
443
+ inTextBlock = true;
444
+ process.stderr.write(formatTextStart());
445
+ }
446
+ else if (ameType === 'text_delta') {
447
+ const delta = String(ame.delta ?? ame.text ?? '');
448
+ if (delta) {
449
+ if (!inTextBlock) {
450
+ // Edge case: delta without start
451
+ inTextBlock = true;
452
+ process.stderr.write(formatTextStart());
453
+ }
454
+ process.stderr.write(delta);
455
+ }
456
+ }
457
+ else if (ameType === 'text_end') {
458
+ if (inTextBlock) {
459
+ process.stderr.write(formatTextEnd() + '\n');
460
+ inTextBlock = false;
461
+ }
462
+ }
463
+ // --- Thinking streaming ---
464
+ else if (ameType === 'thinking_start') {
465
+ inThinkingBlock = true;
466
+ process.stderr.write(formatThinkingStart());
467
+ }
468
+ else if (ameType === 'thinking_delta') {
469
+ const delta = String(ame.delta ?? ame.text ?? '');
470
+ if (delta) {
471
+ if (!inThinkingBlock) {
472
+ inThinkingBlock = true;
473
+ process.stderr.write(formatThinkingStart());
474
+ }
475
+ process.stderr.write(delta);
476
+ }
477
+ }
478
+ else if (ameType === 'thinking_end') {
479
+ if (inThinkingBlock) {
480
+ process.stderr.write(formatThinkingEnd() + '\n');
481
+ inThinkingBlock = false;
482
+ }
483
+ }
484
+ }
485
+ // Non-verbose: accumulate text_delta for truncated one-liner
486
+ else if (ame?.type === 'text_delta') {
487
+ thinkingBuffer += String(ame.delta ?? ame.text ?? '');
438
488
  }
439
489
  }
440
490
  // Track tool execution start timestamps
@@ -443,8 +493,19 @@ async function runHeadlessOnce(options, restartCount) {
443
493
  if (toolCallId)
444
494
  toolStartTimes.set(toolCallId, Date.now());
445
495
  }
446
- // Flush thinking buffer before tool calls or message end
447
- if (options.verbose && thinkingBuffer.trim() &&
496
+ // Close any open streaming blocks before tool calls or message end
497
+ if (options.verbose && (eventType === 'tool_execution_start' || eventType === 'message_end')) {
498
+ if (inTextBlock) {
499
+ process.stderr.write('\n');
500
+ inTextBlock = false;
501
+ }
502
+ if (inThinkingBlock) {
503
+ process.stderr.write('\n');
504
+ inThinkingBlock = false;
505
+ }
506
+ }
507
+ // Non-verbose: flush accumulated buffer as truncated one-liner
508
+ else if (!options.verbose && thinkingBuffer.trim() &&
448
509
  (eventType === 'tool_execution_start' || eventType === 'message_end')) {
449
510
  process.stderr.write(formatThinkingLine(thinkingBuffer) + '\n');
450
511
  thinkingBuffer = '';
package/dist/help-text.js CHANGED
@@ -160,6 +160,7 @@ export function printHelp(version) {
160
160
  process.stdout.write(' update Update GSD to the latest version\n');
161
161
  process.stdout.write(' sessions List and resume a past session\n');
162
162
  process.stdout.write(' worktree <cmd> Manage worktrees (list, merge, clean, remove)\n');
163
+ process.stdout.write(' auto [args] Run auto-mode without TUI (pipeable)\n');
163
164
  process.stdout.write(' headless [cmd] [args] Run /gsd commands without TUI (default: auto)\n');
164
165
  process.stdout.write('\nRun gsd <subcommand> --help for subcommand-specific help.\n');
165
166
  }
@@ -49,6 +49,7 @@ const LLM_PROVIDER_IDS = [
49
49
  'xai',
50
50
  'openrouter',
51
51
  'mistral',
52
+ 'ollama',
52
53
  'ollama-cloud',
53
54
  'custom-openai',
54
55
  ];
@@ -63,6 +64,7 @@ const OTHER_PROVIDERS = [
63
64
  { value: 'xai', label: 'xAI (Grok)' },
64
65
  { value: 'openrouter', label: 'OpenRouter' },
65
66
  { value: 'mistral', label: 'Mistral' },
67
+ { value: 'ollama', label: 'Ollama (Local)' },
66
68
  { value: 'ollama-cloud', label: 'Ollama Cloud' },
67
69
  { value: 'custom-openai', label: 'Custom (OpenAI-compatible)' },
68
70
  ];
@@ -293,6 +295,9 @@ async function runLlmStep(p, pc, authStorage) {
293
295
  if (provider === 'custom-openai') {
294
296
  return await runCustomOpenAIFlow(p, pc, authStorage);
295
297
  }
298
+ if (provider === 'ollama') {
299
+ return await runOllamaLocalFlow(p, pc, authStorage);
300
+ }
296
301
  const label = provider === 'anthropic' ? 'Anthropic'
297
302
  : provider === 'openai' ? 'OpenAI'
298
303
  : OTHER_PROVIDERS.find(op => op.value === provider)?.label ?? String(provider);
@@ -382,6 +387,45 @@ async function runApiKeyFlow(p, pc, authStorage, providerId, providerLabel) {
382
387
  p.log.success(`API key saved for ${pc.green(providerLabel)}`);
383
388
  return true;
384
389
  }
390
+ // ─── Ollama Local Flow ───────────────────────────────────────────────────────
391
+ async function runOllamaLocalFlow(p, pc, authStorage) {
392
+ const host = process.env.OLLAMA_HOST || 'http://localhost:11434';
393
+ const s = p.spinner();
394
+ s.start(`Checking Ollama at ${host}...`);
395
+ try {
396
+ const controller = new AbortController();
397
+ const timeout = setTimeout(() => controller.abort(), 3000);
398
+ const response = await fetch(host, { signal: controller.signal });
399
+ clearTimeout(timeout);
400
+ if (response.ok) {
401
+ s.stop(`Ollama is running at ${pc.green(host)}`);
402
+ // Store a placeholder so the provider is recognized as authenticated
403
+ authStorage.set('ollama', { type: 'api_key', key: 'ollama' });
404
+ p.log.success(`${pc.green('Ollama (Local)')} configured — no API key needed`);
405
+ p.log.info(pc.dim('Models are discovered automatically from your local Ollama instance.'));
406
+ return true;
407
+ }
408
+ else {
409
+ s.stop('Ollama check failed');
410
+ p.log.warn(`Ollama responded with status ${response.status} at ${host}`);
411
+ }
412
+ }
413
+ catch {
414
+ s.stop('Ollama not detected');
415
+ p.log.warn(`Could not reach Ollama at ${host}`);
416
+ p.log.info(pc.dim('Install Ollama from https://ollama.com and run "ollama serve"'));
417
+ p.log.info(pc.dim('Set OLLAMA_HOST if using a non-default address.'));
418
+ }
419
+ // Even if not reachable now, save the config — the extension will detect it at runtime
420
+ const proceed = await p.confirm({
421
+ message: 'Save Ollama as your provider anyway? (it will auto-detect when running)',
422
+ });
423
+ if (p.isCancel(proceed) || !proceed)
424
+ return false;
425
+ authStorage.set('ollama', { type: 'api_key', key: 'ollama' });
426
+ p.log.success(`${pc.green('Ollama (Local)')} saved — models will appear when Ollama is running`);
427
+ return true;
428
+ }
385
429
  // ─── Custom OpenAI-compatible Flow ────────────────────────────────────────────
386
430
  async function runCustomOpenAIFlow(p, pc, authStorage) {
387
431
  // Prompt for base URL
@@ -1,4 +1,4 @@
1
- import { DefaultResourceLoader } from '@gsd/pi-coding-agent';
1
+ import { DefaultResourceLoader, sortExtensionPaths } from '@gsd/pi-coding-agent';
2
2
  import { createHash } from 'node:crypto';
3
3
  import { homedir } from 'node:os';
4
4
  import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, openSync, closeSync, readFileSync, readlinkSync, readdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
@@ -584,5 +584,20 @@ export function buildResourceLoader(agentDir) {
584
584
  agentDir,
585
585
  additionalExtensionPaths: piExtensionPaths,
586
586
  bundledExtensionNames: bundledKeys,
587
+ extensionPathsTransform: (paths) => {
588
+ // 1. Filter community extensions through the GSD registry
589
+ const filteredPaths = paths.filter((entryPath) => {
590
+ const manifest = readManifestFromEntryPath(entryPath);
591
+ if (!manifest)
592
+ return true; // no manifest = always load
593
+ return isExtensionEnabled(registry, manifest.id);
594
+ });
595
+ // 2. Sort in topological dependency order
596
+ const { sortedPaths, warnings } = sortExtensionPaths(filteredPaths);
597
+ return {
598
+ paths: sortedPaths,
599
+ diagnostics: warnings.map((w) => w.message),
600
+ };
601
+ },
587
602
  });
588
603
  }
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: researcher
3
3
  description: Web researcher that finds and synthesizes current information using Brave Search
4
- tools: web_search, bash
4
+ tools: search-the-web, bash
5
5
  ---
6
6
 
7
7
  You are a web researcher. You find current, accurate information using web search and synthesize it into a clear, well-structured report.
@@ -104,9 +104,22 @@ export default function AskUserQuestions(pi) {
104
104
  if (selected === undefined) {
105
105
  return errorResult("ask_user_questions was cancelled", params.questions);
106
106
  }
107
- answers[q.id] = {
108
- answers: Array.isArray(selected) ? selected : [selected],
109
- };
107
+ // When the user picks "None of the above" on a single-select
108
+ // question, prompt for a free-text explanation so they are not
109
+ // trapped in a re-asking loop (bug #2715).
110
+ let freeTextNote = "";
111
+ const selectedStr = Array.isArray(selected) ? selected[0] : selected;
112
+ if (!q.allowMultiple && selectedStr === OTHER_OPTION_LABEL) {
113
+ const note = await ctx.ui.input(`${q.header}: Please explain in your own words`, "Type your answer here…");
114
+ if (note) {
115
+ freeTextNote = note;
116
+ }
117
+ }
118
+ const answerList = Array.isArray(selected) ? selected : [selected];
119
+ if (freeTextNote) {
120
+ answerList.push(`user_note: ${freeTextNote}`);
121
+ }
122
+ answers[q.id] = { answers: answerList };
110
123
  }
111
124
  const roundResult = {
112
125
  endInterview: false,
@@ -8,6 +8,6 @@
8
8
  "provides": {
9
9
  "tools": ["async_bash", "await_job", "cancel_job"],
10
10
  "commands": ["jobs"],
11
- "hooks": ["session_start"]
11
+ "hooks": ["session_start", "session_before_switch", "session_shutdown"]
12
12
  }
13
13
  }
@@ -8,7 +8,7 @@
8
8
  "provides": {
9
9
  "tools": ["bg_shell"],
10
10
  "commands": ["bg"],
11
- "hooks": ["session_shutdown"],
11
+ "hooks": ["session_shutdown", "session_compact", "session_tree", "session_switch", "before_agent_start", "session_start", "turn_end", "agent_end", "tool_execution_end"],
12
12
  "shortcuts": ["Ctrl+Alt+B"]
13
13
  }
14
14
  }
@@ -29,7 +29,7 @@
29
29
  "browser_visual_diff", "browser_zoom_region",
30
30
  "browser_generate_test", "browser_action_cache", "browser_check_injection"
31
31
  ],
32
- "hooks": ["session_shutdown"]
32
+ "hooks": ["session_start", "session_shutdown"]
33
33
  },
34
34
  "dependencies": {
35
35
  "runtime": ["playwright"]