gsd-pi 2.58.0 → 2.59.0-dev.3de3832

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 (841) 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 +15 -15
  127. package/dist/web/standalone/.next/build-manifest.json +4 -4
  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/required-server-files.json +4 -4
  131. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  132. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  134. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  142. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  151. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  198. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  204. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  218. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  220. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  222. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  224. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/index.html +1 -1
  234. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  235. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  236. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  237. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  238. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  239. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  240. package/dist/web/standalone/.next/server/app/page.js +2 -2
  241. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  243. package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
  244. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  245. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  246. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/middleware.js +2 -2
  248. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  250. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  251. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  252. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  253. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +9 -0
  254. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  255. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  256. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/{webpack-61d3afac6d0f0ce7.js → webpack-a1c1e452c6b32d04.js} +1 -1
  260. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
  261. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  262. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  263. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  264. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  265. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  266. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  267. package/dist/web/standalone/server.js +1 -1
  268. package/dist/web-mode.js +2 -1
  269. package/dist/welcome-screen.d.ts +1 -0
  270. package/dist/welcome-screen.js +32 -6
  271. package/package.json +2 -2
  272. package/packages/daemon/src/daemon.ts +1 -1
  273. package/packages/daemon/src/discord-bot.ts +11 -0
  274. package/packages/daemon/src/event-bridge.ts +15 -9
  275. package/packages/daemon/src/event-formatter.ts +30 -2
  276. package/packages/daemon/src/message-batcher.test.ts +2 -2
  277. package/packages/daemon/src/message-batcher.ts +9 -3
  278. package/packages/daemon/src/orchestrator.test.ts +1 -0
  279. package/packages/daemon/src/orchestrator.ts +106 -2
  280. package/packages/native/dist/ast/index.js +9 -5
  281. package/packages/native/dist/ast/types.js +2 -1
  282. package/packages/native/dist/clipboard/index.js +12 -7
  283. package/packages/native/dist/clipboard/types.js +2 -1
  284. package/packages/native/dist/diff/index.js +12 -7
  285. package/packages/native/dist/diff/types.js +2 -1
  286. package/packages/native/dist/fd/index.js +6 -3
  287. package/packages/native/dist/fd/types.js +2 -1
  288. package/packages/native/dist/glob/index.js +9 -5
  289. package/packages/native/dist/glob/types.js +2 -1
  290. package/packages/native/dist/grep/index.js +9 -5
  291. package/packages/native/dist/grep/types.js +2 -1
  292. package/packages/native/dist/gsd-parser/index.js +18 -11
  293. package/packages/native/dist/gsd-parser/types.js +2 -1
  294. package/packages/native/dist/highlight/index.js +12 -7
  295. package/packages/native/dist/highlight/types.js +2 -1
  296. package/packages/native/dist/html/index.js +6 -3
  297. package/packages/native/dist/html/types.js +2 -1
  298. package/packages/native/dist/image/index.js +10 -5
  299. package/packages/native/dist/image/types.js +7 -4
  300. package/packages/native/dist/index.js +70 -17
  301. package/packages/native/dist/json-parse/index.js +13 -8
  302. package/packages/native/dist/native.js +47 -10
  303. package/packages/native/dist/ps/index.js +15 -9
  304. package/packages/native/dist/ps/types.js +2 -1
  305. package/packages/native/dist/stream-process/index.js +12 -7
  306. package/packages/native/dist/text/index.js +24 -14
  307. package/packages/native/dist/text/types.js +5 -2
  308. package/packages/native/dist/truncate/index.js +12 -7
  309. package/packages/native/dist/ttsr/index.js +12 -7
  310. package/packages/native/dist/ttsr/types.js +2 -1
  311. package/packages/native/dist/xxhash/index.js +9 -5
  312. package/packages/native/package.json +19 -19
  313. package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
  314. package/packages/native/src/native.ts +9 -8
  315. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  316. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  317. package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
  318. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  319. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  320. package/packages/pi-agent-core/src/agent-loop.test.ts +45 -0
  321. package/packages/pi-agent-core/src/agent-loop.ts +3 -2
  322. package/packages/pi-agent-core/src/proxy.ts +1 -1
  323. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  324. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  325. package/packages/pi-ai/dist/index.d.ts +1 -0
  326. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  327. package/packages/pi-ai/dist/index.js +1 -0
  328. package/packages/pi-ai/dist/index.js.map +1 -1
  329. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  330. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -2
  331. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  332. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
  333. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
  334. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
  335. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
  336. package/packages/pi-ai/dist/types.d.ts +3 -3
  337. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  338. package/packages/pi-ai/dist/types.js.map +1 -1
  339. package/packages/pi-ai/dist/utils/json-parse.d.ts +3 -0
  340. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  341. package/packages/pi-ai/dist/utils/json-parse.js +24 -1
  342. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  343. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
  344. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
  345. package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
  346. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
  347. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
  348. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
  350. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
  351. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  352. package/packages/pi-ai/src/index.ts +1 -0
  353. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
  354. package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
  355. package/packages/pi-ai/src/types.ts +3 -2
  356. package/packages/pi-ai/src/utils/json-parse.ts +28 -1
  357. package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
  358. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
  359. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  360. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
  362. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
  364. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
  366. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
  368. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
  369. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
  370. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
  371. package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/exec.js +3 -1
  373. package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
  375. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
  376. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
  377. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
  378. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
  379. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
  380. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
  381. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
  382. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
  383. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
  384. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
  385. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
  386. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
  387. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
  388. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
  389. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
  390. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
  391. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  392. package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
  393. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  395. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  396. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  397. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  398. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
  399. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
  400. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
  401. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
  402. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
  403. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
  404. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
  405. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
  406. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
  407. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/core/index.js +1 -1
  409. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  411. package/packages/pi-coding-agent/dist/core/lsp/index.js +3 -0
  412. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  414. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -0
  415. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  416. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  417. package/packages/pi-coding-agent/dist/core/messages.js +31 -2
  418. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  419. package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
  420. package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
  421. package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
  422. package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
  423. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  424. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  425. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  426. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts +8 -0
  427. package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
  428. package/packages/pi-coding-agent/dist/core/resolve-config-value.js +23 -2
  429. package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
  430. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +89 -2
  431. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  432. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
  433. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  434. package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
  435. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  436. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
  437. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  438. package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
  439. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  440. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
  441. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
  442. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
  443. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
  444. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.d.ts +2 -0
  445. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.d.ts.map +1 -0
  446. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.js +83 -0
  447. package/packages/pi-coding-agent/dist/core/settings-manager-security.test.js.map +1 -0
  448. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +14 -0
  449. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  450. package/packages/pi-coding-agent/dist/core/settings-manager.js +36 -3
  451. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  452. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  453. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +10 -3
  454. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  455. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  456. package/packages/pi-coding-agent/dist/core/tools/read.js +13 -4
  457. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  458. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
  459. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
  460. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
  461. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
  462. package/packages/pi-coding-agent/dist/index.d.ts +3 -2
  463. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  464. package/packages/pi-coding-agent/dist/index.js +2 -1
  465. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  466. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts +1 -1
  467. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +9 -8
  469. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +0 -3
  472. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -0
  474. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -1
  476. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  477. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
  478. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  479. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  480. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  481. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  482. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  483. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  484. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +5 -2
  485. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  486. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts +1 -0
  487. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  488. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +4 -0
  489. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  490. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  491. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  492. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  493. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  494. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +4 -2
  495. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  496. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +2 -2
  497. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  498. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  499. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +8 -1
  500. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  501. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  502. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +2 -0
  503. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  504. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  505. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +4 -0
  506. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  507. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  508. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +26 -12
  509. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  510. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +4 -4
  511. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  512. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +3 -0
  513. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  514. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +46 -14
  515. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  516. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  517. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -8
  518. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -4
  520. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  521. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  522. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  523. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  524. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -3
  525. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  526. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  527. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +3 -2
  528. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  529. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  530. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -1
  531. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  532. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +1 -0
  533. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  534. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +22 -1
  535. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  536. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts +2 -0
  537. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts.map +1 -0
  538. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +122 -0
  539. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -0
  540. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  541. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  542. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +57 -4
  543. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  544. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +1 -1
  545. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  546. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  547. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  548. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +1 -0
  549. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
  550. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +5 -0
  551. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
  552. package/packages/pi-coding-agent/package.json +1 -1
  553. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
  554. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
  555. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
  556. package/packages/pi-coding-agent/src/core/exec.ts +3 -1
  557. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  558. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  559. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  560. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  561. package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
  562. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  563. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  564. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  565. package/packages/pi-coding-agent/src/core/index.ts +6 -0
  566. package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
  567. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
  568. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  569. package/packages/pi-coding-agent/src/core/messages.ts +29 -2
  570. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  571. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +111 -1
  572. package/packages/pi-coding-agent/src/core/resolve-config-value.ts +26 -2
  573. package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
  574. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
  575. package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
  576. package/packages/pi-coding-agent/src/core/settings-manager-security.test.ts +102 -0
  577. package/packages/pi-coding-agent/src/core/settings-manager.ts +44 -3
  578. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
  579. package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
  580. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
  581. package/packages/pi-coding-agent/src/index.ts +11 -0
  582. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +9 -9
  583. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -2
  584. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +3 -1
  585. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +1 -1
  586. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  587. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  588. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +7 -2
  589. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +3 -0
  590. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  591. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +4 -3
  592. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +2 -2
  593. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -1
  594. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -0
  595. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +4 -0
  596. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +27 -13
  597. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +4 -4
  598. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +45 -14
  599. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -7
  600. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +4 -4
  601. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -2
  602. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +8 -3
  603. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +3 -2
  604. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +24 -1
  605. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +156 -0
  606. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +21 -1
  607. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +73 -3
  608. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +1 -1
  609. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  610. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
  611. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  612. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  613. package/packages/pi-tui/dist/terminal.js +9 -0
  614. package/packages/pi-tui/dist/terminal.js.map +1 -1
  615. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  616. package/packages/pi-tui/dist/tui.js +9 -0
  617. package/packages/pi-tui/dist/tui.js.map +1 -1
  618. package/packages/pi-tui/src/terminal.ts +14 -0
  619. package/packages/pi-tui/src/tui.ts +8 -0
  620. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  621. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  622. package/pkg/package.json +1 -1
  623. package/scripts/ensure-workspace-builds.cjs +45 -14
  624. package/src/resources/agents/researcher.md +1 -1
  625. package/src/resources/extensions/ask-user-questions.ts +21 -3
  626. package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
  627. package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
  628. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  629. package/src/resources/extensions/claude-code-cli/partial-builder.ts +13 -6
  630. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
  631. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
  632. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
  633. package/src/resources/extensions/context7/extension-manifest.json +1 -1
  634. package/src/resources/extensions/get-secrets-from-user.ts +8 -5
  635. package/src/resources/extensions/google-search/extension-manifest.json +1 -1
  636. package/src/resources/extensions/google-search/index.ts +2 -1
  637. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  638. package/src/resources/extensions/gsd/auto/phases.ts +43 -34
  639. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  640. package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
  641. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -2
  642. package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
  643. package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
  644. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  645. package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
  646. package/src/resources/extensions/gsd/auto-start.ts +35 -26
  647. package/src/resources/extensions/gsd/auto-worktree.ts +193 -9
  648. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
  649. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +85 -8
  650. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
  651. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -35
  652. package/src/resources/extensions/gsd/bootstrap/system-context.ts +72 -12
  653. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
  654. package/src/resources/extensions/gsd/captures.ts +63 -3
  655. package/src/resources/extensions/gsd/codebase-generator.ts +351 -0
  656. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  657. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  658. package/src/resources/extensions/gsd/commands-codebase.ts +164 -0
  659. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +46 -4
  660. package/src/resources/extensions/gsd/complexity-classifier.ts +8 -6
  661. package/src/resources/extensions/gsd/db-writer.ts +140 -7
  662. package/src/resources/extensions/gsd/doctor-git-checks.ts +75 -1
  663. package/src/resources/extensions/gsd/doctor-proactive.ts +35 -1
  664. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  665. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
  666. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  667. package/src/resources/extensions/gsd/doctor.ts +3 -1
  668. package/src/resources/extensions/gsd/error-classifier.ts +13 -11
  669. package/src/resources/extensions/gsd/extension-manifest.json +16 -1
  670. package/src/resources/extensions/gsd/forensics.ts +144 -20
  671. package/src/resources/extensions/gsd/git-service.ts +119 -3
  672. package/src/resources/extensions/gsd/gitignore.ts +33 -0
  673. package/src/resources/extensions/gsd/gsd-db.ts +43 -7
  674. package/src/resources/extensions/gsd/guided-flow.ts +114 -45
  675. package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
  676. package/src/resources/extensions/gsd/health-widget.ts +17 -0
  677. package/src/resources/extensions/gsd/index.ts +1 -0
  678. package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
  679. package/src/resources/extensions/gsd/migrate-external.ts +9 -1
  680. package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
  681. package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
  682. package/src/resources/extensions/gsd/model-router.ts +35 -1
  683. package/src/resources/extensions/gsd/native-git-bridge.ts +41 -0
  684. package/src/resources/extensions/gsd/notifications.ts +16 -0
  685. package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
  686. package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
  687. package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
  688. package/src/resources/extensions/gsd/paths.ts +44 -0
  689. package/src/resources/extensions/gsd/preferences-models.ts +14 -1
  690. package/src/resources/extensions/gsd/preferences-types.ts +10 -1
  691. package/src/resources/extensions/gsd/preferences.ts +13 -15
  692. package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
  693. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  694. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  695. package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  696. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  697. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
  698. package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
  699. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  700. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  701. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  702. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  703. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  704. package/src/resources/extensions/gsd/repo-identity.ts +186 -11
  705. package/src/resources/extensions/gsd/rethink.ts +6 -0
  706. package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
  707. package/src/resources/extensions/gsd/state.ts +84 -32
  708. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +29 -0
  709. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  710. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
  711. package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
  712. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  713. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +488 -0
  714. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
  715. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
  716. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  717. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +4 -4
  718. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
  719. package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
  720. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
  721. package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
  722. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  723. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
  724. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
  725. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  726. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
  727. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  728. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
  729. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  730. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
  731. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
  732. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
  733. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
  734. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
  735. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  736. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
  737. package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
  738. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
  739. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
  740. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +134 -0
  741. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
  742. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  743. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +72 -0
  744. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +68 -0
  745. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  746. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
  747. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  748. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
  749. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
  750. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
  751. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  752. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
  753. package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
  754. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
  755. package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
  756. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
  757. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
  758. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
  759. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
  760. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  761. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +29 -0
  762. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  763. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  764. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
  765. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
  766. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
  767. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
  768. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  769. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
  770. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
  771. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
  772. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
  773. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
  774. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  775. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
  776. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
  777. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
  778. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
  779. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +44 -0
  780. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  781. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
  782. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  783. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
  784. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  785. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +4 -1
  786. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  787. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
  788. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
  789. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
  790. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
  791. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
  792. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
  793. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
  794. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
  795. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
  796. package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
  797. package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
  798. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
  799. package/src/resources/extensions/gsd/tools/validate-milestone.ts +20 -2
  800. package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
  801. package/src/resources/extensions/gsd/types.ts +4 -2
  802. package/src/resources/extensions/gsd/undo.ts +2 -2
  803. package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
  804. package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
  805. package/src/resources/extensions/gsd/watch/header-renderer.ts +275 -0
  806. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  807. package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
  808. package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
  809. package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
  810. package/src/resources/extensions/gsd/workspace-index.ts +30 -0
  811. package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
  812. package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
  813. package/src/resources/extensions/mcp-client/index.ts +13 -7
  814. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
  815. package/src/resources/extensions/ollama/index.ts +130 -0
  816. package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
  817. package/src/resources/extensions/ollama/ollama-client.ts +196 -0
  818. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  819. package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
  820. package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
  821. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
  822. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  823. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
  824. package/src/resources/extensions/ollama/types.ts +130 -0
  825. package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
  826. package/src/resources/extensions/search-the-web/url-utils.ts +19 -0
  827. package/src/resources/extensions/shared/interview-ui.ts +12 -1
  828. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
  829. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
  830. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  831. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  832. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  833. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  834. package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +0 -9
  835. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  836. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  837. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  838. package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
  839. package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
  840. /package/dist/web/standalone/.next/static/{IoheXIe-5DH7ieX8AUo8U → Y_HG7cJVptjBpkVSQQiFi}/_buildManifest.js +0 -0
  841. /package/dist/web/standalone/.next/static/{IoheXIe-5DH7ieX8AUo8U → Y_HG7cJVptjBpkVSQQiFi}/_ssgManifest.js +0 -0
