gsd-pi 2.63.0 → 2.64.0-dev.1a85e85

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 (583) hide show
  1. package/README.md +46 -134
  2. package/dist/cli.js +48 -6
  3. package/dist/headless-query.js +11 -1
  4. package/dist/help-text.js +4 -1
  5. package/dist/onboarding.js +15 -8
  6. package/dist/resource-loader.js +18 -3
  7. package/dist/resources/extensions/cmux/index.js +21 -12
  8. package/dist/resources/extensions/gsd/auto/detect-stuck.js +27 -0
  9. package/dist/resources/extensions/gsd/auto/finalize-timeout.js +40 -0
  10. package/dist/resources/extensions/gsd/auto/loop.js +4 -0
  11. package/dist/resources/extensions/gsd/auto/phases.js +157 -22
  12. package/dist/resources/extensions/gsd/auto/session.js +12 -0
  13. package/dist/resources/extensions/gsd/auto-dashboard.js +14 -8
  14. package/dist/resources/extensions/gsd/auto-model-selection.js +32 -0
  15. package/dist/resources/extensions/gsd/auto-post-unit.js +222 -11
  16. package/dist/resources/extensions/gsd/auto-prompts.js +25 -0
  17. package/dist/resources/extensions/gsd/auto-recovery.js +15 -7
  18. package/dist/resources/extensions/gsd/auto-start.js +10 -21
  19. package/dist/resources/extensions/gsd/auto-timers.js +2 -1
  20. package/dist/resources/extensions/gsd/auto-tool-tracking.js +17 -0
  21. package/dist/resources/extensions/gsd/auto-verification.js +138 -1
  22. package/dist/resources/extensions/gsd/auto-worktree.js +13 -7
  23. package/dist/resources/extensions/gsd/auto.js +24 -2
  24. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +147 -75
  25. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +13 -0
  26. package/dist/resources/extensions/gsd/bootstrap/notify-interceptor.js +28 -0
  27. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +85 -0
  28. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -0
  29. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +40 -1
  30. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +15 -0
  31. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +54 -0
  32. package/dist/resources/extensions/gsd/bootstrap/system-context.js +50 -2
  33. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  34. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
  35. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +103 -0
  36. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  37. package/dist/resources/extensions/gsd/commands-handlers.js +9 -4
  38. package/dist/resources/extensions/gsd/constants.js +42 -0
  39. package/dist/resources/extensions/gsd/db-writer.js +72 -4
  40. package/dist/resources/extensions/gsd/forensics.js +20 -4
  41. package/dist/resources/extensions/gsd/gsd-db.js +64 -17
  42. package/dist/resources/extensions/gsd/guided-flow.js +19 -0
  43. package/dist/resources/extensions/gsd/metrics.js +27 -1
  44. package/dist/resources/extensions/gsd/native-git-bridge.js +5 -3
  45. package/dist/resources/extensions/gsd/notification-overlay.js +224 -0
  46. package/dist/resources/extensions/gsd/notification-store.js +268 -0
  47. package/dist/resources/extensions/gsd/notification-widget.js +56 -0
  48. package/dist/resources/extensions/gsd/post-execution-checks.js +407 -0
  49. package/dist/resources/extensions/gsd/pre-execution-checks.js +464 -0
  50. package/dist/resources/extensions/gsd/preferences-types.js +6 -0
  51. package/dist/resources/extensions/gsd/preferences-validation.js +33 -0
  52. package/dist/resources/extensions/gsd/preferences.js +11 -2
  53. package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
  54. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
  55. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -0
  56. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +1 -0
  57. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -0
  58. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +2 -0
  59. package/dist/resources/extensions/gsd/prompts/system.md +4 -7
  60. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  61. package/dist/resources/extensions/gsd/roadmap-mutations.js +1 -1
  62. package/dist/resources/extensions/gsd/roadmap-slices.js +9 -5
  63. package/dist/resources/extensions/gsd/safety/content-validator.js +73 -0
  64. package/dist/resources/extensions/gsd/safety/destructive-guard.js +34 -0
  65. package/dist/resources/extensions/gsd/safety/evidence-collector.js +109 -0
  66. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +83 -0
  67. package/dist/resources/extensions/gsd/safety/file-change-validator.js +71 -0
  68. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +91 -0
  69. package/dist/resources/extensions/gsd/safety/safety-harness.js +64 -0
  70. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +67 -0
  71. package/dist/resources/extensions/gsd/slice-parallel-eligibility.js +51 -0
  72. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +378 -0
  73. package/dist/resources/extensions/gsd/state.js +74 -14
  74. package/dist/resources/extensions/gsd/status-guards.js +11 -0
  75. package/dist/resources/extensions/gsd/tools/complete-milestone.js +17 -12
  76. package/dist/resources/extensions/gsd/tools/complete-slice.js +40 -26
  77. package/dist/resources/extensions/gsd/tools/complete-task.js +12 -12
  78. package/dist/resources/extensions/gsd/tools/plan-milestone.js +33 -25
  79. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -8
  80. package/dist/resources/extensions/gsd/verification-evidence.js +18 -0
  81. package/dist/resources/extensions/gsd/workflow-logger.js +8 -0
  82. package/dist/resources/extensions/gsd/workflow-projections.js +21 -5
  83. package/dist/resources/extensions/gsd/worktree-manager.js +82 -29
  84. package/dist/resources/extensions/gsd/worktree-resolver.js +4 -3
  85. package/dist/resources/extensions/mcp-client/auth.js +101 -0
  86. package/dist/resources/extensions/mcp-client/index.js +10 -1
  87. package/dist/resources/extensions/ollama/index.js +28 -22
  88. package/dist/resources/extensions/ollama/model-capabilities.js +37 -34
  89. package/dist/resources/extensions/ollama/ndjson-stream.js +54 -0
  90. package/dist/resources/extensions/ollama/ollama-chat-provider.js +380 -0
  91. package/dist/resources/extensions/ollama/ollama-client.js +23 -32
  92. package/dist/resources/extensions/ollama/ollama-discovery.js +2 -7
  93. package/dist/resources/extensions/ollama/ollama-tool.js +62 -0
  94. package/dist/resources/extensions/ollama/thinking-parser.js +104 -0
  95. package/dist/update-cmd.js +4 -2
  96. package/dist/web/standalone/.next/BUILD_ID +1 -1
  97. package/dist/web/standalone/.next/app-path-routes-manifest.json +19 -18
  98. package/dist/web/standalone/.next/build-manifest.json +3 -3
  99. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  100. package/dist/web/standalone/.next/required-server-files.json +4 -4
  101. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  102. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  103. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  105. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  113. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  124. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  127. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  130. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  132. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  148. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/notifications/route.js +3 -0
  177. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -0
  178. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -0
  179. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  191. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  199. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +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.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  219. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  221. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  223. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  226. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  238. package/dist/web/standalone/.next/server/app/index.html +1 -1
  239. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  240. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  241. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  242. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  243. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  244. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  245. package/dist/web/standalone/.next/server/app/page.js +2 -2
  246. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app-paths-manifest.json +19 -18
  248. package/dist/web/standalone/.next/server/chunks/6897.js +12 -0
  249. package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
  250. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  251. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  252. package/dist/web/standalone/.next/server/middleware.js +2 -2
  253. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  254. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  255. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  256. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  257. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  258. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-8805a20e15762c3c.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  260. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-8805a20e15762c3c.js +1 -0
  261. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-8805a20e15762c3c.js +1 -0
  262. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-8805a20e15762c3c.js +1 -0
  263. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-8805a20e15762c3c.js +1 -0
  264. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-8805a20e15762c3c.js +1 -0
  265. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-8805a20e15762c3c.js +1 -0
  266. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-8805a20e15762c3c.js +1 -0
  267. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-8805a20e15762c3c.js +1 -0
  268. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-8805a20e15762c3c.js +1 -0
  269. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-8805a20e15762c3c.js +1 -0
  270. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-8805a20e15762c3c.js +1 -0
  271. package/dist/web/standalone/.next/static/chunks/app/api/files/route-8805a20e15762c3c.js +1 -0
  272. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-8805a20e15762c3c.js +1 -0
  273. package/dist/web/standalone/.next/static/chunks/app/api/git/route-8805a20e15762c3c.js +1 -0
  274. package/dist/web/standalone/.next/static/chunks/app/api/history/route-8805a20e15762c3c.js +1 -0
  275. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-8805a20e15762c3c.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-8805a20e15762c3c.js +1 -0
  277. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-8805a20e15762c3c.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-8805a20e15762c3c.js +1 -0
  279. package/dist/web/standalone/.next/static/chunks/app/api/notifications/route-8805a20e15762c3c.js +1 -0
  280. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-8805a20e15762c3c.js +1 -0
  281. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-8805a20e15762c3c.js +1 -0
  282. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-8805a20e15762c3c.js +1 -0
  283. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-8805a20e15762c3c.js +1 -0
  284. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-8805a20e15762c3c.js +1 -0
  285. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-8805a20e15762c3c.js +1 -0
  286. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-8805a20e15762c3c.js +1 -0
  287. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-8805a20e15762c3c.js +1 -0
  288. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-8805a20e15762c3c.js +1 -0
  289. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-8805a20e15762c3c.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-8805a20e15762c3c.js +1 -0
  291. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-8805a20e15762c3c.js +1 -0
  292. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-8805a20e15762c3c.js +1 -0
  293. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-8805a20e15762c3c.js +1 -0
  294. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-8805a20e15762c3c.js +1 -0
  295. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-8805a20e15762c3c.js +1 -0
  296. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-8805a20e15762c3c.js +1 -0
  297. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-8805a20e15762c3c.js +1 -0
  298. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-8805a20e15762c3c.js +1 -0
  299. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-8805a20e15762c3c.js +1 -0
  300. package/dist/web/standalone/.next/static/chunks/app/api/update/route-8805a20e15762c3c.js +1 -0
  301. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-8805a20e15762c3c.js +1 -0
  302. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  303. package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
  304. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  305. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-8805a20e15762c3c.js +1 -0
  306. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-8805a20e15762c3c.js +1 -0
  307. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  308. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-8805a20e15762c3c.js +1 -0
  309. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-8805a20e15762c3c.js +1 -0
  310. package/dist/web/standalone/.next/static/ffabZXz8JdN3EzX9EKt-R/_buildManifest.js +1 -0
  311. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  312. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  313. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  314. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  315. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  316. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  317. package/dist/web/standalone/server.js +1 -1
  318. package/dist/welcome-screen.js +1 -1
  319. package/package.json +1 -1
  320. package/packages/pi-agent-core/dist/agent-loop.d.ts +8 -0
  321. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  322. package/packages/pi-agent-core/dist/agent-loop.js +70 -3
  323. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  324. package/packages/pi-agent-core/src/agent-loop.test.ts +317 -5
  325. package/packages/pi-agent-core/src/agent-loop.ts +90 -6
  326. package/packages/pi-ai/dist/types.d.ts +16 -1
  327. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/types.js.map +1 -1
  329. package/packages/pi-ai/src/types.ts +18 -1
  330. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts +2 -0
  331. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.d.ts.map +1 -0
  332. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +38 -0
  333. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -0
  334. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  335. package/packages/pi-coding-agent/dist/core/agent-session.js +11 -0
  336. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +9 -0
  338. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/auth-storage.js +50 -1
  340. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +41 -0
  342. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +7 -0
  344. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
  346. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +28 -1
  348. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.d.ts +2 -0
  350. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.d.ts.map +1 -0
  351. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js +46 -0
  352. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js.map +1 -0
  353. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -0
  354. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +1 -0
  357. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/core/model-registry.js +12 -0
  359. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -3
  361. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts +2 -0
  363. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.d.ts.map +1 -0
  364. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +24 -0
  365. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -0
  366. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +23 -1
  367. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/resource-loader.js +84 -57
  369. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/sdk.js +9 -0
  372. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  373. package/packages/pi-coding-agent/package.json +1 -1
  374. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +64 -0
  375. package/packages/pi-coding-agent/src/core/agent-session.ts +10 -0
  376. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +53 -0
  377. package/packages/pi-coding-agent/src/core/auth-storage.ts +66 -1
  378. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +39 -1
  379. package/packages/pi-coding-agent/src/core/extensions/loader.ts +34 -4
  380. package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +81 -0
  381. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -0
  382. package/packages/pi-coding-agent/src/core/model-registry.ts +14 -0
  383. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -3
  384. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +42 -0
  385. package/packages/pi-coding-agent/src/core/resource-loader.ts +94 -57
  386. package/packages/pi-coding-agent/src/core/sdk.ts +10 -0
  387. package/pkg/package.json +1 -1
  388. package/src/resources/extensions/cmux/index.ts +18 -12
  389. package/src/resources/extensions/gsd/auto/detect-stuck.ts +27 -0
  390. package/src/resources/extensions/gsd/auto/finalize-timeout.ts +46 -0
  391. package/src/resources/extensions/gsd/auto/loop.ts +5 -0
  392. package/src/resources/extensions/gsd/auto/phases.ts +194 -33
  393. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  394. package/src/resources/extensions/gsd/auto-dashboard.ts +16 -7
  395. package/src/resources/extensions/gsd/auto-model-selection.ts +36 -0
  396. package/src/resources/extensions/gsd/auto-post-unit.ts +263 -12
  397. package/src/resources/extensions/gsd/auto-prompts.ts +21 -0
  398. package/src/resources/extensions/gsd/auto-recovery.ts +9 -8
  399. package/src/resources/extensions/gsd/auto-start.ts +11 -20
  400. package/src/resources/extensions/gsd/auto-timers.ts +2 -1
  401. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  402. package/src/resources/extensions/gsd/auto-verification.ts +190 -2
  403. package/src/resources/extensions/gsd/auto-worktree.ts +14 -6
  404. package/src/resources/extensions/gsd/auto.ts +26 -1
  405. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +160 -88
  406. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +15 -0
  407. package/src/resources/extensions/gsd/bootstrap/notify-interceptor.ts +34 -0
  408. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +98 -0
  409. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +4 -0
  410. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +44 -1
  411. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +19 -0
  412. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +57 -0
  413. package/src/resources/extensions/gsd/bootstrap/system-context.ts +59 -2
  414. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  415. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
  416. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +139 -0
  417. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  418. package/src/resources/extensions/gsd/commands-handlers.ts +10 -4
  419. package/src/resources/extensions/gsd/constants.ts +44 -0
  420. package/src/resources/extensions/gsd/db-writer.ts +78 -4
  421. package/src/resources/extensions/gsd/forensics.ts +21 -5
  422. package/src/resources/extensions/gsd/gsd-db.ts +64 -17
  423. package/src/resources/extensions/gsd/guided-flow.ts +22 -0
  424. package/src/resources/extensions/gsd/metrics.ts +28 -1
  425. package/src/resources/extensions/gsd/native-git-bridge.ts +5 -3
  426. package/src/resources/extensions/gsd/notification-overlay.ts +267 -0
  427. package/src/resources/extensions/gsd/notification-store.ts +288 -0
  428. package/src/resources/extensions/gsd/notification-widget.ts +68 -0
  429. package/src/resources/extensions/gsd/post-execution-checks.ts +539 -0
  430. package/src/resources/extensions/gsd/pre-execution-checks.ts +573 -0
  431. package/src/resources/extensions/gsd/preferences-types.ts +44 -0
  432. package/src/resources/extensions/gsd/preferences-validation.ts +33 -0
  433. package/src/resources/extensions/gsd/preferences.ts +13 -2
  434. package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
  435. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
  436. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -0
  437. package/src/resources/extensions/gsd/prompts/doctor-heal.md +1 -0
  438. package/src/resources/extensions/gsd/prompts/forensics.md +2 -0
  439. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +2 -0
  440. package/src/resources/extensions/gsd/prompts/system.md +4 -7
  441. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  442. package/src/resources/extensions/gsd/roadmap-mutations.ts +1 -1
  443. package/src/resources/extensions/gsd/roadmap-slices.ts +10 -5
  444. package/src/resources/extensions/gsd/safety/content-validator.ts +98 -0
  445. package/src/resources/extensions/gsd/safety/destructive-guard.ts +49 -0
  446. package/src/resources/extensions/gsd/safety/evidence-collector.ts +151 -0
  447. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +120 -0
  448. package/src/resources/extensions/gsd/safety/file-change-validator.ts +108 -0
  449. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +106 -0
  450. package/src/resources/extensions/gsd/safety/safety-harness.ts +105 -0
  451. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +86 -0
  452. package/src/resources/extensions/gsd/slice-parallel-eligibility.ts +73 -0
  453. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +477 -0
  454. package/src/resources/extensions/gsd/state.ts +67 -12
  455. package/src/resources/extensions/gsd/status-guards.ts +13 -0
  456. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +288 -0
  457. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +34 -13
  458. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +50 -0
  459. package/src/resources/extensions/gsd/tests/cmux.test.ts +58 -0
  460. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +51 -0
  461. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  462. package/src/resources/extensions/gsd/tests/complete-slice-string-coercion.test.ts +211 -0
  463. package/src/resources/extensions/gsd/tests/complete-task.test.ts +39 -0
  464. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +107 -0
  465. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +109 -0
  466. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +13 -9
  467. package/src/resources/extensions/gsd/tests/db-writer.test.ts +134 -0
  468. package/src/resources/extensions/gsd/tests/deferred-slice-dispatch.test.ts +203 -0
  469. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +76 -0
  470. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +130 -0
  471. package/src/resources/extensions/gsd/tests/doctor-fix-flag.test.ts +92 -0
  472. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +526 -0
  473. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +116 -0
  474. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +50 -0
  475. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +103 -0
  476. package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +94 -0
  477. package/src/resources/extensions/gsd/tests/insert-slice-no-wipe.test.ts +88 -0
  478. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +27 -7
  479. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +34 -0
  480. package/src/resources/extensions/gsd/tests/metrics.test.ts +116 -1
  481. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +201 -0
  482. package/src/resources/extensions/gsd/tests/notification-store.test.ts +249 -0
  483. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +2 -1
  484. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +82 -18
  485. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +312 -0
  486. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +813 -0
  487. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +999 -0
  488. package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +266 -0
  489. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +457 -0
  490. package/src/resources/extensions/gsd/tests/preferences.test.ts +10 -0
  491. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +25 -0
  492. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +69 -0
  493. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +30 -0
  494. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +50 -0
  495. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +92 -0
  496. package/src/resources/extensions/gsd/tests/slice-parallel-eligibility.test.ts +95 -0
  497. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +83 -0
  498. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +42 -0
  499. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +103 -0
  500. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +349 -0
  501. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +163 -0
  502. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +35 -2
  503. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +73 -0
  504. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +34 -0
  505. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +1 -1
  506. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +148 -0
  507. package/src/resources/extensions/gsd/tools/complete-milestone.ts +34 -20
  508. package/src/resources/extensions/gsd/tools/complete-slice.ts +41 -26
  509. package/src/resources/extensions/gsd/tools/complete-task.ts +12 -12
  510. package/src/resources/extensions/gsd/tools/plan-milestone.ts +55 -30
  511. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -8
  512. package/src/resources/extensions/gsd/types.ts +44 -22
  513. package/src/resources/extensions/gsd/verification-evidence.ts +68 -0
  514. package/src/resources/extensions/gsd/workflow-logger.ts +15 -1
  515. package/src/resources/extensions/gsd/workflow-projections.ts +23 -5
  516. package/src/resources/extensions/gsd/worktree-manager.ts +76 -28
  517. package/src/resources/extensions/gsd/worktree-resolver.ts +4 -3
  518. package/src/resources/extensions/mcp-client/auth.ts +149 -0
  519. package/src/resources/extensions/mcp-client/index.ts +16 -1
  520. package/src/resources/extensions/ollama/index.ts +26 -25
  521. package/src/resources/extensions/ollama/model-capabilities.ts +41 -34
  522. package/src/resources/extensions/ollama/ndjson-stream.ts +63 -0
  523. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +20 -0
  524. package/src/resources/extensions/ollama/ollama-chat-provider.ts +459 -0
  525. package/src/resources/extensions/ollama/ollama-client.ts +30 -30
  526. package/src/resources/extensions/ollama/ollama-discovery.ts +5 -8
  527. package/src/resources/extensions/ollama/ollama-tool.ts +69 -0
  528. package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +82 -0
  529. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -27
  530. package/src/resources/extensions/ollama/thinking-parser.ts +116 -0
  531. package/src/resources/extensions/ollama/types.ts +23 -0
  532. package/dist/web/standalone/.next/server/chunks/2229.js +0 -12
  533. package/dist/web/standalone/.next/static/5FLUBNdqolRyyehCyChPd/_buildManifest.js +0 -1
  534. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +0 -1
  535. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +0 -1
  536. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +0 -1
  537. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  538. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  539. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +0 -1
  540. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +0 -1
  541. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +0 -1
  544. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +0 -1
  545. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +0 -1
  546. package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +0 -1
  547. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +0 -1
  548. package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +0 -1
  549. package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +0 -1
  550. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +0 -1
  551. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +0 -1
  553. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +0 -1
  555. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +0 -1
  556. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +0 -1
  557. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +0 -1
  558. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +0 -1
  559. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +0 -1
  560. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +0 -1
  561. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +0 -1
  562. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +0 -1
  563. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +0 -1
  564. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +0 -1
  565. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +0 -1
  566. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +0 -1
  567. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +0 -1
  568. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +0 -1
  569. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +0 -1
  570. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +0 -1
  571. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +0 -1
  572. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +0 -1
  573. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +0 -1
  574. package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +0 -1
  575. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +0 -1
  576. package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
  577. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  578. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +0 -1
  579. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +0 -1
  580. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  581. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +0 -1
  582. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +0 -1
  583. /package/dist/web/standalone/.next/static/{5FLUBNdqolRyyehCyChPd → ffabZXz8JdN3EzX9EKt-R}/_ssgManifest.js +0 -0
