gsd-pi 2.58.0 → 2.59.0

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 (785) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +60 -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/bootstrap/agent-end-recovery.js +32 -0
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -8
  32. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
  33. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +42 -34
  34. package/dist/resources/extensions/gsd/bootstrap/system-context.js +66 -12
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -0
  36. package/dist/resources/extensions/gsd/captures.js +56 -4
  37. package/dist/resources/extensions/gsd/codebase-generator.js +279 -0
  38. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  40. package/dist/resources/extensions/gsd/commands-codebase.js +115 -0
  41. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +41 -4
  42. package/dist/resources/extensions/gsd/complexity-classifier.js +8 -6
  43. package/dist/resources/extensions/gsd/db-writer.js +116 -8
  44. package/dist/resources/extensions/gsd/doctor-git-checks.js +76 -1
  45. package/dist/resources/extensions/gsd/doctor-proactive.js +34 -1
  46. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  47. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -4
  48. package/dist/resources/extensions/gsd/doctor.js +3 -1
  49. package/dist/resources/extensions/gsd/error-classifier.js +12 -10
  50. package/dist/resources/extensions/gsd/extension-manifest.json +16 -1
  51. package/dist/resources/extensions/gsd/forensics.js +123 -20
  52. package/dist/resources/extensions/gsd/git-service.js +105 -2
  53. package/dist/resources/extensions/gsd/gitignore.js +33 -0
  54. package/dist/resources/extensions/gsd/gsd-db.js +36 -9
  55. package/dist/resources/extensions/gsd/guided-flow.js +106 -44
  56. package/dist/resources/extensions/gsd/health-widget-core.js +31 -0
  57. package/dist/resources/extensions/gsd/health-widget.js +17 -0
  58. package/dist/resources/extensions/gsd/index.js +1 -1
  59. package/dist/resources/extensions/gsd/memory-extractor.js +7 -0
  60. package/dist/resources/extensions/gsd/migrate-external.js +8 -1
  61. package/dist/resources/extensions/gsd/milestone-validation-gates.js +45 -0
  62. package/dist/resources/extensions/gsd/model-cost-table.js +18 -0
  63. package/dist/resources/extensions/gsd/model-router.js +35 -1
  64. package/dist/resources/extensions/gsd/native-git-bridge.js +39 -0
  65. package/dist/resources/extensions/gsd/notifications.js +16 -1
  66. package/dist/resources/extensions/gsd/parallel-eligibility.js +13 -2
  67. package/dist/resources/extensions/gsd/parallel-merge.js +78 -5
  68. package/dist/resources/extensions/gsd/parsers-legacy.js +20 -3
  69. package/dist/resources/extensions/gsd/paths.js +45 -0
  70. package/dist/resources/extensions/gsd/preferences-models.js +14 -1
  71. package/dist/resources/extensions/gsd/preferences-types.js +3 -1
  72. package/dist/resources/extensions/gsd/preferences.js +13 -16
  73. package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
  74. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  76. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  77. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
  79. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  83. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  84. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  85. package/dist/resources/extensions/gsd/repo-identity.js +205 -11
  86. package/dist/resources/extensions/gsd/rethink.js +5 -0
  87. package/dist/resources/extensions/gsd/roadmap-slices.js +5 -4
  88. package/dist/resources/extensions/gsd/state.js +85 -27
  89. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  90. package/dist/resources/extensions/gsd/tools/complete-task.js +34 -71
  91. package/dist/resources/extensions/gsd/tools/plan-milestone.js +12 -2
  92. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +29 -1
  93. package/dist/resources/extensions/gsd/tools/validate-milestone.js +14 -3
  94. package/dist/resources/extensions/gsd/triage-resolution.js +22 -7
  95. package/dist/resources/extensions/gsd/undo.js +2 -2
  96. package/dist/resources/extensions/gsd/unit-ownership.js +164 -33
  97. package/dist/resources/extensions/gsd/verdict-parser.js +20 -8
  98. package/dist/resources/extensions/gsd/watch/header-renderer.js +241 -0
  99. package/dist/resources/extensions/gsd/workflow-manifest.js +24 -5
  100. package/dist/resources/extensions/gsd/workflow-projections.js +95 -63
  101. package/dist/resources/extensions/gsd/workflow-reconcile.js +35 -5
  102. package/dist/resources/extensions/gsd/workspace-index.js +24 -0
  103. package/dist/resources/extensions/gsd/worktree-manager.js +105 -1
  104. package/dist/resources/extensions/gsd/worktree-resolver.js +20 -3
  105. package/dist/resources/extensions/mcp-client/index.js +11 -7
  106. package/dist/resources/extensions/ollama/index.js +112 -0
  107. package/dist/resources/extensions/ollama/model-capabilities.js +115 -0
  108. package/dist/resources/extensions/ollama/ollama-client.js +168 -0
  109. package/dist/resources/extensions/ollama/ollama-commands.js +194 -0
  110. package/dist/resources/extensions/ollama/ollama-discovery.js +69 -0
  111. package/dist/resources/extensions/ollama/ollama-tool.js +184 -0
  112. package/dist/resources/extensions/ollama/types.js +2 -0
  113. package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
  114. package/dist/resources/extensions/search-the-web/url-utils.js +17 -0
  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/security-overrides.d.ts +11 -0
  122. package/dist/security-overrides.js +41 -0
  123. package/dist/startup-model-validation.d.ts +39 -0
  124. package/dist/startup-model-validation.js +50 -0
  125. package/dist/web/standalone/.next/BUILD_ID +1 -1
  126. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  127. package/dist/web/standalone/.next/build-manifest.json +3 -3
  128. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  129. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  132. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  148. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/index.html +1 -1
  203. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  204. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  206. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  208. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  209. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  211. package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
  212. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  215. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  216. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  217. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +9 -0
  218. package/dist/web/standalone/.next/static/chunks/{webpack-61d3afac6d0f0ce7.js → webpack-a1c1e452c6b32d04.js} +1 -1
  219. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
  220. package/dist/web-mode.js +2 -1
  221. package/dist/welcome-screen.d.ts +1 -0
  222. package/dist/welcome-screen.js +32 -6
  223. package/package.json +2 -2
  224. package/packages/daemon/src/daemon.ts +1 -1
  225. package/packages/daemon/src/discord-bot.ts +11 -0
  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/message-batcher.test.ts +2 -2
  229. package/packages/daemon/src/message-batcher.ts +9 -3
  230. package/packages/daemon/src/orchestrator.test.ts +1 -0
  231. package/packages/daemon/src/orchestrator.ts +106 -2
  232. package/packages/native/dist/ast/index.js +9 -5
  233. package/packages/native/dist/ast/types.js +2 -1
  234. package/packages/native/dist/clipboard/index.js +12 -7
  235. package/packages/native/dist/clipboard/types.js +2 -1
  236. package/packages/native/dist/diff/index.js +12 -7
  237. package/packages/native/dist/diff/types.js +2 -1
  238. package/packages/native/dist/fd/index.js +6 -3
  239. package/packages/native/dist/fd/types.js +2 -1
  240. package/packages/native/dist/glob/index.js +9 -5
  241. package/packages/native/dist/glob/types.js +2 -1
  242. package/packages/native/dist/grep/index.js +9 -5
  243. package/packages/native/dist/grep/types.js +2 -1
  244. package/packages/native/dist/gsd-parser/index.js +18 -11
  245. package/packages/native/dist/gsd-parser/types.js +2 -1
  246. package/packages/native/dist/highlight/index.js +12 -7
  247. package/packages/native/dist/highlight/types.js +2 -1
  248. package/packages/native/dist/html/index.js +6 -3
  249. package/packages/native/dist/html/types.js +2 -1
  250. package/packages/native/dist/image/index.js +10 -5
  251. package/packages/native/dist/image/types.js +7 -4
  252. package/packages/native/dist/index.js +70 -17
  253. package/packages/native/dist/json-parse/index.js +13 -8
  254. package/packages/native/dist/native.js +47 -10
  255. package/packages/native/dist/ps/index.js +15 -9
  256. package/packages/native/dist/ps/types.js +2 -1
  257. package/packages/native/dist/stream-process/index.js +12 -7
  258. package/packages/native/dist/text/index.js +24 -14
  259. package/packages/native/dist/text/types.js +5 -2
  260. package/packages/native/dist/truncate/index.js +12 -7
  261. package/packages/native/dist/ttsr/index.js +12 -7
  262. package/packages/native/dist/ttsr/types.js +2 -1
  263. package/packages/native/dist/xxhash/index.js +9 -5
  264. package/packages/native/package.json +19 -19
  265. package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
  266. package/packages/native/src/native.ts +9 -8
  267. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  268. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  269. package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
  270. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  271. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  272. package/packages/pi-agent-core/src/agent-loop.test.ts +45 -0
  273. package/packages/pi-agent-core/src/agent-loop.ts +3 -2
  274. package/packages/pi-agent-core/src/proxy.ts +1 -1
  275. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  276. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  277. package/packages/pi-ai/dist/index.d.ts +1 -0
  278. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  279. package/packages/pi-ai/dist/index.js +1 -0
  280. package/packages/pi-ai/dist/index.js.map +1 -1
  281. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  282. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -2
  283. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  284. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
  285. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
  286. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
  287. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
  288. package/packages/pi-ai/dist/types.d.ts +3 -3
  289. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  290. package/packages/pi-ai/dist/types.js.map +1 -1
  291. package/packages/pi-ai/dist/utils/json-parse.d.ts +3 -0
  292. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  293. package/packages/pi-ai/dist/utils/json-parse.js +24 -1
  294. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  295. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
  296. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
  297. package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
  298. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
  299. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
  300. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
  301. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
  302. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
  303. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  304. package/packages/pi-ai/src/index.ts +1 -0
  305. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
  306. package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
  307. package/packages/pi-ai/src/types.ts +3 -2
  308. package/packages/pi-ai/src/utils/json-parse.ts +28 -1
  309. package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
  310. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
  311. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  312. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
  314. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
  316. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  317. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
  318. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
  320. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
  321. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
  322. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
  323. package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/exec.js +3 -1
  325. package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
  327. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
  328. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
  329. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
  330. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
  331. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
  332. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
  333. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
  334. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
  335. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
  336. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
  337. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
  338. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
  339. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
  341. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
  342. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
  343. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
  345. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  347. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  349. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
  351. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
  352. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
  353. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
  354. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
  355. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
  356. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
  357. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
  358. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
  359. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/index.js +1 -1
  361. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/lsp/index.js +3 -0
  364. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -0
  367. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/messages.js +31 -2
  370. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
  372. package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
  373. package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
  374. package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
  375. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  377. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  378. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts +8 -0
  379. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
  380. package/packages/pi-coding-agent/dist/core/resolve-config-value.js +23 -2
  381. package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
  382. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +89 -2
  383. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
  385. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
  387. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
  389. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  390. package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
  391. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  392. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
  393. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
  394. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
  395. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
  396. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.d.ts +2 -0
  397. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.d.ts.map +1 -0
  398. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.js +83 -0
  399. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.js.map +1 -0
  400. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +14 -0
  401. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  402. package/packages/pi-coding-agent/dist/core/settings-manager.js +36 -3
  403. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  404. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  405. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +10 -3
  406. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/core/tools/read.js +13 -4
  409. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
  411. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
  412. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
  413. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
  414. package/packages/pi-coding-agent/dist/index.d.ts +3 -2
  415. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  416. package/packages/pi-coding-agent/dist/index.js +2 -1
  417. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts +1 -1
  419. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts.map +1 -1
  420. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +9 -8
  421. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  422. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +0 -3
  424. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -0
  426. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -1
  428. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
  430. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  431. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  432. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  435. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +5 -2
  437. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  438. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts +1 -0
  439. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  440. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +4 -0
  441. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  442. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  443. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  444. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  445. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +4 -2
  447. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +2 -2
  449. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  450. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  451. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +8 -1
  452. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  454. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +2 -0
  455. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  456. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  457. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +4 -0
  458. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  459. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +26 -12
  461. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  462. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +4 -4
  463. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  464. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +3 -0
  465. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  466. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +46 -14
  467. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  469. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -8
  470. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -4
  472. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  474. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  476. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -3
  477. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  478. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  479. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +3 -2
  480. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  481. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  482. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -1
  483. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  484. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  485. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +16 -1
  486. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  487. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
  488. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  489. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +27 -4
  490. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  491. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  492. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +6 -0
  493. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  494. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  495. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  496. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +1 -0
  497. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
  498. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +5 -0
  499. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
  500. package/packages/pi-coding-agent/package.json +1 -1
  501. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
  502. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
  503. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
  504. package/packages/pi-coding-agent/src/core/exec.ts +3 -1
  505. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  506. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  507. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  508. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  509. package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
  510. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  511. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  512. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  513. package/packages/pi-coding-agent/src/core/index.ts +6 -0
  514. package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
  515. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
  516. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  517. package/packages/pi-coding-agent/src/core/messages.ts +29 -2
  518. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  519. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +111 -1
  520. package/packages/pi-coding-agent/src/core/resolve-config-value.ts +26 -2
  521. package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
  522. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
  523. package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
  524. package/packages/pi-coding-agent/src/core/settings-manager-security.test.ts +102 -0
  525. package/packages/pi-coding-agent/src/core/settings-manager.ts +44 -3
  526. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
  527. package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
  528. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
  529. package/packages/pi-coding-agent/src/index.ts +11 -0
  530. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +9 -9
  531. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -2
  532. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +3 -1
  533. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +1 -1
  534. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  535. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  536. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +7 -2
  537. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +3 -0
  538. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  539. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +4 -3
  540. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +2 -2
  541. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -1
  542. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -0
  543. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +4 -0
  544. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +27 -13
  545. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +4 -4
  546. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +45 -14
  547. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -7
  548. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +4 -4
  549. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -2
  550. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +8 -3
  551. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +3 -2
  552. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +24 -1
  553. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +14 -1
  554. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +35 -3
  555. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +7 -0
  556. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  557. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
  558. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  559. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  560. package/packages/pi-tui/dist/terminal.js +9 -0
  561. package/packages/pi-tui/dist/terminal.js.map +1 -1
  562. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  563. package/packages/pi-tui/dist/tui.js +9 -0
  564. package/packages/pi-tui/dist/tui.js.map +1 -1
  565. package/packages/pi-tui/src/terminal.ts +14 -0
  566. package/packages/pi-tui/src/tui.ts +8 -0
  567. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  568. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  569. package/pkg/package.json +1 -1
  570. package/scripts/ensure-workspace-builds.cjs +45 -14
  571. package/src/resources/agents/researcher.md +1 -1
  572. package/src/resources/extensions/ask-user-questions.ts +21 -3
  573. package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
  574. package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
  575. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  576. package/src/resources/extensions/claude-code-cli/partial-builder.ts +13 -6
  577. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
  578. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
  579. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
  580. package/src/resources/extensions/context7/extension-manifest.json +1 -1
  581. package/src/resources/extensions/get-secrets-from-user.ts +8 -5
  582. package/src/resources/extensions/google-search/extension-manifest.json +1 -1
  583. package/src/resources/extensions/google-search/index.ts +2 -1
  584. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  585. package/src/resources/extensions/gsd/auto/phases.ts +43 -34
  586. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  587. package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
  588. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -2
  589. package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
  590. package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
  591. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  592. package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
  593. package/src/resources/extensions/gsd/auto-start.ts +35 -26
  594. package/src/resources/extensions/gsd/auto-worktree.ts +193 -9
  595. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
  596. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +85 -8
  597. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
  598. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -35
  599. package/src/resources/extensions/gsd/bootstrap/system-context.ts +72 -12
  600. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
  601. package/src/resources/extensions/gsd/captures.ts +63 -3
  602. package/src/resources/extensions/gsd/codebase-generator.ts +351 -0
  603. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  604. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  605. package/src/resources/extensions/gsd/commands-codebase.ts +164 -0
  606. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +46 -4
  607. package/src/resources/extensions/gsd/complexity-classifier.ts +8 -6
  608. package/src/resources/extensions/gsd/db-writer.ts +140 -7
  609. package/src/resources/extensions/gsd/doctor-git-checks.ts +75 -1
  610. package/src/resources/extensions/gsd/doctor-proactive.ts +35 -1
  611. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  612. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
  613. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  614. package/src/resources/extensions/gsd/doctor.ts +3 -1
  615. package/src/resources/extensions/gsd/error-classifier.ts +13 -11
  616. package/src/resources/extensions/gsd/extension-manifest.json +16 -1
  617. package/src/resources/extensions/gsd/forensics.ts +144 -20
  618. package/src/resources/extensions/gsd/git-service.ts +119 -3
  619. package/src/resources/extensions/gsd/gitignore.ts +33 -0
  620. package/src/resources/extensions/gsd/gsd-db.ts +43 -7
  621. package/src/resources/extensions/gsd/guided-flow.ts +114 -45
  622. package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
  623. package/src/resources/extensions/gsd/health-widget.ts +17 -0
  624. package/src/resources/extensions/gsd/index.ts +1 -0
  625. package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
  626. package/src/resources/extensions/gsd/migrate-external.ts +9 -1
  627. package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
  628. package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
  629. package/src/resources/extensions/gsd/model-router.ts +35 -1
  630. package/src/resources/extensions/gsd/native-git-bridge.ts +41 -0
  631. package/src/resources/extensions/gsd/notifications.ts +16 -0
  632. package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
  633. package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
  634. package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
  635. package/src/resources/extensions/gsd/paths.ts +44 -0
  636. package/src/resources/extensions/gsd/preferences-models.ts +14 -1
  637. package/src/resources/extensions/gsd/preferences-types.ts +10 -1
  638. package/src/resources/extensions/gsd/preferences.ts +13 -15
  639. package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
  640. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  641. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  642. package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  643. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  644. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
  645. package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
  646. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  647. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  648. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  649. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  650. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  651. package/src/resources/extensions/gsd/repo-identity.ts +186 -11
  652. package/src/resources/extensions/gsd/rethink.ts +6 -0
  653. package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
  654. package/src/resources/extensions/gsd/state.ts +84 -32
  655. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +29 -0
  656. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  657. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
  658. package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
  659. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  660. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +488 -0
  661. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
  662. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
  663. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  664. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +4 -4
  665. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
  666. package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
  667. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
  668. package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
  669. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  670. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
  671. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
  672. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  673. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
  674. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  675. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
  676. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  677. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
  678. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
  679. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
  680. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
  681. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
  682. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  683. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
  684. package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
  685. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
  686. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
  687. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +134 -0
  688. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
  689. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  690. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +72 -0
  691. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +68 -0
  692. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  693. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
  694. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  695. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
  696. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
  697. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
  698. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  699. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
  700. package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
  701. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
  702. package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
  703. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
  704. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
  705. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
  706. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
  707. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  708. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +29 -0
  709. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  710. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  711. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
  712. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
  713. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
  714. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
  715. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  716. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
  717. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
  718. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
  719. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
  720. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
  721. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  722. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
  723. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
  724. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
  725. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
  726. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +44 -0
  727. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  728. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
  729. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  730. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
  731. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  732. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +4 -1
  733. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  734. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
  735. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
  736. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
  737. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
  738. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
  739. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
  740. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
  741. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
  742. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
  743. package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
  744. package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
  745. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
  746. package/src/resources/extensions/gsd/tools/validate-milestone.ts +20 -2
  747. package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
  748. package/src/resources/extensions/gsd/types.ts +4 -2
  749. package/src/resources/extensions/gsd/undo.ts +2 -2
  750. package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
  751. package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
  752. package/src/resources/extensions/gsd/watch/header-renderer.ts +275 -0
  753. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  754. package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
  755. package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
  756. package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
  757. package/src/resources/extensions/gsd/workspace-index.ts +30 -0
  758. package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
  759. package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
  760. package/src/resources/extensions/mcp-client/index.ts +13 -7
  761. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
  762. package/src/resources/extensions/ollama/index.ts +130 -0
  763. package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
  764. package/src/resources/extensions/ollama/ollama-client.ts +196 -0
  765. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  766. package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
  767. package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
  768. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
  769. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  770. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
  771. package/src/resources/extensions/ollama/types.ts +130 -0
  772. package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
  773. package/src/resources/extensions/search-the-web/url-utils.ts +19 -0
  774. package/src/resources/extensions/shared/interview-ui.ts +12 -1
  775. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
  776. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
  777. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  778. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  779. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  780. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  781. package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +0 -9
  782. package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
  783. package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
  784. /package/dist/web/standalone/.next/static/{IoheXIe-5DH7ieX8AUo8U → DGvT_c5Vb7Wu3X-fEOVUU}/_buildManifest.js +0 -0
  785. /package/dist/web/standalone/.next/static/{IoheXIe-5DH7ieX8AUo8U → DGvT_c5Vb7Wu3X-fEOVUU}/_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,11 +5,13 @@ 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';
