gsd-pi 2.78.1-dev.84a383f51 → 2.78.1

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 (474) hide show
  1. package/README.md +7 -7
  2. package/dist/cli.js +55 -95
  3. package/dist/headless-query.d.ts +0 -22
  4. package/dist/headless-query.js +4 -24
  5. package/dist/headless.d.ts +0 -10
  6. package/dist/headless.js +1 -16
  7. package/dist/loader.js +10 -7
  8. package/dist/onboarding.d.ts +0 -10
  9. package/dist/onboarding.js +2 -2
  10. package/dist/provider-migrations.d.ts +2 -2
  11. package/dist/provider-migrations.js +2 -5
  12. package/dist/resource-loader.d.ts +2 -5
  13. package/dist/resource-loader.js +5 -28
  14. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +601 -0
  15. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +651 -0
  16. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +91 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +0 -23
  18. package/dist/resources/extensions/gsd/auto/phases.js +2 -2
  19. package/dist/resources/extensions/gsd/auto/run-unit.js +1 -3
  20. package/dist/resources/extensions/gsd/auto/session.js +0 -3
  21. package/dist/resources/extensions/gsd/auto-recovery.js +4 -43
  22. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  23. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
  24. package/dist/resources/extensions/gsd/auto-worktree.js +0 -30
  25. package/dist/resources/extensions/gsd/auto.js +5 -14
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -14
  27. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +5 -7
  28. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  29. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +4 -5
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -94
  31. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +6 -11
  32. package/dist/resources/extensions/gsd/bootstrap/system-context.js +8 -34
  33. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +2 -38
  34. package/dist/resources/extensions/gsd/commands/catalog.js +5 -69
  35. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -22
  36. package/dist/resources/extensions/gsd/commands-mcp-status.js +1 -3
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -10
  38. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  39. package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -4
  40. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +1 -39
  41. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  42. package/dist/resources/extensions/gsd/forensics.js +2 -2
  43. package/dist/resources/extensions/gsd/git-service.js +5 -12
  44. package/dist/resources/extensions/gsd/gsd-db.js +2 -11
  45. package/dist/resources/extensions/gsd/guided-flow.js +23 -23
  46. package/dist/resources/extensions/gsd/memory-store.js +31 -66
  47. package/dist/resources/extensions/gsd/model-router.js +9 -114
  48. package/dist/resources/extensions/gsd/native-git-bridge.js +1 -7
  49. package/dist/resources/extensions/gsd/preferences-models.js +15 -91
  50. package/dist/resources/extensions/gsd/preferences-types.js +0 -2
  51. package/dist/resources/extensions/gsd/preferences-validation.js +0 -32
  52. package/dist/resources/extensions/gsd/preferences.js +3 -5
  53. package/dist/resources/extensions/gsd/prompt-loader.js +12 -23
  54. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -9
  55. package/dist/resources/extensions/gsd/state.js +0 -42
  56. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
  57. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
  58. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +112 -0
  59. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +23 -0
  60. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +5 -0
  61. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -18
  62. package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
  63. package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -3
  64. package/dist/resources/extensions/gsd/worktree-command.js +46 -26
  65. package/dist/resources/extensions/mcp-client/index.js +3 -6
  66. package/dist/resources/extensions/slash-commands/create-extension.js +22 -36
  67. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -9
  68. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  69. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  70. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  71. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  72. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  73. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  74. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  75. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
  76. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  77. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  78. package/dist/rtk-shared.d.ts +0 -3
  79. package/dist/rtk-shared.js +0 -17
  80. package/dist/rtk.d.ts +5 -2
  81. package/dist/rtk.js +20 -3
  82. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  83. package/dist/web/standalone/.next/BUILD_ID +1 -1
  84. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  85. package/dist/web/standalone/.next/build-manifest.json +4 -4
  86. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  87. package/dist/web/standalone/.next/react-loadable-manifest.json +4 -44
  88. package/dist/web/standalone/.next/required-server-files.json +3 -3
  89. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  90. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  100. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  116. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  128. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  148. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  158. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -4
  164. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  184. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/index.html +1 -1
  194. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  195. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  196. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  197. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  199. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/page.js +2 -2
  201. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  203. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  204. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  205. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  207. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/middleware.js +2 -2
  209. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  211. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  212. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  213. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  214. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  215. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  216. package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +20 -0
  217. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  218. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  219. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +1 -0
  223. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  224. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  225. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  226. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  227. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  228. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  229. package/dist/web/standalone/package.json +1 -2
  230. package/dist/web/standalone/server.js +1 -1
  231. package/package.json +1 -1
  232. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  233. package/packages/mcp-server/dist/workflow-tools.js +46 -74
  234. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  235. package/packages/mcp-server/src/workflow-tools.test.ts +0 -26
  236. package/packages/mcp-server/src/workflow-tools.ts +58 -93
  237. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  238. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  239. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  240. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -48
  241. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  242. package/packages/pi-ai/dist/types.d.ts +0 -13
  243. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  244. package/packages/pi-ai/dist/types.js.map +1 -1
  245. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/utils/repair-tool-json.js +3 -24
  247. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  248. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -26
  249. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  250. package/packages/pi-ai/src/providers/anthropic-shared.ts +20 -52
  251. package/packages/pi-ai/src/types.ts +0 -13
  252. package/packages/pi-ai/src/utils/repair-tool-json.ts +3 -24
  253. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -32
  254. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  255. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/agent-session.js +0 -6
  257. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/messages.js +0 -4
  260. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -19
  262. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -10
  264. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/model-registry.js +0 -18
  266. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +0 -13
  268. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -20
  270. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -14
  274. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  275. package/packages/pi-coding-agent/src/core/agent-session.ts +0 -7
  276. package/packages/pi-coding-agent/src/core/messages.ts +0 -4
  277. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -32
  278. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -21
  279. package/packages/pi-coding-agent/src/core/system-prompt.ts +15 -33
  280. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -17
  281. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
  282. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  283. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +3 -17
  284. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  285. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +3 -20
  286. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  287. package/src/resources/extensions/gsd/auto/loop.ts +2 -24
  288. package/src/resources/extensions/gsd/auto/phases.ts +3 -3
  289. package/src/resources/extensions/gsd/auto/run-unit.ts +1 -3
  290. package/src/resources/extensions/gsd/auto/session.ts +0 -3
  291. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  292. package/src/resources/extensions/gsd/auto-recovery.ts +8 -46
  293. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  294. package/src/resources/extensions/gsd/auto-tool-tracking.ts +4 -2
  295. package/src/resources/extensions/gsd/auto-worktree.ts +0 -38
  296. package/src/resources/extensions/gsd/auto.ts +4 -14
  297. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -15
  298. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +7 -8
  299. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  300. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +9 -10
  301. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +31 -102
  302. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +6 -12
  303. package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -39
  304. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +11 -39
  305. package/src/resources/extensions/gsd/commands/catalog.ts +5 -75
  306. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -22
  307. package/src/resources/extensions/gsd/commands-mcp-status.ts +1 -3
  308. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -15
  309. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  310. package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -4
  311. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +1 -39
  312. package/src/resources/extensions/gsd/doctor-types.ts +1 -3
  313. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  314. package/src/resources/extensions/gsd/forensics.ts +2 -2
  315. package/src/resources/extensions/gsd/git-service.ts +5 -13
  316. package/src/resources/extensions/gsd/gsd-db.ts +2 -12
  317. package/src/resources/extensions/gsd/guided-flow.ts +25 -25
  318. package/src/resources/extensions/gsd/memory-store.ts +28 -81
  319. package/src/resources/extensions/gsd/model-router.ts +9 -172
  320. package/src/resources/extensions/gsd/native-git-bridge.ts +1 -7
  321. package/src/resources/extensions/gsd/preferences-models.ts +15 -101
  322. package/src/resources/extensions/gsd/preferences-types.ts +0 -6
  323. package/src/resources/extensions/gsd/preferences-validation.ts +0 -35
  324. package/src/resources/extensions/gsd/preferences.ts +2 -16
  325. package/src/resources/extensions/gsd/prompt-loader.ts +12 -26
  326. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -9
  327. package/src/resources/extensions/gsd/state.ts +0 -42
  328. package/src/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
  329. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1 -178
  330. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -58
  331. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +5 -9
  332. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +4 -21
  333. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
  334. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +211 -138
  335. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +59 -142
  336. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +4 -7
  337. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +32 -89
  338. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +22 -0
  339. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +23 -41
  340. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +43 -3
  341. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +3 -5
  342. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +87 -22
  343. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +118 -7
  344. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +47 -0
  345. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +60 -18
  346. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +76 -14
  347. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +75 -0
  348. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +83 -22
  349. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +63 -1
  350. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +1 -26
  351. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +0 -30
  352. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +4 -14
  353. package/src/resources/extensions/gsd/tests/health-widget.test.ts +12 -22
  354. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +1 -64
  355. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -22
  356. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +23 -0
  357. package/src/resources/extensions/gsd/tests/memory-store.test.ts +0 -128
  358. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +1 -33
  359. package/src/resources/extensions/gsd/tests/model-router.test.ts +8 -169
  360. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +0 -8
  361. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +43 -32
  362. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +10 -4
  363. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -127
  364. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +0 -16
  365. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -7
  366. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
  367. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +19 -168
  368. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +1 -7
  369. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -23
  370. package/src/resources/extensions/gsd/tests/token-profile.test.ts +4 -51
  371. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +16 -7
  372. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +7 -5
  373. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -15
  374. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
  375. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +0 -15
  376. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -17
  377. package/src/resources/extensions/gsd/unit-context-manifest.ts +8 -8
  378. package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
  379. package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -3
  380. package/src/resources/extensions/gsd/workflow-logger.ts +0 -1
  381. package/src/resources/extensions/gsd/worktree-command.ts +44 -31
  382. package/src/resources/extensions/mcp-client/index.ts +3 -6
  383. package/src/resources/extensions/slash-commands/create-extension.ts +24 -38
  384. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -9
  385. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  386. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  387. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  388. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  389. package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  390. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  391. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  392. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
  393. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
  394. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
  395. package/dist/cli-policy.d.ts +0 -13
  396. package/dist/cli-policy.js +0 -17
  397. package/dist/resources/.managed-resources-content-hash +0 -1
  398. package/dist/resources/extensions/gsd/auto-runtime-state.js +0 -31
  399. package/dist/resources/extensions/gsd/milestone-id-reservation.js +0 -36
  400. package/dist/resources/extensions/gsd/worktree-session-state.js +0 -33
  401. package/dist/runtime-checks.d.ts +0 -27
  402. package/dist/runtime-checks.js +0 -38
  403. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  404. package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +0 -1
  405. package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +0 -1
  406. package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +0 -1
  407. package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +0 -1
  408. package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +0 -1
  409. package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +0 -10
  410. package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +0 -2
  411. package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +0 -20
  412. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  413. package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +0 -1
  414. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  415. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  416. package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +0 -1
  417. package/dist/worktree-status-banner.d.ts +0 -1
  418. package/dist/worktree-status-banner.js +0 -132
  419. package/packages/mcp-server/dist/alias-telemetry.d.ts +0 -8
  420. package/packages/mcp-server/dist/alias-telemetry.d.ts.map +0 -1
  421. package/packages/mcp-server/dist/alias-telemetry.js +0 -30
  422. package/packages/mcp-server/dist/alias-telemetry.js.map +0 -1
  423. package/packages/mcp-server/src/alias-telemetry.test.ts +0 -78
  424. package/packages/mcp-server/src/alias-telemetry.ts +0 -30
  425. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +0 -2
  426. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +0 -1
  427. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +0 -231
  428. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +0 -1
  429. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +0 -289
  430. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +0 -37
  431. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +0 -1
  432. package/packages/pi-coding-agent/dist/core/token-telemetry.js +0 -49
  433. package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +0 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +0 -2
  435. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +0 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +0 -133
  437. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +0 -1
  438. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +0 -2
  439. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +0 -1
  440. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +0 -78
  441. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +0 -1
  442. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +0 -2
  443. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +0 -1
  444. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +0 -181
  445. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +0 -1
  446. package/packages/pi-coding-agent/src/core/token-telemetry.ts +0 -77
  447. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +0 -212
  448. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +0 -102
  449. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +0 -200
  450. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +0 -2
  451. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +0 -1
  452. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +0 -161
  453. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +0 -1
  454. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +0 -219
  455. package/src/resources/extensions/gsd/auto-runtime-state.ts +0 -51
  456. package/src/resources/extensions/gsd/milestone-id-reservation.ts +0 -47
  457. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +0 -116
  458. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +0 -100
  459. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +0 -93
  460. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +0 -47
  461. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +0 -63
  462. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +0 -81
  463. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +0 -57
  464. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +0 -145
  465. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +0 -124
  466. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +0 -152
  467. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +0 -50
  468. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +0 -93
  469. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +0 -101
  470. package/src/resources/extensions/gsd/worktree-session-state.ts +0 -35
  471. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +0 -91
  472. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +0 -58
  473. /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_buildManifest.js +0 -0
  474. /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_ssgManifest.js +0 -0
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Regression tests for the optional sharp dependency in capture.ts.
3
+ *
4
+ * Behaviour:
5
+ * - constrainScreenshot must fall back to returning the raw buffer
6
+ * unchanged when sharp is unavailable, rather than throwing.
7
+ * - When sharp IS available, oversized screenshots get resized.
8
+ *
9
+ * No source-grep. The test drives the real constrainScreenshot function
10
+ * after seeding the module-private `_sharp` cache via the test-only
11
+ * `__setSharpForTesting` export.
12
+ */
13
+
14
+ const { describe, it, afterEach } = require("node:test");
15
+ const assert = require("node:assert/strict");
16
+ const jiti = require("jiti")(__filename, { interopDefault: true, debug: false });
17
+
18
+ const { constrainScreenshot, __setSharpForTesting } = jiti("../capture.ts");
19
+
20
+ describe("constrainScreenshot — sharp unavailable (null)", () => {
21
+ afterEach(() => {
22
+ // Clear the test override so later tests don't inherit a null sharp.
23
+ __setSharpForTesting(undefined);
24
+ });
25
+
26
+ it("returns the raw buffer unchanged when sharp is null", async () => {
27
+ __setSharpForTesting(null);
28
+
29
+ const rawBuffer = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); // PNG magic bytes
30
+ const result = await constrainScreenshot(null, rawBuffer, "image/png", 80);
31
+
32
+ assert.strictEqual(
33
+ result,
34
+ rawBuffer,
35
+ "constrainScreenshot must return the exact same buffer instance when sharp is null",
36
+ );
37
+ });
38
+
39
+ it("returns the raw buffer unchanged for JPEG input when sharp is null", async () => {
40
+ __setSharpForTesting(null);
41
+
42
+ const rawBuffer = Buffer.from([0xff, 0xd8, 0xff, 0xe0]); // JPEG magic bytes
43
+ const result = await constrainScreenshot(null, rawBuffer, "image/jpeg", 80);
44
+
45
+ assert.strictEqual(result, rawBuffer);
46
+ });
47
+ });
48
+
49
+ describe("constrainScreenshot — sharp available", () => {
50
+ afterEach(() => {
51
+ __setSharpForTesting(undefined);
52
+ });
53
+
54
+ it("passes through a small image unchanged (below cap)", async () => {
55
+ const sharp = require("sharp");
56
+ const small = await sharp({
57
+ create: {
58
+ width: 400,
59
+ height: 300,
60
+ channels: 3,
61
+ background: { r: 128, g: 128, b: 128 },
62
+ },
63
+ })
64
+ .jpeg({ quality: 80 })
65
+ .toBuffer();
66
+
67
+ const result = await constrainScreenshot(null, small, "image/jpeg", 80);
68
+ const meta = await sharp(result).metadata();
69
+ assert.equal(meta.width, 400, "small images must not be resized");
70
+ assert.equal(meta.height, 300);
71
+ });
72
+
73
+ it("resizes an oversized image to within 1568px", async () => {
74
+ const sharp = require("sharp");
75
+ const big = await sharp({
76
+ create: {
77
+ width: 3000,
78
+ height: 2000,
79
+ channels: 3,
80
+ background: { r: 128, g: 128, b: 128 },
81
+ },
82
+ })
83
+ .jpeg({ quality: 80 })
84
+ .toBuffer();
85
+
86
+ const result = await constrainScreenshot(null, big, "image/jpeg", 80);
87
+ const meta = await sharp(result).metadata();
88
+ assert.ok(meta.width <= 1568, `width ${meta.width} must be <= 1568`);
89
+ assert.ok(meta.height <= 1568, `height ${meta.height} must be <= 1568`);
90
+ });
91
+ });
@@ -163,17 +163,6 @@ function resolveDispatchNodeKind(unitType, sidecarItem) {
163
163
  }
