gsd-pi 2.80.0-dev.96f4d89d5 → 2.80.0-dev.b0acf17e9

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 (667) hide show
  1. package/README.md +4 -2
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  18. package/dist/resources/extensions/gsd/auto/phases.js +240 -139
  19. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  21. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  23. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  24. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +103 -86
  27. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  28. package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
  29. package/dist/resources/extensions/gsd/auto-start.js +240 -15
  30. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  31. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  32. package/dist/resources/extensions/gsd/auto-worktree.js +165 -28
  33. package/dist/resources/extensions/gsd/auto.js +165 -45
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +50 -37
  36. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +35 -10
  37. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +36 -20
  38. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +10 -1
  39. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +12 -4
  40. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +11 -3
  41. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  42. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -55
  43. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  44. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
  45. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  46. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  47. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  48. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  49. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  50. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  51. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  52. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  53. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  54. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  55. package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
  56. package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
  57. package/dist/resources/extensions/gsd/detection.js +106 -0
  58. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  59. package/dist/resources/extensions/gsd/git-service.js +73 -5
  60. package/dist/resources/extensions/gsd/gsd-db.js +146 -13
  61. package/dist/resources/extensions/gsd/guided-flow.js +143 -48
  62. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  63. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  64. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  65. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  66. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  67. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  68. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  69. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  70. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  71. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  72. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  73. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  74. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  75. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  77. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  79. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  81. package/dist/resources/extensions/gsd/quick.js +34 -2
  82. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  83. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  84. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  85. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  86. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  87. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  88. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  89. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  90. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  91. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  92. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  93. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  94. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  95. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  96. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  97. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  98. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  99. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  100. package/dist/web/standalone/.next/BUILD_ID +1 -1
  101. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  102. package/dist/web/standalone/.next/build-manifest.json +3 -3
  103. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  104. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  105. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/index.html +1 -1
  124. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  125. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  126. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  127. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  132. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/middleware.js +3 -3
  135. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  136. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  137. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  138. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  139. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  140. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  141. package/dist/welcome-screen.d.ts +2 -0
  142. package/dist/welcome-screen.js +9 -7
  143. package/package.json +6 -4
  144. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  145. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  146. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  147. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  148. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  149. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  150. package/packages/native/tsconfig.tsbuildinfo +1 -1
  151. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  152. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  153. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  154. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  155. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  156. package/packages/pi-agent-core/dist/agent.js +2 -0
  157. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  158. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  159. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  160. package/packages/pi-agent-core/dist/index.js +2 -0
  161. package/packages/pi-agent-core/dist/index.js.map +1 -1
  162. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  163. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  164. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  165. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  166. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  167. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  168. package/packages/pi-agent-core/dist/types.js.map +1 -1
  169. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  170. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  171. package/packages/pi-agent-core/src/agent.ts +8 -0
  172. package/packages/pi-agent-core/src/index.ts +2 -0
  173. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  174. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  175. package/packages/pi-agent-core/src/types.ts +14 -0
  176. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  177. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  178. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  179. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  180. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  181. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  182. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  183. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  184. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  185. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  186. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  187. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  188. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  189. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  190. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  191. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  192. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  193. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  194. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  195. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  196. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  197. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  198. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  199. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  200. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  201. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  202. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  203. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
  204. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
  206. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/agent-session.js +44 -7
  208. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +78 -0
  210. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  212. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  214. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  216. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  217. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  218. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  219. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  220. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  221. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  222. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  223. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  224. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  225. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  226. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  227. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  229. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  231. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  233. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  235. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -3
  237. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  238. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  240. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  242. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  243. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  244. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  245. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  246. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
  248. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  250. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  252. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  254. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  256. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  258. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  260. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  262. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  264. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  266. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  268. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  270. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  272. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  274. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  276. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  278. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  280. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  282. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  284. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  286. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  288. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  290. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  292. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  294. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  296. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  297. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  298. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  299. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  300. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  301. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  302. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  303. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  304. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  306. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  308. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +137 -19
  310. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  312. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +7 -6
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +18 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -16
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +85 -2
  326. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  328. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +3 -0
  331. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  334. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  336. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  338. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  339. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  340. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  341. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  342. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  343. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  344. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  345. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
  346. package/packages/pi-coding-agent/src/core/agent-session.ts +48 -7
  347. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
  348. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  349. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  350. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  351. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  352. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  353. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  354. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  355. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -2
  356. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  357. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  358. package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
  359. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  360. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  361. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  362. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  363. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  364. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  365. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  366. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  367. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  368. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  369. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  370. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  371. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  372. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  373. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  374. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  375. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  376. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +185 -19
  377. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  378. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  379. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  380. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +10 -9
  381. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +260 -16
  382. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  383. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +107 -3
  384. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +3 -0
  385. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  386. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  387. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  388. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  389. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  390. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  391. package/packages/pi-tui/dist/tui.js +18 -8
  392. package/packages/pi-tui/dist/tui.js.map +1 -1
  393. package/packages/pi-tui/src/tui.ts +20 -8
  394. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  395. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  396. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  397. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  398. package/src/resources/GSD-WORKFLOW.md +2 -2
  399. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  400. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
  401. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
  402. package/src/resources/extensions/github-sync/sync.ts +8 -1
  403. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  404. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  405. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  406. package/src/resources/extensions/gsd/auto/phases.ts +328 -200
  407. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  408. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  409. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  410. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  411. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  412. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  413. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  414. package/src/resources/extensions/gsd/auto-post-unit.ts +116 -88
  415. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  416. package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
  417. package/src/resources/extensions/gsd/auto-start.ts +293 -21
  418. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  419. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  420. package/src/resources/extensions/gsd/auto-worktree.ts +199 -30
  421. package/src/resources/extensions/gsd/auto.ts +216 -40
  422. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  423. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +51 -37
  424. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +35 -10
  425. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +38 -19
  426. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +11 -1
  427. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +13 -4
  428. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +12 -3
  429. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  430. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +386 -55
  431. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  432. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
  433. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  434. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  435. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  436. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  437. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  438. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  439. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  440. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  441. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  442. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  443. package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
  444. package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
  445. package/src/resources/extensions/gsd/detection.ts +128 -0
  446. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  447. package/src/resources/extensions/gsd/git-service.ts +87 -10
  448. package/src/resources/extensions/gsd/gsd-db.ts +168 -13
  449. package/src/resources/extensions/gsd/guided-flow.ts +169 -55
  450. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  451. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  452. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  453. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  454. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  455. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  456. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  457. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  458. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  459. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  460. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  461. package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  462. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  463. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  464. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  466. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  467. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  468. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  469. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  470. package/src/resources/extensions/gsd/quick.ts +37 -2
  471. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  472. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  473. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  474. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  475. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  476. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  477. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  478. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  479. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  480. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  481. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  482. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  483. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  484. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  485. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +184 -2
  486. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  487. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  488. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  489. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  490. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  491. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  492. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  493. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  494. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  495. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  496. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  497. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  498. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  499. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  500. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  501. package/src/resources/extensions/gsd/tests/cmux.test.ts +42 -53
  502. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  503. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  504. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  505. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  506. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  507. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  508. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  509. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  510. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  511. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  512. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  513. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  514. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  515. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  516. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  517. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
  518. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  519. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  520. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  521. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  522. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  523. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  524. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  525. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  526. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  527. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  528. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  529. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  530. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  531. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  532. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  533. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  534. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  535. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  536. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  537. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  538. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +35 -0
  539. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  540. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  541. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  542. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  543. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  544. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  545. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  546. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  547. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  548. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  549. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  550. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  551. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  552. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  553. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  554. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  555. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  556. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  557. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  558. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  559. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  560. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  561. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  562. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  563. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  564. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  565. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  566. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  567. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  568. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  569. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  570. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  571. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  572. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  573. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  574. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  575. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  576. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  577. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  578. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  579. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  580. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  581. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  582. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  583. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  584. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  585. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  586. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  587. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  588. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  589. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  590. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  591. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  592. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  593. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  594. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  595. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  596. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  597. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  598. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  599. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  600. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  601. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  602. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  603. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  604. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  605. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  606. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  607. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  608. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  609. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  610. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  611. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  612. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  613. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  614. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  615. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  616. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +36 -45
  617. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  618. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  619. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  620. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  621. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  622. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  623. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  624. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  625. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  626. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  627. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  628. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  629. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  630. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  631. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  632. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  633. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  634. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  635. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  636. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  637. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  638. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  639. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  640. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  641. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  642. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  643. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  644. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  645. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  646. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  647. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  648. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  649. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  650. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  651. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  652. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  653. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  654. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  655. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  656. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  657. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  658. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  659. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  660. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  661. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  662. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  663. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  664. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  665. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  666. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → naNyn5ToUBzCQtuLbEYXC}/_buildManifest.js +0 -0
  667. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → naNyn5ToUBzCQtuLbEYXC}/_ssgManifest.js +0 -0