@@ -0,0 +1,28 @@
1
+ // GSD Extension — Notify Interceptor
2
+ // Wraps ctx.ui.notify() in-place to persist every notification through the
3
+ // notification store. Uses a WeakSet to prevent double-wrapping and handle
4
+ // UI context replacement on /reload gracefully.
5
+ import { appendNotification } from "../notification-store.js";
6
+ // Track which ui context objects have been wrapped to prevent double-install.
7
+ // WeakSet allows GC to collect replaced uiContext instances after /reload.
8
+ const _wrappedContexts = new WeakSet();
9
+ /**
10
+ * Install the notify interceptor on a context's UI object.
11
+ * Mutates ctx.ui.notify in place — the original is called after persistence.
12
+ * Safe to call multiple times; no-ops if already installed on the same ui object.
13
+ */
14
+ export function installNotifyInterceptor(ctx) {
15
+ if (_wrappedContexts.has(ctx.ui))
16
+ return;
17
+ const originalNotify = ctx.ui.notify.bind(ctx.ui);
18
+ ctx.ui.notify = (message, type) => {
19
+ try {
20
+ appendNotification(message, (type ?? "info"), "notify");
21
+ }
22
+ catch {
23
+ // Non-fatal — never let persistence break the UI
24
+ }
25
+ originalNotify(message, type);
26
+ };
27
+ _wrappedContexts.add(ctx.ui);
28
+ }
@@ -0,0 +1,85 @@
1
+ // GSD2 — Read-only query tools exposing DB state to the LLM via the WAL connection
2
+ import { Type } from "@sinclair/typebox";
3
+ import { logWarning } from "../workflow-logger.js";
4
+ export function registerQueryTools(pi) {
5
+ pi.registerTool({
6
+ name: "gsd_milestone_status",
7
+ label: "Milestone Status",
8
+ description: "Read the current status of a milestone and all its slices from the GSD database. " +
9
+ "Returns milestone metadata, per-slice status, and task counts per slice. " +
10
+ "Use this instead of querying .gsd/gsd.db directly via sqlite3 or better-sqlite3.",
11
+ promptSnippet: "Get milestone status, slice statuses, and task counts for a given milestoneId",
12
+ promptGuidelines: [
13
+ "Use this tool — not sqlite3 or better-sqlite3 — to inspect milestone or slice state from the DB.",
14
+ ],
15
+ parameters: Type.Object({
16
+ milestoneId: Type.String({ description: "Milestone ID to query (e.g. M001)" }),
17
+ }),
18
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
19
+ try {
20
+ // Strictly read-only: only use an already-open DB connection.
21
+ // Do NOT call ensureDbOpen() — it can create/migrate the DB as a side effect.
22
+ const { isDbAvailable, getMilestone, getSliceStatusSummary, getSliceTaskCounts, _getAdapter, } = await import("../gsd-db.js");
23
+ if (!isDbAvailable()) {
24
+ return {
25
+ content: [{ type: "text", text: "Error: GSD database is not available." }],
26
+ details: { operation: "milestone_status", error: "db_unavailable" },
27
+ };
28
+ }
29
+ // Wrap all reads in a single transaction for snapshot consistency.
30
+ // SQLite WAL mode guarantees reads within a transaction see a single
31
+ // consistent snapshot, preventing torn reads from concurrent writes.
32
+ const adapter = _getAdapter();
33
+ adapter.exec("BEGIN"); // eslint-disable-line -- SQLite exec, not child_process
34
+ try {
35
+ const milestone = getMilestone(params.milestoneId);
36
+ if (!milestone) {
37
+ adapter.exec("COMMIT"); // eslint-disable-line
38
+ return {
39
+ content: [{ type: "text", text: `Milestone ${params.milestoneId} not found in database.` }],
40
+ details: { operation: "milestone_status", milestoneId: params.milestoneId, found: false },
41
+ };
42
+ }
43
+ const sliceStatuses = getSliceStatusSummary(params.milestoneId);
44
+ const slices = sliceStatuses.map((s) => {
45
+ const counts = getSliceTaskCounts(params.milestoneId, s.id);
46
+ return {
47
+ id: s.id,
48
+ status: s.status,
49
+ taskCounts: counts,
50
+ };
51
+ });
52
+ adapter.exec("COMMIT"); // eslint-disable-line
53
+ const result = {
54
+ milestoneId: milestone.id,
55
+ title: milestone.title,
56
+ status: milestone.status,
57
+ createdAt: milestone.created_at,
58
+ completedAt: milestone.completed_at,
59
+ sliceCount: slices.length,
60
+ slices,
61
+ };
62
+ return {
63
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
64
+ details: { operation: "milestone_status", milestoneId: milestone.id, sliceCount: slices.length },
65
+ };
66
+ }
67
+ catch (txErr) {
68
+ try {
69
+ adapter.exec("ROLLBACK");
70
+ }
71
+ catch { /* swallow */ } // eslint-disable-line
72
+ throw txErr;
73
+ }
74
+ }
75
+ catch (err) {
76
+ const msg = err instanceof Error ? err.message : String(err);
77
+ logWarning("tool", `gsd_milestone_status tool failed: ${msg}`);
78
+ return {
79
+ content: [{ type: "text", text: `Error querying milestone status: ${msg}` }],
80
+ details: { operation: "milestone_status", error: msg },
81
+ };
82
+ }
83
+ },
84
+ });
85
+ }
@@ -1,9 +1,11 @@
1
+ // GSD2 — Extension registration: wires all GSD tools, commands, and hooks into pi
1
2
  import { registerGSDCommand } from "../commands.js";