164
164
  return "unit";
165
165
  }
166
- async function enforceMinRequestInterval(s, prefs) {
167
- const minInterval = prefs?.min_request_interval_ms ?? 0;
168
- if (minInterval > 0 && s.lastRequestTimestamp > 0) {
169
- const elapsed = Date.now() - s.lastRequestTimestamp;
170
- if (elapsed < minInterval) {
171
- const waitMs = minInterval - elapsed;
172
- debugLog("autoLoop", { phase: "rate-limit-wait", waitMs });
173
- await new Promise(r => setTimeout(r, waitMs));
174
- }
175
- }
176
- }
177
166
  async function runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem) {
178
167
  if (dispatchContract === "legacy-direct") {
179
168
  return runUnitPhase(ic, iterData, loopState, sidecarItem);
@@ -403,13 +392,7 @@ export async function autoLoop(ctx, pi, s, deps, options) {
403
392
  break;
404
393
  }
405
394
  // ── Unit execution (shared with dev path) ──
406
- await enforceMinRequestInterval(s, prefs);
407
395
  const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState);
408
- if (unitPhaseResult.action === "next") {
409
- const requestTimestamp = unitPhaseResult.data.requestDispatchedAt ?? unitPhaseResult.data.unitStartedAt;
410
- if (typeof requestTimestamp === "number")
411
- s.lastRequestTimestamp = requestTimestamp;
412
- }
413
396
  deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
414
397
  unitType: iterData.unitType,
415
398
  unitId: iterData.unitId,
@@ -572,13 +555,7 @@ export async function autoLoop(ctx, pi, s, deps, options) {
572
555
  sidecarKind: sidecarItem.kind,
573
556
  });