@@ -3,7 +3,7 @@
3
3
  import { Type } from "@sinclair/typebox";
4
4
  import { Text } from "@gsd/pi-tui";
5
5
  import { loadEffectiveGSDPreferences } from "../preferences.js";
6
- import { ensureDbOpen } from "./dynamic-tools.js";
6
+ import { ensureDbOpen, safeWorkspaceCwd } from "./dynamic-tools.js";
7
7
  import { loadWriteGateSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "./write-gate.js";
8
8
  import { StringEnum } from "@gsd/pi-ai";
9
9
  import { logError } from "../workflow-logger.js";
@@ -11,6 +11,12 @@ import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
11
11
  async function loadWorkflowExecutors() {
12
12
  return import("../tools/workflow-tool-executors.js");
13
13
  }
14
+ function toolWorkspaceRoot(ctx) {
15
+ if (ctx && typeof ctx === "object" && typeof ctx.cwd === "string") {
16
+ return ctx.cwd;
17
+ }
18
+ return safeWorkspaceCwd();
19
+ }
14
20
  /**
15
21
  * Register an alias tool that shares the same execute function as its canonical counterpart.
16
22
  * The alias description and promptGuidelines direct the LLM to prefer the canonical name.
@@ -31,8 +37,8 @@ function registerAlias(pi, toolDef, aliasName, canonicalName) {
31
37
  execute,
32
38
  });
33
39
  }
34
- function requirementRootWriteGuard(operation) {
35
- const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(process.cwd()), "REQUIREMENTS");
40
+ function requirementRootWriteGuard(operation, basePath) {
41
+ const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(basePath), "REQUIREMENTS");
36
42
  if (!guard.block)
37
43
  return null;
38
44
  return {
@@ -56,7 +62,8 @@ function readDetails(result) {
56
62
  export function registerDbTools(pi) {
57
63
  // ─── gsd_decision_save (formerly gsd_save_decision) ─────────────────────
58
64
  const decisionSaveExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
59
- const dbAvailable = await ensureDbOpen();
65
+ const basePath = toolWorkspaceRoot(_ctx);
66
+ const dbAvailable = await ensureDbOpen(basePath);
60
67
  if (!dbAvailable) {
61
68
  return {
62
69
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot save decision." }],
@@ -73,7 +80,7 @@ export function registerDbTools(pi) {
73
80
  revisable: params.revisable,
74
81
  when_context: params.when_context,
75
82
  made_by: params.made_by,
76
- }, process.cwd());
83
+ }, basePath);
77
84
  return {
78
85
  content: [{ type: "text", text: `Saved decision ${id}` }],
79
86
  details: { operation: "save_decision", id },
@@ -140,10 +147,11 @@ export function registerDbTools(pi) {
140
147
  registerAlias(pi, decisionSaveTool, "gsd_save_decision", "gsd_decision_save");
141
148
  // ─── gsd_requirement_update (formerly gsd_update_requirement) ───────────
142
149
  const requirementUpdateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
143
- const gateBlock = requirementRootWriteGuard("update_requirement");
150
+ const basePath = toolWorkspaceRoot(_ctx);
151
+ const gateBlock = requirementRootWriteGuard("update_requirement", basePath);
144
152
  if (gateBlock)
145
153
  return gateBlock;
146
- const dbAvailable = await ensureDbOpen();
154
+ const dbAvailable = await ensureDbOpen(basePath);
147
155
  if (!dbAvailable) {
148
156
  return {
149
157
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot update requirement." }],
@@ -165,7 +173,7 @@ export function registerDbTools(pi) {
165
173
  updates.primary_owner = params.primary_owner;
166
174
  if (params.supporting_slices !== undefined)
167
175
  updates.supporting_slices = params.supporting_slices;
168
- await updateRequirementInDb(params.id, updates, process.cwd());
176
+ await updateRequirementInDb(params.id, updates, basePath);
169
177
  return {
170
178
  content: [{ type: "text", text: `Updated requirement ${params.id}` }],
171
179
  details: { operation: "update_requirement", id: params.id },
@@ -225,10 +233,11 @@ export function registerDbTools(pi) {
225
233
  registerAlias(pi, requirementUpdateTool, "gsd_update_requirement", "gsd_requirement_update");
226
234
  // ─── gsd_requirement_save ─────────────────────────────────────────────
227
235
  const requirementSaveExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
228
- const gateBlock = requirementRootWriteGuard("save_requirement");
236
+ const basePath = toolWorkspaceRoot(_ctx);
237
+ const gateBlock = requirementRootWriteGuard("save_requirement", basePath);
229
238
  if (gateBlock)
230
239
  return gateBlock;
231
- const dbAvailable = await ensureDbOpen();
240
+ const dbAvailable = await ensureDbOpen(basePath);
232
241
  if (!dbAvailable) {
233
242
  return {
234
243
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot save requirement." }],
@@ -247,7 +256,7 @@ export function registerDbTools(pi) {
247
256
  supporting_slices: params.supporting_slices,
248
257
  validation: params.validation,
249
258
  notes: params.notes,
250
- }, process.cwd());
259
+ }, basePath);
251
260
  return {
252
261
  content: [{ type: "text", text: `Saved requirement ${result.id}` }],
253
262
  details: { operation: "save_requirement", id: result.id },
@@ -324,7 +333,7 @@ export function registerDbTools(pi) {
324
333
  // ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
325
334
  const summarySaveExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
326
335
  const { executeSummarySave } = await loadWorkflowExecutors();
327
- return executeSummarySave(params, process.cwd());
336
+ return executeSummarySave(params, toolWorkspaceRoot(_ctx));
328
337
  };
329
338
  const summarySaveTool = {
330
339
  name: "gsd_summary_save",
@@ -373,23 +382,23 @@ export function registerDbTools(pi) {
373
382
  // ─── gsd_milestone_generate_id (formerly gsd_generate_milestone_id) ────
374
383
  const milestoneGenerateIdExecute = async (_toolCallId, _params, _signal, _onUpdate, _ctx) => {
375
384
  try {
385
+ const basePath = toolWorkspaceRoot(_ctx);
376
386
  // Claim a reserved ID if the guided-flow already previewed one to the user.
377
387
  // This guarantees the ID shown in the UI matches the one materialised on disk.
378
388
  const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
379
389
  const reserved = claimReservedId();
380
390
  if (reserved) {
381
- await ensureMilestoneDbRow(reserved);
391
+ await ensureMilestoneDbRow(reserved, basePath);
382
392
  return {
383
393
  content: [{ type: "text", text: reserved }],
384
394
  details: { operation: "generate_milestone_id", id: reserved, source: "reserved" },
385
395
  };
386
396
  }
387
- const basePath = process.cwd();
388
397
  const existingIds = findMilestoneIds(basePath);
389
- const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
398
+ const uniqueEnabled = !!loadEffectiveGSDPreferences(basePath)?.preferences?.unique_milestone_ids;
390
399
  const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
391
400
  const newId = nextMilestoneId(allIds, uniqueEnabled);
392
- await ensureMilestoneDbRow(newId);
401
+ await ensureMilestoneDbRow(newId, basePath);
393
402
  return {
394
403
  content: [{ type: "text", text: newId }],
395
404
  details: { operation: "generate_milestone_id", id: newId, existingCount: existingIds.length, uniqueEnabled },
@@ -409,8 +418,8 @@ export function registerDbTools(pi) {
409
418
  * later writes the full row. Silently skips if the DB isn't available yet
410
419
  * (pre-migration).
411
420
  */
412
- async function ensureMilestoneDbRow(milestoneId) {
413
- const dbAvailable = await ensureDbOpen();
421
+ async function ensureMilestoneDbRow(milestoneId, basePath) {
422
+ const dbAvailable = await ensureDbOpen(basePath);
414
423
  if (!dbAvailable)
415
424
  return;
416
425
  try {
@@ -455,7 +464,7 @@ export function registerDbTools(pi) {
455
464
  // ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
456
465
  const planMilestoneExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
457
466
  const { executePlanMilestone } = await loadWorkflowExecutors();
458
- return executePlanMilestone(params, process.cwd());
467
+ return executePlanMilestone(params, toolWorkspaceRoot(_ctx));
459
468
  };
460
469
  const planMilestoneTool = {
461
470
  name: "gsd_plan_milestone",
@@ -520,7 +529,7 @@ export function registerDbTools(pi) {
520
529
  // ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
521
530
  const planSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
522
531
  const { executePlanSlice } = await loadWorkflowExecutors();
523
- return executePlanSlice(params, process.cwd());
532
+ return executePlanSlice(params, toolWorkspaceRoot(_ctx));
524
533
  };
525
534
  const planSliceTool = {
526
535
  name: "gsd_plan_slice",
@@ -564,7 +573,8 @@ export function registerDbTools(pi) {
564
573
  registerAlias(pi, planSliceTool, "gsd_slice_plan", "gsd_plan_slice");
565
574
  // ─── gsd_plan_task (gsd_task_plan alias) ───────────────────────────────
566
575
  const planTaskExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
567
- const dbAvailable = await ensureDbOpen();
576
+ const basePath = toolWorkspaceRoot(_ctx);
577
+ const dbAvailable = await ensureDbOpen(basePath);
568
578
  if (!dbAvailable) {
569
579
  return {
570
580
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot plan task." }],
@@ -573,7 +583,7 @@ export function registerDbTools(pi) {
573
583
  }
574
584
  try {
575
585
  const { handlePlanTask } = await import("../tools/plan-task.js");
576
- const result = await handlePlanTask(params, process.cwd());
586
+ const result = await handlePlanTask(params, basePath);
577
587
  if ("error" in result) {
578
588
  return {
579
589
  content: [{ type: "text", text: `Error planning task: ${result.error}` }],
@@ -634,7 +644,7 @@ export function registerDbTools(pi) {
634
644
  // ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
635
645
  const taskCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
636
646
  const { executeTaskComplete } = await loadWorkflowExecutors();
637
- return executeTaskComplete(params, process.cwd());
647
+ return executeTaskComplete(params, toolWorkspaceRoot(_ctx));
638
648
  };
639
649
  const taskCompleteTool = {
640
650
  name: "gsd_task_complete",
@@ -697,7 +707,7 @@ export function registerDbTools(pi) {
697
707
  // ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
698
708
  const sliceCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
699
709
  const { executeSliceComplete } = await loadWorkflowExecutors();
700
- return executeSliceComplete(params, process.cwd());
710
+ return executeSliceComplete(params, toolWorkspaceRoot(_ctx));
701
711
  };
702
712
  const sliceCompleteTool = {
703
713
  name: "gsd_slice_complete",
@@ -777,7 +787,8 @@ export function registerDbTools(pi) {
777
787
  registerAlias(pi, sliceCompleteTool, "gsd_complete_slice", "gsd_slice_complete");
778
788
  // ─── gsd_skip_slice (#3477 / #3487) ───────────────────────────────────
779
789
  const skipSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
780
- const dbAvailable = await ensureDbOpen();
790
+ const basePath = toolWorkspaceRoot(_ctx);
791
+ const dbAvailable = await ensureDbOpen(basePath);
781
792
  if (!dbAvailable) {
782
793
  return {
783
794
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot skip slice." }],
@@ -806,7 +817,6 @@ export function registerDbTools(pi) {
806
817
  // Rebuild STATE.md so it reflects the skip immediately (#3477).
807
818
  // Without this, /gsd auto reads stale STATE.md and resumes the skipped slice.
808
819
  try {
809
- const basePath = process.cwd();
810
820
  const { rebuildState } = await import("../doctor.js");
811
821
  await rebuildState(basePath);
812
822
  }
@@ -862,7 +872,7 @@ export function registerDbTools(pi) {
862
872
  // ─── gsd_complete_milestone ────────────────────────────────────────────
863
873
  const milestoneCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
864
874
  const { executeCompleteMilestone } = await loadWorkflowExecutors();
865
- return executeCompleteMilestone(params, process.cwd());
875
+ return executeCompleteMilestone(params, toolWorkspaceRoot(_ctx));
866
876
  };
867
877
  const milestoneCompleteTool = {
868
878
  name: "gsd_complete_milestone",
@@ -903,7 +913,7 @@ export function registerDbTools(pi) {
903
913
  // ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
904
914
  const milestoneValidateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
905
915
  const { executeValidateMilestone } = await loadWorkflowExecutors();
906
- return executeValidateMilestone(params, process.cwd());
916
+ return executeValidateMilestone(params, toolWorkspaceRoot(_ctx));
907
917
  };
908
918
  const milestoneValidateTool = {
909
919
  name: "gsd_validate_milestone",
@@ -936,7 +946,7 @@ export function registerDbTools(pi) {
936
946
  // ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
937
947
  const replanSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
938
948
  const { executeReplanSlice } = await loadWorkflowExecutors();
939
- return executeReplanSlice(params, process.cwd());
949
+ return executeReplanSlice(params, toolWorkspaceRoot(_ctx));
940
950
  };
941
951
  const replanSliceTool = {
942
952
  name: "gsd_replan_slice",
@@ -979,7 +989,7 @@ export function registerDbTools(pi) {
979
989
  // ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
980
990
  const reassessRoadmapExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
981
991
  const { executeReassessRoadmap } = await loadWorkflowExecutors();
982
- return executeReassessRoadmap(params, process.cwd());
992
+ return executeReassessRoadmap(params, toolWorkspaceRoot(_ctx));
983
993
  };
984
994
  const reassessRoadmapTool = {
985
995
  name: "gsd_reassess_roadmap",
@@ -1027,7 +1037,8 @@ export function registerDbTools(pi) {
1027
1037
  // ─── gsd_task_reopen (gsd_reopen_task alias) ───────────────────────────
1028
1038
  // Single-writer v3, Stream 3: reversibility tools for closed units.
1029
1039
  const reopenTaskExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
1030
- const dbAvailable = await ensureDbOpen();
1040
+ const basePath = toolWorkspaceRoot(_ctx);
1041
+ const dbAvailable = await ensureDbOpen(basePath);
1031
1042
  if (!dbAvailable) {
1032
1043
  return {
1033
1044
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot reopen task." }],
@@ -1036,7 +1047,7 @@ export function registerDbTools(pi) {
1036
1047
  }
1037
1048
  try {
1038
1049
  const { handleReopenTask } = await import("../tools/reopen-task.js");
1039
- const result = await handleReopenTask(params, process.cwd());
1050
+ const result = await handleReopenTask(params, basePath);
1040
1051
  if ("error" in result) {
1041
1052
  return {
1042
1053
  content: [{ type: "text", text: `Error reopening task: ${result.error}` }],
@@ -1089,7 +1100,8 @@ export function registerDbTools(pi) {
1089
1100
  registerAlias(pi, reopenTaskTool, "gsd_reopen_task", "gsd_task_reopen");
1090
1101
  // ─── gsd_slice_reopen (gsd_reopen_slice alias) ─────────────────────────
1091
1102
  const reopenSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
1092
- const dbAvailable = await ensureDbOpen();
1103
+ const basePath = toolWorkspaceRoot(_ctx);
1104
+ const dbAvailable = await ensureDbOpen(basePath);
1093
1105
  if (!dbAvailable) {
1094
1106
  return {
1095
1107
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot reopen slice." }],
@@ -1098,7 +1110,7 @@ export function registerDbTools(pi) {
1098
1110
  }
1099
1111
  try {
1100
1112
  const { handleReopenSlice } = await import("../tools/reopen-slice.js");
1101
- const result = await handleReopenSlice(params, process.cwd());
1113
+ const result = await handleReopenSlice(params, basePath);
1102
1114
  if ("error" in result) {
1103
1115
  return {
1104
1116
  content: [{ type: "text", text: `Error reopening slice: ${result.error}` }],
@@ -1151,7 +1163,8 @@ export function registerDbTools(pi) {
1151
1163
  registerAlias(pi, reopenSliceTool, "gsd_reopen_slice", "gsd_slice_reopen");
1152
1164
  // ─── gsd_milestone_reopen (gsd_reopen_milestone alias) ─────────────────
1153
1165
  const reopenMilestoneExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
1154
- const dbAvailable = await ensureDbOpen();
1166
+ const basePath = toolWorkspaceRoot(_ctx);
1167
+ const dbAvailable = await ensureDbOpen(basePath);
1155
1168
  if (!dbAvailable) {
1156
1169
  return {
1157
1170
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot reopen milestone." }],
@@ -1160,7 +1173,7 @@ export function registerDbTools(pi) {
1160
1173
  }
1161
1174
  try {
1162
1175
  const { handleReopenMilestone } = await import("../tools/reopen-milestone.js");
1163
- const result = await handleReopenMilestone(params, process.cwd());
1176
+ const result = await handleReopenMilestone(params, basePath);
1164
1177
  if ("error" in result) {
1165
1178
  return {
1166
1179
  content: [{ type: "text", text: `Error reopening milestone: ${result.error}` }],
@@ -1212,7 +1225,7 @@ export function registerDbTools(pi) {
1212
1225
  // ─── gsd_save_gate_result ──────────────────────────────────────────────
1213
1226
  const saveGateResultExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
1214
1227
  const { executeSaveGateResult } = await loadWorkflowExecutors();
1215
- return executeSaveGateResult(params, process.cwd());
1228
+ return executeSaveGateResult(params, toolWorkspaceRoot(_ctx));
1216
1229
  };
1217
1230
  const saveGateResultTool = {
1218
1231
  name: "gsd_save_gate_result",
@@ -1,9 +1,29 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers workspace-aware dynamic filesystem and shell tools.
1
3
  import { existsSync } from "node:fs";
4
+ import { homedir } from "node:os";
2
5
  import { dirname } from "node:path";
3
6
  import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
4
7
  import { DEFAULT_BASH_TIMEOUT_SECS } from "../constants.js";
5
8
  import { setLogBasePath, logWarning } from "../workflow-logger.js";
6
9
  import { resolveGsdPathContract } from "../paths.js";
10
+ export function safeWorkspaceCwd() {
11
+ try {
12
+ return process.cwd();
13
+ }
14
+ catch {
15
+ const projectRoot = process.env.GSD_PROJECT_ROOT;
16
+ if (projectRoot && existsSync(projectRoot))
17
+ return projectRoot;
18
+ return homedir();
19
+ }
20
+ }
21
+ function resolveToolWorkspaceRoot(ctx) {
22
+ if (ctx && typeof ctx === "object" && typeof ctx.cwd === "string") {
23
+ return ctx.cwd;
24
+ }
25
+ return safeWorkspaceCwd();
26
+ }
7
27
  /**
8
28
  * Resolve the correct DB path for the current working directory.
9
29
  * If `basePath` is inside a `.gsd/worktrees/<MID>/` directory, returns
@@ -13,7 +33,7 @@ import { resolveGsdPathContract } from "../paths.js";
13
33
  export function resolveProjectRootDbPath(basePath) {
14
34
  return resolveGsdPathContract(basePath).projectDb;
15
35
  }
16
- export async function ensureDbOpen(basePath = process.cwd()) {
36
+ export async function ensureDbOpen(basePath = safeWorkspaceCwd()) {
17
37
  try {
18
38
  const db = await import("../gsd-db.js");
19
39
  const contract = resolveGsdPathContract(basePath);
@@ -44,41 +64,46 @@ export async function ensureDbOpen(basePath = process.cwd()) {
44
64
  }
45
65
  }
46
66
  export function registerDynamicTools(pi) {
47
- const baseBash = createBashTool(process.cwd(), {
48
- spawnHook: (ctx) => ({ ...ctx, cwd: process.cwd() }),
67
+ const fallbackRoot = safeWorkspaceCwd();
68
+ const baseBash = createBashTool(fallbackRoot, {
69
+ spawnHook: (ctx) => ctx,
49
70
  });
50
71
  const dynamicBash = {
51
72
  ...baseBash,
52
73
  execute: async (toolCallId, params, signal, onUpdate, ctx) => {
74
+ const basePath = resolveToolWorkspaceRoot(ctx);
75
+ const fresh = createBashTool(basePath, {
76
+ spawnHook: (spawnCtx) => ({ ...spawnCtx, cwd: basePath }),
77
+ });
53
78
  const paramsWithTimeout = {
54
79
  ...params,
55
80
  timeout: params.timeout ?? DEFAULT_BASH_TIMEOUT_SECS,
56
81
  };
57
- return baseBash.execute(toolCallId, paramsWithTimeout, signal, onUpdate, ctx);
82
+ return fresh.execute(toolCallId, paramsWithTimeout, signal, onUpdate, ctx);
58
83
  },
59
84
  };
60
85
  pi.registerTool(dynamicBash);
61
- const baseWrite = createWriteTool(process.cwd());
86
+ const baseWrite = createWriteTool(fallbackRoot);
62
87
  pi.registerTool({
63
88
  ...baseWrite,
64
89
  execute: async (toolCallId, params, signal, onUpdate, ctx) => {
65
- const fresh = createWriteTool(process.cwd());
90
+ const fresh = createWriteTool(resolveToolWorkspaceRoot(ctx));
66
91
  return fresh.execute(toolCallId, params, signal, onUpdate, ctx);
67
92
  },
68
93
  });
69
- const baseRead = createReadTool(process.cwd());
94
+ const baseRead = createReadTool(fallbackRoot);
70
95
  pi.registerTool({
71
96
  ...baseRead,
72
97
  execute: async (toolCallId, params, signal, onUpdate, ctx) => {
73
- const fresh = createReadTool(process.cwd());
98
+ const fresh = createReadTool(resolveToolWorkspaceRoot(ctx));
74
99
  return fresh.execute(toolCallId, params, signal, onUpdate, ctx);
75
100
  },
76
101
  });
77
- const baseEdit = createEditTool(process.cwd());
102
+ const baseEdit = createEditTool(fallbackRoot);
78
103
  pi.registerTool({
79
104
  ...baseEdit,
80
105
  execute: async (toolCallId, params, signal, onUpdate, ctx) => {
81
- const fresh = createEditTool(process.cwd());
106
+ const fresh = createEditTool(resolveToolWorkspaceRoot(ctx));
82
107
  return fresh.execute(toolCallId, params, signal, onUpdate, ctx);
83
108
  },
84
109
  });
@@ -1,23 +1,45 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers Context Mode execution tools.
1
3
  // GSD2 — Exec (context-mode) tool registration.
2
4
  //
3
5
  // Exposes the Context Mode runtime tools in-process. Default-on; opt out with
4
6
  // `context_mode.enabled: false` in preferences.
5
7
  import { Type } from "@sinclair/typebox";
8
+ import { safeWorkspaceCwd } from "./dynamic-tools.js";
9
+ function toolWorkspaceRoot(ctx) {
10
+ if (ctx && typeof ctx === "object" && typeof ctx.cwd === "string") {
11
+ return ctx.cwd;
12
+ }
13
+ return safeWorkspaceCwd();
14
+ }
15
+ async function loadContextModePreferences(baseDir) {
16
+ const [{ loadEffectiveGSDPreferences }, { logWarning }] = await Promise.all([
17
+ import("../preferences.js"),
18
+ import("../workflow-logger.js"),
19
+ ]);
20
+ try {
21
+ return loadEffectiveGSDPreferences(baseDir)?.preferences ?? null;
22
+ }
23
+ catch (err) {
24
+ logWarning("tool", `Context Mode tool could not load preferences: ${err instanceof Error ? err.message : String(err)}`);
25
+ return null;
26
+ }
27
+ }
6
28
  export function registerExecTools(pi) {
7
29
  pi.registerTool({
8
30
  name: "gsd_exec",
9
31
  label: "Exec (Sandboxed)",
10
- description: "Run a short script (bash/node/python) in a subprocess. Full stdout/stderr persist to " +
32
+ description: "Run a short script (bash/node/python) in a subprocess. Capped stdout/stderr and metadata persist to " +
11
33
  ".gsd/exec/<id>.{stdout,stderr,meta.json}; only a short digest returns in context. Use " +
12
34
  "this instead of reading many files or emitting large tool outputs — e.g. have the script " +
13
35
  "count/grep/summarize and log the finding. Enabled by default; opt out via " +
14
36
  "preferences.context_mode.enabled=false.",
15
- promptSnippet: "Run a bash/node/python script in a sandbox; full output is saved to disk and only a digest returns",
37
+ promptSnippet: "Run a bash/node/python script in a sandbox; capped output is saved to disk and only a digest returns",
16
38
  promptGuidelines: [
17
39
  "Prefer gsd_exec for analyses that would otherwise read >3 files or produce large tool output.",
18
40
  "Write scripts that log the finding (counts, matches, summaries) rather than raw dumps.",
19
41
  "The digest is the last ~300 chars of stdout — size your log output accordingly.",
20
- "Need the full output? Read the stdout_path returned in details (file on local disk).",
42
+ "Need persisted output? Read the stdout_path returned in details (file on local disk).",
21
43
  ],
22
44
  parameters: Type.Object({
23
45
  runtime: Type.Union([Type.Literal("bash"), Type.Literal("node"), Type.Literal("python")], { description: "Interpreter: bash (-c), node (-e), or python3 (-c)." }),
@@ -30,21 +52,11 @@ export function registerExecTools(pi) {
30
52
  })),
31
53
  }),
32
54
  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
- let prefs = null;
39
- try {
40
- prefs = loadEffectiveGSDPreferences();
41
- }
42
- catch (err) {
43
- logWarning("tool", `gsd_exec could not load preferences: ${err instanceof Error ? err.message : String(err)}`);
44
- }
55
+ const { executeGsdExec } = await import("../tools/exec-tool.js");
56
+ const baseDir = toolWorkspaceRoot(_ctx);
45
57
  return executeGsdExec(params, {
46
- baseDir: process.cwd(),
47
- preferences: prefs?.preferences ?? null,
58
+ baseDir,
59
+ preferences: await loadContextModePreferences(baseDir),
48
60
  });
49
61
  },
50
62
  });
@@ -56,7 +68,7 @@ export function registerExecTools(pi) {
56
68
  promptSnippet: "Search prior gsd_exec runs by substring, runtime, or failing-only filter",
57
69
  promptGuidelines: [
58
70
  "Use this before re-running an expensive analysis — the prior run's stdout file may still answer.",
59
- "The preview shows the trailing ~300 chars of stdout; read stdout_path for the full transcript.",
71
+ "The preview shows the trailing ~300 chars of stdout; read stdout_path for persisted output.",
60
72
  ],
61
73
  parameters: Type.Object({
62
74
  query: Type.Optional(Type.String({ description: "Substring matched against id and purpose (case-insensitive)." })),
@@ -68,8 +80,10 @@ export function registerExecTools(pi) {
68
80
  }),
69
81
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
70
82
  const { executeExecSearch } = await import("../tools/exec-search-tool.js");
83
+ const baseDir = toolWorkspaceRoot(_ctx);
71
84
  return executeExecSearch(params, {
72
- baseDir: process.cwd(),
85
+ baseDir,
86
+ preferences: await loadContextModePreferences(baseDir),
73
87
  });
74
88
  },
75
89
  });
@@ -87,8 +101,10 @@ export function registerExecTools(pi) {
87
101
  parameters: Type.Object({}),
88
102
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
89
103
  const { executeResume } = await import("../tools/resume-tool.js");
104
+ const baseDir = toolWorkspaceRoot(_ctx);
90
105
  return executeResume(params, {
91
- baseDir: process.cwd(),
106
+ baseDir,
107
+ preferences: await loadContextModePreferences(baseDir),
92
108
  });
93
109
  },
94
110
  });
@@ -1,6 +1,15 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers journal query tools.
1
3
  import { Type } from "@sinclair/typebox";
2
4
  import { queryJournal } from "../journal.js";
3
5
  import { logWarning } from "../workflow-logger.js";
6
+ import { safeWorkspaceCwd } from "./dynamic-tools.js";
7
+ function toolWorkspaceRoot(ctx) {
8
+ if (ctx && typeof ctx === "object" && typeof ctx.cwd === "string") {
9
+ return ctx.cwd;
10
+ }
11
+ return safeWorkspaceCwd();
12
+ }
4
13
  export function registerJournalTools(pi) {
5
14
  pi.registerTool({
6
15
  name: "gsd_journal_query",
@@ -37,7 +46,7 @@ export function registerJournalTools(pi) {
37
46
  filters.after = params.after;
38
47
  if (params.before !== undefined)
39
48
  filters.before = params.before;
40
- const entries = queryJournal(process.cwd(), filters);
49
+ const entries = queryJournal(toolWorkspaceRoot(_ctx), filters);
41
50
  const limited = entries.slice(0, params.limit ?? 100);
42
51
  if (limited.length === 0) {
43
52
  return {
@@ -1,11 +1,19 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers memory-layer tools.
1
3
  // GSD2 — Memory tool registration
2
4
  //
3
5
  // Exposes the memory-layer tools (capture_thought, memory_query, gsd_graph)
4
6
  // to the LLM over MCP. All three degrade gracefully when the GSD database
5
7
  // is unavailable.
6
8
  import { Type } from "@sinclair/typebox";
7
- import { ensureDbOpen } from "./dynamic-tools.js";
9
+ import { ensureDbOpen, safeWorkspaceCwd } from "./dynamic-tools.js";
8
10
  import { executeGsdGraph, executeMemoryCapture, executeMemoryQuery, } from "../tools/memory-tools.js";
11
+ function toolWorkspaceRoot(ctx) {
12
+ if (ctx && typeof ctx === "object" && typeof ctx.cwd === "string") {
13
+ return ctx.cwd;
14
+ }
15
+ return safeWorkspaceCwd();
16
+ }
9
17
  export function registerMemoryTools(pi) {
10
18
  // ─── capture_thought ────────────────────────────────────────────────────
11
19
  pi.registerTool({
@@ -39,7 +47,7 @@ export function registerMemoryTools(pi) {
39
47
  })),
40
48
  }),
41
49
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
42
- const ok = await ensureDbOpen();
50
+ const ok = await ensureDbOpen(toolWorkspaceRoot(_ctx));
43
51
  if (!ok) {
44
52
  return {
45
53
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot capture memory." }],
@@ -79,7 +87,7 @@ export function registerMemoryTools(pi) {
79
87
  reinforce_hits: Type.Optional(Type.Boolean({ description: "Increment hit_count on returned memories (default false)" })),
80
88
  }),
81
89
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
82
- const ok = await ensureDbOpen();
90
+ const ok = await ensureDbOpen(toolWorkspaceRoot(_ctx));
83
91
  if (!ok) {
84
92
  return {
85
93
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot query memory." }],
@@ -117,7 +125,7 @@ export function registerMemoryTools(pi) {
117
125
  ], { description: "Only include edges with this relation type" })),
118
126
  }),
119
127
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
120
- const ok = await ensureDbOpen();
128
+ const ok = await ensureDbOpen(toolWorkspaceRoot(_ctx));
121
129
  if (!ok) {
122
130
  return {
123
131
  content: [{ type: "text", text: "Error: GSD database is not available." }],
@@ -1,6 +1,14 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers read-only DB query tools.
1
3
  // GSD2 — Read-only query tools exposing DB state to the LLM via the WAL connection
2
4
  import { Type } from "@sinclair/typebox";
3
- import { ensureDbOpen } from "./dynamic-tools.js";
5
+ import { ensureDbOpen, safeWorkspaceCwd } from "./dynamic-tools.js";
6
+ function toolWorkspaceRoot(ctx) {
7
+ if (ctx && typeof ctx === "object" && typeof ctx.cwd === "string") {
8
+ return ctx.cwd;
9
+ }
10
+ return safeWorkspaceCwd();
11
+ }
4
12
  export function registerQueryTools(pi) {
5
13
  pi.registerTool({
6
14
  name: "gsd_milestone_status",
@@ -16,7 +24,7 @@ export function registerQueryTools(pi) {
16
24
  milestoneId: Type.String({ description: "Milestone ID to query (e.g. M001)" }),
17
25
  }),
18
26
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
19
- const dbAvailable = await ensureDbOpen();
27
+ const dbAvailable = await ensureDbOpen(toolWorkspaceRoot(_ctx));
20
28
  if (!dbAvailable) {
21
29
  return {
22
30
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot read milestone status." }],
@@ -41,7 +49,7 @@ export function registerQueryTools(pi) {
41
49
  ],
42
50
  parameters: Type.Object({}),
43
51
  async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
44
- const dbAvailable = await ensureDbOpen();
52
+ const dbAvailable = await ensureDbOpen(toolWorkspaceRoot(_ctx));
45
53
  if (!dbAvailable) {
46
54
  return {
47
55
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot checkpoint." }],
@@ -36,7 +36,7 @@ export function handleRecoverableExtensionProcessError(err) {
36
36
  }
37
37
  return false;
38
38
  }
39
- function installEpipeGuard() {
39
+ export function installEpipeGuard() {
40
40
  if (!process.listeners("uncaughtException").some((listener) => listener.name === "_gsdEpipeGuard")) {
41
41
  const _gsdEpipeGuard = (err) => {
42
42
  if (handleRecoverableExtensionProcessError(err))