2
3
  import { registerExitCommand } from "../exit-command.js";
3
4
  import { registerWorktreeCommand } from "../worktree-command.js";
4
5
  import { registerDbTools } from "./db-tools.js";
5
6
  import { registerDynamicTools } from "./dynamic-tools.js";
6
7
  import { registerJournalTools } from "./journal-tools.js";
8
+ import { registerQueryTools } from "./query-tools.js";
7
9
  import { registerHooks } from "./register-hooks.js";
8
10
  import { registerShortcuts } from "./register-shortcuts.js";
9
11
  export function handleRecoverableExtensionProcessError(err) {
@@ -48,6 +50,7 @@ export function registerGsdExtension(pi) {
48
50
  registerDynamicTools(pi);
49
51
  registerDbTools(pi);
50
52
  registerJournalTools(pi);
53
+ registerQueryTools(pi);
51
54
  registerShortcuts(pi);
52
55
  registerHooks(pi);
53
56
  }
@@ -10,11 +10,17 @@ import { getDiscussionMilestoneId } from "../guided-flow.js";
10
10
  import { loadToolApiKeys } from "../commands-config.js";
11
11
  import { loadFile, saveFile, formatContinue } from "../files.js";
12
12
  import { deriveState } from "../state.js";
13
- import { getAutoDashboardData, isAutoActive, isAutoPaused, markToolEnd, markToolStart } from "../auto.js";
13
+ import { getAutoDashboardData, isAutoActive, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError } from "../auto.js";
14
14
  import { isParallelActive, shutdownParallel } from "../parallel-orchestrator.js";
15
15
  import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
16
16
  import { saveActivityLog } from "../activity-log.js";
17
17
  import { resetAskUserQuestionsCache } from "../../ask-user-questions.js";
18
+ import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult } from "../safety/evidence-collector.js";
19
+ import { classifyCommand } from "../safety/destructive-guard.js";
20
+ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
21
+ import { installNotifyInterceptor } from "./notify-interceptor.js";
22
+ import { initNotificationStore } from "../notification-store.js";
23
+ import { initNotificationWidget } from "../notification-widget.js";
18
24
  // Skip the welcome screen on the very first session_start — cli.ts already