574
557
  }
575
- await enforceMinRequestInterval(s, prefs);
576
558
  const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem);
577
- if (unitPhaseResult.action === "next") {
578
- const requestTimestamp = unitPhaseResult.data.requestDispatchedAt ?? unitPhaseResult.data.unitStartedAt;
579
- if (typeof requestTimestamp === "number")
580
- s.lastRequestTimestamp = requestTimestamp;
581
- }
582
559
  deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
583
560
  unitType: iterData.unitType,
584
561
  unitId: iterData.unitId,
@@ -1365,7 +1365,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1365
1365
  ctx.ui.notify(`${unitType} ${unitId} completed with 0 tool calls — context exhaustion, will retry`, "warning");
1366
1366
  // Fall through to next iteration where dispatch will re-derive
1367
1367
  // and re-dispatch this unit.
1368
- return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt, requestDispatchedAt: unitResult.requestDispatchedAt } };
1368
+ return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
1369
1369
  }
1370
1370
  }
1371
1371
  }
@@ -1418,7 +1418,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1418
1418
  }
1419
1419
  s.checkpointSha = null;
1420
1420
  }
1421
- return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt, requestDispatchedAt: unitResult.requestDispatchedAt } };
1421
+ return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
1422
1422
  }
1423
1423
  // ─── runFinalize ──────────────────────────────────────────────────────────────