@@ -8,14 +8,14 @@
8
8
  * paths, commit type inference, and the runGit shell helper.
9
9
  */
10
10
  import { execFileSync, execSync } from "node:child_process";
11
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
11
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
12
12
  import { join } from "node:path";
13
13
  import { gsdRoot } from "./paths.js";
14
14
  import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
15
15
  import { loadEffectiveGSDPreferences } from "./preferences.js";
16
16
  import { detectWorktreeName, } from "./worktree.js";
17
17
  import { SLICE_BRANCH_RE, QUICK_BRANCH_RE, WORKFLOW_BRANCH_RE } from "./branch-patterns.js";
18
- import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeBranchExists, nativeHasChanges, nativeAddAllWithExclusions, nativeHasStagedChanges, nativeCommit, nativeRmCached, nativeUpdateRef, } from "./native-git-bridge.js";
18
+ import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeBranchExists, nativeHasChanges, nativeAddAllWithExclusions, nativeHasStagedChanges, nativeCommit, nativeRmCached, nativeUpdateRef, nativeResetSoft, nativeCommitSubject, } from "./native-git-bridge.js";
19
19
  import { GSDError, GSD_MERGE_CONFLICT, GSD_GIT_ERROR } from "./errors.js";
20
20
  import { getErrorMessage } from "./error-utils.js";