19
25
  // printed it before the TUI launched. Only re-print on /clear (subsequent sessions).
20
26
  let isFirstSession = true;
@@ -24,6 +30,9 @@ async function syncServiceTierStatus(ctx) {
24
30
  }
25
31
  export function registerHooks(pi) {
26
32
  pi.on("session_start", async (_event, ctx) => {
33
+ initNotificationStore(process.cwd());
34
+ installNotifyInterceptor(ctx);
35
+ initNotificationWidget(ctx);
27
36
  resetWriteGateState();
28
37
  resetToolCallLoopGuard();
29
38
  resetAskUserQuestionsCache();
@@ -60,6 +69,8 @@ export function registerHooks(pi) {
60
69
  loadToolApiKeys();
61
70
  });
62
71
  pi.on("session_switch", async (_event, ctx) => {
72
+ initNotificationStore(process.cwd());
73
+ installNotifyInterceptor(ctx);
63
74
  resetWriteGateState();
64
75
  resetToolCallLoopGuard();
65
76
  resetAskUserQuestionsCache();
@@ -187,6 +198,22 @@ export function registerHooks(pi) {
187
198
  if (result.block)
188
199
  return result;
189
200
  });
201
+ // ── Safety harness: evidence collection + destructive command warnings ──
202
+ pi.on("tool_call", async (event, ctx) => {
203
+ if (!isAutoActive())
204
+ return;
205
+ safetyRecordToolCall(event.toolName, event.input);
206
+ // Destructive command classification (warn only, never block)
207
+ if (isToolCallEventType("bash", event)) {
208
+ const classification = classifyCommand(event.input.command);
209
+ if (classification.destructive) {
210
+ safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
211
+ command: String(event.input.command).slice(0, 200),
212
+ });
213
+ ctx.ui.notify(`Destructive command detected: ${classification.labels.join(", ")}`, "warning");
214
+ }
215
+ }
216
+ });
190
217
  pi.on("tool_result", async (event) => {
191
218
  if (event.toolName !== "ask_user_questions")
192
219
  return;
@@ -243,6 +270,18 @@ export function registerHooks(pi) {
243
270
  });
244
271
  pi.on("tool_execution_end", async (event) => {
245
272
  markToolEnd(event.toolCallId);
273
+ // #2883: Capture tool invocation errors (malformed/truncated JSON arguments)
274
+ // so postUnitPreVerification can break the retry loop instead of re-dispatching.
275
+ if (event.isError && event.toolName.startsWith("gsd_")) {
276
+ const errorText = typeof event.result === "string"
277
+ ? event.result
278
+ : (typeof event.result?.content?.[0]?.text === "string" ? event.result.content[0].text : String(event.result));
279
+ recordToolInvocationError(event.toolName, errorText);
280
+ }
281
+ // Safety harness: record tool execution results for evidence cross-referencing
282
+ if (isAutoActive()) {
283
+ safetyRecordToolResult(event.toolCallId, event.toolName, event.result, event.isError);
284
+ }
246
285
  });
247
286
  pi.on("model_select", async (_event, ctx) => {
248
287
  await syncServiceTierStatus(ctx);
@@ -2,6 +2,7 @@ import { existsSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { Key } from "@gsd/pi-tui";
4
4
  import { GSDDashboardOverlay } from "../dashboard-overlay.js";
5
+ import { GSDNotificationOverlay } from "../notification-overlay.js";
5
6
  import { ParallelMonitorOverlay } from "../parallel-monitor-overlay.js";
6
7
  import { shortcutDesc } from "../../shared/mod.js";
7
8
  export function registerShortcuts(pi) {
@@ -23,6 +24,20 @@ export function registerShortcuts(pi) {
23
24
  });
24
25
  },
25
26
  });
27
+ pi.registerShortcut(Key.ctrlAlt("n"), {
28
+ description: shortcutDesc("Open notification history", "/gsd notifications"),
29
+ handler: async (ctx) => {
30
+ await ctx.ui.custom((tui, theme, _kb, done) => new GSDNotificationOverlay(tui, theme, () => done()), {
31
+ overlay: true,
32
+ overlayOptions: {
33
+ width: "80%",
34
+ minWidth: 60,
35
+ maxHeight: "88%",
36
+ anchor: "center",
37
+ },
38
+ });
39
+ },
40
+ });
26
41
  pi.registerShortcut(Key.ctrlAlt("p"), {
27
42
  description: shortcutDesc("Open parallel worker monitor", "/gsd parallel watch"),
28
43
  handler: async (ctx) => {
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Input sanitization for gsd_complete_milestone parameters.
3
+ *
4
+ * The Claude SDK deserializes tool-call JSON before the handler runs.
5
+ * When an LLM (especially smaller models like haiku) generates large markdown
6
+ * parameters, the JSON can arrive with subtly wrong types — numbers where
7
+ * strings are expected, null where arrays belong, string "true" instead of
8
+ * boolean true, etc. This sanitizer normalizes all fields so
9
+ * handleCompleteMilestone never crashes on type mismatches.
10
+ *
11
+ * See: https://github.com/gsd-build/gsd-2/issues/3013
12
+ */
13
+ /**
14
+ * Coerce an unknown value to a trimmed string.
15
+ * Returns "" for null / undefined.
16
+ */
17
+ function toStr(v) {
18
+ if (v == null)
19
+ return "";
20
+ return String(v).trim();
21
+ }
22
+ /**
23
+ * Coerce an unknown value to an array of trimmed, non-empty strings.
24
+ * - If already an array, filter/trim each element.
25
+ * - Otherwise return [].
26
+ */
27
+ function toStrArray(v) {
28
+ if (!Array.isArray(v))
29
+ return [];
30
+ return v
31
+ .map((item) => (item == null ? "" : String(item).trim()))
32
+ .filter((s) => s.length > 0);
33
+ }
34
+ /**
35
+ * Sanitize raw params from the tool-call framework into well-typed
36
+ * CompleteMilestoneParams, tolerating type mismatches from LLM JSON quirks.
37
+ */
38
+ export function sanitizeCompleteMilestoneParams(raw) {
39
+ return {
40
+ milestoneId: toStr(raw.milestoneId),
41
+ title: toStr(raw.title),
42
+ oneLiner: toStr(raw.oneLiner),
43
+ narrative: toStr(raw.narrative),
44
+ successCriteriaResults: toStr(raw.successCriteriaResults),
45
+ definitionOfDoneResults: toStr(raw.definitionOfDoneResults),
46
+ requirementOutcomes: toStr(raw.requirementOutcomes),
47
+ keyDecisions: toStrArray(raw.keyDecisions),
48
+ keyFiles: toStrArray(raw.keyFiles),
49
+ lessonsLearned: toStrArray(raw.lessonsLearned),
50
+ followUps: toStr(raw.followUps),
51
+ deviations: toStr(raw.deviations),
52
+ verificationPassed: raw.verificationPassed === true || raw.verificationPassed === "true",
53
+ };
54
+ }
@@ -3,9 +3,10 @@ import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import { logWarning } from "../workflow-logger.js";
5
5
  import { debugTime } from "../debug-logger.js";
6
- import { loadPrompt } from "../prompt-loader.js";
6
+ import { loadPrompt, getTemplatesDir } from "../prompt-loader.js";
7
7
  import { readForensicsMarker } from "../forensics.js";
8
8
  import { resolveAllSkillReferences, renderPreferencesForSystemPrompt, loadEffectiveGSDPreferences } from "../preferences.js";
9
+ import { resolveSkillReference } from "../preferences-skills.js";
9
10
  import { resolveGsdRootFile, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTaskFiles, resolveTasksDir, relSliceFile, relSlicePath, relTaskFile } from "../paths.js";
10
11
  import { hasSkillSnapshot, detectNewSkills, formatSkillsXml } from "../skill-discovery.js";
11
12
  import { getActiveAutoWorktreeContext } from "../auto-worktree.js";
@@ -15,6 +16,30 @@ import { formatOverridesSection, loadActiveOverrides, loadFile, parseContinue, p
15
16
  import { toPosixPath } from "../../shared/mod.js";
16
17
  import { markCmuxPromptShown, shouldPromptToEnableCmux } from "../../cmux/index.js";
17
18
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
19
+ /**
20
+ * Bundled skill triggers — resolved dynamically at runtime instead of
21
+ * hardcoding absolute paths in the system prompt template. Only skills
22
+ * that actually exist on disk are included in the table. (#3575)
23
+ */
24
+ const BUNDLED_SKILL_TRIGGERS = [
25
+ { trigger: "Frontend UI - web components, pages, landing pages, dashboards, React/HTML/CSS, styling", skill: "frontend-design" },
26
+ { trigger: "macOS or iOS apps - SwiftUI, Xcode, App Store", skill: "swiftui" },
27
+ { trigger: "Debugging - complex bugs, failing tests, root-cause investigation after standard approaches fail", skill: "debug-like-expert" },
28
+ ];
29
+ function buildBundledSkillsTable() {
30
+ const cwd = process.cwd();
31
+ const rows = [];
32
+ for (const { trigger, skill } of BUNDLED_SKILL_TRIGGERS) {
33
+ const resolution = resolveSkillReference(skill, cwd);
34
+ if (resolution.method === "unresolved")
35
+ continue; // skill not installed — omit from prompt
36
+ rows.push(`| ${trigger} | \`${resolution.resolvedPath}\` |`);
37
+ }
38
+ if (rows.length === 0) {
39
+ return "*No bundled skills found. Install skills to `~/.agents/skills/` or `~/.claude/skills/`.*";
40
+ }
41
+ return `| Trigger | Skill to load |\n|---|---|\n${rows.join("\n")}`;
42
+ }
18
43
  function warnDeprecatedAgentInstructions() {
19
44
  const paths = [
20
45
  join(gsdHome, "agent-instructions.md"),
@@ -32,7 +57,10 @@ export async function buildBeforeAgentStartResult(event, ctx) {
32
57
  if (!existsSync(join(process.cwd(), ".gsd")))
33
58
  return undefined;
34
59
  const stopContextTimer = debugTime("context-inject");
35
- const systemContent = loadPrompt("system");
60
+ const systemContent = loadPrompt("system", {
61
+ bundledSkillsTable: buildBundledSkillsTable(),
62
+ templatesDir: getTemplatesDir(),
63
+ });
36
64
  const loadedPreferences = loadEffectiveGSDPreferences();
37
65
  if (shouldPromptToEnableCmux(loadedPreferences?.preferences)) {
38
66
  markCmuxPromptShown();
@@ -201,6 +229,12 @@ function buildWorktreeContextBlock() {
201
229
  }
202
230
  return "";
203
231
  }
232
+ /**
233
+ * Low-entropy resume intent patterns — short phrases a user types to
234
+ * continue work after a pause, rate limit, or context reset (#3615).
235
+ * Tested against the trimmed, lowercased prompt with trailing punctuation stripped.
236
+ */
237
+ const RESUME_INTENT_PATTERNS = /^(continue|resume|ok|go|go ahead|proceed|keep going|carry on|next|yes|yeah|yep|sure|do it|let's go|pick up where you left off)$/;
204
238
  async function buildGuidedExecuteContextInjection(prompt, basePath) {
205
239
  const executeMatch = prompt.match(/Execute the next task:\s+(T\d+)\s+\("([^"]+)"\)\s+in slice\s+(S\d+)\s+of milestone\s+(M\d+(?:-[a-z0-9]{6})?)/i);
206
240
  if (executeMatch) {
@@ -215,6 +249,20 @@ async function buildGuidedExecuteContextInjection(prompt, basePath) {
215
249
  return buildTaskExecutionContextInjection(basePath, milestoneId, sliceId, state.activeTask.id, state.activeTask.title);
216
250
  }
217
251
  }
252
+ // Fallback: low-entropy resume prompt (e.g., "continue", "ok", "go ahead")
253
+ // during an active executing task — inject task context so the agent
254
+ // doesn't rebuild from scratch (#3615).
255
+ // Intent-gated: only fire for short, resume-like prompts to avoid hijacking
256
+ // control/help/diagnostic prompts with unrelated execution context.
257
+ // Phase-gated: only fire during "executing" to avoid misrouting during
258
+ // replanning, gate evaluation, or other non-execution phases.
259
+ const trimmed = prompt.trim().toLowerCase().replace(/[.!?,]+$/g, "");
260
+ if (RESUME_INTENT_PATTERNS.test(trimmed)) {
261
+ const state = await deriveState(basePath);
262
+ if (state.phase === "executing" && state.activeTask && state.activeMilestone && state.activeSlice) {
263
+ return buildTaskExecutionContextInjection(basePath, state.activeMilestone.id, state.activeSlice.id, state.activeTask.id, state.activeTask.title);
264
+ }
265
+ }
218
266
  return null;
219
267
  }
220
268
  async function buildTaskExecutionContextInjection(basePath, milestoneId, sliceId, taskId, taskTitle) {
@@ -4,7 +4,7 @@ import { join } from "node:path";
4
4
  import { loadRegistry } from "../workflow-templates.js";
5
5
  import { resolveProjectRoot } from "../worktree.js";
6
6
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
7
- export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink|codebase";
7
+ export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink|codebase|notifications";
8
8
  export const TOP_LEVEL_SUBCOMMANDS = [
9
9
  { cmd: "help", desc: "Categorized command reference with descriptions" },
10
10
  { cmd: "next", desc: "Explicit step mode (same as /gsd)" },
@@ -36,6 +36,7 @@ export const TOP_LEVEL_SUBCOMMANDS = [
36
36
  { cmd: "hooks", desc: "Show configured post-unit and pre-dispatch hooks" },
37
37
  { cmd: "run-hook", desc: "Manually trigger a specific hook" },
38
38
  { cmd: "skill-health", desc: "Skill lifecycle dashboard" },
39
+ { cmd: "notifications", desc: "View, filter, and clear persistent notification history" },
39
40
  { cmd: "doctor", desc: "Runtime health checks with auto-fix" },
40
41
  { cmd: "logs", desc: "Browse activity logs, debug logs, and metrics" },
41
42
  { cmd: "forensics", desc: "Examine execution logs" },
@@ -97,6 +98,11 @@ const NESTED_COMPLETIONS = {
97
98
  { cmd: "keys", desc: "Manage API keys" },
98
99
  { cmd: "prefs", desc: "Configure global preferences" },
99
100
  ],
101
+ notifications: [
102
+ { cmd: "clear", desc: "Clear all notifications" },
103
+ { cmd: "tail", desc: "Show last N notifications (default: 20)" },
104
+ { cmd: "filter", desc: "Filter by severity (error|warning|info|success)" },
105
+ ],
100
106
  logs: [
101
107
  { cmd: "debug", desc: "List or view debug log files" },
102
108
  { cmd: "tail", desc: "Show last N activity log summaries" },
@@ -25,6 +25,7 @@ export function showHelp(ctx) {
25
25
  " /gsd queue Show queued/dispatched units and execution order",
26
26
  " /gsd history View execution history [--cost] [--phase] [--model] [N]",
27
27
  " /gsd changelog Show categorized release notes [version]",
28
+ " /gsd notifications View persistent notification history [clear|tail|filter] (Ctrl+Alt+N)",
28
29
  "",
29
30
  "COURSE CORRECTION",
30
31
  " /gsd steer <desc> Apply user override to active work",
@@ -0,0 +1,103 @@
1
+ // GSD Extension — /gsd notifications Command Handler
2
+ // View, filter, and clear the persistent notification history.
3
+ import { readNotifications, clearNotifications, getUnreadCount, suppressPersistence, unsuppressPersistence, } from "../../notification-store.js";
4
+ import { GSDNotificationOverlay } from "../../notification-overlay.js";
5
+ function severityIcon(severity) {
6
+ switch (severity) {
7
+ case "error": return "✗";
8
+ case "warning": return "⚠";
9
+ case "success": return "✓";
10
+ case "info":
11
+ default: return "●";
12
+ }
13
+ }
14
+ function formatTimestamp(ts) {
15
+ try {
16
+ const d = new Date(ts);
17
+ return d.toLocaleString("en-US", { hour12: false, month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" });
18
+ }
19
+ catch {
20
+ return ts.slice(0, 19);
21
+ }
22
+ }
23
+ export async function handleNotificationsCommand(args, ctx, pi) {
24
+ // /gsd notifications clear
25
+ if (args === "clear") {
26
+ clearNotifications();
27
+ // Suppress persistence so the confirmation toast doesn't re-populate the store
28
+ suppressPersistence();
29
+ try {
30
+ ctx.ui.notify("All notifications cleared.", "success");
31
+ }
32
+ finally {
33
+ unsuppressPersistence();
34
+ }
35
+ return true;
36
+ }
37
+ // /gsd notifications tail [N]
38
+ if (args === "tail" || args.startsWith("tail ")) {
39
+ const countStr = args.replace(/^tail\s*/, "").trim();
40
+ const count = countStr ? parseInt(countStr, 10) : 20;
41
+ const n = isNaN(count) || count < 1 ? 20 : Math.min(count, 100);
42
+ const entries = readNotifications().slice(0, n);
43
+ if (entries.length === 0) {
44
+ ctx.ui.notify("No notifications.", "info");
45
+ return true;
46
+ }
47
+ const lines = entries.map((e) => `${severityIcon(e.severity)} [${formatTimestamp(e.ts)}] ${e.message}`);
48
+ ctx.ui.notify(`Last ${entries.length} notification(s):\n${lines.join("\n")}`, "info");
49
+ return true;
50
+ }
51
+ // /gsd notifications filter <severity>
52
+ if (args.startsWith("filter ")) {
53
+ const severity = args.replace(/^filter\s+/, "").trim().toLowerCase();
54
+ if (!["error", "warning", "info", "success"].includes(severity)) {
55
+ ctx.ui.notify("Usage: /gsd notifications filter <error|warning|info|success>", "warning");
56
+ return true;
57
+ }
58
+ const entries = readNotifications().filter((e) => e.severity === severity);
59
+ if (entries.length === 0) {
60
+ ctx.ui.notify(`No ${severity} notifications.`, "info");
61
+ return true;
62
+ }
63
+ const lines = entries.slice(0, 20).map((e) => `${severityIcon(e.severity)} [${formatTimestamp(e.ts)}] ${e.message}`);
64
+ const suffix = entries.length > 20 ? `\n... and ${entries.length - 20} more` : "";
65
+ ctx.ui.notify(`${severity} notifications (${entries.length}):\n${lines.join("\n")}${suffix}`, "info");
66
+ return true;
67
+ }
68
+ // /gsd notifications (no args) — open overlay in TUI, or print summary
69
+ if (args === "" || args === "status") {
70
+ // Try overlay first (TUI mode)
71
+ if (ctx.hasUI) {
72
+ try {
73
+ await ctx.ui.custom((tui, theme, _kb, done) => new GSDNotificationOverlay(tui, theme, () => done()), {
74
+ overlay: true,
75
+ overlayOptions: {
76
+ width: "80%",
77
+ minWidth: 60,
78
+ maxHeight: "88%",
79
+ anchor: "center",
80
+ },
81
+ });
82
+ return true;
83
+ }
84
+ catch {
85
+ // Fall through to text output if overlay fails
86
+ }
87
+ }
88
+ // Text fallback (RPC/headless mode)
89
+ const unread = getUnreadCount();
90
+ const entries = readNotifications().slice(0, 10);
91
+ if (entries.length === 0) {
92
+ ctx.ui.notify("No notifications.", "info");
93
+ return true;
94
+ }
95
+ const lines = entries.map((e) => `${severityIcon(e.severity)} [${formatTimestamp(e.ts)}] ${e.message}`);
96
+ const header = unread > 0 ? `${unread} unread — ` : "";
97
+ ctx.ui.notify(`${header}Recent notifications:\n${lines.join("\n")}`, "info");
98
+ return true;
99
+ }
100
+ // Unknown subcommand
101
+ ctx.ui.notify("Usage: /gsd notifications [clear|tail [N]|filter <severity>]", "warning");
102
+ return true;
103
+ }
@@ -175,6 +175,11 @@ Examples:
175
175
  await dispatchDirectPhase(ctx, pi, phase, projectRoot());
176
176
  return true;
177
177
  }
178
+ if (trimmed === "notifications" || trimmed.startsWith("notifications ")) {
179
+ const { handleNotificationsCommand } = await import("./notifications-handler.js");
180
+ await handleNotificationsCommand(trimmed.replace(/^notifications\s*/, "").trim(), ctx, pi);
181
+ return true;
182
+ }
178
183
  if (trimmed === "inspect") {
179
184
  await handleInspect(ctx);
180
185
  return true;
@@ -27,21 +27,26 @@ export function dispatchDoctorHeal(pi, scope, reportText, structuredIssues) {
27
27
  const content = `Read the following GSD workflow protocol and execute exactly.\n\n${workflow}\n\n## Your Task\n\n${prompt}`;
28
28
  pi.sendMessage({ customType: "gsd-doctor-heal", content, display: false }, { triggerTurn: true });
29
29
  }
30
- export async function handleDoctor(args, ctx, pi) {
30
+ /** Parse doctor command args into structured flags and positionals (pure, no I/O). */
31
+ export function parseDoctorArgs(args) {
31
32
  const trimmed = args.trim();
32
- // Extract flags before positional parsing
33
33
  const jsonMode = trimmed.includes("--json");
34
34
  const dryRun = trimmed.includes("--dry-run");
35
+ const fixFlag = trimmed.includes("--fix");
35
36
  const includeBuild = trimmed.includes("--build");
36
37
  const includeTests = trimmed.includes("--test");
37
- const stripped = trimmed.replace(/--json|--dry-run|--build|--test/g, "").trim();
38
+ const stripped = trimmed.replace(/--json|--dry-run|--build|--test|--fix/g, "").trim();
38
39
  const parts = stripped ? stripped.split(/\s+/) : [];
39
40
  const mode = parts[0] === "fix" || parts[0] === "heal" || parts[0] === "audit" ? parts[0] : "doctor";
40
41
  const requestedScope = mode === "doctor" ? parts[0] : parts[1];
42
+ return { jsonMode, dryRun, fixFlag, includeBuild, includeTests, mode, requestedScope };
43
+ }
44
+ export async function handleDoctor(args, ctx, pi) {
45
+ const { jsonMode, dryRun, fixFlag, includeBuild, includeTests, mode, requestedScope } = parseDoctorArgs(args);
41
46
  const scope = await selectDoctorScope(projectRoot(), requestedScope);
42
47
  const effectiveScope = mode === "audit" ? requestedScope : scope;
43
48
  const report = await runGSDDoctor(projectRoot(), {
44
- fix: mode === "fix" || mode === "heal" || dryRun,
49
+ fix: mode === "fix" || mode === "heal" || dryRun || fixFlag,
45
50
  dryRun,
46
51
  scope: effectiveScope,
47
52
  includeBuild,
@@ -13,3 +13,45 @@ export const DEFAULT_BASH_TIMEOUT_SECS = 120;
13
13
  export const DIR_CACHE_MAX = 200;
14
14
  /** Max parse-cache entries before eviction. */
15
15
  export const CACHE_MAX = 50;
16
+ // ─── Tool Scoping ─────────────────────────────────────────────────────────────
17
+ /**
18
+ * GSD tools allowed during discuss flows (#2949).
19
+ *
20
+ * xAI/Grok (and potentially other providers with grammar-based constrained
21
+ * decoding) return "Grammar is too complex" (HTTP 400) when the combined
22
+ * tool schemas exceed their internal grammar limit. The full GSD tool set
23
+ * registers ~33 tools with deeply nested schemas; discuss flows only need
24
+ * a small subset.
25
+ *
26
+ * By scoping tools to this allowlist during discuss dispatches, the grammar
27
+ * sent to the provider stays well under provider limits.
28
+ *
29
+ * Included tools and why:
30
+ * - gsd_summary_save: writes CONTEXT.md artifacts (all discuss prompts)
31
+ * - gsd_save_summary: alias for above
32
+ * - gsd_decision_save: records decisions (discuss.md output phase)
33
+ * - gsd_save_decision: alias for above
34
+ * - gsd_plan_milestone: writes roadmap (discuss.md single/multi milestone)
35
+ * - gsd_milestone_plan: alias for above
36
+ * - gsd_milestone_generate_id: generates milestone IDs (discuss.md multi-milestone)
37
+ * - gsd_generate_milestone_id: alias for above
38
+ * - gsd_requirement_update: updates requirements during discuss
39
+ * - gsd_update_requirement: alias for above
40
+ */
41
+ export const DISCUSS_TOOLS_ALLOWLIST = [
42
+ // Context / summary writing
43
+ "gsd_summary_save",
44
+ "gsd_save_summary",
45
+ // Decision recording
46
+ "gsd_decision_save",
47
+ "gsd_save_decision",
48
+ // Milestone planning (needed for discuss.md output phase)
49
+ "gsd_plan_milestone",
50
+ "gsd_milestone_plan",
51
+ // Milestone ID generation (multi-milestone flow)
52
+ "gsd_milestone_generate_id",
53
+ "gsd_generate_milestone_id",
54
+ // Requirement updates
55
+ "gsd_requirement_update",
56
+ "gsd_update_requirement",
57
+ ];