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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (770) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +58 -35
  3. package/dist/headless-ui.d.ts +17 -0
  4. package/dist/headless-ui.js +97 -3
  5. package/dist/headless.js +67 -6
  6. package/dist/help-text.js +1 -0
  7. package/dist/onboarding.js +44 -0
  8. package/dist/resource-loader.js +16 -1
  9. package/dist/resources/agents/researcher.md +1 -1
  10. package/dist/resources/extensions/ask-user-questions.js +16 -3
  11. package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
  12. package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
  13. package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
  14. package/dist/resources/extensions/claude-code-cli/partial-builder.js +14 -6
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +59 -36
  16. package/dist/resources/extensions/context7/extension-manifest.json +1 -1
  17. package/dist/resources/extensions/get-secrets-from-user.js +8 -5
  18. package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
  19. package/dist/resources/extensions/google-search/index.js +2 -1
  20. package/dist/resources/extensions/gsd/auto/phases.js +25 -21
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -20
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -2
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +26 -3
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +16 -4
  26. package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
  27. package/dist/resources/extensions/gsd/auto-recovery.js +13 -5
  28. package/dist/resources/extensions/gsd/auto-start.js +35 -22
  29. package/dist/resources/extensions/gsd/auto-worktree.js +199 -12
  30. package/dist/resources/extensions/gsd/auto.js +4 -0
  31. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -0
  32. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -8
  33. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +42 -34
  35. package/dist/resources/extensions/gsd/bootstrap/system-context.js +66 -12
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -0
  37. package/dist/resources/extensions/gsd/captures.js +56 -4
  38. package/dist/resources/extensions/gsd/codebase-generator.js +279 -0
  39. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  40. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  41. package/dist/resources/extensions/gsd/commands-codebase.js +115 -0
  42. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +41 -4
  43. package/dist/resources/extensions/gsd/complexity-classifier.js +8 -6
  44. package/dist/resources/extensions/gsd/db-writer.js +116 -8
  45. package/dist/resources/extensions/gsd/doctor-git-checks.js +76 -1
  46. package/dist/resources/extensions/gsd/doctor-proactive.js +34 -1
  47. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  48. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -4
  49. package/dist/resources/extensions/gsd/doctor.js +3 -1
  50. package/dist/resources/extensions/gsd/error-classifier.js +12 -10
  51. package/dist/resources/extensions/gsd/extension-manifest.json +16 -1
  52. package/dist/resources/extensions/gsd/forensics.js +123 -20
  53. package/dist/resources/extensions/gsd/git-service.js +105 -2
  54. package/dist/resources/extensions/gsd/gitignore.js +33 -0
  55. package/dist/resources/extensions/gsd/gsd-db.js +36 -9
  56. package/dist/resources/extensions/gsd/guided-flow.js +106 -44
  57. package/dist/resources/extensions/gsd/health-widget-core.js +31 -0
  58. package/dist/resources/extensions/gsd/health-widget.js +17 -0
  59. package/dist/resources/extensions/gsd/index.js +1 -1
  60. package/dist/resources/extensions/gsd/memory-extractor.js +7 -0
  61. package/dist/resources/extensions/gsd/migrate-external.js +8 -1
  62. package/dist/resources/extensions/gsd/milestone-validation-gates.js +45 -0
  63. package/dist/resources/extensions/gsd/model-cost-table.js +18 -0
  64. package/dist/resources/extensions/gsd/model-router.js +35 -1
  65. package/dist/resources/extensions/gsd/native-git-bridge.js +39 -0
  66. package/dist/resources/extensions/gsd/notifications.js +16 -1
  67. package/dist/resources/extensions/gsd/parallel-eligibility.js +13 -2
  68. package/dist/resources/extensions/gsd/parallel-merge.js +78 -5
  69. package/dist/resources/extensions/gsd/parsers-legacy.js +20 -3
  70. package/dist/resources/extensions/gsd/paths.js +45 -0
  71. package/dist/resources/extensions/gsd/preferences-models.js +14 -1
  72. package/dist/resources/extensions/gsd/preferences-types.js +3 -1
  73. package/dist/resources/extensions/gsd/preferences.js +13 -16
  74. package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  77. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
  80. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  84. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  85. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  86. package/dist/resources/extensions/gsd/repo-identity.js +205 -11
  87. package/dist/resources/extensions/gsd/rethink.js +5 -0
  88. package/dist/resources/extensions/gsd/roadmap-slices.js +5 -4
  89. package/dist/resources/extensions/gsd/state.js +85 -27
  90. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  91. package/dist/resources/extensions/gsd/tools/complete-task.js +34 -71
  92. package/dist/resources/extensions/gsd/tools/plan-milestone.js +12 -2
  93. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +29 -1
  94. package/dist/resources/extensions/gsd/tools/validate-milestone.js +14 -3
  95. package/dist/resources/extensions/gsd/triage-resolution.js +22 -7
  96. package/dist/resources/extensions/gsd/undo.js +2 -2
  97. package/dist/resources/extensions/gsd/unit-ownership.js +164 -33
  98. package/dist/resources/extensions/gsd/verdict-parser.js +20 -8
  99. package/dist/resources/extensions/gsd/watch/header-renderer.js +241 -0
  100. package/dist/resources/extensions/gsd/workflow-manifest.js +24 -5
  101. package/dist/resources/extensions/gsd/workflow-projections.js +95 -63
  102. package/dist/resources/extensions/gsd/workflow-reconcile.js +35 -5
  103. package/dist/resources/extensions/gsd/workspace-index.js +24 -0
  104. package/dist/resources/extensions/gsd/worktree-manager.js +105 -1
  105. package/dist/resources/extensions/gsd/worktree-resolver.js +20 -3
  106. package/dist/resources/extensions/mcp-client/index.js +11 -7
  107. package/dist/resources/extensions/ollama/index.js +112 -0
  108. package/dist/resources/extensions/ollama/model-capabilities.js +115 -0
  109. package/dist/resources/extensions/ollama/ollama-client.js +168 -0
  110. package/dist/resources/extensions/ollama/ollama-commands.js +194 -0
  111. package/dist/resources/extensions/ollama/ollama-discovery.js +69 -0
  112. package/dist/resources/extensions/ollama/ollama-tool.js +184 -0
  113. package/dist/resources/extensions/ollama/types.js +2 -0
  114. package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
  115. package/dist/resources/extensions/shared/interview-ui.js +11 -1
  116. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -3
  117. package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  118. package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  119. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  120. package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  121. package/dist/startup-model-validation.d.ts +39 -0
  122. package/dist/startup-model-validation.js +50 -0
  123. package/dist/web/standalone/.next/BUILD_ID +1 -1
  124. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  125. package/dist/web/standalone/.next/build-manifest.json +3 -3
  126. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  127. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  130. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  146. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/index.html +1 -1
  201. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  202. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  204. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  206. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  207. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  209. package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
  210. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  213. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  214. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  215. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +9 -0
  216. package/dist/web/standalone/.next/static/chunks/{webpack-61d3afac6d0f0ce7.js → webpack-a1c1e452c6b32d04.js} +1 -1
  217. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
  218. package/dist/web-mode.js +2 -1
  219. package/dist/welcome-screen.d.ts +1 -0
  220. package/dist/welcome-screen.js +32 -6
  221. package/package.json +2 -2
  222. package/packages/daemon/src/cli.ts +49 -0
  223. package/packages/daemon/src/daemon.test.ts +104 -1
  224. package/packages/daemon/src/daemon.ts +24 -1
  225. package/packages/daemon/src/discord-bot.ts +73 -3
  226. package/packages/daemon/src/event-bridge.ts +15 -9
  227. package/packages/daemon/src/event-formatter.ts +30 -2
  228. package/packages/daemon/src/index.ts +9 -0
  229. package/packages/daemon/src/launchd.test.ts +356 -0
  230. package/packages/daemon/src/launchd.ts +242 -0
  231. package/packages/daemon/src/message-batcher.test.ts +2 -2
  232. package/packages/daemon/src/message-batcher.ts +9 -3
  233. package/packages/daemon/src/orchestrator.test.ts +1 -0
  234. package/packages/daemon/src/orchestrator.ts +106 -2
  235. package/packages/native/dist/ast/index.js +9 -5
  236. package/packages/native/dist/ast/types.js +2 -1
  237. package/packages/native/dist/clipboard/index.js +12 -7
  238. package/packages/native/dist/clipboard/types.js +2 -1
  239. package/packages/native/dist/diff/index.js +12 -7
  240. package/packages/native/dist/diff/types.js +2 -1
  241. package/packages/native/dist/fd/index.js +6 -3
  242. package/packages/native/dist/fd/types.js +2 -1
  243. package/packages/native/dist/glob/index.js +9 -5
  244. package/packages/native/dist/glob/types.js +2 -1
  245. package/packages/native/dist/grep/index.js +9 -5
  246. package/packages/native/dist/grep/types.js +2 -1
  247. package/packages/native/dist/gsd-parser/index.js +18 -11
  248. package/packages/native/dist/gsd-parser/types.js +2 -1
  249. package/packages/native/dist/highlight/index.js +12 -7
  250. package/packages/native/dist/highlight/types.js +2 -1
  251. package/packages/native/dist/html/index.js +6 -3
  252. package/packages/native/dist/html/types.js +2 -1
  253. package/packages/native/dist/image/index.js +10 -5
  254. package/packages/native/dist/image/types.js +7 -4
  255. package/packages/native/dist/index.js +70 -17
  256. package/packages/native/dist/json-parse/index.js +13 -8
  257. package/packages/native/dist/native.js +47 -10
  258. package/packages/native/dist/ps/index.js +15 -9
  259. package/packages/native/dist/ps/types.js +2 -1
  260. package/packages/native/dist/stream-process/index.js +12 -7
  261. package/packages/native/dist/text/index.js +24 -14
  262. package/packages/native/dist/text/types.js +5 -2
  263. package/packages/native/dist/truncate/index.js +12 -7
  264. package/packages/native/dist/ttsr/index.js +12 -7
  265. package/packages/native/dist/ttsr/types.js +2 -1
  266. package/packages/native/dist/xxhash/index.js +9 -5
  267. package/packages/native/package.json +19 -19
  268. package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
  269. package/packages/native/src/native.ts +9 -8
  270. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  271. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  272. package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
  273. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  274. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  275. package/packages/pi-agent-core/src/agent-loop.test.ts +45 -0
  276. package/packages/pi-agent-core/src/agent-loop.ts +3 -2
  277. package/packages/pi-agent-core/src/proxy.ts +1 -1
  278. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  279. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  280. package/packages/pi-ai/dist/index.d.ts +1 -0
  281. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  282. package/packages/pi-ai/dist/index.js +1 -0
  283. package/packages/pi-ai/dist/index.js.map +1 -1
  284. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  285. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -2
  286. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  287. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
  288. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
  289. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
  290. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
  291. package/packages/pi-ai/dist/types.d.ts +3 -3
  292. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  293. package/packages/pi-ai/dist/types.js.map +1 -1
  294. package/packages/pi-ai/dist/utils/json-parse.d.ts +3 -0
  295. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/utils/json-parse.js +24 -1
  297. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  298. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
  299. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
  300. package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
  301. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
  302. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
  303. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
  304. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
  305. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
  306. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  307. package/packages/pi-ai/src/index.ts +1 -0
  308. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
  309. package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
  310. package/packages/pi-ai/src/types.ts +3 -2
  311. package/packages/pi-ai/src/utils/json-parse.ts +28 -1
  312. package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
  313. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
  314. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  315. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
  317. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
  319. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
  321. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
  323. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
  324. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
  325. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
  326. package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/exec.js +3 -1
  328. package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
  330. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
  331. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
  332. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
  333. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
  336. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
  338. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
  339. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
  340. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
  341. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
  342. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
  343. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
  344. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
  345. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
  346. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
  348. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  350. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  352. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
  354. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
  355. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
  356. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
  357. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
  358. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
  359. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
  360. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
  361. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
  362. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/index.js +1 -1
  364. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/lsp/index.js +3 -0
  367. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -0
  370. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/messages.js +31 -2
  373. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
  375. package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
  376. package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
  377. package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
  378. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  380. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
  382. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
  384. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
  386. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
  388. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
  390. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
  392. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
  393. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  394. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +10 -3
  395. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  396. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/tools/read.js +13 -4
  398. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
  400. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
  401. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
  402. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
  403. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  404. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  405. package/packages/pi-coding-agent/dist/index.js +1 -1
  406. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts.map +1 -1
  409. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +9 -8
  410. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  411. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +0 -3
  413. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  414. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -0
  415. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  416. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -1
  417. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
  419. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  420. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  421. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  422. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  423. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  424. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +5 -2
  426. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts +1 -0
  428. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +4 -0
  430. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  431. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  432. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +4 -2
  436. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +2 -2
  438. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  439. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  440. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +8 -1
  441. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  442. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  443. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +2 -0
  444. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  445. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +4 -0
  447. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  449. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +26 -12
  450. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  451. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +4 -4
  452. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +3 -0
  454. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  455. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +46 -14
  456. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  457. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  458. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -8
  459. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -4
  461. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  462. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  463. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  464. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  465. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -3
  466. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  467. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +3 -2
  469. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -1
  472. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  474. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +16 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  476. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
  477. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  478. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +27 -4
  479. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  480. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  481. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +6 -0
  482. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  483. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  484. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  485. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +1 -0
  486. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
  487. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +5 -0
  488. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
  489. package/packages/pi-coding-agent/package.json +1 -1
  490. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
  491. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
  492. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
  493. package/packages/pi-coding-agent/src/core/exec.ts +3 -1
  494. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  495. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  496. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  497. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  498. package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
  499. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  500. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  501. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  502. package/packages/pi-coding-agent/src/core/index.ts +6 -0
  503. package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
  504. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
  505. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  506. package/packages/pi-coding-agent/src/core/messages.ts +29 -2
  507. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  508. package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
  509. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
  510. package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
  511. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
  512. package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
  513. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
  514. package/packages/pi-coding-agent/src/index.ts +6 -0
  515. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +9 -9
  516. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -2
  517. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +3 -1
  518. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +1 -1
  519. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  520. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  521. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +7 -2
  522. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +3 -0
  523. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  524. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +4 -3
  525. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +2 -2
  526. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -1
  527. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -0
  528. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +4 -0
  529. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +27 -13
  530. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +4 -4
  531. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +45 -14
  532. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -7
  533. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +4 -4
  534. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -2
  535. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +8 -3
  536. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +3 -2
  537. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +24 -1
  538. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +14 -1
  539. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +35 -3
  540. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +7 -0
  541. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  542. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
  543. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  544. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  545. package/packages/pi-tui/dist/terminal.js +9 -0
  546. package/packages/pi-tui/dist/terminal.js.map +1 -1
  547. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  548. package/packages/pi-tui/dist/tui.js +9 -0
  549. package/packages/pi-tui/dist/tui.js.map +1 -1
  550. package/packages/pi-tui/src/terminal.ts +14 -0
  551. package/packages/pi-tui/src/tui.ts +8 -0
  552. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  553. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  554. package/pkg/package.json +1 -1
  555. package/scripts/ensure-workspace-builds.cjs +45 -14
  556. package/src/resources/agents/researcher.md +1 -1
  557. package/src/resources/extensions/ask-user-questions.ts +21 -3
  558. package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
  559. package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
  560. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  561. package/src/resources/extensions/claude-code-cli/partial-builder.ts +13 -6
  562. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
  563. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
  564. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
  565. package/src/resources/extensions/context7/extension-manifest.json +1 -1
  566. package/src/resources/extensions/get-secrets-from-user.ts +8 -5
  567. package/src/resources/extensions/google-search/extension-manifest.json +1 -1
  568. package/src/resources/extensions/google-search/index.ts +2 -1
  569. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  570. package/src/resources/extensions/gsd/auto/phases.ts +43 -34
  571. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  572. package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
  573. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -2
  574. package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
  575. package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
  576. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  577. package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
  578. package/src/resources/extensions/gsd/auto-start.ts +35 -26
  579. package/src/resources/extensions/gsd/auto-worktree.ts +193 -9
  580. package/src/resources/extensions/gsd/auto.ts +5 -0
  581. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
  582. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +85 -8
  583. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
  584. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -35
  585. package/src/resources/extensions/gsd/bootstrap/system-context.ts +72 -12
  586. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
  587. package/src/resources/extensions/gsd/captures.ts +63 -3
  588. package/src/resources/extensions/gsd/codebase-generator.ts +351 -0
  589. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  590. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  591. package/src/resources/extensions/gsd/commands-codebase.ts +164 -0
  592. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +46 -4
  593. package/src/resources/extensions/gsd/complexity-classifier.ts +8 -6
  594. package/src/resources/extensions/gsd/db-writer.ts +140 -7
  595. package/src/resources/extensions/gsd/doctor-git-checks.ts +75 -1
  596. package/src/resources/extensions/gsd/doctor-proactive.ts +35 -1
  597. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  598. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
  599. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  600. package/src/resources/extensions/gsd/doctor.ts +3 -1
  601. package/src/resources/extensions/gsd/error-classifier.ts +13 -11
  602. package/src/resources/extensions/gsd/extension-manifest.json +16 -1
  603. package/src/resources/extensions/gsd/forensics.ts +144 -20
  604. package/src/resources/extensions/gsd/git-service.ts +119 -3
  605. package/src/resources/extensions/gsd/gitignore.ts +33 -0
  606. package/src/resources/extensions/gsd/gsd-db.ts +43 -7
  607. package/src/resources/extensions/gsd/guided-flow.ts +114 -45
  608. package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
  609. package/src/resources/extensions/gsd/health-widget.ts +17 -0
  610. package/src/resources/extensions/gsd/index.ts +1 -0
  611. package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
  612. package/src/resources/extensions/gsd/migrate-external.ts +9 -1
  613. package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
  614. package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
  615. package/src/resources/extensions/gsd/model-router.ts +35 -1
  616. package/src/resources/extensions/gsd/native-git-bridge.ts +41 -0
  617. package/src/resources/extensions/gsd/notifications.ts +16 -0
  618. package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
  619. package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
  620. package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
  621. package/src/resources/extensions/gsd/paths.ts +44 -0
  622. package/src/resources/extensions/gsd/preferences-models.ts +14 -1
  623. package/src/resources/extensions/gsd/preferences-types.ts +10 -1
  624. package/src/resources/extensions/gsd/preferences.ts +13 -15
  625. package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
  626. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  627. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  628. package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  629. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  630. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
  631. package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
  632. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  633. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  634. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  635. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  636. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  637. package/src/resources/extensions/gsd/repo-identity.ts +186 -11
  638. package/src/resources/extensions/gsd/rethink.ts +6 -0
  639. package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
  640. package/src/resources/extensions/gsd/state.ts +84 -32
  641. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +47 -0
  642. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  643. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
  644. package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
  645. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  646. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +488 -0
  647. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
  648. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
  649. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  650. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +4 -4
  651. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
  652. package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
  653. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
  654. package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
  655. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  656. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
  657. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
  658. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  659. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
  660. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  661. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
  662. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  663. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
  664. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
  665. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
  666. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
  667. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
  668. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  669. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
  670. package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
  671. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
  672. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
  673. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +134 -0
  674. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
  675. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  676. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +72 -0
  677. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +68 -0
  678. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  679. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
  680. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  681. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
  682. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
  683. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
  684. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  685. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
  686. package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
  687. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
  688. package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
  689. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
  690. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
  691. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
  692. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
  693. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  694. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +29 -0
  695. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  696. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  697. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
  698. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
  699. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
  700. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
  701. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  702. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
  703. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
  704. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
  705. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
  706. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
  707. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  708. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
  709. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
  710. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
  711. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
  712. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +44 -0
  713. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  714. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
  715. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  716. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
  717. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  718. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +4 -1
  719. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  720. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
  721. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
  722. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
  723. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
  724. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
  725. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
  726. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
  727. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
  728. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
  729. package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
  730. package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
  731. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
  732. package/src/resources/extensions/gsd/tools/validate-milestone.ts +20 -2
  733. package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
  734. package/src/resources/extensions/gsd/types.ts +4 -2
  735. package/src/resources/extensions/gsd/undo.ts +2 -2
  736. package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
  737. package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
  738. package/src/resources/extensions/gsd/watch/header-renderer.ts +275 -0
  739. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  740. package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
  741. package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
  742. package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
  743. package/src/resources/extensions/gsd/workspace-index.ts +30 -0
  744. package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
  745. package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
  746. package/src/resources/extensions/mcp-client/index.ts +13 -7
  747. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
  748. package/src/resources/extensions/ollama/index.ts +130 -0
  749. package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
  750. package/src/resources/extensions/ollama/ollama-client.ts +196 -0
  751. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  752. package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
  753. package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
  754. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
  755. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  756. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
  757. package/src/resources/extensions/ollama/types.ts +130 -0
  758. package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
  759. package/src/resources/extensions/shared/interview-ui.ts +12 -1
  760. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
  761. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
  762. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  763. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  764. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  765. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  766. package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +0 -9
  767. package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
  768. package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
  769. /package/dist/web/standalone/.next/static/{OS7_z6QaL6uqp8q5pjHSJ → uDm3eO1oo9lDfY2TyoO9t}/_buildManifest.js +0 -0
  770. /package/dist/web/standalone/.next/static/{OS7_z6QaL6uqp8q5pjHSJ → uDm3eO1oo9lDfY2TyoO9t}/_ssgManifest.js +0 -0