21
21
  export const VALID_BRANCH_NAME = /^[a-zA-Z0-9_\-\/.]+$/;
@@ -348,6 +348,28 @@ export class GitServiceImpl {
348
348
  // If .gsd/ IS in .gitignore (the default for external state projects),
349
349
  // git add -A already skips it and the exclusions are harmless no-ops.
350
350
  const allExclusions = [...RUNTIME_EXCLUSION_PATHS, ...extraExclusions];
351
+ // ── Parallel worker milestone scope (#1991) ──
352
+ // When GSD_MILESTONE_LOCK is set, this process is a parallel worker that
353
+ // must only commit files belonging to its own milestone. Exclude all other
354
+ // milestone directories from staging to prevent cross-milestone pollution
355
+ // (e.g., an M033 worker fabricating M032 artifacts in the same commit).
356
+ const milestoneLock = process.env.GSD_MILESTONE_LOCK;
357
+ if (milestoneLock) {
358
+ const msDir = join(gsdRoot(this.basePath), "milestones");
359
+ if (existsSync(msDir)) {
360
+ try {
361
+ const entries = readdirSync(msDir, { withFileTypes: true });
362
+ for (const entry of entries) {
363
+ if (entry.isDirectory() && entry.name !== milestoneLock) {
364
+ allExclusions.push(`.gsd/milestones/${entry.name}/`);
365
+ }
366
+ }
367
+ }
368
+ catch {
369
+ // Best-effort — if we can't read the milestones dir, proceed without scoping
370
+ }
371
+ }
372
+ }
351
373
  nativeAddAllWithExclusions(this.basePath, allExclusions);
352
374
  }