1424
1424
  /**
@@ -138,7 +138,6 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
138
138
  const capturedTurnGen = getCurrentTurnGeneration();
139
139
  // ── Send the prompt ──
140
140
  debugLog("runUnit", { phase: "send-message", unitType, unitId });
141
- const requestDispatchedAt = Date.now();
142
141
  pi.sendMessage({ customType: "gsd-auto", content: prompt, display: s.verbose }, { triggerTurn: true });
143
142
  // ── Await agent_end with absolute timeout (H4 fix) ──
144
143
  // If supervision fails to resolve unitPromise within 30s, treat as cancelled.
@@ -161,7 +160,6 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
161
160
  unitId,
162
161
  status: result.status,
163
162
  });
164
- const finalResult = { ...result, requestDispatchedAt };
165
163
  // Discard trailing follow-up messages (e.g. async_job_result notifications)
166
164
  // from the completed unit. Without this, queued follow-ups trigger wasteful
167
165
  // LLM turns before the next session can start (#1642).
@@ -176,5 +174,5 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
176
174
  catch (e) {
177
175
  logWarning("engine", "clearQueue failed after unit completion", { error: String(e) });
178
176
  }
179
- return finalResult;
177
+ return result;
180
178
  }
@@ -118,8 +118,6 @@ export class AutoSession {
118
118
  lastPromptCharCount;
119
119
  lastBaselineCharCount;
120
120
  pendingQuickTasks = [];
121
- /** Timestamp of the last LLM request dispatch (ms since epoch). Used for proactive rate limiting. */
122
- lastRequestTimestamp = 0;
123
121
  // ── Safety harness ───────────────────────────────────────────────────────
124
122
  /** SHA of the pre-unit git checkpoint ref. Cleared on success or rollback. */
125
123
  checkpointSha = null;
@@ -217,7 +215,6 @@ export class AutoSession {
217
215
  this.lastPromptCharCount = undefined;
218
216
  this.lastBaselineCharCount = undefined;
219
217
  this.pendingQuickTasks = [];
220
- this.lastRequestTimestamp = 0;
221
218
  this.sidecarQueue = [];
222
219
  this.rewriteAttemptCount = 0;
223
220
  this.consecutiveCompleteBootstraps = 0;
@@ -7,7 +7,6 @@
7
7
  * globals or AutoContext dependency.
8
8
  */
9
9
  import { parseUnitId } from "./unit-id.js";
10
- import { MILESTONE_ID_RE } from "./milestone-ids.js";
11
10
  import { appendEvent } from "./workflow-events.js";
12
11
  import { atomicWriteSync } from "./atomic-write.js";
13
12
  import { clearParseCache } from "./files.js";
@@ -169,35 +168,8 @@ function getChangedFilesSinceBranch(basePath, targetBranch) {
169
168
  }
170
169
  }