12
13
  import { printHelp, printSubcommandHelp } from './help-text.js';
14
+ import { applySecurityOverrides } from './security-overrides.js';
13
15
  import { parseCliArgs as parseWebCliArgs, runWebCliBranch, migrateLegacyFlatSessions, } from './cli-web-branch.js';
14
16
  import { stopWebMode } from './web-mode.js';
15
17
  import { getProjectSessionsDir } from './project-sessions.js';
@@ -136,6 +138,7 @@ const hasSubcommand = cliFlags.messages.length > 0;
136
138
  if (!process.stdin.isTTY && !isPrintMode && !hasSubcommand && !cliFlags.listModels && !cliFlags.web) {
137
139
  process.stderr.write('[gsd] Error: Interactive mode requires a terminal (TTY).\n');
138
140
  process.stderr.write('[gsd] Non-interactive alternatives:\n');
141
+ process.stderr.write('[gsd] gsd auto Auto-mode (pipeable, no TUI)\n');
139
142
  process.stderr.write('[gsd] gsd --print "your message" Single-shot prompt\n');
140
143
  process.stderr.write('[gsd] gsd --mode rpc JSON-RPC over stdin/stdout\n');
141
144
  process.stderr.write('[gsd] gsd --mode mcp MCP server over stdin/stdout\n');
@@ -248,6 +251,22 @@ if (cliFlags.messages[0] === 'headless') {
248
251
  await runHeadless(parseHeadlessArgs(process.argv));
249
252
  process.exit(0);
250
253
  }
254
+ // `gsd auto [args...]` — shorthand for `gsd headless auto [args...]` (#2732)
255
+ // Without this, `gsd auto` falls through to the interactive TUI which hangs
256
+ // when stdin/stdout are piped (non-TTY environments).
257
+ if (cliFlags.messages[0] === 'auto') {
258
+ await ensureRtkBootstrap();
259
+ const { runHeadless, parseHeadlessArgs } = await import('./headless.js');
260
+ // Rewrite argv so parseHeadlessArgs sees: [node, gsd, headless, auto, ...rest]
261
+ const rewrittenArgv = [
262
+ process.argv[0],
263
+ process.argv[1],
264
+ 'headless',
265
+ ...cliFlags.messages, // ['auto', ...extra args]
266
+ ];
267
+ await runHeadless(parseHeadlessArgs(rewrittenArgv));
268
+ process.exit(0);
269
+ }
251
270
  // Pi's tool bootstrap can mis-detect already-installed fd/rg on some systems
252
271
  // because spawnSync(..., ["--version"]) returns EPERM despite a zero exit code.
253
272
  // Provision local managed binaries first so Pi sees them without probing PATH.
@@ -263,6 +282,7 @@ const modelsJsonPath = resolveModelsJsonPath();
263
282
  const modelRegistry = new ModelRegistry(authStorage, modelsJsonPath);
264
283
  markStartup('ModelRegistry');
265
284
  const settingsManager = SettingsManager.create(agentDir);
285
+ applySecurityOverrides(settingsManager);
266
286
  markStartup('SettingsManager.create');
267
287
  // Run onboarding wizard on first launch (no LLM provider configured)
268
288
  if (!isPrintMode && shouldRunOnboarding(authStorage, settingsManager.getDefaultProvider())) {
@@ -328,38 +348,6 @@ if (cliFlags.listModels !== undefined) {
328
348
  }
329
349
  process.exit(0);
330
350
  }
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
351
  // GSD always uses quiet startup — the gsd extension renders its own branded header
364
352
  if (!settingsManager.getQuietStartup()) {
365
353
  settingsManager.setQuietStartup(true);
@@ -405,6 +393,10 @@ if (isPrintMode) {
405
393
  resourceLoader,
406
394
  });
407
395
  markStartup('createAgentSession');
396
+ // Validate configured model AFTER extensions have registered their models (#2626).
397
+ // Before this, extension-provided models (e.g. claude-code/*) were not yet in the
398
+ // registry, causing the user's valid choice to be silently overwritten.
399
+ validateConfiguredModel(modelRegistry, settingsManager);
408
400
  if (extensionsResult.errors.length > 0) {
409
401
  for (const err of extensionsResult.errors) {
410
402
  // Downgrade conflicts with built-in tools to warnings (#1347)
@@ -488,6 +480,19 @@ if (!cliFlags.worktree && !isPrintMode) {
488
480
  catch { /* non-fatal */ }
489
481
  }
490
482
  // ---------------------------------------------------------------------------
483
+ // Auto-redirect: `gsd auto` with piped stdout → headless mode (#2732)
484
+ // When stdout is not a TTY (e.g. `gsd auto | cat`, `gsd auto > file`),
485
+ // the TUI cannot render and the process hangs. Redirect to headless mode
486
+ // which handles non-interactive output gracefully.
487
+ // ---------------------------------------------------------------------------
488
+ if (cliFlags.messages[0] === 'auto' && !process.stdout.isTTY) {
489
+ await ensureRtkBootstrap();
490
+ const { runHeadless, parseHeadlessArgs } = await import('./headless.js');
491
+ process.stderr.write('[gsd] stdout is not a terminal — running auto-mode in headless mode.\n');
492
+ await runHeadless(parseHeadlessArgs(['node', 'gsd', 'headless', ...cliFlags.messages.slice(1)]));
493
+ process.exit(0);
494
+ }
495
+ // ---------------------------------------------------------------------------
491
496
  // Interactive mode — normal TTY session
492
497
  // ---------------------------------------------------------------------------
493
498
  await ensureRtkBootstrap();
@@ -524,6 +529,10 @@ const { session, extensionsResult } = await createAgentSession({
524
529
  resourceLoader,
525
530
  });
526
531
  markStartup('createAgentSession');
532
+ // Validate configured model AFTER extensions have registered their models (#2626).
533
+ // Before this, extension-provided models (e.g. claude-code/*) were not yet in the
534
+ // registry, causing the user's valid choice to be silently overwritten.
535
+ validateConfiguredModel(modelRegistry, settingsManager);
527
536
  if (extensionsResult.errors.length > 0) {
528
537
  for (const err of extensionsResult.errors) {
529
538
  const isSuperseded = err.error.includes("supersedes");
@@ -572,24 +581,40 @@ if (enabledModelPatterns && enabledModelPatterns.length > 0) {
572
581
  session.setScopedModels(scopedModels);
573
582
  }
574
583
  }
575
- if (!process.stdin.isTTY) {
576
- process.stderr.write('[gsd] Error: Interactive mode requires a terminal (TTY).\n');
584
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
585
+ const missing = !process.stdin.isTTY && !process.stdout.isTTY
586
+ ? 'stdin and stdout are'
587
+ : !process.stdin.isTTY
588
+ ? 'stdin is'
589
+ : 'stdout is';
590
+ process.stderr.write(`[gsd] Error: Interactive mode requires a terminal (TTY) but ${missing} not a TTY.\n`);
577
591
  process.stderr.write('[gsd] Non-interactive alternatives:\n');
592
+ process.stderr.write('[gsd] gsd auto Auto-mode (pipeable, no TUI)\n');
578
593
  process.stderr.write('[gsd] gsd --print "your message" Single-shot prompt\n');
579
594
  process.stderr.write('[gsd] gsd --web [path] Browser-only web mode\n');
580
595
  process.stderr.write('[gsd] gsd --mode rpc JSON-RPC over stdin/stdout\n');
581
596
  process.stderr.write('[gsd] gsd --mode mcp MCP server over stdin/stdout\n');
582
597
  process.stderr.write('[gsd] gsd --mode text "message" Text output mode\n');
598
+ process.stderr.write('[gsd] gsd headless Auto-mode without TUI\n');
583
599
  process.exit(1);
584
600
  }
585
601
  // Welcome screen — shown on every fresh interactive session before TUI takes over.
586
602
  // Skip when the first-run banner was already printed in loader.ts (prevents double banner).
587
603
  if (!process.env.GSD_FIRST_RUN_BANNER) {
588
604
  const { printWelcomeScreen } = await import('./welcome-screen.js');
605
+ let remoteChannel;
606
+ try {
607
+ const { resolveRemoteConfig } = await import('./resources/extensions/remote-questions/config.js');
608
+ const rc = resolveRemoteConfig();
609
+ if (rc)
610
+ remoteChannel = rc.channel;
611
+ }
612
+ catch { /* non-fatal */ }
589
613
  printWelcomeScreen({
590
614
  version: process.env.GSD_VERSION || '0.0.0',
591
615
  modelName: settingsManager.getDefaultModel() || undefined,
592
616
  provider: settingsManager.getDefaultProvider() || undefined,
617
+ remoteChannel,
593
618
  });
594
619
  }
595
620
  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"]