353
375
  /** Tracks whether runtime file cleanup has run this session. */
@@ -390,8 +412,89 @@ export class GitServiceImpl {
390
412
  ? buildTaskCommitMessage(taskContext)
391
413
  : `chore: auto-commit after ${unitType}\n\nGSD-Unit: ${unitId}`;
392
414
  nativeCommit(this.basePath, message, { allowEmpty: false });
415
+ // Absorb any preceding gsd snapshot commits into this real commit.
416
+ // Walk backwards from HEAD~1 counting consecutive snapshot subjects,
417
+ // then soft-reset to before them and re-commit with the same message.
418
+ this.absorbSnapshotCommits(message);
393
419
  return message;
394
420
  }
421
+ /**
422
+ * Squash consecutive `gsd snapshot:` commits that sit immediately below
423
+ * HEAD into the current HEAD commit. This keeps the git history clean
424
+ * after automated snapshot commits are superseded by real work.
425
+ *
426
+ * Guards:
427
+ * - Opt-in via `absorb_snapshot_commits` preference (default: true).
428
+ * - Refuses to rewrite commits that have been pushed to the remote
429
+ * tracking branch (checks merge-base ancestry).
430
+ * - Saves HEAD SHA before reset; restores it if the re-commit fails.
431
+ *
432
+ * Does nothing if there are no snapshot commits to absorb.
433
+ */
434
+ absorbSnapshotCommits(headMessage) {
435
+ try {
436
+ // Opt-in guard — users can disable to keep snapshot commits for forensics
437
+ if (this.prefs.absorb_snapshot_commits === false)
438
+ return;
439
+ const GSD_SNAPSHOT_PREFIX = "gsd snapshot:";
440
+ let count = 0;
441
+ // Walk back from HEAD~1 counting consecutive snapshot commits (cap at 10)
442
+ for (let i = 1; i <= 10; i++) {
443
+ const subject = nativeCommitSubject(this.basePath, `HEAD~${i}`);
444
+ if (!subject.startsWith(GSD_SNAPSHOT_PREFIX))
445
+ break;
446
+ count = i;
447
+ }
448
+ if (count === 0)
449
+ return;
450
+ // Guard: don't rewrite history that has been pushed to the remote.
451
+ // Check whether the newest snapshot commit (HEAD~1) is already
452
+ // reachable from the remote tracking branch. If it is, the snapshots
453
+ // have been pushed and must not be squashed via local history rewrite.
454
+ // (Checking resetTarget instead would false-positive when the remote
455
+ // is at the pre-snapshot base but the snapshots themselves are local.)
456
+ const resetTarget = `HEAD~${count + 1}`;
457
+ try {
458
+ const branch = nativeGetCurrentBranch(this.basePath);
459
+ if (branch) {
460
+ const remoteBranch = `origin/${branch}`;
461
+ // merge-base --is-ancestor exits 0 if HEAD~1 is ancestor of remote
462
+ execFileSync("git", ["merge-base", "--is-ancestor", "HEAD~1", remoteBranch], {
463
+ cwd: this.basePath,
464
+ stdio: ["ignore", "pipe", "pipe"],
465
+ });
466
+ // If we get here, newest snapshot IS reachable from remote — already pushed
467
+ return;
468
+ }
469
+ }
470
+ catch {
471
+ // Not an ancestor or remote doesn't exist — safe to proceed
472
+ }
473
+ // Save HEAD SHA so we can restore if the re-commit fails
474
+ const savedHead = execFileSync("git", ["rev-parse", "HEAD"], {
475
+ cwd: this.basePath,
476
+ stdio: ["ignore", "pipe", "pipe"],
477
+ encoding: "utf-8",
478
+ }).trim();
479
+ nativeResetSoft(this.basePath, resetTarget);
480
+ // Re-run smartStage so the same RUNTIME_EXCLUSION_PATHS apply.
481
+ // Snapshot commits used nativeAddTracked (git add -u) which stages
482
+ // ALL tracked modifications including .gsd/ state files. Without
483
+ // re-staging, those .gsd/ changes leak into the absorbed commit.
484
+ this.smartStage();
485
+ try {
486
+ nativeCommit(this.basePath, headMessage, { allowEmpty: false });
487
+ }
488
+ catch {
489
+ // Re-commit failed — restore original HEAD to avoid leaving the
490
+ // repo in a partially-reset state with no commit
491
+ nativeResetSoft(this.basePath, savedHead);
492
+ }
493
+ }
494
+ catch {
495
+ // Non-fatal — if squash fails, the commits remain unsquashed
496
+ }
497
+ }
395
498
  // ─── Branch Queries ────────────────────────────────────────────────────
