gsd-pi 2.78.0 → 2.78.1-dev.8a893322c

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 (559) hide show
  1. package/README.md +60 -23
  2. package/dist/bundled-resource-path.d.ts +7 -0
  3. package/dist/bundled-resource-path.js +34 -2
  4. package/dist/claude-cli-check.js +104 -33
  5. package/dist/cli-policy.d.ts +13 -0
  6. package/dist/cli-policy.js +17 -0
  7. package/dist/cli.js +95 -55
  8. package/dist/headless-query.d.ts +22 -0
  9. package/dist/headless-query.js +43 -8
  10. package/dist/headless.d.ts +10 -0
  11. package/dist/headless.js +16 -1
  12. package/dist/loader.js +9 -13
  13. package/dist/onboarding.d.ts +10 -0
  14. package/dist/onboarding.js +2 -2
  15. package/dist/provider-migrations.d.ts +2 -2
  16. package/dist/provider-migrations.js +5 -2
  17. package/dist/resource-loader.d.ts +5 -2
  18. package/dist/resource-loader.js +30 -13
  19. package/dist/resources/.managed-resources-content-hash +1 -0
  20. package/dist/resources/extensions/claude-code-cli/readiness.js +128 -32
  21. package/dist/resources/extensions/google-search/index.js +2 -6
  22. package/dist/resources/extensions/gsd/auto/loop.js +23 -0
  23. package/dist/resources/extensions/gsd/auto/phases.js +5 -13
  24. package/dist/resources/extensions/gsd/auto/run-unit.js +3 -1
  25. package/dist/resources/extensions/gsd/auto/session.js +5 -6
  26. package/dist/resources/extensions/gsd/auto-dashboard.js +3 -2
  27. package/dist/resources/extensions/gsd/auto-dispatch.js +18 -6
  28. package/dist/resources/extensions/gsd/auto-prompts.js +63 -2
  29. package/dist/resources/extensions/gsd/auto-recovery.js +43 -4
  30. package/dist/resources/extensions/gsd/auto-runtime-state.js +31 -0
  31. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  32. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
  33. package/dist/resources/extensions/gsd/auto-worktree.js +60 -13
  34. package/dist/resources/extensions/gsd/auto.js +14 -5
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -2
  36. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -5
  37. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  38. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -4
  39. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +112 -31
  40. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +11 -6
  41. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +22 -0
  42. package/dist/resources/extensions/gsd/bootstrap/system-context.js +45 -8
  43. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +121 -3
  44. package/dist/resources/extensions/gsd/commands/catalog.js +76 -5
  45. package/dist/resources/extensions/gsd/commands/handlers/core.js +23 -1
  46. package/dist/resources/extensions/gsd/commands/handlers/ops.js +8 -0
  47. package/dist/resources/extensions/gsd/commands-config.js +3 -2
  48. package/dist/resources/extensions/gsd/commands-extensions.js +46 -3
  49. package/dist/resources/extensions/gsd/commands-handlers.js +3 -2
  50. package/dist/resources/extensions/gsd/commands-mcp-status.js +3 -1
  51. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -1
  52. package/dist/resources/extensions/gsd/commands-worktree.js +309 -0
  53. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  54. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  55. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  56. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +39 -1
  57. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  58. package/dist/resources/extensions/gsd/forensics.js +10 -8
  59. package/dist/resources/extensions/gsd/git-service.js +12 -5
  60. package/dist/resources/extensions/gsd/gsd-db.js +11 -2
  61. package/dist/resources/extensions/gsd/guided-flow.js +25 -24
  62. package/dist/resources/extensions/gsd/home-dir.js +16 -0
  63. package/dist/resources/extensions/gsd/key-manager.js +2 -1
  64. package/dist/resources/extensions/gsd/memory-store.js +66 -31
  65. package/dist/resources/extensions/gsd/migrate/command.js +3 -2
  66. package/dist/resources/extensions/gsd/milestone-id-reservation.js +36 -0
  67. package/dist/resources/extensions/gsd/model-router.js +114 -9
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -1
  69. package/dist/resources/extensions/gsd/preferences-models.js +91 -15
  70. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  71. package/dist/resources/extensions/gsd/preferences-validation.js +32 -0
  72. package/dist/resources/extensions/gsd/preferences.js +5 -3
  73. package/dist/resources/extensions/gsd/prompt-loader.js +23 -12
  74. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -0
  76. package/dist/resources/extensions/gsd/prompts/plan-slice.md +10 -0
  77. package/dist/resources/extensions/gsd/prompts/refine-slice.md +10 -0
  78. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +9 -3
  79. package/dist/resources/extensions/gsd/state.js +42 -0
  80. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  81. package/dist/resources/extensions/gsd/tools/memory-tools.js +18 -1
  82. package/dist/resources/extensions/gsd/unit-context-manifest.js +29 -4
  83. package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
  84. package/dist/resources/extensions/gsd/watch/header-renderer.js +3 -1
  85. package/dist/resources/extensions/gsd/worktree-command.js +26 -46
  86. package/dist/resources/extensions/gsd/worktree-manager.js +20 -1
  87. package/dist/resources/extensions/gsd/worktree-resolver.js +4 -13
  88. package/dist/resources/extensions/gsd/worktree-root.js +124 -0
  89. package/dist/resources/extensions/gsd/worktree-session-state.js +33 -0
  90. package/dist/resources/extensions/gsd/worktree.js +4 -115
  91. package/dist/resources/extensions/mcp-client/index.js +6 -9
  92. package/dist/resources/extensions/ollama/index.js +15 -2
  93. package/dist/resources/extensions/ollama/model-capabilities.js +31 -0
  94. package/dist/resources/extensions/ollama/ollama-client.js +40 -4
  95. package/dist/resources/extensions/slash-commands/create-extension.js +36 -22
  96. package/dist/resources/extensions/subagent/index.js +324 -178
  97. package/dist/resources/skills/create-gsd-extension/SKILL.md +9 -5
  98. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  99. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  100. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  101. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  102. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  103. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  104. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  105. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  106. package/dist/rtk-shared.d.ts +3 -0
  107. package/dist/rtk-shared.js +17 -0
  108. package/dist/rtk.d.ts +2 -5
  109. package/dist/rtk.js +3 -20
  110. package/dist/runtime-checks.d.ts +27 -0
  111. package/dist/runtime-checks.js +38 -0
  112. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  113. package/dist/web/standalone/.next/BUILD_ID +1 -1
  114. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  115. package/dist/web/standalone/.next/build-manifest.json +4 -4
  116. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  117. package/dist/web/standalone/.next/react-loadable-manifest.json +44 -4
  118. package/dist/web/standalone/.next/required-server-files.json +3 -3
  119. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  120. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  130. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  146. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  158. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  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_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  188. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/events/route.js +4 -2
  194. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  208. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  210. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  212. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  214. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/index.html +1 -1
  224. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  225. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  226. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  227. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  228. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  229. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  230. package/dist/web/standalone/.next/server/app/page.js +2 -2
  231. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  233. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  234. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  235. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  237. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  238. package/dist/web/standalone/.next/server/middleware.js +2 -2
  239. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  241. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  242. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  243. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  244. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  245. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +10 -0
  252. package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +2 -0
  253. package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +20 -0
  254. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  256. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  257. package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  259. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  260. package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +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/package.json +2 -1
  268. package/dist/web/standalone/server.js +1 -1
  269. package/dist/welcome-screen.js +27 -1
  270. package/dist/worktree-cli.d.ts +1 -0
  271. package/dist/worktree-cli.js +9 -3
  272. package/dist/worktree-status-banner.d.ts +1 -0
  273. package/dist/worktree-status-banner.js +132 -0
  274. package/package.json +1 -3
  275. package/packages/daemon/package.json +2 -2
  276. package/packages/mcp-server/dist/alias-telemetry.d.ts +8 -0
  277. package/packages/mcp-server/dist/alias-telemetry.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/alias-telemetry.js +30 -0
  279. package/packages/mcp-server/dist/alias-telemetry.js.map +1 -0
  280. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  281. package/packages/mcp-server/dist/workflow-tools.js +74 -46
  282. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  283. package/packages/mcp-server/package.json +2 -2
  284. package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
  285. package/packages/mcp-server/src/alias-telemetry.ts +30 -0
  286. package/packages/mcp-server/src/workflow-tools.test.ts +78 -0
  287. package/packages/mcp-server/src/workflow-tools.ts +93 -58
  288. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  289. package/packages/native/package.json +1 -1
  290. package/packages/native/tsconfig.tsbuildinfo +1 -1
  291. package/packages/pi-agent-core/package.json +1 -1
  292. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  293. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +2 -0
  294. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +1 -0
  295. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +231 -0
  296. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +1 -0
  297. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  298. package/packages/pi-ai/dist/providers/anthropic-shared.js +48 -19
  299. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  300. package/packages/pi-ai/dist/types.d.ts +13 -0
  301. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/types.js.map +1 -1
  303. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  304. package/packages/pi-ai/dist/utils/repair-tool-json.js +24 -3
  305. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  306. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +26 -0
  307. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  308. package/packages/pi-ai/package.json +1 -1
  309. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
  310. package/packages/pi-ai/src/providers/anthropic-shared.ts +52 -20
  311. package/packages/pi-ai/src/types.ts +13 -0
  312. package/packages/pi-ai/src/utils/repair-tool-json.ts +24 -3
  313. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +32 -0
  314. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  315. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/agent-session.js +6 -0
  317. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  319. package/packages/pi-coding-agent/dist/core/messages.js +4 -0
  320. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  322. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +10 -0
  324. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/core/model-registry.js +18 -0
  326. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +13 -0
  328. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/system-prompt.js +20 -16
  330. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +37 -0
  332. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +1 -0
  333. package/packages/pi-coding-agent/dist/core/token-telemetry.js +49 -0
  334. package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +1 -0
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +2 -0
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +1 -0
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +133 -0
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -0
  339. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +2 -0
  344. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +1 -0
  345. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +78 -0
  346. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +1 -0
  347. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +2 -0
  348. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +1 -0
  349. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +181 -0
  350. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +1 -0
  351. package/packages/pi-coding-agent/package.json +1 -1
  352. package/packages/pi-coding-agent/src/core/agent-session.ts +7 -0
  353. package/packages/pi-coding-agent/src/core/messages.ts +4 -0
  354. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +32 -2
  355. package/packages/pi-coding-agent/src/core/model-registry.ts +21 -0
  356. package/packages/pi-coding-agent/src/core/system-prompt.ts +33 -15
  357. package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
  358. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +212 -0
  359. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +17 -1
  360. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
  361. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
  362. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
  363. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  364. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +17 -3
  365. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  366. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
  367. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
  368. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
  369. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
  370. package/packages/pi-tui/package.json +1 -1
  371. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -3
  372. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
  373. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  374. package/packages/rpc-client/package.json +1 -1
  375. package/pkg/package.json +1 -1
  376. package/src/resources/extensions/claude-code-cli/readiness.ts +130 -30
  377. package/src/resources/extensions/google-search/index.ts +2 -9
  378. package/src/resources/extensions/gsd/auto/loop.ts +24 -2
  379. package/src/resources/extensions/gsd/auto/phases.ts +6 -14
  380. package/src/resources/extensions/gsd/auto/run-unit.ts +3 -1
  381. package/src/resources/extensions/gsd/auto/session.ts +5 -6
  382. package/src/resources/extensions/gsd/auto/types.ts +1 -0
  383. package/src/resources/extensions/gsd/auto-dashboard.ts +3 -2
  384. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -6
  385. package/src/resources/extensions/gsd/auto-prompts.ts +60 -2
  386. package/src/resources/extensions/gsd/auto-recovery.ts +46 -8
  387. package/src/resources/extensions/gsd/auto-runtime-state.ts +51 -0
  388. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  389. package/src/resources/extensions/gsd/auto-tool-tracking.ts +2 -4
  390. package/src/resources/extensions/gsd/auto-worktree.ts +82 -12
  391. package/src/resources/extensions/gsd/auto.ts +14 -4
  392. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -13
  393. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -7
  394. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  395. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +10 -9
  396. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +121 -31
  397. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +12 -6
  398. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +20 -0
  399. package/src/resources/extensions/gsd/bootstrap/system-context.ts +50 -8
  400. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +141 -11
  401. package/src/resources/extensions/gsd/commands/catalog.ts +82 -5
  402. package/src/resources/extensions/gsd/commands/handlers/core.ts +23 -1
  403. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  404. package/src/resources/extensions/gsd/commands-config.ts +3 -2
  405. package/src/resources/extensions/gsd/commands-extensions.ts +43 -3
  406. package/src/resources/extensions/gsd/commands-handlers.ts +3 -2
  407. package/src/resources/extensions/gsd/commands-mcp-status.ts +3 -1
  408. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -1
  409. package/src/resources/extensions/gsd/commands-worktree.ts +383 -0
  410. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  411. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  412. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  413. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +39 -1
  414. package/src/resources/extensions/gsd/doctor-types.ts +3 -1
  415. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  416. package/src/resources/extensions/gsd/forensics.ts +12 -7
  417. package/src/resources/extensions/gsd/git-service.ts +13 -5
  418. package/src/resources/extensions/gsd/gsd-db.ts +12 -2
  419. package/src/resources/extensions/gsd/guided-flow.ts +27 -26
  420. package/src/resources/extensions/gsd/home-dir.ts +19 -0
  421. package/src/resources/extensions/gsd/journal.ts +4 -1
  422. package/src/resources/extensions/gsd/key-manager.ts +2 -1
  423. package/src/resources/extensions/gsd/memory-store.ts +81 -28
  424. package/src/resources/extensions/gsd/migrate/command.ts +3 -2
  425. package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
  426. package/src/resources/extensions/gsd/model-router.ts +172 -9
  427. package/src/resources/extensions/gsd/native-git-bridge.ts +7 -1
  428. package/src/resources/extensions/gsd/preferences-models.ts +101 -15
  429. package/src/resources/extensions/gsd/preferences-types.ts +6 -0
  430. package/src/resources/extensions/gsd/preferences-validation.ts +35 -0
  431. package/src/resources/extensions/gsd/preferences.ts +16 -2
  432. package/src/resources/extensions/gsd/prompt-loader.ts +26 -12
  433. package/src/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
  434. package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -0
  435. package/src/resources/extensions/gsd/prompts/plan-slice.md +10 -0
  436. package/src/resources/extensions/gsd/prompts/refine-slice.md +10 -0
  437. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +9 -3
  438. package/src/resources/extensions/gsd/state.ts +42 -0
  439. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  440. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +178 -1
  441. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +58 -0
  442. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +24 -5
  443. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +21 -4
  444. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
  445. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +138 -211
  446. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +50 -27
  447. package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
  448. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +48 -0
  449. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +142 -59
  450. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -4
  451. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +89 -32
  452. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +41 -23
  453. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +3 -43
  454. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +5 -3
  455. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +116 -0
  456. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +22 -87
  457. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +7 -118
  458. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +18 -60
  459. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
  460. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +14 -76
  461. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
  462. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +22 -83
  463. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +1 -63
  464. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
  465. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +26 -1
  466. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +63 -0
  467. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +25 -65
  468. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +30 -0
  469. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +81 -0
  470. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +14 -4
  471. package/src/resources/extensions/gsd/tests/health-widget.test.ts +22 -12
  472. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
  473. package/src/resources/extensions/gsd/tests/home-dir.test.ts +52 -0
  474. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
  475. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +64 -1
  476. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +72 -1
  477. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -23
  478. package/src/resources/extensions/gsd/tests/memory-store.test.ts +128 -0
  479. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +33 -1
  480. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +124 -0
  481. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
  482. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +18 -1
  483. package/src/resources/extensions/gsd/tests/model-router.test.ts +169 -8
  484. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
  485. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +8 -0
  486. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +32 -43
  487. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +4 -10
  488. package/src/resources/extensions/gsd/tests/preferences.test.ts +127 -0
  489. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -0
  490. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +7 -0
  491. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
  492. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +93 -0
  493. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +34 -0
  494. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +168 -19
  495. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +7 -1
  496. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +23 -1
  497. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +17 -1
  498. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +101 -0
  499. package/src/resources/extensions/gsd/tests/token-profile.test.ts +51 -4
  500. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +7 -16
  501. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +38 -3
  502. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -7
  503. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +15 -1
  504. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
  505. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +34 -33
  506. package/src/resources/extensions/gsd/tests/worktree.test.ts +8 -0
  507. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +131 -1
  508. package/src/resources/extensions/gsd/tools/memory-tools.ts +17 -1
  509. package/src/resources/extensions/gsd/unit-context-manifest.ts +44 -12
  510. package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
  511. package/src/resources/extensions/gsd/watch/header-renderer.ts +3 -1
  512. package/src/resources/extensions/gsd/workflow-logger.ts +1 -0
  513. package/src/resources/extensions/gsd/worktree-command.ts +31 -44
  514. package/src/resources/extensions/gsd/worktree-manager.ts +40 -1
  515. package/src/resources/extensions/gsd/worktree-resolver.ts +4 -14
  516. package/src/resources/extensions/gsd/worktree-root.ts +144 -0
  517. package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
  518. package/src/resources/extensions/gsd/worktree.ts +8 -119
  519. package/src/resources/extensions/mcp-client/index.ts +6 -10
  520. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
  521. package/src/resources/extensions/ollama/index.ts +16 -2
  522. package/src/resources/extensions/ollama/model-capabilities.ts +34 -0
  523. package/src/resources/extensions/ollama/ollama-client.ts +41 -4
  524. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +96 -0
  525. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
  526. package/src/resources/extensions/slash-commands/create-extension.ts +38 -24
  527. package/src/resources/extensions/subagent/index.ts +165 -7
  528. package/src/resources/skills/create-gsd-extension/SKILL.md +9 -5
  529. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  530. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  531. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  532. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  533. package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  534. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  535. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  536. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
  537. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
  538. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +58 -0
  539. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
  540. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +0 -601
  541. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +0 -651
  542. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +0 -91
  543. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
  544. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
  545. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
  546. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
  547. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  548. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +0 -608
  549. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +0 -11
  550. package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +0 -20
  551. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  553. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +0 -1
  555. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +0 -22
  556. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +0 -47
  557. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -75
  558. /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → QK8fABiGPmonfTgboN0Y9}/_buildManifest.js +0 -0
  559. /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → QK8fABiGPmonfTgboN0Y9}/_ssgManifest.js +0 -0