171
170
  function getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId) {
172
- // Primary: path-scoped log against .gsd/milestones/<id>. Fast and unbounded
173
- // by depth when .gsd/ is tracked in git.
174
- const scoped = scanGsdTaggedCommits(basePath, milestoneId, [
175
- "log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
176
- ]);
177
- if (!scoped.ok)
178
- return scoped;
179
- if (scoped.matched)
180
- return scoped;
181
- // Fallback (#5033): when .gsd/ is gitignored / external / untracked, the
182
- // path-scoped scan matches no commits even though GSD-tagged commits
183
- // referencing the milestone exist on the integration branch. Re-scan all
184
- // of HEAD's history and rely on commitMatchesMilestone to bind by
185
- // explicit milestone mention in the message body.
186
- //
187
- // Intentionally unbounded — symmetric with the primary scan, and avoids
188
- // reintroducing the rolling-depth failure class removed in #4699 where
189
- // milestone evidence aged out behind unrelated activity.
190
- return scanGsdTaggedCommits(basePath, milestoneId, [
191
- "log", "--format=%H%x1f%B%x1e", "HEAD",
192
- ]);
193
- }
194
- function scanGsdTaggedCommits(basePath, milestoneId, gitArgs) {
195
171
  try {
196
- const logOutput = execFileSync("git", [...gitArgs], {
197
- cwd: basePath,
198
- stdio: ["ignore", "pipe", "pipe"],
199
- encoding: "utf-8",
200
- });
172
+ const logOutput = execFileSync("git", ["log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`], { cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
201
173
  const records = logOutput
202
174
  .split("\x1e")
203
175
  .map((record) => record.trim())
@@ -241,24 +213,13 @@ function commitMatchesMilestone(message, milestoneId, files) {
241
213
  if (commitTrailerStartsWithMilestone(message, milestoneId))
242
214
  return true;
243
215
  // Meaningful execute-task commits currently store task scope as Sxx/Tyy
244
- // rather than Mxx/Sxx/Tyy. Bind those commits back to the milestone when
245
- // either the commit touched this milestone's artifacts, or — for projects
246
- // where .gsd/ is gitignored/external (#5033) — the message explicitly
247
- // names the milestone.
216
+ // rather than Mxx/Sxx/Tyy. Bind those commits back to the milestone only
217
+ // when the commit also touched this milestone's artifacts.
248
218
  if (/^GSD-Task:\s*S[^/\s]+\/T\S+/m.test(message)) {
249
- if (files.some((file) => isMilestoneArtifactPath(file, milestoneId)))
250
- return true;
251
- if (commitMessageMentionsMilestone(message, milestoneId))
252
- return true;
219
+ return files.some((file) => isMilestoneArtifactPath(file, milestoneId));
253
220
  }
254
221
  return false;
255
222
  }
256
- function commitMessageMentionsMilestone(message, milestoneId) {
257
- if (!MILESTONE_ID_RE.test(milestoneId))
258
- return false;
259
- const escapedMilestone = milestoneId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
260
- return new RegExp(`\\b${escapedMilestone}\\b`).test(message);
261
- }
262
223
  function commitTrailerStartsWithMilestone(message, milestoneId) {
263
224
  const escapedMilestone = milestoneId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
264
225
  const trailerPattern = new RegExp(`^GSD-(?:Task|Unit):\\s*${escapedMilestone}(?:$|[\\s/])`, "m");
@@ -208,7 +208,7 @@ export function auditOrphanedMilestoneBranches(basePath, isolationMode) {
208
208
  else {
209
209
  // Branch is NOT merged — preserve for safety, warn the user
210
210
  warnings.push(`Branch ${branch} exists for completed milestone ${milestoneId} but is NOT merged into ${mainBranch}. ` +
211
- `This may contain unmerged work. Merge manually or run \`/gsd doctor fix\` to resolve.`);
211
+ `This may contain unmerged work. Merge manually or run \`/gsd health --fix\` to resolve.`);
212
212
  // #4764 telemetry
213
213
  try {
214
214
  emitWorktreeOrphaned(basePath, milestoneId, {
@@ -139,6 +139,6 @@ export const DETERMINISTIC_POLICY_ERROR_STRINGS = [
139
139
  export function isDeterministicPolicyError(errorMsg) {
140
140
  if (!errorMsg)
141
141
  return false;
142
- return DETERMINISTIC_POLICY_ERROR_RE.test(errorMsg)
143
- || DETERMINISTIC_POLICY_ERROR_STRINGS.some(s => errorMsg.includes(s));
142
+ return (DETERMINISTIC_POLICY_ERROR_RE.test(errorMsg) ||
143
+ DETERMINISTIC_POLICY_ERROR_STRINGS.some(s => errorMsg.includes(s)));
144
144
  }
@@ -857,11 +857,6 @@ export function runWorktreePostCreateHook(sourceDir, worktreeDir, hookPath) {
857
857
  export function autoWorktreeBranch(milestoneId) {
858
858
  return `milestone/${milestoneId}`;
859
859
  }
860
- function normalizeLocalBranchRef(branch) {
861
- return branch.startsWith("refs/heads/")
862
- ? branch.slice("refs/heads/".length)
863
- : branch;
864
- }
865
860
  // ─── Branch-mode Entry ─────────────────────────────────────────────────────
866
861
  /**
867
862
  * Enter branch isolation mode for a milestone.
@@ -1038,13 +1033,6 @@ function reconcilePlanCheckboxes(projectRoot, wtPath, milestoneId) {
1038
1033
  }
1039
1034
  }
1040
1035
  export function createAutoWorktree(basePath, milestoneId) {
1041
- // Check if repo has commits — git worktree requires a valid HEAD
1042
- try {
1043
- execFileSync("git", ["rev-parse", "--verify", "HEAD"], { cwd: basePath, stdio: "pipe" });
1044
- }
1045
- catch {
1046
- throw new GSDError(GSD_GIT_ERROR, `Cannot create worktree: repository has no commits yet. Worktree isolation requires at least one commit.`);
1047
- }
1048
1036
  const branch = autoWorktreeBranch(milestoneId);
1049
1037
  // Check if the milestone branch already exists — it survives auto-mode
1050
1038
  // stop/pause and contains committed work from prior sessions. If it exists,
@@ -1420,10 +1408,6 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1420
1408
  }
1421
1409
  }
1422
1410
  // 3. chdir to original base
1423
- // Note: previousCwd captures the cwd at this point — i.e. the worktree cwd
1424
- // entering the function. Subsequent throws restore to previousCwd, leaving
1425
- // the caller in worktree-cwd; callers (worktree-resolver) are responsible
1426
- // for any further cwd movement on the error path.
1427
1411
  const previousCwd = process.cwd();
1428
1412
  process.chdir(originalBasePath_);
1429
1413
  // 4. Resolve integration branch — prefer milestone metadata, then preferences,
@@ -1438,20 +1422,6 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1438
1422
  ? prefs.main_branch
1439
1423
  : undefined;
1440
1424
  const mainBranch = integrationBranch ?? validatedPrefBranch ?? nativeDetectMainBranch(originalBasePath_);
1441
- // Fail closed when the resolved integration branch is the milestone branch
1442
- // itself (#5024). Stale or corrupt metadata (e.g. integrationBranch recorded
1443
- // as "milestone/<MID>") would otherwise let the squash merge resolve to a
1444
- // self-merge: nothing-to-commit + empty self-diff in the post-merge safety
1445
- // check (#1792) collapse to a false success, and the worktree-resolver
1446
- // emits worktree-merged for work that never landed on a distinct
1447
- // integration branch.
1448
- if (normalizeLocalBranchRef(mainBranch) === milestoneBranch) {
1449
- process.chdir(previousCwd);
1450
- throw new GSDError(GSD_GIT_ERROR, `Resolved integration branch "${mainBranch}" is the same ref as milestone branch ` +
1451
- `"${milestoneBranch}" — refusing to self-merge. Integration branch metadata is invalid; ` +
1452
- `set a distinct main_branch in GSD preferences or repair the milestone integration record ` +
1453
- `before retrying milestone completion.`);
1454
- }
1455
1425
  // Remove transient project-root state files before any branch or merge
1456
1426
  // operation. Untracked milestone metadata can otherwise block squash merges.
1457
1427
  clearProjectRootStateFiles(originalBasePath_, milestoneId);
@@ -80,12 +80,13 @@ import { runAutoLoopWithUok } from "./uok/kernel.js";
80
80
  import { resolveUokFlags } from "./uok/flags.js";
81
81
  import { WorktreeResolver, } from "./worktree-resolver.js";
82
82
  import { reorderForCaching } from "./prompt-ordering.js";
83
+ // ─── Session State ─────────────────────────────────────────────────────────
84
+ import { AutoSession, } from "./auto/session.js";
83
85
  export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session.js";
84
- import { autoSession as s } from "./auto-runtime-state.js";
85
86
  // ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
86
87
  // ALL mutable auto-mode state lives in the AutoSession class (auto/session.ts).
87
88
  // This file must NOT declare module-level `let` or `var` variables for state.
88
- // The single shared `s` instance below is the only mutable AutoSession binding.
89
+ // The single `s` instance below is the only mutable module-level binding.
89
90
  //
90
91
  // When adding features or fixing bugs:
91
92
  // - New mutable state → add a property to AutoSession, not a module-level variable
@@ -94,6 +95,7 @@ import { autoSession as s } from "./auto-runtime-state.js";
94
95
  //
95
96
  // Tests in auto-session-encapsulation.test.ts enforce this invariant.
96
97
  // ─────────────────────────────────────────────────────────────────────────────
98
+ const s = new AutoSession();
97
99
  /** Throttle STATE.md rebuilds — at most once per 30 seconds */
98
100
  const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
99
101
  function captureProjectRootEnv(projectRoot) {
@@ -1406,21 +1408,10 @@ const widgetStateAccessors = {
1406
1408
  * Ensure directories, branches, and other prerequisites exist before
1407
1409
  * dispatching a unit. The LLM should never need to mkdir or git checkout.
1408
1410
  */
1409
- export function ensurePreconditions(unitType, unitId, base, state) {
1411
+ function ensurePreconditions(unitType, unitId, base, state) {
1410
1412
  const { milestone: mid, slice: sid } = parseUnitId(unitId);
1411
1413
  const mDir = resolveMilestonePath(base, mid);
1412
1414
  if (!mDir) {
1413
- // Fix #4996: When dispatching a slice unit against an unrecognised milestone,
1414
- // only create the directory if the milestone has a DB row.
1415
- // Without this guard, forward-referenced unit IDs (e.g. from REQUIREMENTS.md)
1416
- // silently scaffold empty stub directories that later skew nextMilestoneId.
1417
- if (sid !== undefined) {
1418
- const hasDbRow = isDbAvailable() && getMilestone(mid) != null;
1419
- if (!hasDbRow) {
1420
- logWarning("engine", `ensurePreconditions: skipping mkdir for unrecognised milestone ${mid} referenced by slice unit ${unitId} — no DB row exists`, { file: "auto.ts" });
1421
- return;
1422
- }
1423
- }
1424
1415
  const newDir = join(milestonesDir(base), mid);
1425
1416
  mkdirSync(join(newDir, "slices"), { recursive: true });
1426
1417
  }
@@ -1,12 +1,11 @@
1
1
  import { Type } from "@sinclair/typebox";
2
2
  import { Text } from "@gsd/pi-tui";
3
+ import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
3
4
  import { loadEffectiveGSDPreferences } from "../preferences.js";
4
5
  import { ensureDbOpen } from "./dynamic-tools.js";
5
6
  import { StringEnum } from "@gsd/pi-ai";
6
7
  import { logError } from "../workflow-logger.js";
7
- async function loadWorkflowExecutors() {
8
- return import("../tools/workflow-tool-executors.js");
9
- }
8
+ import { executeCompleteMilestone, executePlanMilestone, executePlanSlice, executeReplanSlice, executeReassessRoadmap, executeSaveGateResult, executeSliceComplete, executeSummarySave, executeTaskComplete, executeValidateMilestone, } from "../tools/workflow-tool-executors.js";
10
9
  /**
11
10
  * Register an alias tool that shares the same execute function as its canonical counterpart.
12
11
  * The alias description and promptGuidelines direct the LLM to prefer the canonical name.
@@ -281,7 +280,6 @@ export function registerDbTools(pi) {
281
280
  registerAlias(pi, requirementSaveTool, "gsd_save_requirement", "gsd_requirement_save");
282
281
  // ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
283
282
  const summarySaveExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
284
- const { executeSummarySave } = await loadWorkflowExecutors();
285
283
  return executeSummarySave(params, process.cwd());
286
284
  };
287
285
  const summarySaveTool = {
@@ -332,7 +330,6 @@ export function registerDbTools(pi) {
332
330
  try {
333
331
  // Claim a reserved ID if the guided-flow already previewed one to the user.
334
332
  // This guarantees the ID shown in the UI matches the one materialised on disk.
335
- const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
336
333
  const reserved = claimReservedId();
337
334
  if (reserved) {
338
335
  await ensureMilestoneDbRow(reserved);
@@ -411,7 +408,6 @@ export function registerDbTools(pi) {
411
408
  registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
412
409
  // ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
413
410
  const planMilestoneExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
414
- const { executePlanMilestone } = await loadWorkflowExecutors();
415
411
  return executePlanMilestone(params, process.cwd());
416
412
  };
417
413
  const planMilestoneTool = {
@@ -476,7 +472,6 @@ export function registerDbTools(pi) {
476
472
  registerAlias(pi, planMilestoneTool, "gsd_milestone_plan", "gsd_plan_milestone");
477
473
  // ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
478
474
  const planSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
479
- const { executePlanSlice } = await loadWorkflowExecutors();
480
475
  return executePlanSlice(params, process.cwd());
481
476
  };
482
477
  const planSliceTool = {
@@ -590,7 +585,6 @@ export function registerDbTools(pi) {
590
585
  registerAlias(pi, planTaskTool, "gsd_task_plan", "gsd_plan_task");
591
586
  // ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
592
587
  const taskCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
593
- const { executeTaskComplete } = await loadWorkflowExecutors();
594
588
  return executeTaskComplete(params, process.cwd());
595
589
  };
596
590
  const taskCompleteTool = {
@@ -653,7 +647,6 @@ export function registerDbTools(pi) {
653
647
  registerAlias(pi, taskCompleteTool, "gsd_complete_task", "gsd_task_complete");
654
648
  // ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
655
649
  const sliceCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
656
- const { executeSliceComplete } = await loadWorkflowExecutors();
657
650
  return executeSliceComplete(params, process.cwd());
658
651
  };
659
652
  const sliceCompleteTool = {
@@ -818,7 +811,6 @@ export function registerDbTools(pi) {
818
811
  });
819
812
  // ─── gsd_complete_milestone ────────────────────────────────────────────
820
813
  const milestoneCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
821
- const { executeCompleteMilestone } = await loadWorkflowExecutors();
822
814
  return executeCompleteMilestone(params, process.cwd());
823
815
  };
824
816
  const milestoneCompleteTool = {
@@ -859,7 +851,6 @@ export function registerDbTools(pi) {
859
851
  registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
860
852
  // ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
861
853
  const milestoneValidateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
862
- const { executeValidateMilestone } = await loadWorkflowExecutors();
863
854
  return executeValidateMilestone(params, process.cwd());
864
855
  };
865
856
  const milestoneValidateTool = {
@@ -892,7 +883,6 @@ export function registerDbTools(pi) {
892
883
  registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
893
884
  // ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
894
885
  const replanSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
895
- const { executeReplanSlice } = await loadWorkflowExecutors();
896
886
  return executeReplanSlice(params, process.cwd());
897
887
  };
898
888
  const replanSliceTool = {
@@ -935,7 +925,6 @@ export function registerDbTools(pi) {
935
925
  registerAlias(pi, replanSliceTool, "gsd_slice_replan", "gsd_replan_slice");
936
926
  // ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
937
927
  const reassessRoadmapExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
938
- const { executeReassessRoadmap } = await loadWorkflowExecutors();
939
928
  return executeReassessRoadmap(params, process.cwd());
940
929
  };
941
930
  const reassessRoadmapTool = {
@@ -1168,7 +1157,6 @@ export function registerDbTools(pi) {
1168
1157
  registerAlias(pi, reopenMilestoneTool, "gsd_reopen_milestone", "gsd_milestone_reopen");
1169
1158
  // ─── gsd_save_gate_result ──────────────────────────────────────────────
1170
1159
  const saveGateResultExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
1171
- const { executeSaveGateResult } = await loadWorkflowExecutors();
1172
1160
  return executeSaveGateResult(params, process.cwd());
1173
1161
  };
1174
1162
  const saveGateResultTool = {
@@ -3,6 +3,11 @@
3
3
  // Exposes the `gsd_exec` tool over MCP. Opt-in: disabled unless
4
4
  // `context_mode.enabled: true` is set in preferences.
5
5
  import { Type } from "@sinclair/typebox";
6
+ import { executeGsdExec } from "../tools/exec-tool.js";
7
+ import { executeExecSearch } from "../tools/exec-search-tool.js";
8
+ import { executeResume } from "../tools/resume-tool.js";
9
+ import { loadEffectiveGSDPreferences } from "../preferences.js";
10
+ import { logWarning } from "../workflow-logger.js";
6
11
  export function registerExecTools(pi) {
7
12
  pi.registerTool({
8
13
  name: "gsd_exec",
@@ -30,11 +35,6 @@ export function registerExecTools(pi) {
30
35
  })),
31
36
  }),
32
37
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
33
- const [{ executeGsdExec }, { loadEffectiveGSDPreferences }, { logWarning }] = await Promise.all([
34
- import("../tools/exec-tool.js"),
35
- import("../preferences.js"),
36
- import("../workflow-logger.js"),
37
- ]);
38
38
  let prefs = null;
39
39
  try {
40
40
  prefs = loadEffectiveGSDPreferences();
@@ -67,7 +67,6 @@ export function registerExecTools(pi) {
67
67
  limit: Type.Optional(Type.Number({ description: "Max results (default 20, cap 200)", minimum: 1, maximum: 200 })),
68
68
  }),
69
69
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
70
- const { executeExecSearch } = await import("../tools/exec-search-tool.js");
71
70
  return executeExecSearch(params, {
72
71
  baseDir: process.cwd(),
73
72
  });
@@ -86,7 +85,6 @@ export function registerExecTools(pi) {
86
85
  ],
87
86
  parameters: Type.Object({}),
88
87
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
89
- const { executeResume } = await import("../tools/resume-tool.js");
90
88
  return executeResume(params, {
91
89
  baseDir: process.cwd(),
92
90
  });
@@ -1,6 +1,8 @@
1
1
  // GSD2 — Read-only query tools exposing DB state to the LLM via the WAL connection
2
2
  import { Type } from "@sinclair/typebox";
3
3
  import { ensureDbOpen } from "./dynamic-tools.js";
4
+ import { executeMilestoneStatus } from "../tools/workflow-tool-executors.js";
5
+ import { checkpointDatabase } from "../gsd-db.js";
4
6
  export function registerQueryTools(pi) {
5
7
  pi.registerTool({
6
8
  name: "gsd_milestone_status",
@@ -23,7 +25,6 @@ export function registerQueryTools(pi) {
23
25
  details: { operation: "milestone_status", error: "db_unavailable" },
24
26
  };
25
27
  }
26
- const { executeMilestoneStatus } = await import("../tools/workflow-tool-executors.js");
27
28
  return executeMilestoneStatus(params);
28
29
  },
29
30
  });
@@ -48,7 +49,6 @@ export function registerQueryTools(pi) {
48
49
  details: { operation: "checkpoint_db", error: "db_unavailable" },
49
50
  };
50
51
  }
51
- const { checkpointDatabase } = await import("../gsd-db.js");
52
52
  checkpointDatabase();
53
53
  return {
54
54
  content: [{ type: "text", text: "WAL checkpoint complete. gsd.db is now up to date and safe to stage with git add." }],
@@ -1,6 +1,7 @@
1
1
  // GSD2 — Extension registration: wires all GSD tools, commands, and hooks into pi
2
2
  import { registerExitCommand } from "../exit-command.js";
3
- import { registerLazyWorktreeCommands } from "../worktree-command-bootstrap.js";
3
+ import { registerWorktreeCommand } from "../worktree-command.js";
4
+ import { loadEcosystemExtensions } from "../ecosystem/loader.js";
4
5
  import { registerDbTools } from "./db-tools.js";
5
6
  import { registerDynamicTools } from "./dynamic-tools.js";
6
7
  import { registerExecTools } from "./exec-tools.js";
@@ -63,7 +64,7 @@ function installEpipeGuard() {
63
64
  export function registerGsdExtension(pi) {
64
65
  // Note: registerGSDCommand is called by index.ts before this function,
65
66
  // so we intentionally skip it here to avoid double-registration.
66
- registerLazyWorktreeCommands(pi);
67
+ registerWorktreeCommand(pi);
67
68
  registerExitCommand(pi);
68
69
  // Wire the Layer 2 event emitter bridge so deeply-nested GSD code can emit
69
70
  // extension events (git lifecycle, verify, budget, milestone, unit) without
@@ -101,9 +102,7 @@ export function registerGsdExtension(pi) {
101
102
  ["cmux-events", () => initCmuxEventListeners(pi.events)],
102
103
  ["hooks", () => registerHooks(pi, ecosystemHandlers)],
103
104
  ["ecosystem", () => {
104
- void import("../ecosystem/loader.js")
105
- .then(({ loadEcosystemExtensions }) => loadEcosystemExtensions(pi, ecosystemHandlers))
106
- .catch((err) => {
105
+ void loadEcosystemExtensions(pi, ecosystemHandlers).catch((err) => {
107
106
  logWarning("ecosystem", `loader failed: ${err instanceof Error ? err.message : String(err)}`);
108
107
  });
109
108
  }],