396
499
  /**
397
500
  * Get the integration branch for this repo — the branch that slice
@@ -38,6 +38,7 @@ const GSD_RUNTIME_PATTERNS = [
38
38
  const BASELINE_PATTERNS = [
39
39
  // ── GSD state directory (symlink to external storage) ──
40
40
  ".gsd",
41
+ ".gsd-id",
41
42
  // ── OS junk ──
42
43
  ".DS_Store",
43
44
  "Thumbs.db",
@@ -72,6 +73,38 @@ const BASELINE_PATTERNS = [
72
73
  ".cache/",
73
74
  "tmp/",
74
75
  ];
76
+ /**
77
+ * Check whether `.gsd` is covered by the project's `.gitignore`.
78
+ *
79
+ * Uses `git check-ignore` for accurate evaluation — this respects nested
80
+ * .gitignore files, global gitignore, and negation patterns. Returns true
81
+ * only when git would actually ignore `.gsd/`.
82
+ *
83
+ * Returns false (not ignored) if:
84
+ * - No `.gitignore` exists
85
+ * - `.gsd` is not listed in any active ignore rule
86
+ * - Not a git repo or git is unavailable
87
+ */
88
+ export function isGsdGitignored(basePath) {
89
+ // Check both `.gsd` and `.gsd/` because `.gsd/` in .gitignore (trailing
90
+ // slash = directory-only pattern) only matches the directory form. Using
91
+ // both paths covers all gitignore pattern variants.
92
+ for (const path of [".gsd", ".gsd/"]) {
93
+ try {
94
+ // git check-ignore exits 0 when the path IS ignored, 1 when it is NOT.
95
+ execFileSync("git", ["check-ignore", "-q", path], {
96
+ cwd: basePath,
97
+ stdio: "pipe",
98
+ env: GIT_NO_PROMPT_ENV,
99
+ });
100
+ return true; // exit 0 → .gsd is ignored
101
+ }
102
+ catch {
103
+ // exit 1 → this form is NOT ignored, try the other
104
+ }
105
+ }
106
+ return false; // neither form is ignored (or git unavailable)
107
+ }
75
108
  /**
76
109
  * Check whether `.gsd/` contains files tracked by git.
77
110
  * If so, the project intentionally keeps `.gsd/` in version control
@@ -8,6 +8,7 @@ import { createRequire } from "node:module";
8
8
  import { existsSync, copyFileSync, mkdirSync, realpathSync } from "node:fs";
9
9
  import { dirname } from "node:path";
10
10
  import { GSDError, GSD_STALE_STATE } from "./errors.js";
11
+ import { logError } from "./workflow-logger.js";
11
12
  const _require = createRequire(import.meta.url);
12
13
  let providerName = null;
13
14
  let providerModule = null;
@@ -697,11 +698,29 @@ export function openDatabase(path) {
697
698
  initSchema(adapter, fileBacked);
698
699
  }
699
700
  catch (err) {
700
- try {
701
- adapter.close();
701
+ // Corrupt freelist: DDL fails with "malformed" but VACUUM can rebuild.
702
+ // Attempt VACUUM recovery before giving up (see #2519).
703
+ if (fileBacked && err instanceof Error && err.message?.includes("malformed")) {
704
+ try {
705
+ adapter.exec("VACUUM");
706
+ initSchema(adapter, fileBacked);
707
+ process.stderr.write("gsd-db: recovered corrupt database via VACUUM\n");
708
+ }
709
+ catch (retryErr) {
710
+ try {
711
+ adapter.close();
712
+ }
713
+ catch { /* swallow */ }
714
+ throw retryErr;
715
+ }
716
+ }
717
+ else {
718
+ try {
719
+ adapter.close();
720
+ }
721
+ catch { /* swallow */ }
722
+ throw err;
702
723
  }
703
- catch { /* swallow */ }
704
- throw err;
705
724
  }
706
725
  currentDb = adapter;
707
726
  currentPath = path;
@@ -990,10 +1009,11 @@ export function insertMilestone(m) {
990
1009
  ":boundary_map_markdown": m.planning?.boundaryMapMarkdown ?? "",
991
1010
  });
992
1011
  }