@@ -232,7 +232,6 @@ import { reorderForCaching } from "./prompt-ordering.js";
232
232
  // ─── Session State ─────────────────────────────────────────────────────────
233
233
 
234
234
  import {
235
- AutoSession,
236
235
  STUB_RECOVERY_THRESHOLD,
237
236
  NEW_SESSION_TIMEOUT_MS,
238
237
  } from "./auto/session.js";
@@ -250,11 +249,12 @@ export type {
250
249
  UnitRouting,
251
250
  StartModel,
252
251
  } from "./auto/session.js";
252
+ import { autoSession as s } from "./auto-runtime-state.js";
253
253
 
254
254
  // ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
255
255
  // ALL mutable auto-mode state lives in the AutoSession class (auto/session.ts).
256
256
  // This file must NOT declare module-level `let` or `var` variables for state.
257
- // The single `s` instance below is the only mutable module-level binding.
257
+ // The single shared `s` instance below is the only mutable AutoSession binding.
258
258
  //
259
259
  // When adding features or fixing bugs:
260
260
  // - New mutable state → add a property to AutoSession, not a module-level variable
@@ -263,7 +263,6 @@ export type {
263
263
  //
264
264
  // Tests in auto-session-encapsulation.test.ts enforce this invariant.
265
265
  // ─────────────────────────────────────────────────────────────────────────────
266
- const s = new AutoSession();
267
266
 
268
267
  /** Throttle STATE.md rebuilds — at most once per 30 seconds */
269
268
  const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
@@ -1812,7 +1811,7 @@ const widgetStateAccessors: WidgetStateAccessors = {
1812
1811
  * Ensure directories, branches, and other prerequisites exist before
1813
1812
  * dispatching a unit. The LLM should never need to mkdir or git checkout.
1814
1813
  */
1815
- function ensurePreconditions(
1814
+ export function ensurePreconditions(
1816
1815
  unitType: string,
1817
1816
  unitId: string,
1818
1817
  base: string,
@@ -1822,6 +1821,17 @@ function ensurePreconditions(
1822
1821
 
1823
1822
  const mDir = resolveMilestonePath(base, mid);
1824
1823
  if (!mDir) {
1824
+ // Fix #4996: When dispatching a slice unit against an unrecognised milestone,
1825
+ // only create the directory if the milestone has a DB row.
1826
+ // Without this guard, forward-referenced unit IDs (e.g. from REQUIREMENTS.md)
1827
+ // silently scaffold empty stub directories that later skew nextMilestoneId.
1828
+ if (sid !== undefined) {
1829
+ const hasDbRow = isDbAvailable() && getMilestone(mid) != null;
1830
+ if (!hasDbRow) {
1831
+ logWarning("engine", `ensurePreconditions: skipping mkdir for unrecognised milestone ${mid} referenced by slice unit ${unitId} — no DB row exists`, { file: "auto.ts" });
1832
+ return;
1833
+ }
1834
+ }
1825
1835
  const newDir = join(milestonesDir(base), mid);
1826
1836
  mkdirSync(join(newDir, "slices"), { recursive: true });
1827
1837
  }
@@ -2,24 +2,15 @@ import { Type } from "@sinclair/typebox";
2
2
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
3
3
  import { Text } from "@gsd/pi-tui";
4
4
 
5
- import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
6
5
  import { loadEffectiveGSDPreferences } from "../preferences.js";
7
6
  import { ensureDbOpen } from "./dynamic-tools.js";
8
7
  import { StringEnum } from "@gsd/pi-ai";
9
8
  import { logError } from "../workflow-logger.js";
10
9
  import { getErrorMessage } from "../error-utils.js";
11
- import {
12
- executeCompleteMilestone,
13
- executePlanMilestone,
14
- executePlanSlice,
15
- executeReplanSlice,
16
- executeReassessRoadmap,
17
- executeSaveGateResult,
18
- executeSliceComplete,
19
- executeSummarySave,
20
- executeTaskComplete,
21
- executeValidateMilestone,
22
- } from "../tools/workflow-tool-executors.js";
10
+
11
+ async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow-tool-executors.js")> {
12
+ return import("../tools/workflow-tool-executors.js");
13
+ }
23
14
 
24
15
  /**
25
16
  * Register an alias tool that shares the same execute function as its canonical counterpart.
@@ -302,6 +293,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
302
293
  // ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
303
294
 
304
295
  const summarySaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
296
+ const { executeSummarySave } = await loadWorkflowExecutors();
305
297
  return executeSummarySave(params, process.cwd());
306
298
  };
307
299
 
@@ -354,6 +346,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
354
346
  try {
355
347
  // Claim a reserved ID if the guided-flow already previewed one to the user.
356
348
  // This guarantees the ID shown in the UI matches the one materialised on disk.
349
+ const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
357
350
  const reserved = claimReservedId();
358
351
  if (reserved) {
359
352
  await ensureMilestoneDbRow(reserved);
@@ -435,6 +428,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
435
428
  // ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
436
429
 
437
430
  const planMilestoneExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
431
+ const { executePlanMilestone } = await loadWorkflowExecutors();
438
432
  return executePlanMilestone(params, process.cwd());
439
433
  };
440
434
 
@@ -504,6 +498,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
504
498
  // ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
505
499
 
506
500
  const planSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
501
+ const { executePlanSlice } = await loadWorkflowExecutors();
507
502
  return executePlanSlice(params, process.cwd());
508
503
  };
509
504
 
@@ -626,6 +621,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
626
621
  // ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
627
622
 
628
623
  const taskCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
624
+ const { executeTaskComplete } = await loadWorkflowExecutors();
629
625
  return executeTaskComplete(params, process.cwd());
630
626
  };
631
627
 
@@ -696,6 +692,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
696
692
  // ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
697
693
 
698
694
  const sliceCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
695
+ const { executeSliceComplete } = await loadWorkflowExecutors();
699
696
  return executeSliceComplete(params, process.cwd());
700
697
  };
701
698
 
@@ -888,6 +885,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
888
885
  // ─── gsd_complete_milestone ────────────────────────────────────────────
889
886
 
890
887
  const milestoneCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
888
+ const { executeCompleteMilestone } = await loadWorkflowExecutors();
891
889
  return executeCompleteMilestone(params, process.cwd());
892
890
  };
893
891
 
@@ -933,6 +931,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
933
931
  // ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
934
932
 
935
933
  const milestoneValidateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
934
+ const { executeValidateMilestone } = await loadWorkflowExecutors();
936
935
  return executeValidateMilestone(params, process.cwd());
937
936
  };
938
937
 
@@ -970,6 +969,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
970
969
  // ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
971
970
 
972
971
  const replanSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
972
+ const { executeReplanSlice } = await loadWorkflowExecutors();
973
973
  return executeReplanSlice(params, process.cwd());
974
974
  };
975
975
 
@@ -1020,6 +1020,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1020
1020
  // ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
1021
1021
 
1022
1022
  const reassessRoadmapExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1023
+ const { executeReassessRoadmap } = await loadWorkflowExecutors();
1023
1024
  return executeReassessRoadmap(params, process.cwd());
1024
1025
  };
1025
1026
 
@@ -1275,6 +1276,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1275
1276
  // ─── gsd_save_gate_result ──────────────────────────────────────────────
1276
1277
 
1277
1278
  const saveGateResultExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1279
+ const { executeSaveGateResult } = await loadWorkflowExecutors();
1278
1280
  return executeSaveGateResult(params, process.cwd());
1279
1281
  };
1280
1282
 
@@ -6,12 +6,6 @@
6
6
  import { Type } from "@sinclair/typebox";
7
7
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
8
8
 
9
- import { executeGsdExec } from "../tools/exec-tool.js";
10
- import { executeExecSearch } from "../tools/exec-search-tool.js";
11
- import { executeResume } from "../tools/resume-tool.js";
12
- import { loadEffectiveGSDPreferences } from "../preferences.js";
13
- import { logWarning } from "../workflow-logger.js";
14
-
15
9
  export function registerExecTools(pi: ExtensionAPI): void {
16
10
  pi.registerTool({
17
11
  name: "gsd_exec",
@@ -46,7 +40,12 @@ export function registerExecTools(pi: ExtensionAPI): void {
46
40
  ),
47
41
  }),
48
42
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
49
- let prefs: Awaited<ReturnType<typeof loadEffectiveGSDPreferences>> | null = null;
43
+ const [{ executeGsdExec }, { loadEffectiveGSDPreferences }, { logWarning }] = await Promise.all([
44
+ import("../tools/exec-tool.js"),
45
+ import("../preferences.js"),
46
+ import("../workflow-logger.js"),
47
+ ]);
48
+ let prefs: ReturnType<typeof loadEffectiveGSDPreferences> | null = null;
50
49
  try {
51
50
  prefs = loadEffectiveGSDPreferences();
52
51
  } catch (err) {
@@ -81,6 +80,7 @@ export function registerExecTools(pi: ExtensionAPI): void {
81
80
  limit: Type.Optional(Type.Number({ description: "Max results (default 20, cap 200)", minimum: 1, maximum: 200 })),
82
81
  }),
83
82
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
83
+ const { executeExecSearch } = await import("../tools/exec-search-tool.js");
84
84
  return executeExecSearch(params as Parameters<typeof executeExecSearch>[0], {
85
85
  baseDir: process.cwd(),
86
86
  });
@@ -101,6 +101,7 @@ export function registerExecTools(pi: ExtensionAPI): void {
101
101
  ],
102
102
  parameters: Type.Object({}),
103
103
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
104
+ const { executeResume } = await import("../tools/resume-tool.js");
104
105
  return executeResume(params as Parameters<typeof executeResume>[0], {
105
106
  baseDir: process.cwd(),
106
107
  });
@@ -3,8 +3,6 @@
3
3
  import { Type } from "@sinclair/typebox";
4
4
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
5
5
  import { ensureDbOpen } from "./dynamic-tools.js";
6
- import { executeMilestoneStatus } from "../tools/workflow-tool-executors.js";
7
- import { checkpointDatabase } from "../gsd-db.js";
8
6
 
9
7
  export function registerQueryTools(pi: ExtensionAPI): void {
10
8
  pi.registerTool({
@@ -29,6 +27,7 @@ export function registerQueryTools(pi: ExtensionAPI): void {
29
27
  details: { operation: "milestone_status", error: "db_unavailable" },
30
28
  };
31
29
  }
30
+ const { executeMilestoneStatus } = await import("../tools/workflow-tool-executors.js");
32
31
  return executeMilestoneStatus(params);
33
32
  },
34
33
  });
@@ -55,6 +54,7 @@ export function registerQueryTools(pi: ExtensionAPI): void {
55
54
  details: { operation: "checkpoint_db", error: "db_unavailable" },
56
55
  };
57
56
  }
57
+ const { checkpointDatabase } = await import("../gsd-db.js");
58
58
  checkpointDatabase();
59
59
  return {
60
60
  content: [{ type: "text", text: "WAL checkpoint complete. gsd.db is now up to date and safe to stage with git add." }],
@@ -3,9 +3,8 @@
3
3
  import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
4
4
 
5
5
  import { registerExitCommand } from "../exit-command.js";
6
- import { registerWorktreeCommand } from "../worktree-command.js";
6
+ import { registerLazyWorktreeCommands } from "../worktree-command-bootstrap.js";
7
7
  import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-extension-api.js";
8
- import { loadEcosystemExtensions } from "../ecosystem/loader.js";
9
8
  import { registerDbTools } from "./db-tools.js";
10
9
  import { registerDynamicTools } from "./dynamic-tools.js";
11
10
  import { registerExecTools } from "./exec-tools.js";
@@ -71,7 +70,7 @@ function installEpipeGuard(): void {
71
70
  export function registerGsdExtension(pi: ExtensionAPI): void {
72
71
  // Note: registerGSDCommand is called by index.ts before this function,
73
72
  // so we intentionally skip it here to avoid double-registration.
74
- registerWorktreeCommand(pi);
73
+ registerLazyWorktreeCommands(pi);
75
74
  registerExitCommand(pi);
76
75
 
77
76
  // Wire the Layer 2 event emitter bridge so deeply-nested GSD code can emit
@@ -116,12 +115,14 @@ export function registerGsdExtension(pi: ExtensionAPI): void {
116
115
  ["cmux-events", () => initCmuxEventListeners(pi.events)],
117
116
  ["hooks", () => registerHooks(pi, ecosystemHandlers)],
118
117
  ["ecosystem", () => {
119
- void loadEcosystemExtensions(pi, ecosystemHandlers).catch((err) => {
120
- logWarning(
121
- "ecosystem",
122
- `loader failed: ${err instanceof Error ? err.message : String(err)}`,
123
- );
124
- });
118
+ void import("../ecosystem/loader.js")
119
+ .then(({ loadEcosystemExtensions }) => loadEcosystemExtensions(pi, ecosystemHandlers))
120
+ .catch((err) => {
121
+ logWarning(
122
+ "ecosystem",
123
+ `loader failed: ${err instanceof Error ? err.message : String(err)}`,
124
+ );
125
+ });
125
126
  }],
126
127
  ];
127
128
 
@@ -5,24 +5,16 @@ import { isToolCallEventType } from "@gsd/pi-coding-agent";
5
5
 
6
6
  import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-extension-api.js";
7
7
  import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
8
- import { getEcosystemReadyPromise } from "../ecosystem/loader.js";
9
8
 
10
9
  import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
11
- import { buildBeforeAgentStartResult } from "./system-context.js";
12
- import { handleAgentEnd } from "./agent-end-recovery.js";
13
- import { clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockQueueExecution, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
10
+ import { clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
11
+ import { resolveManifest } from "../unit-context-manifest.js";
14
12
  import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
15
- import { cleanupQuickBranch } from "../quick.js";
16
- import { getDiscussionMilestoneId } from "../guided-flow.js";
17
- import { loadToolApiKeys } from "../commands-config.js";
18
13
  import { loadFile, saveFile, formatContinue } from "../files.js";
19
- import { deriveState } from "../state.js";
20
- import { getAutoDashboardData, isAutoActive, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError } from "../auto.js";
14
+ import { getAutoRuntimeSnapshot, isAutoActive, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError } from "../auto-runtime-state.js";
21
15
 
22
- import { isParallelActive, shutdownParallel } from "../parallel-orchestrator.js";
23
16
  import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
24
17
  import { saveActivityLog } from "../activity-log.js";
25
- import { resetAskUserQuestionsCache } from "../../ask-user-questions.js";
26
18
  import { recordToolCall as safetyRecordToolCall, recordToolResult as safetyRecordToolResult, saveEvidenceToDisk } from "../safety/evidence-collector.js";
27
19
  import { parseUnitId } from "../unit-id.js";
28
20
  import { classifyCommand } from "../safety/destructive-guard.js";
@@ -30,17 +22,46 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
30
22
  import { installNotifyInterceptor } from "./notify-interceptor.js";
31
23
  import { initNotificationStore } from "../notification-store.js";
32
24
  import { initNotificationWidget } from "../notification-widget.js";
33
- import { initHealthWidget } from "../health-widget.js";
25
+ import { extractSubagentAgentClasses } from "./subagent-input.js";
34
26
 
35
27
  // Skip the welcome screen on the very first session_start — cli.ts already
36
28
  // printed it before the TUI launched. Only re-print on /clear (subsequent sessions).
37
29
  let isFirstSession = true;
38
30
 
31
+ async function deriveGsdState(basePath: string) {
32
+ const { deriveState } = await import("../state.js");
33
+ return deriveState(basePath);
34
+ }
35
+
36
+ async function getDiscussionMilestoneIdFor(basePath: string): Promise<string | null> {
37
+ const { getDiscussionMilestoneId } = await import("../guided-flow.js");
38
+ return getDiscussionMilestoneId(basePath);
39
+ }
40
+
41
+ async function loadToolApiKeysForSession(): Promise<void> {
42
+ const { loadToolApiKeys } = await import("../commands-config.js");
43
+ loadToolApiKeys();
44
+ }
45
+
46
+ async function resetAskUserQuestionsTurnCache(): Promise<void> {
47
+ const { resetAskUserQuestionsCache } = await import("../../ask-user-questions.js");
48
+ resetAskUserQuestionsCache();
49
+ }
50
+
39
51
  async function syncServiceTierStatus(ctx: ExtensionContext): Promise<void> {
40
52
  const { getEffectiveServiceTier, formatServiceTierFooterStatus } = await import("../service-tier.js");
41
53
  ctx.ui.setStatus("gsd-fast", formatServiceTierFooterStatus(getEffectiveServiceTier(), ctx.model?.id));
42
54
  }
43
55
 
56
+ async function applyDisabledModelProviderPolicy(ctx: ExtensionContext): Promise<void> {
57
+ try {
58
+ const { resolveDisabledModelProvidersFromPreferences } = await import("../preferences.js");
59
+ ctx.modelRegistry.setDisabledModelProviders(resolveDisabledModelProvidersFromPreferences());
60
+ } catch {
61
+ // Non-fatal: keep default provider visibility if preferences cannot be loaded.
62
+ }
63
+ }
64
+
44
65
  export function registerHooks(
45
66
  pi: ExtensionAPI,
46
67
  ecosystemHandlers: GSDEcosystemBeforeAgentStartHandler[],
@@ -50,12 +71,14 @@ export function registerHooks(
50
71
  installNotifyInterceptor(ctx);
51
72
  initNotificationWidget(ctx);
52
73
  if (!isAutoActive()) {
74
+ const { initHealthWidget } = await import("../health-widget.js");
53
75
  initHealthWidget(ctx);
54
76
  }
55
77
  resetWriteGateState();
56
78
  resetToolCallLoopGuard();
57
- resetAskUserQuestionsCache();
79
+ await resetAskUserQuestionsTurnCache();
58
80
  await syncServiceTierStatus(ctx);
81
+ await applyDisabledModelProviderPolicy(ctx);
59
82
  // Skip MCP auto-prep when running inside an auto-worktree (see session_switch below).
60
83
  const { isInAutoWorktree } = await import("../auto-worktree.js");
61
84
  if (!isInAutoWorktree(process.cwd())) {
@@ -91,7 +114,7 @@ export function registerHooks(
91
114
  }
92
115
  } catch { /* non-fatal */ }
93
116
  }
94
- loadToolApiKeys();
117
+ await loadToolApiKeysForSession();
95
118
  if (isAutoActive()) {
96
119
  ctx.ui.setWidget("gsd-health", undefined);
97
120
  }
@@ -102,9 +125,10 @@ export function registerHooks(
102
125
  installNotifyInterceptor(ctx);
103
126
  resetWriteGateState();
104
127
  resetToolCallLoopGuard();
105
- resetAskUserQuestionsCache();
128
+ await resetAskUserQuestionsTurnCache();
106
129
  clearDiscussionFlowState();
107
130
  await syncServiceTierStatus(ctx);
131
+ await applyDisabledModelProviderPolicy(ctx);
108
132
  // Skip MCP auto-prep when running inside an auto-worktree. The worktree
109
133
  // already has .mcp.json from createAutoWorktree, and re-running the writer
110
134
  // post-chdir rewrites the file mid-run (non-idempotent due to cwd-relative
@@ -114,23 +138,28 @@ export function registerHooks(
114
138
  const { prepareWorkflowMcpForProject } = await import("../workflow-mcp-auto-prep.js");
115
139
  prepareWorkflowMcpForProject(ctx, process.cwd());
116
140
  }
117
- loadToolApiKeys();
118
- if (isAutoActive()) {
141
+ await loadToolApiKeysForSession();
142
+ if (!isAutoActive()) {
143
+ const { initHealthWidget } = await import("../health-widget.js");
144
+ initHealthWidget(ctx);
145
+ } else {
119
146
  ctx.ui.setWidget("gsd-health", undefined);
120
147
  }
121
148
  });
122
149
 
123
150
  pi.on("before_agent_start", async (event, ctx: ExtensionContext) => {
124
151
  // Wait for ecosystem loader to finish (no-op after first turn).
152
+ const { getEcosystemReadyPromise } = await import("../ecosystem/loader.js");
125
153
  await getEcosystemReadyPromise();
126
154
 
127
155
  // GSD's own context injection (existing behavior — unchanged).
156
+ const { buildBeforeAgentStartResult } = await import("./system-context.js");
128
157
  const gsdResult = await buildBeforeAgentStartResult(event, ctx);
129
158
 
130
159
  // Refresh the snapshot used by ecosystem getPhase()/getActiveUnit().
131
160
  // deriveState has its own ~100ms cache so this is cheap on repeat calls.
132
161
  try {
133
- const state = await deriveState(process.cwd());
162
+ const state = await deriveGsdState(process.cwd());
134
163
  updateSnapshot(state);
135
164
  } catch {
136
165
  updateSnapshot(null);
@@ -169,7 +198,8 @@ export function registerHooks(
169
198
 
170
199
  pi.on("agent_end", async (event, ctx: ExtensionContext) => {
171
200
  resetToolCallLoopGuard();
172
- resetAskUserQuestionsCache();
201
+ await resetAskUserQuestionsTurnCache();
202
+ const { handleAgentEnd } = await import("./agent-end-recovery.js");
173
203
  await handleAgentEnd(pi, event, ctx);
174
204
  });
175
205
 
@@ -178,6 +208,7 @@ export function registerHooks(
178
208
  // quick-return state is pending, so this is safe to call on every turn.
179
209
  pi.on("turn_end", async () => {
180
210
  try {
211
+ const { cleanupQuickBranch } = await import("../quick.js");
181
212
  cleanupQuickBranch();
182
213
  } catch {
183
214
  // Best-effort: don't break the turn lifecycle if cleanup fails.
@@ -194,8 +225,8 @@ export function registerHooks(
194
225
  const basePath = process.cwd();
195
226
  const { ensureDbOpen } = await import("./dynamic-tools.js");
196
227
  await ensureDbOpen();
197
- const state = await deriveState(basePath);
198
- if (!state.activeMilestone || !state.activeSlice || !state.activeTask) return;
228
+ const state = await deriveGsdState(basePath);
229
+ if (!state.activeMilestone || !state.activeSlice) return;
199
230
  // Write checkpoint for ALL phases, not just "executing" — discuss, research,
200
231
  // and planning also carry in-memory state (user answers, gate verification)
201
232
  // that would be lost on compaction (#4258).
@@ -210,21 +241,31 @@ export function registerHooks(
210
241
  if (await loadFile(legacyContinue)) return;
211
242
 
212
243
  const continuePath = join(sliceDir, `${state.activeSlice.id}-CONTINUE.md`);
244
+ const taskId = state.activeTask?.id ?? "none";
245
+ const taskTitle = state.activeTask?.title ?? "";
246
+ const phaseLabel = state.phase.replace(/-/g, " ");
247
+
213
248
  await saveFile(continuePath, formatContinue({
214
249
  frontmatter: {
215
250
  milestone: state.activeMilestone.id,
216
251
  slice: state.activeSlice.id,
217
- task: state.activeTask.id,
252
+ task: taskId,
218
253
  step: 0,
219
254
  totalSteps: 0,
220
255
  status: "compacted" as const,
221
256
  savedAt: new Date().toISOString(),
222
257
  },
223
- completedWork: `Task ${state.activeTask.id} (${state.activeTask.title}) was in progress when compaction occurred.`,
224
- remainingWork: "Check the task plan for remaining steps.",
258
+ completedWork: state.activeTask
259
+ ? `Task ${taskId} (${taskTitle}) was in progress when compaction occurred.`
260
+ : `Slice ${state.activeSlice.id} was in ${phaseLabel} phase when compaction occurred.`,
261
+ remainingWork: state.activeTask
262
+ ? "Check the task plan for remaining steps."
263
+ : "Continue this slice from the latest planning/research/discussion artifacts.",
225
264
  decisions: "Check task summary files for prior decisions.",
226
265
  context: "Session was auto-compacted by Pi. Resume with /gsd.",
227
- nextAction: `Resume task ${state.activeTask.id}: ${state.activeTask.title}.`,
266
+ nextAction: state.activeTask
267
+ ? `Resume task ${taskId}: ${taskTitle}.`
268
+ : `Resume ${phaseLabel} work for slice ${state.activeSlice.id}.`,
228
269
  }));
229
270
  });
230
271
 
@@ -246,7 +287,7 @@ export function registerHooks(
246
287
  const basePath = process.cwd();
247
288
  let activeContext: string | null = null;
248
289
  try {
249
- const state = await deriveState(basePath);
290
+ const state = await deriveGsdState(basePath);
250
291
  if (state.activeMilestone && state.activeSlice && state.activeTask) {
251
292
  activeContext =
252
293
  `Active: ${state.activeMilestone.id} / ${state.activeSlice.id} / ${state.activeTask.id}` +
@@ -265,6 +306,7 @@ export function registerHooks(
265
306
  });
266
307
 
267
308
  pi.on("session_shutdown", async (_event, ctx: ExtensionContext) => {
309
+ const { isParallelActive, shutdownParallel } = await import("../parallel-orchestrator.js");
268
310
  if (isParallelActive()) {
269
311
  try {
270
312
  await shutdownParallel(process.cwd());
@@ -273,7 +315,7 @@ export function registerHooks(
273
315
  }
274
316
  }
275
317
  if (!isAutoActive() && !isAutoPaused()) return;
276
- const dash = getAutoDashboardData();
318
+ const dash = getAutoRuntimeSnapshot();
277
319
  if (dash.currentUnit) {
278
320
  saveActivityLog(ctx, dash.basePath, dash.currentUnit.type, dash.currentUnit.id);
279
321
  }
@@ -302,7 +344,7 @@ export function registerHooks(
302
344
  // If ask_user_questions was called with a gate ID but hasn't been confirmed,
303
345
  // block all non-read-only tool calls to prevent the model from skipping gates.
304
346
  if (getPendingGate()) {
305
- const milestoneId = getDiscussionMilestoneId(discussionBasePath);
347
+ const milestoneId = await getDiscussionMilestoneIdFor(discussionBasePath);
306
348
  if (isToolCallEventType("bash", event)) {
307
349
  const bashGuard = shouldBlockPendingGateBash(
308
350
  event.input.command,
@@ -337,6 +379,41 @@ export function registerHooks(
337
379
  if (queueGuard.block) return queueGuard;
338
380
  }
339
381
 
382
+ // ── Planning-unit tools-policy enforcement (#4934): runtime half ─────
383
+ // The active auto-mode unit's manifest declares a ToolsPolicy. For
384
+ // planning/docs/read-only modes, deny writes outside .gsd/ (or the
385
+ // manifest's allowedPathGlobs), bash that isn't read-only, and
386
+ // subagent dispatch. Closes the b23 bug class where a discuss-milestone
387
+ // turn used the host Edit tool to modify user source files.
388
+ const dash = getAutoRuntimeSnapshot();
389
+ const activeUnitType = dash.currentUnit?.type;
390
+ if (activeUnitType) {
391
+ const manifest = resolveManifest(activeUnitType);
392
+ if (manifest) {
393
+ let planningInput = "";
394
+ let agentClasses: string[] | undefined;
395
+ if (isToolCallEventType("write", event)) {
396
+ planningInput = event.input.path;
397
+ } else if (isToolCallEventType("edit", event)) {
398
+ planningInput = event.input.path;
399
+ } else if (isToolCallEventType("bash", event)) {
400
+ planningInput = event.input.command;
401
+ } else if (event.toolName === "subagent" || event.toolName === "task") {
402
+ // Subagent inputs use { agent }, { tasks: [{ agent }] }, or { chain: [{ agent }] }.
403
+ agentClasses = extractSubagentAgentClasses((event as { input?: unknown }).input);
404
+ }
405
+ const planningGuard = shouldBlockPlanningUnit(
406
+ event.toolName,
407
+ planningInput,
408
+ dash.basePath || discussionBasePath,
409
+ activeUnitType,
410
+ manifest.tools,
411
+ agentClasses,
412
+ );
413
+ if (planningGuard.block) return planningGuard;
414
+ }
415
+ }
416
+
340
417
  // ── Single-writer engine: block direct writes to STATE.md ──────────
341
418
  // Covers write, edit, and bash tools to prevent bypass vectors.
342
419
  if (isToolCallEventType("write", event)) {
@@ -362,7 +439,7 @@ export function registerHooks(
362
439
  const result = shouldBlockContextWrite(
363
440
  event.toolName,
364
441
  event.input.path,
365
- getDiscussionMilestoneId(discussionBasePath),
442
+ await getDiscussionMilestoneIdFor(discussionBasePath),
366
443
  isQueuePhaseActive(),
367
444
  );
368
445
  if (result.block) return result;
@@ -374,6 +451,19 @@ export function registerHooks(
374
451
  markToolStart(event.toolCallId, event.toolName);
375
452
  safetyRecordToolCall(event.toolCallId, event.toolName, event.input as Record<string, unknown>);
376
453
 
454
+ // Persist immediately at dispatch so a mid-unit re-dispatch — which calls
455
+ // resetEvidence() + loadEvidenceFromDisk() in runUnitPhase — cannot wipe
456
+ // the entry between tool_call and tool_execution_end. Without this, the
457
+ // race window equals the tool's runtime, producing the "no bash calls"
458
+ // false positive when the LLM clearly ran a verification command.
459
+ const callDash = getAutoRuntimeSnapshot();
460
+ if (callDash.basePath && callDash.currentUnit?.type === "execute-task") {
461
+ const { milestone: cMid, slice: cSid, task: cTid } = parseUnitId(callDash.currentUnit.id);
462
+ if (cMid && cSid && cTid) {
463
+ saveEvidenceToDisk(callDash.basePath, cMid, cSid, cTid);
464
+ }
465
+ }
466
+
377
467
  // Destructive command classification (warn only, never block)
378
468
  if (isToolCallEventType("bash", event)) {
379
469
  const classification = classifyCommand(event.input.command);
@@ -407,7 +497,7 @@ export function registerHooks(
407
497
  recordToolInvocationError(event.toolName, errorText);
408
498
  }
409
499
  if (event.toolName !== "ask_user_questions") return;
410
- const milestoneId = getDiscussionMilestoneId(process.cwd());
500
+ const milestoneId = await getDiscussionMilestoneIdFor(process.cwd());
411
501
  const queueActive = isQueuePhaseActive();
412
502
 
413
503
  const details = event.details as any;
@@ -506,7 +596,7 @@ export function registerHooks(
506
596
  safetyRecordToolResult(event.toolCallId, event.toolName, event.result, event.isError);
507
597
  // Persist evidence to disk after each tool result so it survives a session
508
598
  // restart mid-unit (Bug #4385 — non-persisted evidence false positives).
509
- const dash = getAutoDashboardData();
599
+ const dash = getAutoRuntimeSnapshot();
510
600
  if (dash.basePath && dash.currentUnit?.type === "execute-task") {
511
601
  const { milestone: pMid, slice: pSid, task: pTid } = parseUnitId(dash.currentUnit.id);
512
602
  if (pMid && pSid && pTid) {
@@ -4,13 +4,14 @@ import { join } from "node:path";
4
4
  import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
5
5
  import { Key } from "@gsd/pi-tui";
6
6
 
7
- import { GSDDashboardOverlay } from "../dashboard-overlay.js";
8
- import { GSDNotificationOverlay } from "../notification-overlay.js";
9
- import { ParallelMonitorOverlay } from "../parallel-monitor-overlay.js";
10
7
  import { GSD_SHORTCUTS } from "../shortcut-defs.js";
11
- import { projectRoot } from "../commands/context.js";
12
8
  import { shortcutDesc } from "../../shared/mod.js";
13
9
 
10
+ async function getProjectRoot(): Promise<string> {
11
+ const { projectRoot } = await import("../commands/context.js");
12
+ return projectRoot();
13
+ }
14
+
14
15
  export function registerShortcuts(pi: ExtensionAPI): void {
15
16
  const overlayOptions = {
16
17
  width: "90%",
@@ -20,7 +21,10 @@ export function registerShortcuts(pi: ExtensionAPI): void {
20
21
  } as const;
21
22
 
22
23
  const openDashboardOverlay = async (ctx: ExtensionContext) => {
23
- const basePath = projectRoot();
24
+ const [{ GSDDashboardOverlay }, basePath] = await Promise.all([
25
+ import("../dashboard-overlay.js"),
26
+ getProjectRoot(),
27
+ ]);
24
28
  if (!existsSync(join(basePath, ".gsd"))) {
25
29
  ctx.ui.notify("No .gsd/ directory found. Run /gsd to start.", "info");
26
30
  return;
@@ -35,6 +39,7 @@ export function registerShortcuts(pi: ExtensionAPI): void {
35
39
  };
36
40
 
37
41
  const openNotificationsOverlay = async (ctx: ExtensionContext) => {
42
+ const { GSDNotificationOverlay } = await import("../notification-overlay.js");
38
43
  await ctx.ui.custom<boolean>(
39
44
  (tui, theme, _kb, done) => new GSDNotificationOverlay(tui, theme, () => done(true)),
40
45
  {
@@ -51,12 +56,13 @@ export function registerShortcuts(pi: ExtensionAPI): void {
51
56
  };
52
57
 
53
58
  const openParallelOverlay = async (ctx: ExtensionContext) => {
54
- const basePath = projectRoot();
59
+ const basePath = await getProjectRoot();
55
60
  const parallelDir = join(basePath, ".gsd", "parallel");
56
61
  if (!existsSync(parallelDir)) {
57
62
  ctx.ui.notify("No parallel workers found. Run /gsd parallel start first.", "info");
58
63
  return;
59
64
  }
65
+ const { ParallelMonitorOverlay } = await import("../parallel-monitor-overlay.js");
60
66
  await ctx.ui.custom<boolean>(
61
67
  (tui, theme, _kb, done) => new ParallelMonitorOverlay(tui, theme, () => done(true), basePath),
62
68
  {