@@ -29,6 +29,7 @@ export class BashExecutionComponent extends Container {
29
29
  private expanded = false;
30
30
  private contentContainer: Container;
31
31
  private ui: TUI;
32
+ private _borderColorKey: "dim" | "bashMode";
32
33
 
33
34
  constructor(command: string, ui: TUI, excludeFromContext = false) {
34
35
  super();
@@ -37,6 +38,7 @@ export class BashExecutionComponent extends Container {
37
38
 
38
39
  // Use dim border for excluded-from-context commands (!! prefix)
39
40
  const colorKey = excludeFromContext ? "dim" : "bashMode";
41
+ this._borderColorKey = colorKey;
40
42
  const borderColor = (str: string) => theme.fg(colorKey, str);
41
43
 
42
44
  // Add spacer
@@ -137,7 +139,7 @@ export class BashExecutionComponent extends Container {
137
139
  this.contentContainer.clear();
138
140
 
139
141
  // Command header
140
- const header = new Text(theme.fg("bashMode", theme.bold(`$ ${this.command}`)), 1, 0);
142
+ const header = new Text(theme.fg(this._borderColorKey, theme.bold(`$ ${this.command}`)), 1, 0);
141
143
  this.contentContainer.addChild(header);
142
144
 
143
145
  // Output
@@ -34,8 +34,8 @@ export class BorderedLoader extends Container {
34
34
  if (this.cancellable) {
35
35
  this.addChild(new Spacer(1));
36
36
  this.addChild(new Text(keyHint("selectCancel", "cancel"), 1, 0));
37
+ this.addChild(new Spacer(1));
37
38
  }
38
- this.addChild(new Spacer(1));
39
39
  this.addChild(new DynamicBorder(borderColor));
40
40
  }
41
41
 
@@ -32,7 +32,7 @@ export class BranchSummaryMessageComponent extends Box {
32
32
  private updateDisplay(): void {
33
33
  this.clear();
34
34
 
35
- const label = theme.fg("customMessageLabel", `\x1b[1m[branch]\x1b[22m`);
35
+ const label = theme.fg("customMessageLabel", theme.bold("[branch]"));
36
36
  this.addChild(new Text(label, 0, 0));
37
37
  this.addChild(new Spacer(1));
38
38
 
@@ -33,7 +33,7 @@ export class CompactionSummaryMessageComponent extends Box {
33
33
  this.clear();
34
34
 
35
35
  const tokenStr = this.message.tokensBefore.toLocaleString();
36
- const label = theme.fg("customMessageLabel", `\x1b[1m[compaction]\x1b[22m`);
36
+ const label = theme.fg("customMessageLabel", theme.bold("[compaction]"));
37
37
  this.addChild(new Text(label, 0, 0));
38
38
  this.addChild(new Spacer(1));
39
39
 
@@ -346,9 +346,14 @@ class ResourceList implements Component, Focusable {
346
346
  }
347
347
  }
348
348
 
349
- // Scroll indicator
349
+ // Scroll indicator — count only selectable items (exclude group/subgroup headers)
350
350
  if (startIndex > 0 || endIndex < this.filteredItems.length) {
351
- lines.push(theme.fg("dim", ` (${this.selectedIndex + 1}/${this.filteredItems.length})`));
351
+ const selectableItems = this.filteredItems.filter((e) => e.type === "item");
352
+ const selectableTotal = selectableItems.length;
353
+ const selectablePosition = selectableItems.findIndex(
354
+ (e) => this.filteredItems.indexOf(e) === this.selectedIndex,
355
+ );
356
+ lines.push(theme.fg("dim", ` (${selectablePosition + 1}/${selectableTotal})`));
352
357
  }
353
358
 
354
359
  return lines;
@@ -7,6 +7,7 @@ import type { TUI } from "@gsd/pi-tui";
7
7
  export class CountdownTimer {
8
8
  private intervalId: ReturnType<typeof setInterval> | undefined;
9
9
  private remainingSeconds: number;
10
+ private _disposed = false;
10
11
 
11
12
  constructor(
12
13
  timeoutMs: number,
@@ -18,6 +19,7 @@ export class CountdownTimer {
18
19
  this.onTick(this.remainingSeconds);
19
20
 
20
21
  this.intervalId = setInterval(() => {
22
+ if (this._disposed) return;
21
23
  this.remainingSeconds--;
22
24
  this.onTick(this.remainingSeconds);
23
25
  this.tui?.requestRender();
@@ -30,6 +32,7 @@ export class CountdownTimer {
30
32
  }
31
33
 
32
34
  dispose(): void {
35
+ this._disposed = true;
33
36
  if (this.intervalId) {
34
37
  clearInterval(this.intervalId);
35
38
  this.intervalId = undefined;
@@ -75,7 +75,7 @@ export class CustomMessageComponent extends Container {
75
75
  this.box.clear();
76
76
 
77
77
  // Default rendering: label + content
78
- const label = theme.fg("customMessageLabel", `\x1b[1m[${this.message.customType}]\x1b[22m`);
78
+ const label = theme.fg("customMessageLabel", theme.bold(`[${this.message.customType}]`));
79
79
  this.box.addChild(new Text(label, 0, 0));
80
80
  this.box.addChild(new Spacer(1));
81
81
 
@@ -4,7 +4,7 @@
4
4
  * A heartfelt tribute to dax (@thdxr) for providing free Kimi K2.5 access via OpenCode.
5
5
  */
6
6
 
7
- import type { Component, TUI } from "@gsd/pi-tui";
7
+ import { type Component, type TUI, visibleWidth } from "@gsd/pi-tui";
8
8
  import { theme } from "../theme/theme.js";
9
9
 
10
10
  // 32x32 RGB image of dax, hex encoded (3 bytes per pixel)
@@ -101,7 +101,7 @@ export class DaxnutsComponent implements Component {
101
101
  const lines: string[] = [];
102
102
 
103
103
  const center = (s: string) => {
104
- const visible = s.replace(/\x1b\[[0-9;]*m/g, "").length;
104
+ const visible = visibleWidth(s);
105
105
  const left = Math.max(0, Math.floor((width - visible) / 2));
106
106
  return " ".repeat(left) + s;
107
107
  };
@@ -145,7 +145,8 @@ export class DaxnutsComponent implements Component {
145
145
  lines.push("");
146
146
  if (textPhase > 2 || this.tick >= this.maxTicks) {
147
147
  lines.push(center(t.fg("dim", "Try OpenCode")));
148
- lines.push(center(t.fg("mdLink", "https://mistral.ai/news/mistral-vibe-2-0")));
148
+ // URL removed — was pointing to an incorrect destination
149
+ lines.push(center(t.fg("mdLink", "opencode.ai")));
149
150
  } else {
150
151
  lines.push("");
151
152
  lines.push("");
@@ -6,7 +6,7 @@ import { theme } from "../theme/theme.js";
6
6
  * Format: "+123 content" or "-123 content" or " 123 content" or " ..."
7
7
  */
8
8
  function parseDiffLine(line: string): { prefix: string; lineNum: string; content: string } | null {
9
- const match = line.match(/^([+-\s])(\s*\d*)\s(.*)$/);
9
+ const match = line.match(/^([+\- ])(\s*\d*)\s(.*)$/);
10
10
  if (!match) return null;
11
11
  return { prefix: match[1], lineNum: match[2], content: match[3] };
12
12
  }
@@ -15,7 +15,7 @@ function parseDiffLine(line: string): { prefix: string; lineNum: string; content
15
15
  * Replace tabs with spaces for consistent rendering.
16
16
  */
17
17
  function replaceTabs(text: string): string {
18
- return text.replace(/\t/g, " ");
18
+ return text.replace(/\t/g, " ");
19
19
  }
20
20
 
21
21
  /**
@@ -11,7 +11,9 @@ import { theme } from "../theme/theme.js";
11
11
  export class DynamicBorder implements Component {
12
12
  private color: (str: string) => string;
13
13
 
14
- constructor(color: (str: string) => string = (str) => theme.fg("border", str)) {
14
+ constructor(color: (str: string) => string = (str) => {
15
+ try { return theme.fg("border", str); } catch { return str; }
16
+ }) {
15
17
  this.color = color;
16
18
  }
17
19
 
@@ -74,6 +74,7 @@ export class ExtensionInputComponent extends Container implements Focusable {
74
74
  handleInput(keyData: string): void {
75
75
  const kb = getEditorKeybindings();
76
76
  if (kb.matches(keyData, "selectConfirm") || keyData === "\n") {
77
+ if (this.input.getValue().trim() === "") return;
77
78
  this.onSubmitCallback(this.input.getValue());
78
79
  } else if (kb.matches(keyData, "selectCancel")) {
79
80
  this.onCancelCallback();
@@ -96,6 +96,10 @@ export class ExtensionSelectorComponent extends Container {
96
96
  if (idx < 0 || idx >= this.options.length) {
97
97
  return Math.max(0, Math.min(from, this.options.length - 1));
98
98
  }
99
+ // If all items are separators, idx may still point to one — fall back to original index
100
+ if (this.isSeparator(idx)) {
101
+ return Math.max(0, Math.min(from, this.options.length - 1));
102
+ }
99
103
  return idx;
100
104
  }
101
105
 
@@ -110,29 +110,36 @@ export class FooterComponent implements Component {
110
110
  pwd = `${pwd} • ${sessionName}`;
111
111
  }
112
112
 
113
- // Build stats line
114
- const statsParts = [];
115
- if (totalInput) statsParts.push(`↑${formatTokens(totalInput)}`);
116
- if (totalOutput) statsParts.push(`↓${formatTokens(totalOutput)}`);
117
- if (totalCacheRead) statsParts.push(`R${formatTokens(totalCacheRead)}`);
118
- if (totalCacheWrite) statsParts.push(`W${formatTokens(totalCacheWrite)}`);
119
-
120
- // Show cost with "(sub)" indicator if using OAuth subscription
113
+ // Build stats line as separate groups joined by a dim middle-dot separator
114
+ const sep = ` ${theme.fg("dim", "\u00B7")} `;
115
+
116
+ // Group 1: token I/O
117
+ const tokenGroup: string[] = [];
118
+ if (totalInput) tokenGroup.push(`↑${formatTokens(totalInput)}`);
119
+ if (totalOutput) tokenGroup.push(`↓${formatTokens(totalOutput)}`);
120
+
121
+ // Group 2: cache metrics
122
+ const cacheGroup: string[] = [];
123
+ if (totalCacheRead) cacheGroup.push(`cr:${formatTokens(totalCacheRead)}`);
124
+ if (totalCacheWrite) cacheGroup.push(`cw:${formatTokens(totalCacheWrite)}`);
125
+
126
+ // Group 3: cost
127
+ const costGroup: string[] = [];
121
128
  const usingSubscription = displayModel ? this.session.modelRegistry.isUsingOAuth(displayModel) : false;
122
129
  if (totalCost || usingSubscription) {
123
130
  const costStr = `$${totalCost.toFixed(3)}${usingSubscription ? " (sub)" : ""}`;
124
- statsParts.push(costStr);
131
+ costGroup.push(costStr);
125
132
  }
126
133
 
127
134
  // Per-prompt cost annotation (opt-in via show_token_cost preference, #1515)
128
135
  if (process.env.GSD_SHOW_TOKEN_COST === "1") {
129
136
  const lastTurnCost = this.session.getLastTurnCost();
130
137
  if (lastTurnCost > 0) {
131
- statsParts.push(`(last: ${formatPromptCost(lastTurnCost)})`);
138
+ costGroup.push(`(last: ${formatPromptCost(lastTurnCost)})`);
132
139
  }
133
140
  }
134
141
 
135
- // Colorize context percentage based on usage
142
+ // Group 4: context percentage (colorized)
136
143
  let contextPercentStr: string;
137
144
  const autoIndicator = this.autoCompactEnabled ? " (auto)" : "";
138
145
  const contextPercentDisplay =
@@ -146,9 +153,16 @@ export class FooterComponent implements Component {
146
153
  } else {
147
154
  contextPercentStr = contextPercentDisplay;
148
155
  }
149
- statsParts.push(contextPercentStr);
150
156
 
151
- let statsLeft = statsParts.join(" ");
157
+ // Assemble groups: items within a group are space-separated,
158
+ // groups are separated by a dim middle-dot
159
+ const groups: string[] = [];
160
+ if (tokenGroup.length > 0) groups.push(tokenGroup.join(" "));
161
+ if (cacheGroup.length > 0) groups.push(cacheGroup.join(" "));
162
+ if (costGroup.length > 0) groups.push(costGroup.join(" "));
163
+ groups.push(contextPercentStr);
164
+
165
+ let statsLeft = groups.join(sep);
152
166
 
153
167
  // Add model name on the right side, plus thinking level if model supports it
154
168
  const modelName = displayModel?.id || "no-model";
@@ -96,14 +96,14 @@ export class OAuthSelectorComponent extends Container {
96
96
 
97
97
  handleInput(keyData: string): void {
98
98
  const kb = getEditorKeybindings();
99
- // Up arrow
99
+ // Up arrow (wrap)
100
100
  if (kb.matches(keyData, "selectUp")) {
101
- this.selectedIndex = Math.max(0, this.selectedIndex - 1);
101
+ this.selectedIndex = this.selectedIndex === 0 ? this.allProviders.length - 1 : this.selectedIndex - 1;
102
102
  this.updateList();
103
103
  }
104
- // Down arrow
104
+ // Down arrow (wrap)
105
105
  else if (kb.matches(keyData, "selectDown")) {
106
- this.selectedIndex = Math.min(this.allProviders.length - 1, this.selectedIndex + 1);
106
+ this.selectedIndex = this.selectedIndex === this.allProviders.length - 1 ? 0 : this.selectedIndex + 1;
107
107
  this.updateList();
108
108
  }
109
109
  // Enter
@@ -43,6 +43,8 @@ export class ProviderManagerComponent extends Container implements Focusable {
43
43
  private modelsJsonWriter: ModelsJsonWriter;
44
44
  private onDone: () => void;
45
45
  private onDiscover: (provider: string) => void;
46
+ private confirmingRemove = false;
47
+ private hintsContainer: Container;
46
48
 
47
49
  constructor(
48
50
  tui: TUI,
@@ -65,12 +67,9 @@ export class ProviderManagerComponent extends Container implements Focusable {
65
67
  this.addChild(new Spacer(1));
66
68
 
67
69
  // Hints
68
- const hints = [
69
- rawKeyHint("d", "discover"),
70
- rawKeyHint("r", "remove"),
71
- rawKeyHint("esc", "close"),
72
- ].join(" ");
73
- this.addChild(new Text(hints, 0, 0));
70
+ this.hintsContainer = new Container();
71
+ this.addChild(this.hintsContainer);
72
+ this.updateHints();
74
73
  this.addChild(new Spacer(1));
75
74
 
76
75
  // List
@@ -116,6 +115,24 @@ export class ProviderManagerComponent extends Container implements Focusable {
116
115
  this.selectedIndex = Math.min(this.selectedIndex, this.providers.length - 1);
117
116
  }
118
117
 
118
+ private updateHints(): void {
119
+ this.hintsContainer.clear();
120
+ if (this.confirmingRemove) {
121
+ const hints = [
122
+ rawKeyHint("r", "confirm removal"),
123
+ rawKeyHint("esc", "cancel"),
124
+ ].join(" ");
125
+ this.hintsContainer.addChild(new Text(hints, 0, 0));
126
+ } else {
127
+ const hints = [
128
+ rawKeyHint("d", "discover"),
129
+ rawKeyHint("r", "remove auth"),
130
+ rawKeyHint("esc", "close"),
131
+ ].join(" ");
132
+ this.hintsContainer.addChild(new Text(hints, 0, 0));
133
+ }
134
+ }
135
+
119
136
  private updateList(): void {
120
137
  this.listContainer.clear();
121
138
 
@@ -156,7 +173,13 @@ export class ProviderManagerComponent extends Container implements Focusable {
156
173
  this.updateList();
157
174
  this.tui.requestRender();
158
175
  } else if (kb.matches(keyData, "selectCancel")) {
159
- this.onDone();
176
+ if (this.confirmingRemove) {
177
+ this.confirmingRemove = false;
178
+ this.updateHints();
179
+ this.tui.requestRender();
180
+ } else {
181
+ this.onDone();
182
+ }
160
183
  } else if (keyData === "d" || keyData === "D") {
161
184
  const provider = this.providers[this.selectedIndex];
162
185
  if (provider?.supportsDiscovery) {
@@ -164,13 +187,21 @@ export class ProviderManagerComponent extends Container implements Focusable {
164
187
  }
165
188
  } else if (keyData === "r" || keyData === "R") {
166
189
  const provider = this.providers[this.selectedIndex];
167
- if (provider) {
168
- this.authStorage.remove(provider.name);
169
- this.modelsJsonWriter.removeProvider(provider.name);
170
- this.modelRegistry.refresh();
171
- this.loadProviders();
172
- this.updateList();
173
- this.tui.requestRender();
190
+ if (provider?.hasAuth) {
191
+ if (this.confirmingRemove) {
192
+ this.confirmingRemove = false;
193
+ this.authStorage.remove(provider.name);
194
+ this.modelsJsonWriter.removeProvider(provider.name);
195
+ this.modelRegistry.refresh();
196
+ this.loadProviders();
197
+ this.updateHints();
198
+ this.updateList();
199
+ this.tui.requestRender();
200
+ } else {
201
+ this.confirmingRemove = true;
202
+ this.updateHints();
203
+ this.tui.requestRender();
204
+ }
174
205
  }
175
206
  }
176
207
  }
@@ -318,14 +318,9 @@ export class ScopedModelsSelectorComponent extends Container implements Focusabl
318
318
  return;
319
319
  }
320
320
 
321
- // Ctrl+C - clear search or cancel if empty
321
+ // Ctrl+C - always cancel immediately
322
322
  if (matchesKey(data, Key.ctrl("c"))) {
323
- if (this.searchInput.getValue()) {
324
- this.searchInput.setValue("");
325
- this.refresh();
326
- } else {
327
- this.callbacks.onCancel();
328
- }
323
+ this.callbacks.onCancel();
329
324
  return;
330
325
  }
331
326
 
@@ -570,13 +570,13 @@ class SessionList implements Component, Focusable {
570
570
  return;
571
571
  }
572
572
 
573
- // Up arrow
573
+ // Up arrow (wrap)
574
574
  if (kb.matches(keyData, "selectUp")) {
575
- this.selectedIndex = Math.max(0, this.selectedIndex - 1);
575
+ this.selectedIndex = this.selectedIndex === 0 ? this.filteredSessions.length - 1 : this.selectedIndex - 1;
576
576
  }
577
- // Down arrow
577
+ // Down arrow (wrap)
578
578
  else if (kb.matches(keyData, "selectDown")) {
579
- this.selectedIndex = Math.min(this.filteredSessions.length - 1, this.selectedIndex + 1);
579
+ this.selectedIndex = this.selectedIndex === this.filteredSessions.length - 1 ? 0 : this.selectedIndex + 1;
580
580
  }
581
581
  // Page up - jump up by maxVisible items
582
582
  else if (kb.matches(keyData, "selectPageUp")) {
@@ -35,7 +35,7 @@ export class SkillInvocationMessageComponent extends Box {
35
35
 
36
36
  if (this.expanded) {
37
37
  // Expanded: label + skill name header + full content
38
- const label = theme.fg("customMessageLabel", `\x1b[1m[skill]\x1b[22m`);
38
+ const label = theme.fg("customMessageLabel", theme.bold("[skill]"));
39
39
  this.addChild(new Text(label, 0, 0));
40
40
  const header = `**${this.skillBlock.name}**\n\n`;
41
41
  this.addChild(
@@ -46,7 +46,7 @@ export class SkillInvocationMessageComponent extends Box {
46
46
  } else {
47
47
  // Collapsed: single line - [skill] name (hint to expand)
48
48
  const line =
49
- theme.fg("customMessageLabel", `\x1b[1m[skill]\x1b[22m `) +
49
+ theme.fg("customMessageLabel", theme.bold("[skill]") + " ") +
50
50
  theme.fg("customMessageText", this.skillBlock.name) +
51
51
  theme.fg("dim", ` (${editorKey("expandTools")} to expand)`);
52
52
  this.addChild(new Text(line, 0, 0));
@@ -32,7 +32,7 @@ const WRITE_PARTIAL_FULL_HIGHLIGHT_LINES = 50;
32
32
  * Replace tabs with spaces for consistent rendering
33
33
  */
34
34
  function replaceTabs(text: string): string {
35
- return text.replace(/\t/g, " ");
35
+ return text.replace(/\t/g, " ");
36
36
  }
37
37
 
38
38
  /**
@@ -915,8 +915,13 @@ export class ToolExecutionComponent extends Container {
915
915
  // Generic tool (shouldn't reach here for custom tools)
916
916
  text = theme.fg("toolTitle", theme.bold(this.toolName));
917
917
 
918
- const content = JSON.stringify(this.args, null, 2);
919
- text += `\n\n${content}`;
918
+ const contentLines = JSON.stringify(this.args, null, 2).split("\n");
919
+ const maxContentLines = 20;
920
+ const truncatedContent = contentLines.slice(0, maxContentLines);
921
+ if (contentLines.length > maxContentLines) {
922
+ truncatedContent.push("...");
923
+ }
924
+ text += `\n\n${truncatedContent.join("\n")}`;
920
925
  const output = this.getTextOutput();
921
926
  if (output) {
922
927
  text += `\n${output}`;
@@ -131,9 +131,10 @@ export class UserMessageSelectorComponent extends Container {
131
131
  this.addChild(new Spacer(1));
132
132
  this.addChild(new DynamicBorder());
133
133
 
134
- // Auto-cancel if no messages
134
+ // Auto-cancel if no messages — invoke synchronously via microtask
135
+ // to avoid the 100ms visual flicker from setTimeout
135
136
  if (messages.length === 0) {
136
- setTimeout(() => onCancel(), 100);
137
+ Promise.resolve().then(() => onCancel());
137
138
  }
138
139
  }
139
140
 
@@ -6,6 +6,9 @@ import { AssistantMessageComponent } from "../components/assistant-message.js";
6
6
  import { ToolExecutionComponent } from "../components/tool-execution.js";
7
7
  import { appKey } from "../components/keybinding-hints.js";
8
8
 
9
+ // Tracks the last processed content index to avoid re-scanning all blocks on every message_update
10
+ let lastProcessedContentIndex = 0;
11
+
9
12
  export async function handleAgentEvent(host: InteractiveModeStateHost & {
10
13
  init: () => Promise<void>;
11
14
  getMarkdownThemeWithSettings: () => any;
@@ -28,6 +31,11 @@ export async function handleAgentEvent(host: InteractiveModeStateHost & {
28
31
 
29
32
  host.footer.invalidate();
30
33
 
34
+ // Reset content index tracker when a new assistant message starts
35
+ if (event.type === "message_start" && event.message.role === "assistant") {
36
+ lastProcessedContentIndex = 0;
37
+ }
38
+
31
39
  switch (event.type) {
32
40
  case "session_state_changed":
33
41
  switch (event.reason) {
@@ -113,7 +121,9 @@ export async function handleAgentEvent(host: InteractiveModeStateHost & {
113
121
  if (host.streamingComponent && event.message.role === "assistant") {
114
122
  host.streamingMessage = event.message;
115
123
  host.streamingComponent.updateContent(host.streamingMessage);
116
- for (const content of host.streamingMessage.content) {
124
+ const contentBlocks = host.streamingMessage.content;
125
+ for (let i = lastProcessedContentIndex; i < contentBlocks.length; i++) {
126
+ const content = contentBlocks[i];
117
127
  if (content.type === "toolCall") {
118
128
  if (!host.pendingTools.has(content.id)) {
119
129
  const component = new ToolExecutionComponent(
@@ -161,6 +171,12 @@ export async function handleAgentEvent(host: InteractiveModeStateHost & {
161
171
  }
162
172
  }
163
173
  }
174
+ // Update index: fully processed blocks won't need re-scanning.
175
+ // Keep the last block's index (it may still be accumulating data),
176
+ // so we re-check it next time but skip all earlier ones.
177
+ if (contentBlocks.length > 0) {
178
+ lastProcessedContentIndex = Math.max(0, contentBlocks.length - 1);
179
+ }
164
180
  host.ui.requestRender();
165
181
  }
166
182
  break;
@@ -337,5 +353,12 @@ export async function handleAgentEvent(host: InteractiveModeStateHost & {
337
353
  host.showError(event.reason);
338
354
  host.ui.requestRender();
339
355
  break;
356
+
357
+ case "image_overflow_recovery":
358
+ host.showStatus(
359
+ `Removed ${event.strippedCount} older image(s) to comply with API limits. Retrying...`,
360
+ );
361
+ host.ui.requestRender();
362
+ break;
340
363
  }
341
364
  }
@@ -46,7 +46,12 @@ export function setupEditorSubmitHandler(host: InteractiveModeStateHost & {
46
46
  if (host.isExtensionCommand(text)) {
47
47
  host.editor.addToHistory?.(text);
48
48
  host.editor.setText("");
49
- await host.session.prompt(text);
49
+ try {
50
+ await host.session.prompt(text);
51
+ } catch (error: unknown) {
52
+ const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
53
+ host.showError(errorMessage);
54
+ }
50
55
  } else {
51
56
  host.queueCompactionMessage(text, "steer");
52
57
  }
@@ -82,5 +87,13 @@ export function setupEditorSubmitHandler(host: InteractiveModeStateHost & {
82
87
  }
83
88
 
84
89
  host.editor.addToHistory?.(text);
90
+ // submitPromptsDirectly is false — still dispatch via session.prompt so user input
91
+ // is not silently discarded.
92
+ try {
93
+ await host.session.prompt(text);
94
+ } catch (error: unknown) {
95
+ const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
96
+ host.showError(errorMessage);
97
+ }
85
98
  };
86
99
  }
@@ -107,6 +107,7 @@ import {
107
107
  getThemeByName,
108
108
  initTheme,
109
109
  onThemeChange,
110
+ stopThemeWatcher,
110
111
  setRegisteredThemes,
111
112
  setTheme,
112
113
  setThemeInstance,
@@ -202,6 +203,9 @@ export class InteractiveMode {
202
203
  // Agent subscription unsubscribe function
203
204
  private unsubscribe?: () => void;
204
205
 
206
+ // Branch change listener unsubscribe function
207
+ private _branchChangeUnsub?: () => void;
208
+
205
209
  // Track if editor is in bash mode (text starts with !)
206
210
  private isBashMode = false;
207
211
 
@@ -511,7 +515,7 @@ export class InteractiveMode {
511
515
  });
512
516
 
513
517
  // Set up git branch watcher (uses provider instead of footer)
514
- this.footerDataProvider.onBranchChange(() => {
518
+ this._branchChangeUnsub = this.footerDataProvider.onBranchChange(() => {
515
519
  this.ui.requestRender();
516
520
  });
517
521
 
@@ -1998,8 +2002,9 @@ export class InteractiveMode {
1998
2002
  }
1999
2003
 
2000
2004
  private subscribeToAgent(): void {
2001
- this.unsubscribe = this.session.subscribe(async (event) => {
2002
- await this.handleEvent(event);
2005
+ let eventQueue: Promise<void> = Promise.resolve();
2006
+ this.unsubscribe = this.session.subscribe((event) => {
2007
+ eventQueue = eventQueue.then(() => this.handleEvent(event)).catch(() => {});
2003
2008
  });
2004
2009
  }
2005
2010
 
@@ -3805,6 +3810,33 @@ export class InteractiveMode {
3805
3810
  this.loadingAnimation = undefined;
3806
3811
  }
3807
3812
  this.clearExtensionTerminalInputListeners();
3813
+
3814
+ // Clean up branch change listener (Fix 1)
3815
+ this._branchChangeUnsub?.();
3816
+ this._branchChangeUnsub = undefined;
3817
+
3818
+ // Clean up theme change listener and watcher (Fix 2)
3819
+ onThemeChange(() => {});
3820
+ stopThemeWatcher();
3821
+
3822
+ // Resolve any pending getUserInput promise so the run() loop can exit (Fix 3)
3823
+ if (this.onInputCallback) {
3824
+ this.onInputCallback("");
3825
+ this.onInputCallback = undefined;
3826
+ }
3827
+
3828
+ // Dispose extension widgets, custom footer, and custom header (Fix 4)
3829
+ this.clearExtensionWidgets();
3830
+ if (this.customFooter?.dispose) {
3831
+ this.customFooter.dispose();
3832
+ }
3833
+ this.customFooter = undefined;
3834
+ if (this.customHeader?.dispose) {
3835
+ this.customHeader.dispose();
3836
+ }
3837
+ this.customHeader = undefined;
3838
+ this.autocompleteProvider = undefined;
3839
+
3808
3840
  this.footer.dispose();
3809
3841
  this.footerDataProvider.dispose();
3810
3842
  if (this.unsubscribe) {
@@ -236,6 +236,13 @@ export async function dispatchSlashCommand(
236
236
  return true;
237
237
  }
238
238
 
239
+ // If input starts with "/" but no command matched, show unknown command feedback
240
+ if (text.startsWith("/")) {
241
+ const command = text.split(/\s/)[0];
242
+ ctx.showError(`Unknown command: ${command}. Type /help for available commands.`);
243
+ return true;
244
+ }
245
+
239
246
  return false;
240
247
  }
241
248
 
@@ -23,7 +23,7 @@ const dark: ThemeJson = {
23
23
  blue: "#5f87ff",
24
24
  green: "#b5bd68",
25
25
  red: "#cc6666",
26
- yellow: "#ffff00",
26
+ yellow: "#e6b800",
27
27
  gray: "#808080",
28
28
  dimGray: "#666666",
29
29
  darkGray: "#505050",