993
- export function upsertMilestonePlanning(milestoneId, planning) {
1012
+ export function upsertMilestonePlanning(milestoneId, planning, title) {
994
1013
  if (!currentDb)
995
1014
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
996
1015
  currentDb.prepare(`UPDATE milestones SET
1016
+ title = COALESCE(:title, title),
997
1017
  vision = COALESCE(:vision, vision),
998
1018
  success_criteria = COALESCE(:success_criteria, success_criteria),
999
1019
  key_risks = COALESCE(:key_risks, key_risks),
@@ -1007,6 +1027,7 @@ export function upsertMilestonePlanning(milestoneId, planning) {
1007
1027
  boundary_map_markdown = COALESCE(:boundary_map_markdown, boundary_map_markdown)
1008
1028
  WHERE id = :id`).run({
1009
1029
  ":id": milestoneId,
1030
+ ":title": title ?? null,
1010
1031
  ":vision": planning.vision ?? null,
1011
1032
  ":success_criteria": planning.successCriteria ? JSON.stringify(planning.successCriteria) : null,
1012
1033
  ":key_risks": planning.keyRisks ? JSON.stringify(planning.keyRisks) : null,
@@ -1276,6 +1297,12 @@ export function insertVerificationEvidence(e) {
1276
1297
  ":created_at": new Date().toISOString(),
1277
1298
  });
1278
1299
  }
1300
+ export function getVerificationEvidence(milestoneId, sliceId, taskId) {
1301
+ if (!currentDb)
1302
+ return [];
1303
+ const rows = currentDb.prepare("SELECT * FROM verification_evidence WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid ORDER BY id").all({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1304
+ return rows;
1305
+ }
1279
1306
  function rowToMilestone(row) {
1280
1307
  return {
1281
1308
  id: row["id"],
@@ -1447,7 +1474,7 @@ export function copyWorktreeDb(srcDbPath, destDbPath) {
1447
1474
  return true;
1448
1475
  }
1449
1476
  catch (err) {
1450
- process.stderr.write(`gsd-db: failed to copy DB to worktree: ${err.message}\n`);
1477
+ logError("db", "failed to copy DB to worktree", { error: err.message });
1451
1478
  return false;
1452
1479
  }
1453
1480
  }
@@ -1466,13 +1493,13 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1466
1493
  // ATTACH DATABASE doesn't support parameterized paths in all providers,
1467
1494
  // so we use strict allowlist validation instead.
1468
1495
  if (/['";\x00]/.test(worktreeDbPath)) {
1469
- process.stderr.write("gsd-db: worktree DB reconciliation failed: path contains unsafe characters\n");
1496
+ logError("db", "worktree DB reconciliation failed: path contains unsafe characters");
1470
1497
  return zero;
1471
1498
  }
1472
1499
  if (!currentDb) {
1473
1500
  const opened = openDatabase(mainDbPath);
1474
1501
  if (!opened) {
1475
- process.stderr.write("gsd-db: worktree DB reconciliation failed: cannot open main DB\n");
1502
+ logError("db", "worktree DB reconciliation failed: cannot open main DB");
1476
1503
  return zero;
1477
1504
  }
1478
1505
  }
@@ -1596,7 +1623,7 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1596
1623
  }
1597
1624
  }
1598
1625
  catch (err) {
1599
- process.stderr.write(`gsd-db: worktree DB reconciliation failed: ${err.message}\n`);
1626
+ logError("db", "worktree DB reconciliation failed", { error: err.message });
1600
1627
  return { ...zero, conflicts };
1601
1628
  }
1602
1629
  }
@@ -8,6 +8,7 @@
8
8
  import { showNextAction } from "../shared/tui.js";
9
9
  import { loadFile } from "./files.js";
10
10
  import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
11
+ import { parseRoadmapSlices } from "./roadmap-slices.js";
11
12
  import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
12
13
  import { buildSkillActivationBlock } from "./auto-prompts.js";
13
14
  import { deriveState } from "./state.js";
@@ -31,7 +32,7 @@ import { showConfirm } from "../shared/tui.js";
31
32
  import { debugLog } from "./debug-logger.js";
32
33
  import { findMilestoneIds, nextMilestoneId, reserveMilestoneId, getReservedMilestoneIds, clearReservedMilestoneIds } from "./milestone-ids.js";
33
34
  import { parkMilestone, discardMilestone } from "./milestone-actions.js";
34
- import { resolveModelWithFallbacksForUnit } from "./preferences-models.js";
35
+ import { selectAndApplyModel } from "./auto-model-selection.js";
35
36
  // ─── Re-exports (preserve public API for existing importers) ────────────────
36
37
  export { MILESTONE_ID_RE, generateMilestoneSuffix, nextMilestoneId, extractMilestoneSeq, parseMilestoneId, milestoneIdSort, maxMilestoneNum, findMilestoneIds, reserveMilestoneId, claimReservedId, getReservedMilestoneIds, clearReservedMilestoneIds, } from "./milestone-ids.js";
37
38
  export { showQueue, handleQueueReorder, showQueueAdd, buildExistingMilestonesContext, } from "./guided-flow-queue.js";
@@ -53,18 +54,61 @@ function nextMilestoneIdReserved(existingIds, uniqueEnabled) {
53
54
  function buildDocsCommitInstruction(_message) {
54
55
  return "Do not commit planning artifacts — .gsd/ is managed externally.";
55
56
  }
56
- // ─── Auto-start after discuss ─────────────────────────────────────────────────
57
- /** Stashed context + flag for auto-starting after discuss phase completes */
58
- let pendingAutoStart = null;
59
- /** Returns the milestoneId being discussed, or null if no discussion is active */
60
- export function getDiscussionMilestoneId() {
61
- return pendingAutoStart?.milestoneId ?? null;
57
+ const pendingAutoStartMap = new Map();
58
+ /**
59
+ * Backward-compat bridge: returns a mutable reference to the entry matching
60
+ * basePath, or the sole entry when only one session exists.
61
+ * Internal use only — external code should use the Map directly.
62
+ */
63
+ function _getPendingAutoStart(basePath) {
64
+ if (basePath)
65
+ return pendingAutoStartMap.get(basePath) ?? null;
66
+ if (pendingAutoStartMap.size === 1)
67
+ return pendingAutoStartMap.values().next().value;
68
+ return null;
69
+ }
70
+ /**
71
+ * Store pending auto-start state for a project.
72
+ * Exported for testing (#2985).
73
+ */
74
+ export function setPendingAutoStart(basePath, entry) {
75
+ pendingAutoStartMap.set(basePath, entry);
76
+ }
77
+ /**
78
+ * Clear pending auto-start state.
79
+ * If basePath is given, clears only that project. Otherwise clears all.
80
+ * Exported for testing (#2985).
81
+ */
82
+ export function clearPendingAutoStart(basePath) {
83
+ if (basePath) {
84
+ pendingAutoStartMap.delete(basePath);
85
+ }
86
+ else {
87
+ pendingAutoStartMap.clear();
88
+ }
89
+ }
90
+ /**
91
+ * Returns the milestoneId being discussed for the given project.
92
+ * When basePath is omitted and only one session is active, returns that
93
+ * session's milestoneId for backward compatibility. Returns null when
94
+ * multiple sessions exist and basePath is not specified (#2985 Bug 4).
95
+ */
96
+ export function getDiscussionMilestoneId(basePath) {
97
+ if (basePath) {
98
+ return pendingAutoStartMap.get(basePath)?.milestoneId ?? null;
99
+ }
100
+ // Backward compat: return the sole entry's milestoneId, or null if ambiguous
101
+ if (pendingAutoStartMap.size === 1) {
102
+ return pendingAutoStartMap.values().next().value.milestoneId;
103
+ }
104
+ return null;
62
105
  }
63
106
  /** Called from agent_end to check if auto-mode should start after discuss */
64
107
  export function checkAutoStartAfterDiscuss() {
65
- if (!pendingAutoStart)
108
+ const entry = _getPendingAutoStart();
109
+ if (!entry)
66
110
  return false;
67
- const { ctx, pi, basePath, milestoneId, step } = pendingAutoStart;
111
+ const { ctx, pi, basePath, milestoneId, step } = entry;
68
112
  // Gate 1: Primary milestone must have CONTEXT.md or ROADMAP.md
69
113
  // The "discuss" path creates CONTEXT.md; the "plan" path creates ROADMAP.md.
70
114
  const contextFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT");
@@ -142,7 +186,7 @@ export function checkAutoStartAfterDiscuss() {
142
186
  unlinkSync(manifestPath);
143
187
  }
144
188
  catch { /* may not exist for single-milestone */ }
145
- pendingAutoStart = null;
189
+ pendingAutoStartMap.delete(basePath);
146
190
  ctx.ui.notify(`Milestone ${milestoneId} ready.`, "info");
147
191
  startAuto(ctx, pi, basePath, false, { step }).catch((err) => {
148
192
  ctx.ui.notify(`Auto-start failed: ${getErrorMessage(err)}`, "error");
@@ -177,23 +221,17 @@ function parseMilestoneSequenceFromProject(content) {
177
221
  * per-phase model preferences that auto-mode uses.
178
222
  */
179
223
  async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType) {
180
- // Apply model preference for this unit type (if configured)
224
+ // Route through the dynamic routing pipeline (complexity classification,
225
+ // tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
181
226
  if (ctx && unitType) {
182
- const modelConfig = resolveModelWithFallbacksForUnit(unitType);
183
- if (modelConfig) {
184
- const availableModels = ctx.modelRegistry.getAvailable();
185
- const modelsToTry = [modelConfig.primary, ...modelConfig.fallbacks];
186
- for (const modelId of modelsToTry) {
187
- // Resolve model from available models (same logic as auto-model-selection)
188
- const model = resolveAvailableModel(modelId, availableModels, ctx.model?.provider);
189
- if (!model)
190
- continue;
191
- const ok = await pi.setModel(model, { persist: false });
192
- if (ok) {
193
- debugLog("guided-flow-model-applied", { unitType, model: `${model.provider}/${model.id}` });
194
- break;
195
- }
196
- }
227
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
228
+ const result = await selectAndApplyModel(ctx, pi, unitType, /* unitId */ "", /* basePath */ process.cwd(), prefs, /* verbose */ false, /* autoModeStartModel */ null);
229
+ if (result.appliedModel) {
230
+ debugLog("guided-flow-model-applied", {
231
+ unitType,
232
+ model: `${result.appliedModel.provider}/${result.appliedModel.id}`,
233
+ routing: result.routing,
234
+ });
197
235
  }
198
236
  }
199
237
  const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(process.env.HOME ?? "~", ".gsd", "agent", "GSD-WORKFLOW.md");
@@ -311,7 +349,7 @@ export async function showHeadlessMilestoneCreation(ctx, pi, basePath, seedConte
311
349
  // Build and dispatch the headless discuss prompt
312
350
  const prompt = buildHeadlessDiscussPrompt(nextId, seedContext, basePath);
313
351
  // Set pending auto start (auto-mode triggers on "Milestone X ready." via checkAutoStartAfterDiscuss)
314
- pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId };
352
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId });
315
353
  // Dispatch — headless milestone creation is a planning activity
316
354
  await dispatchWorkflow(pi, prompt, "gsd-run", ctx, "plan-milestone");
317
355
  }
@@ -460,13 +498,13 @@ export async function showDiscuss(ctx, pi, basePath) {
460
498
  const seed = draftContent
461
499
  ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
462
500
  : basePrompt;
463
- pendingAutoStart = { ctx, pi, basePath, milestoneId: mid, step: false };
501
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: mid, step: false });
464
502
  await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone");
465
503
  }
466
504
  else if (choice === "discuss_fresh") {
467
505
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
468
506
  const structuredQuestionsAvailable = pi.getActiveTools().includes("ask_user_questions") ? "true" : "false";
469
- pendingAutoStart = { ctx, pi, basePath, milestoneId: mid, step: false };
507
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: mid, step: false });
470
508
  await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
471
509
  milestoneId: mid, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
472
510
  commitInstruction: buildDocsCommitInstruction(`docs(${mid}): milestone context from discuss`),
@@ -476,7 +514,7 @@ export async function showDiscuss(ctx, pi, basePath) {
476
514
  const milestoneIds = findMilestoneIds(basePath);
477
515
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
478
516
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
479
- pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: false };
517
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: false });
480
518
  await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
481
519
  }
482
520
  return;
@@ -502,8 +540,20 @@ export async function showDiscuss(ctx, pi, basePath) {
502
540
  else {
503
541
  normSlices = [];
504
542
  }
543
+ // DB is open but returned zero slices despite a roadmap existing —
544
+ // the DB may be empty due to WAL loss or truncation (see #2815, #2892).
545
+ // Fall back to roadmap parsing to prevent false "all complete" exit.
546
+ if (normSlices.length === 0 && roadmapContent) {
547
+ normSlices = parseRoadmapSlices(roadmapContent).map(s => ({ id: s.id, done: s.done, title: s.title }));
548
+ }
505
549
  const pendingSlices = normSlices.filter(s => !s.done);
506
550
  if (pendingSlices.length === 0) {
551
+ // All slices complete — but queued milestones may still need discussion (#3150)
552
+ const pendingMilestones = state.registry.filter(m => m.status === "pending");
553
+ if (pendingMilestones.length > 0) {
554
+ await showDiscussQueuedMilestone(ctx, pi, basePath, pendingMilestones);
555
+ return;
556
+ }
507
557
  ctx.ui.notify("All slices are complete — nothing to discuss.", "info");
508
558
  return;
509
559
  }
@@ -517,9 +567,14 @@ export async function showDiscuss(ctx, pi, basePath) {
517
567
  const contextFile = resolveSliceFile(basePath, mid, s.id, "CONTEXT");
518
568
  discussedMap.set(s.id, !!contextFile);
519
569
  }
520
- // If all pending slices are discussed, notify and exit instead of looping
570
+ // If all pending slices are discussed, check for queued milestones before exiting (#3150)
521
571
  const allDiscussed = pendingSlices.every(s => discussedMap.get(s.id));
522
572
  if (allDiscussed) {
573
+ const pendingMilestones = state.registry.filter(m => m.status === "pending");
574
+ if (pendingMilestones.length > 0) {
575
+ await showDiscussQueuedMilestone(ctx, pi, basePath, pendingMilestones);
576
+ return;
577
+ }
523
578
  const lockData = readSessionLockData(basePath);
524
579
  const remoteAutoRunning = lockData && lockData.pid !== process.pid && isSessionLockProcessAlive(lockData);
525
580
  const nextStep = remoteAutoRunning
@@ -774,7 +829,7 @@ async function handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneT
774
829
  const milestoneIds = findMilestoneIds(basePath);
775
830
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
776
831
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
777
- pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
832
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
778
833
  await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
779
834
  return true;
780
835
  }
@@ -804,7 +859,14 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
804
859
  return;
805
860
  }
806
861
  // ── Detection preamble — run before any bootstrap ────────────────────
807
- if (!existsSync(gsdRoot(basePath))) {
862
+ // Check bootstrap completeness, not just .gsd/ directory existence.
863
+ // A zombie .gsd/ state (symlink exists but missing PREFERENCES.md and
864
+ // milestones/) must trigger the init wizard, not skip it (#2942).
865
+ const gsdPath = gsdRoot(basePath);
866
+ const hasBootstrapArtifacts = existsSync(gsdPath)
867
+ && (existsSync(join(gsdPath, "PREFERENCES.md"))
868
+ || existsSync(join(gsdPath, "milestones")));
869
+ if (!hasBootstrapArtifacts) {
808
870
  const detection = detectProjectState(basePath);
809
871
  // v1 .planning/ detected — offer migration before anything else
810
872
  if (detection.state === "v1-planning" && detection.v1) {
@@ -818,7 +880,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
818
880
  }
819
881
  // "fresh" — fall through to init wizard
820
882
  }
821
- // No .gsd/ — run the project init wizard
883
+ // No .gsd/ or zombie .gsd/ — run the project init wizard
822
884
  const result = await showProjectInit(ctx, pi, basePath, detection);
823
885
  if (!result.completed)
824
886
  return; // User cancelled
@@ -869,9 +931,9 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
869
931
  if (!state.activeMilestone?.id) {
870
932
  // Guard: if a discuss session is already in flight, don't re-inject the prompt.
871
933
  // Both /gsd and /gsd auto reach this branch when no milestone exists yet.
872
- // Without this guard, every subsequent /gsd call overwrites pendingAutoStart
934
+ // Without this guard, every subsequent /gsd call overwrites the pending auto-start
873
935
  // and fires another dispatchWorkflow, resetting the conversation mid-interview.
874
- if (pendingAutoStart) {
936
+ if (pendingAutoStartMap.has(basePath)) {
875
937
  ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
876
938
  return;
877
939
  }
@@ -898,7 +960,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
898
960
  const isFirst = milestoneIds.length === 0;
899
961
  if (isFirst) {
900
962
  // First ever — skip wizard, just ask directly
901
- pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
963
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
902
964
  await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New project, milestone ${nextId}. Do NOT read or explore .gsd/ — it's empty scaffolding.`, basePath), "gsd-run", ctx, "discuss-milestone");
903
965
  }
904
966
  else {
@@ -916,7 +978,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
916
978
  notYetMessage: "Run /gsd when ready.",
917
979
  });
918
980
  if (choice === "new_milestone") {
919
- pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
981
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
920
982
  await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
921
983
  }
922
984
  }
@@ -948,7 +1010,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
948
1010
  const milestoneIds = findMilestoneIds(basePath);
949
1011
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
950
1012
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
951
- pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
1013
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
952
1014
  await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
953
1015
  }
954
1016
  else if (choice === "status") {
@@ -994,13 +1056,13 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
994
1056
  const seed = draftContent
995
1057
  ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
996
1058
  : basePrompt;
997
- pendingAutoStart = { ctx, pi, basePath, milestoneId, step: stepMode };
1059
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
998
1060
  await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone");
999
1061
  }
1000
1062
  else if (choice === "discuss_fresh") {
1001
1063
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1002
1064
  const structuredQuestionsAvailable = pi.getActiveTools().includes("ask_user_questions") ? "true" : "false";
1003
- pendingAutoStart = { ctx, pi, basePath, milestoneId, step: stepMode };
1065
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
1004
1066
  await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
1005
1067
  milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1006
1068
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
@@ -1010,7 +1072,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1010
1072
  const milestoneIds = findMilestoneIds(basePath);
1011
1073
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
1012
1074
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
1013
- pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
1075
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
1014
1076
  await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
1015
1077
  }
1016
1078
  return;
@@ -1055,7 +1117,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1055
1117
  notYetMessage: "Run /gsd when ready.",
1056
1118
  });
1057
1119
  if (choice === "plan") {
1058
- pendingAutoStart = { ctx, pi, basePath, milestoneId, step: stepMode };
1120
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
1059
1121
  const planMilestoneTemplates = [
1060
1122
  inlineTemplate("roadmap", "Roadmap"),
1061
1123
  inlineTemplate("plan", "Slice Plan"),
@@ -1088,7 +1150,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1088
1150
  const milestoneIds = findMilestoneIds(basePath);
1089
1151
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
1090
1152
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds);
1091
- pendingAutoStart = { ctx, pi, basePath, milestoneId: nextId, step: stepMode };
1153
+ pendingAutoStartMap.set(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
1092
1154
  await dispatchWorkflow(pi, buildDiscussPrompt(nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
1093
1155
  }
1094
1156
  else if (choice === "discard_milestone") {
@@ -16,6 +16,31 @@ export function detectHealthWidgetProjectState(basePath) {
16
16
  function formatCost(n) {
17
17
  return n >= 1 ? `$${n.toFixed(2)}` : `${(n * 100).toFixed(1)}¢`;
18
18
  }
19
+ /**
20
+ * Format a Unix epoch (seconds) as a human-readable relative time string.
21
+ * Returns "just now" for <1m, "Xm ago" for <1h, "Xh ago" for <24h, "Xd ago" otherwise.
22
+ */
23
+ export function formatRelativeTime(epochSeconds) {
24
+ const diffSeconds = Math.floor(Date.now() / 1000) - epochSeconds;
25
+ if (diffSeconds < 60)
26
+ return "just now";
27
+ const minutes = Math.floor(diffSeconds / 60);
28
+ if (minutes < 60)
29
+ return `${minutes}m ago`;
30
+ const hours = Math.floor(minutes / 60);
31
+ if (hours < 24)
32
+ return `${hours}h ago`;
33
+ const days = Math.floor(hours / 24);
34
+ return `${days}d ago`;
35
+ }
36
+ /**
37
+ * Truncate a commit message to fit the widget, appending "…" if needed.
38
+ */
39
+ function truncateMessage(msg, maxLen) {
40
+ if (msg.length <= maxLen)
41
+ return msg;
42
+ return msg.slice(0, maxLen - 1) + "…";
43
+ }
19
44
  /**
20
45
  * Build compact health lines for the widget.
21
46
  * Returns a string array suitable for setWidget().
@@ -54,5 +79,11 @@ export function buildHealthLines(data) {
54
79
  else if (data.environmentWarningCount > 0) {
55
80
  parts.push(`Env: ${data.environmentWarningCount} warning${data.environmentWarningCount > 1 ? "s" : ""}`);
56
81
  }
82
+ // Always-on last commit display — shows relative time + truncated message
83
+ if (data.lastCommitEpoch !== null && data.lastCommitEpoch > 0) {
84
+ const relTime = formatRelativeTime(data.lastCommitEpoch);
85
+ const msg = data.lastCommitMessage ? ` — ${truncateMessage(data.lastCommitMessage, 50)}` : "";
86
+ parts.push(`Last commit: ${relTime}${msg}`);
87
+ }
57
88
  return [` ${parts.join(" │ ")}`];
58
89
  }