gsd-pi 2.69.0 → 2.70.0-dev.7ebda5e

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 (255) hide show
  1. package/dist/loader.js +4 -0
  2. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +150 -2
  3. package/dist/resources/extensions/gsd/auto-model-selection.js +33 -19
  4. package/dist/resources/extensions/gsd/auto-prompts.js +7 -3
  5. package/dist/resources/extensions/gsd/auto-start.js +25 -1
  6. package/dist/resources/extensions/gsd/auto.js +12 -8
  7. package/dist/resources/extensions/gsd/bootstrap/system-context.js +6 -2
  8. package/dist/resources/extensions/gsd/commands-cmux.js +30 -1
  9. package/dist/resources/extensions/gsd/commands-handlers.js +22 -8
  10. package/dist/resources/extensions/gsd/doctor-engine-checks.js +12 -0
  11. package/dist/resources/extensions/gsd/doctor-format.js +2 -0
  12. package/dist/resources/extensions/gsd/guided-flow.js +21 -10
  13. package/dist/resources/extensions/gsd/pre-execution-checks.js +5 -3
  14. package/dist/resources/extensions/gsd/validate-directory.js +30 -12
  15. package/dist/resources/extensions/gsd/workflow-mcp.js +64 -6
  16. package/dist/resources/extensions/slash-commands/audit.js +2 -1
  17. package/dist/resources/extensions/subagent/isolation.js +4 -2
  18. package/dist/update-check.d.ts +1 -0
  19. package/dist/update-check.js +30 -27
  20. package/dist/update-cmd.js +3 -11
  21. package/dist/web/standalone/.next/BUILD_ID +1 -1
  22. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  23. package/dist/web/standalone/.next/build-manifest.json +3 -3
  24. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  25. package/dist/web/standalone/.next/required-server-files.json +4 -4
  26. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  27. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  28. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  29. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  37. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  39. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  40. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  41. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  43. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  44. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  47. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  48. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  49. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  50. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  53. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  65. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  85. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  95. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  101. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  117. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  121. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/index.html +1 -1
  131. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  132. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  133. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  134. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  136. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/page.js +2 -2
  138. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  140. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  141. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  142. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/middleware.js +2 -2
  144. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  146. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  147. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  148. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  149. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  150. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  151. package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
  152. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  153. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  154. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  155. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  156. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  157. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  158. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  159. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  160. package/dist/web/standalone/server.js +1 -1
  161. package/dist/web-mode.js +4 -0
  162. package/package.json +11 -11
  163. package/packages/daemon/src/orchestrator.ts +9 -84
  164. package/packages/mcp-server/README.md +25 -3
  165. package/packages/mcp-server/dist/cli.d.ts +0 -1
  166. package/packages/mcp-server/dist/cli.d.ts.map +1 -1
  167. package/packages/mcp-server/dist/cli.js +4 -2
  168. package/packages/mcp-server/dist/cli.js.map +1 -1
  169. package/packages/mcp-server/dist/server.d.ts +32 -1
  170. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  171. package/packages/mcp-server/dist/server.js +118 -1
  172. package/packages/mcp-server/dist/server.js.map +1 -1
  173. package/packages/mcp-server/dist/tool-credentials.d.ts +6 -0
  174. package/packages/mcp-server/dist/tool-credentials.d.ts.map +1 -0
  175. package/packages/mcp-server/dist/tool-credentials.js +90 -0
  176. package/packages/mcp-server/dist/tool-credentials.js.map +1 -0
  177. package/packages/mcp-server/dist/workflow-tools.d.ts +3 -0
  178. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  179. package/packages/mcp-server/dist/workflow-tools.js +308 -4
  180. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  181. package/packages/mcp-server/src/cli.ts +5 -3
  182. package/packages/mcp-server/src/import-candidates.test.ts +48 -0
  183. package/packages/mcp-server/src/mcp-server.test.ts +85 -1
  184. package/packages/mcp-server/src/server.ts +188 -1
  185. package/packages/mcp-server/src/tool-credentials.test.ts +95 -0
  186. package/packages/mcp-server/src/tool-credentials.ts +97 -0
  187. package/packages/mcp-server/src/workflow-tools.test.ts +32 -25
  188. package/packages/mcp-server/src/workflow-tools.ts +398 -2
  189. package/packages/pi-agent-core/dist/agent.d.ts +8 -0
  190. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  191. package/packages/pi-agent-core/dist/agent.js +3 -0
  192. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  193. package/packages/pi-agent-core/src/agent.test.ts +82 -0
  194. package/packages/pi-agent-core/src/agent.ts +12 -0
  195. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  196. package/packages/pi-ai/dist/providers/anthropic.js +1 -23
  197. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  198. package/packages/pi-ai/dist/utils/oauth/index.d.ts +3 -2
  199. package/packages/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  200. package/packages/pi-ai/dist/utils/oauth/index.js +3 -5
  201. package/packages/pi-ai/dist/utils/oauth/index.js.map +1 -1
  202. package/packages/pi-ai/src/providers/anthropic.ts +1 -31
  203. package/packages/pi-ai/src/utils/oauth/index.ts +3 -5
  204. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +1 -0
  205. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  206. package/packages/pi-coding-agent/dist/core/lsp/config.js +38 -15
  207. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/sdk.js +10 -0
  210. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  212. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +3 -1
  213. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  214. package/packages/pi-coding-agent/package.json +1 -1
  215. package/packages/pi-coding-agent/src/core/lsp/config.ts +43 -17
  216. package/packages/pi-coding-agent/src/core/sdk.ts +8 -0
  217. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +7 -5
  218. package/pkg/package.json +1 -1
  219. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +227 -2
  220. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +172 -0
  221. package/src/resources/extensions/gsd/auto-model-selection.ts +39 -25
  222. package/src/resources/extensions/gsd/auto-prompts.ts +7 -3
  223. package/src/resources/extensions/gsd/auto-start.ts +34 -1
  224. package/src/resources/extensions/gsd/auto.ts +12 -8
  225. package/src/resources/extensions/gsd/bootstrap/system-context.ts +9 -5
  226. package/src/resources/extensions/gsd/commands-cmux.ts +32 -1
  227. package/src/resources/extensions/gsd/commands-handlers.ts +22 -7
  228. package/src/resources/extensions/gsd/doctor-engine-checks.ts +14 -0
  229. package/src/resources/extensions/gsd/doctor-format.ts +1 -0
  230. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  231. package/src/resources/extensions/gsd/guided-flow.ts +24 -8
  232. package/src/resources/extensions/gsd/pre-execution-checks.ts +6 -3
  233. package/src/resources/extensions/gsd/tests/cmux.test.ts +67 -1
  234. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +43 -0
  235. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +207 -0
  236. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +6 -2
  237. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +48 -1
  238. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +8 -7
  239. package/src/resources/extensions/gsd/tests/validate-directory.test.ts +33 -1
  240. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +87 -1
  241. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +48 -7
  242. package/src/resources/extensions/gsd/validate-directory.ts +33 -11
  243. package/src/resources/extensions/gsd/workflow-mcp.ts +74 -5
  244. package/src/resources/extensions/slash-commands/audit.ts +2 -1
  245. package/src/resources/extensions/subagent/isolation.ts +4 -3
  246. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  247. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  248. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  249. package/packages/pi-ai/dist/utils/oauth/anthropic.d.ts +0 -17
  250. package/packages/pi-ai/dist/utils/oauth/anthropic.d.ts.map +0 -1
  251. package/packages/pi-ai/dist/utils/oauth/anthropic.js +0 -106
  252. package/packages/pi-ai/dist/utils/oauth/anthropic.js.map +0 -1
  253. package/packages/pi-ai/src/utils/oauth/anthropic.ts +0 -140
  254. /package/dist/web/standalone/.next/static/{DrWdzskk28E5Qz-Wjw1mj → yvFbuOJuph5517lR7HBt2}/_buildManifest.js +0 -0
  255. /package/dist/web/standalone/.next/static/{DrWdzskk28E5Qz-Wjw1mj → yvFbuOJuph5517lR7HBt2}/_ssgManifest.js +0 -0
@@ -318,7 +318,7 @@ function getWriteGateModuleCandidates(): string[] {
318
318
  const candidates: string[] = [];
319
319
  const explicitModule = process.env.GSD_WORKFLOW_WRITE_GATE_MODULE?.trim();
320
320
  if (explicitModule) {
321
- if (/^[a-z]+:/i.test(explicitModule) && !explicitModule.startsWith("file:")) {
321
+ if (/^[a-z]{2,}:/i.test(explicitModule) && !explicitModule.startsWith("file:")) {
322
322
  throw new Error("GSD_WORKFLOW_WRITE_GATE_MODULE only supports file: URLs or filesystem paths.");
323
323
  }
324
324
  candidates.push(explicitModule.startsWith("file:") ? explicitModule : toFileUrl(explicitModule));
@@ -326,6 +326,7 @@ function getWriteGateModuleCandidates(): string[] {
326
326
 
327
327
  candidates.push(
328
328
  new URL("../../../src/resources/extensions/gsd/bootstrap/write-gate.js", import.meta.url).href,
329
+ new URL("../../../dist/resources/extensions/gsd/bootstrap/write-gate.js", import.meta.url).href,
329
330
  new URL("../../../src/resources/extensions/gsd/bootstrap/write-gate.ts", import.meta.url).href,
330
331
  );
331
332
 
@@ -336,11 +337,46 @@ function toFileUrl(modulePath: string): string {
336
337
  return pathToFileURL(resolve(modulePath)).href;
337
338
  }
338
339
 
340
+ /** @internal — exported for testing only */
341
+ export function _buildImportCandidates(relativePath: string): string[] {
342
+ // Build candidate paths: try the given path first, then swap src/<->dist/
343
+ // and try .ts extension. This handles both dev (tsx from src/) and prod
344
+ // (compiled from dist/) execution contexts.
345
+ const candidates: string[] = [relativePath];
346
+ const swapped = relativePath.includes("/src/")
347
+ ? relativePath.replace("/src/", "/dist/")
348
+ : relativePath.includes("/dist/")
349
+ ? relativePath.replace("/dist/", "/src/")
350
+ : null;
351
+ if (swapped) candidates.push(swapped);
352
+ // Also try .ts variants for dev-mode tsx execution
353
+ if (relativePath.endsWith(".js")) {
354
+ candidates.push(relativePath.replace(/\.js$/, ".ts"));
355
+ if (swapped) candidates.push(swapped.replace(/\.js$/, ".ts"));
356
+ }
357
+ return candidates;
358
+ }
359
+
360
+ async function importLocalModule<T>(relativePath: string): Promise<T> {
361
+ const candidates = _buildImportCandidates(relativePath)
362
+ .map((p) => new URL(p, import.meta.url).href);
363
+
364
+ let lastErr: unknown;
365
+ for (const candidate of candidates) {
366
+ try {
367
+ return await import(candidate) as T;
368
+ } catch (err) {
369
+ lastErr = err;
370
+ }
371
+ }
372
+ throw lastErr;
373
+ }
374
+
339
375
  function getWorkflowExecutorModuleCandidates(env: NodeJS.ProcessEnv = process.env): string[] {
340
376
  const candidates: string[] = [];
341
377
  const explicitModule = env.GSD_WORKFLOW_EXECUTORS_MODULE?.trim();
342
378
  if (explicitModule) {
343
- if (/^[a-z]+:/i.test(explicitModule) && !explicitModule.startsWith("file:")) {
379
+ if (/^[a-z]{2,}:/i.test(explicitModule) && !explicitModule.startsWith("file:")) {
344
380
  throw new Error("GSD_WORKFLOW_EXECUTORS_MODULE only supports file: URLs or filesystem paths.");
345
381
  }
346
382
  candidates.push(explicitModule.startsWith("file:") ? explicitModule : toFileUrl(explicitModule));
@@ -348,6 +384,7 @@ function getWorkflowExecutorModuleCandidates(env: NodeJS.ProcessEnv = process.en
348
384
 
349
385
  candidates.push(
350
386
  new URL("../../../src/resources/extensions/gsd/tools/workflow-tool-executors.js", import.meta.url).href,
387
+ new URL("../../../dist/resources/extensions/gsd/tools/workflow-tool-executors.js", import.meta.url).href,
351
388
  new URL("../../../src/resources/extensions/gsd/tools/workflow-tool-executors.ts", import.meta.url).href,
352
389
  );
353
390
 
@@ -420,6 +457,38 @@ interface McpToolServer {
420
457
  ): unknown;
421
458
  }
422
459
 
460
+ export const WORKFLOW_TOOL_NAMES = [
461
+ "gsd_decision_save",
462
+ "gsd_save_decision",
463
+ "gsd_requirement_update",
464
+ "gsd_update_requirement",
465
+ "gsd_requirement_save",
466
+ "gsd_save_requirement",
467
+ "gsd_milestone_generate_id",
468
+ "gsd_generate_milestone_id",
469
+ "gsd_plan_milestone",
470
+ "gsd_plan_slice",
471
+ "gsd_plan_task",
472
+ "gsd_task_plan",
473
+ "gsd_replan_slice",
474
+ "gsd_slice_replan",
475
+ "gsd_slice_complete",
476
+ "gsd_complete_slice",
477
+ "gsd_skip_slice",
478
+ "gsd_complete_milestone",
479
+ "gsd_milestone_complete",
480
+ "gsd_validate_milestone",
481
+ "gsd_milestone_validate",
482
+ "gsd_reassess_roadmap",
483
+ "gsd_roadmap_reassess",
484
+ "gsd_save_gate_result",
485
+ "gsd_summary_save",
486
+ "gsd_task_complete",
487
+ "gsd_complete_task",
488
+ "gsd_milestone_status",
489
+ "gsd_journal_query",
490
+ ] as const;
491
+
423
492
  async function runSerializedWorkflowOperation<T>(fn: () => Promise<T>): Promise<T> {
424
493
  // The shared DB adapter and workflow log base path are process-global, so
425
494
  // workflow MCP mutations must not overlap within a single server process.
@@ -566,6 +635,15 @@ async function handleSaveGateResult(
566
635
  return runSerializedWorkflowOperation(() => executeSaveGateResult(params, projectDir));
567
636
  }
568
637
 
638
+ async function ensureMilestoneDbRow(milestoneId: string): Promise<void> {
639
+ try {
640
+ const { insertMilestone } = await importLocalModule<any>("../../../src/resources/extensions/gsd/gsd-db.js");
641
+ insertMilestone({ id: milestoneId, status: "queued" });
642
+ } catch {
643
+ // Ignore pre-existing rows or transient DB availability issues.
644
+ }
645
+ }
646
+
569
647
  const projectDirParam = z.string().describe("Absolute path to the project directory within the configured workflow root");
570
648
 
571
649
  const planMilestoneParams = {
@@ -772,6 +850,73 @@ const summarySaveParams = {
772
850
  };
773
851
  const summarySaveSchema = z.object(summarySaveParams);
774
852
 
853
+ const decisionSaveParams = {
854
+ projectDir: projectDirParam,
855
+ scope: z.string().describe("Scope of the decision (e.g. architecture, library, observability)"),
856
+ decision: z.string().describe("What is being decided"),
857
+ choice: z.string().describe("The choice made"),
858
+ rationale: z.string().describe("Why this choice was made"),
859
+ revisable: z.string().optional().describe("Whether this can be revisited"),
860
+ when_context: z.string().optional().describe("When/context for the decision"),
861
+ made_by: z.enum(["human", "agent", "collaborative"]).optional().describe("Who made the decision"),
862
+ };
863
+ const decisionSaveSchema = z.object(decisionSaveParams);
864
+
865
+ const requirementUpdateParams = {
866
+ projectDir: projectDirParam,
867
+ id: z.string().describe("Requirement ID (e.g. R001)"),
868
+ status: z.string().optional().describe("New status"),
869
+ validation: z.string().optional().describe("Validation criteria or proof"),
870
+ notes: z.string().optional().describe("Additional notes"),
871
+ description: z.string().optional().describe("Updated description"),
872
+ primary_owner: z.string().optional().describe("Primary owning slice"),
873
+ supporting_slices: z.string().optional().describe("Supporting slices"),
874
+ };
875
+ const requirementUpdateSchema = z.object(requirementUpdateParams);
876
+
877
+ const requirementSaveParams = {
878
+ projectDir: projectDirParam,
879
+ class: z.string().describe("Requirement class"),
880
+ description: z.string().describe("Short description of the requirement"),
881
+ why: z.string().describe("Why this requirement matters"),
882
+ source: z.string().describe("Origin of the requirement"),
883
+ status: z.string().optional().describe("Requirement status"),
884
+ primary_owner: z.string().optional().describe("Primary owning slice"),
885
+ supporting_slices: z.string().optional().describe("Supporting slices"),
886
+ validation: z.string().optional().describe("Validation criteria"),
887
+ notes: z.string().optional().describe("Additional notes"),
888
+ };
889
+ const requirementSaveSchema = z.object(requirementSaveParams);
890
+
891
+ const milestoneGenerateIdParams = {
892
+ projectDir: projectDirParam,
893
+ };
894
+ const milestoneGenerateIdSchema = z.object(milestoneGenerateIdParams);
895
+
896
+ const planTaskParams = {
897
+ projectDir: projectDirParam,
898
+ milestoneId: z.string().describe("Milestone ID (e.g. M001)"),
899
+ sliceId: z.string().describe("Slice ID (e.g. S01)"),
900
+ taskId: z.string().describe("Task ID (e.g. T01)"),
901
+ title: z.string().describe("Task title"),
902
+ description: z.string().describe("Task description / steps block"),
903
+ estimate: z.string().describe("Task estimate"),
904
+ files: z.array(z.string()).describe("Files likely touched"),
905
+ verify: z.string().describe("Verification command or block"),
906
+ inputs: z.array(z.string()).describe("Input files or references"),
907
+ expectedOutput: z.array(z.string()).describe("Expected output files or artifacts"),
908
+ observabilityImpact: z.string().optional().describe("Task observability impact"),
909
+ };
910
+ const planTaskSchema = z.object(planTaskParams);
911
+
912
+ const skipSliceParams = {
913
+ projectDir: projectDirParam,
914
+ sliceId: z.string().describe("Slice ID (e.g. S02)"),
915
+ milestoneId: z.string().describe("Milestone ID (e.g. M003)"),
916
+ reason: z.string().optional().describe("Reason for skipping this slice"),
917
+ };
918
+ const skipSliceSchema = z.object(skipSliceParams);
919
+
775
920
  const taskCompleteParams = {
776
921
  projectDir: projectDirParam,
777
922
  taskId: z.string().describe("Task ID (e.g. T01)"),
@@ -803,7 +948,171 @@ const milestoneStatusParams = {
803
948
  };
804
949
  const milestoneStatusSchema = z.object(milestoneStatusParams);
805
950
 
951
+ const journalQueryParams = {
952
+ projectDir: projectDirParam,
953
+ flowId: z.string().optional().describe("Filter by flow ID"),
954
+ unitId: z.string().optional().describe("Filter by unit ID"),
955
+ rule: z.string().optional().describe("Filter by rule name"),
956
+ eventType: z.string().optional().describe("Filter by event type"),
957
+ after: z.string().optional().describe("ISO-8601 lower bound (inclusive)"),
958
+ before: z.string().optional().describe("ISO-8601 upper bound (inclusive)"),
959
+ limit: z.number().optional().describe("Maximum entries to return"),
960
+ };
961
+ const journalQuerySchema = z.object(journalQueryParams);
962
+
806
963
  export function registerWorkflowTools(server: McpToolServer): void {
964
+ server.tool(
965
+ "gsd_decision_save",
966
+ "Record a project decision to the GSD database and regenerate DECISIONS.md.",
967
+ decisionSaveParams,
968
+ async (args: Record<string, unknown>) => {
969
+ const parsed = parseWorkflowArgs(decisionSaveSchema, args);
970
+ const { projectDir, ...params } = parsed;
971
+ await enforceWorkflowWriteGate("gsd_decision_save", projectDir);
972
+ const result = await runSerializedWorkflowOperation(async () => {
973
+ const { saveDecisionToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
974
+ return saveDecisionToDb(params, projectDir);
975
+ });
976
+ return { content: [{ type: "text" as const, text: `Saved decision ${result.id}` }] };
977
+ },
978
+ );
979
+
980
+ server.tool(
981
+ "gsd_save_decision",
982
+ "Alias for gsd_decision_save. Record a project decision to the GSD database and regenerate DECISIONS.md.",
983
+ decisionSaveParams,
984
+ async (args: Record<string, unknown>) => {
985
+ const parsed = parseWorkflowArgs(decisionSaveSchema, args);
986
+ const { projectDir, ...params } = parsed;
987
+ await enforceWorkflowWriteGate("gsd_decision_save", projectDir);
988
+ const result = await runSerializedWorkflowOperation(async () => {
989
+ const { saveDecisionToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
990
+ return saveDecisionToDb(params, projectDir);
991
+ });
992
+ return { content: [{ type: "text" as const, text: `Saved decision ${result.id}` }] };
993
+ },
994
+ );
995
+
996
+ server.tool(
997
+ "gsd_requirement_update",
998
+ "Update an existing requirement in the GSD database and regenerate REQUIREMENTS.md.",
999
+ requirementUpdateParams,
1000
+ async (args: Record<string, unknown>) => {
1001
+ const parsed = parseWorkflowArgs(requirementUpdateSchema, args);
1002
+ const { projectDir, id, ...updates } = parsed;
1003
+ await enforceWorkflowWriteGate("gsd_requirement_update", projectDir);
1004
+ await runSerializedWorkflowOperation(async () => {
1005
+ const { updateRequirementInDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
1006
+ return updateRequirementInDb(id, updates, projectDir);
1007
+ });
1008
+ return { content: [{ type: "text" as const, text: `Updated requirement ${id}` }] };
1009
+ },
1010
+ );
1011
+
1012
+ server.tool(
1013
+ "gsd_update_requirement",
1014
+ "Alias for gsd_requirement_update. Update an existing requirement in the GSD database and regenerate REQUIREMENTS.md.",
1015
+ requirementUpdateParams,
1016
+ async (args: Record<string, unknown>) => {
1017
+ const parsed = parseWorkflowArgs(requirementUpdateSchema, args);
1018
+ const { projectDir, id, ...updates } = parsed;
1019
+ await enforceWorkflowWriteGate("gsd_requirement_update", projectDir);
1020
+ await runSerializedWorkflowOperation(async () => {
1021
+ const { updateRequirementInDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
1022
+ return updateRequirementInDb(id, updates, projectDir);
1023
+ });
1024
+ return { content: [{ type: "text" as const, text: `Updated requirement ${id}` }] };
1025
+ },
1026
+ );
1027
+
1028
+ server.tool(
1029
+ "gsd_requirement_save",
1030
+ "Record a new requirement to the GSD database and regenerate REQUIREMENTS.md.",
1031
+ requirementSaveParams,
1032
+ async (args: Record<string, unknown>) => {
1033
+ const parsed = parseWorkflowArgs(requirementSaveSchema, args);
1034
+ const { projectDir, ...params } = parsed;
1035
+ await enforceWorkflowWriteGate("gsd_requirement_save", projectDir);
1036
+ const result = await runSerializedWorkflowOperation(async () => {
1037
+ const { saveRequirementToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
1038
+ return saveRequirementToDb(params, projectDir);
1039
+ });
1040
+ return { content: [{ type: "text" as const, text: `Saved requirement ${result.id}` }] };
1041
+ },
1042
+ );
1043
+
1044
+ server.tool(
1045
+ "gsd_save_requirement",
1046
+ "Alias for gsd_requirement_save. Record a new requirement to the GSD database and regenerate REQUIREMENTS.md.",
1047
+ requirementSaveParams,
1048
+ async (args: Record<string, unknown>) => {
1049
+ const parsed = parseWorkflowArgs(requirementSaveSchema, args);
1050
+ const { projectDir, ...params } = parsed;
1051
+ await enforceWorkflowWriteGate("gsd_requirement_save", projectDir);
1052
+ const result = await runSerializedWorkflowOperation(async () => {
1053
+ const { saveRequirementToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
1054
+ return saveRequirementToDb(params, projectDir);
1055
+ });
1056
+ return { content: [{ type: "text" as const, text: `Saved requirement ${result.id}` }] };
1057
+ },
1058
+ );
1059
+
1060
+ server.tool(
1061
+ "gsd_milestone_generate_id",
1062
+ "Generate the next milestone ID for a new GSD milestone.",
1063
+ milestoneGenerateIdParams,
1064
+ async (args: Record<string, unknown>) => {
1065
+ const { projectDir } = parseWorkflowArgs(milestoneGenerateIdSchema, args);
1066
+ await enforceWorkflowWriteGate("gsd_milestone_generate_id", projectDir);
1067
+ const id = await runSerializedWorkflowOperation(async () => {
1068
+ const {
1069
+ claimReservedId,
1070
+ findMilestoneIds,
1071
+ getReservedMilestoneIds,
1072
+ nextMilestoneId,
1073
+ } = await importLocalModule<any>("../../../src/resources/extensions/gsd/milestone-ids.js");
1074
+ const reserved = claimReservedId();
1075
+ if (reserved) {
1076
+ await ensureMilestoneDbRow(reserved);
1077
+ return reserved;
1078
+ }
1079
+ const allIds = [...new Set([...findMilestoneIds(projectDir), ...getReservedMilestoneIds()])];
1080
+ const nextId = nextMilestoneId(allIds);
1081
+ await ensureMilestoneDbRow(nextId);
1082
+ return nextId;
1083
+ });
1084
+ return { content: [{ type: "text" as const, text: id }] };
1085
+ },
1086
+ );
1087
+
1088
+ server.tool(
1089
+ "gsd_generate_milestone_id",
1090
+ "Alias for gsd_milestone_generate_id. Generate the next milestone ID for a new GSD milestone.",
1091
+ milestoneGenerateIdParams,
1092
+ async (args: Record<string, unknown>) => {
1093
+ const { projectDir } = parseWorkflowArgs(milestoneGenerateIdSchema, args);
1094
+ await enforceWorkflowWriteGate("gsd_milestone_generate_id", projectDir);
1095
+ const id = await runSerializedWorkflowOperation(async () => {
1096
+ const {
1097
+ claimReservedId,
1098
+ findMilestoneIds,
1099
+ getReservedMilestoneIds,
1100
+ nextMilestoneId,
1101
+ } = await importLocalModule<any>("../../../src/resources/extensions/gsd/milestone-ids.js");
1102
+ const reserved = claimReservedId();
1103
+ if (reserved) {
1104
+ await ensureMilestoneDbRow(reserved);
1105
+ return reserved;
1106
+ }
1107
+ const allIds = [...new Set([...findMilestoneIds(projectDir), ...getReservedMilestoneIds()])];
1108
+ const nextId = nextMilestoneId(allIds);
1109
+ await ensureMilestoneDbRow(nextId);
1110
+ return nextId;
1111
+ });
1112
+ return { content: [{ type: "text" as const, text: id }] };
1113
+ },
1114
+ );
1115
+
807
1116
  server.tool(
808
1117
  "gsd_plan_milestone",
809
1118
  "Write milestone planning state to the GSD database and render ROADMAP.md from DB.",
@@ -830,6 +1139,48 @@ export function registerWorkflowTools(server: McpToolServer): void {
830
1139
  },
831
1140
  );
832
1141
 
1142
+ server.tool(
1143
+ "gsd_plan_task",
1144
+ "Write task planning state to the GSD database and render tasks/T##-PLAN.md from DB.",
1145
+ planTaskParams,
1146
+ async (args: Record<string, unknown>) => {
1147
+ const parsed = parseWorkflowArgs(planTaskSchema, args);
1148
+ const { projectDir, ...params } = parsed;
1149
+ await enforceWorkflowWriteGate("gsd_plan_task", projectDir, params.milestoneId);
1150
+ const result = await runSerializedWorkflowOperation(async () => {
1151
+ const { handlePlanTask } = await importLocalModule<any>("../../../src/resources/extensions/gsd/tools/plan-task.js");
1152
+ return handlePlanTask(params, projectDir);
1153
+ });
1154
+ if ("error" in result) {
1155
+ throw new Error(result.error);
1156
+ }
1157
+ return {
1158
+ content: [{ type: "text" as const, text: `Planned task ${result.taskId} (${result.sliceId}/${result.milestoneId})` }],
1159
+ };
1160
+ },
1161
+ );
1162
+
1163
+ server.tool(
1164
+ "gsd_task_plan",
1165
+ "Alias for gsd_plan_task. Write task planning state to the GSD database and render tasks/T##-PLAN.md from DB.",
1166
+ planTaskParams,
1167
+ async (args: Record<string, unknown>) => {
1168
+ const parsed = parseWorkflowArgs(planTaskSchema, args);
1169
+ const { projectDir, ...params } = parsed;
1170
+ await enforceWorkflowWriteGate("gsd_plan_task", projectDir, params.milestoneId);
1171
+ const result = await runSerializedWorkflowOperation(async () => {
1172
+ const { handlePlanTask } = await importLocalModule<any>("../../../src/resources/extensions/gsd/tools/plan-task.js");
1173
+ return handlePlanTask(params, projectDir);
1174
+ });
1175
+ if ("error" in result) {
1176
+ throw new Error(result.error);
1177
+ }
1178
+ return {
1179
+ content: [{ type: "text" as const, text: `Planned task ${result.taskId} (${result.sliceId}/${result.milestoneId})` }],
1180
+ };
1181
+ },
1182
+ );
1183
+
833
1184
  server.tool(
834
1185
  "gsd_replan_slice",
835
1186
  "Replan a slice after a blocker is discovered, preserving completed tasks and re-rendering PLAN.md + REPLAN.md.",
@@ -870,6 +1221,36 @@ export function registerWorkflowTools(server: McpToolServer): void {
870
1221
  },
871
1222
  );
872
1223
 
1224
+ server.tool(
1225
+ "gsd_skip_slice",
1226
+ "Mark a slice as skipped so auto-mode advances past it without executing.",
1227
+ skipSliceParams,
1228
+ async (args: Record<string, unknown>) => {
1229
+ const { projectDir, milestoneId, sliceId, reason } = parseWorkflowArgs(skipSliceSchema, args);
1230
+ await enforceWorkflowWriteGate("gsd_skip_slice", projectDir, milestoneId);
1231
+ await runSerializedWorkflowOperation(async () => {
1232
+ const { getSlice, updateSliceStatus } = await importLocalModule<any>("../../../src/resources/extensions/gsd/gsd-db.js");
1233
+ const { invalidateStateCache } = await importLocalModule<any>("../../../src/resources/extensions/gsd/state.js");
1234
+ const { rebuildState } = await importLocalModule<any>("../../../src/resources/extensions/gsd/doctor.js");
1235
+ const slice = getSlice(milestoneId, sliceId);
1236
+ if (!slice) {
1237
+ throw new Error(`Slice ${sliceId} not found in milestone ${milestoneId}`);
1238
+ }
1239
+ if (slice.status === "complete" || slice.status === "done") {
1240
+ throw new Error(`Slice ${sliceId} is already complete and cannot be skipped`);
1241
+ }
1242
+ if (slice.status !== "skipped") {
1243
+ updateSliceStatus(milestoneId, sliceId, "skipped");
1244
+ invalidateStateCache();
1245
+ await rebuildState(projectDir);
1246
+ }
1247
+ });
1248
+ return {
1249
+ content: [{ type: "text" as const, text: `Skipped slice ${sliceId} (${milestoneId}). Reason: ${reason ?? "User-directed skip"}.` }],
1250
+ };
1251
+ },
1252
+ );
1253
+
873
1254
  server.tool(
874
1255
  "gsd_complete_milestone",
875
1256
  "Record a completed milestone to the GSD database and render its SUMMARY.md.",
@@ -994,4 +1375,19 @@ export function registerWorkflowTools(server: McpToolServer): void {
994
1375
  return runSerializedWorkflowOperation(() => executeMilestoneStatus({ milestoneId }, projectDir));
995
1376
  },
996
1377
  );
1378
+
1379
+ server.tool(
1380
+ "gsd_journal_query",
1381
+ "Query the structured event journal for auto-mode iterations.",
1382
+ journalQueryParams,
1383
+ async (args: Record<string, unknown>) => {
1384
+ const { projectDir, limit, ...filters } = parseWorkflowArgs(journalQuerySchema, args);
1385
+ const { queryJournal } = await importLocalModule<any>("../../../src/resources/extensions/gsd/journal.js");
1386
+ const entries = queryJournal(projectDir, filters).slice(0, limit ?? 100);
1387
+ if (entries.length === 0) {
1388
+ return { content: [{ type: "text" as const, text: "No matching journal entries found." }] };
1389
+ }
1390
+ return { content: [{ type: "text" as const, text: JSON.stringify(entries, null, 2) }] };
1391
+ },
1392
+ );
997
1393
  }
@@ -63,6 +63,13 @@ export interface AgentOptions {
63
63
  * switches mid-session are handled correctly.
64
64
  */
65
65
  externalToolExecution?: (model: Model<any>) => boolean;
66
+ /**
67
+ * Optional provider-specific options to merge into the next stream call.
68
+ *
69
+ * Use this for runtime-only callbacks or handles that should not live in
70
+ * shared agent state, such as UI bridges for external CLI providers.
71
+ */
72
+ getProviderOptions?: (model: Model<any>) => Record<string, unknown> | undefined | Promise<Record<string, unknown> | undefined>;
66
73
  }
67
74
  export declare class Agent {
68
75
  private _state;
@@ -86,6 +93,7 @@ export declare class Agent {
86
93
  private _beforeToolCall?;
87
94
  private _afterToolCall?;
88
95
  private _externalToolExecution?;
96
+ private _getProviderOptions?;
89
97
  constructor(opts?: AgentOptions);
90
98
  /**
91
99
  * Get the current session ID used for provider caching.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,7 @@ export class Agent {
39
39
  this._transport = opts.transport ?? "sse";
40
40
  this._maxRetryDelayMs = opts.maxRetryDelayMs;
41
41
  this._externalToolExecution = opts.externalToolExecution;
42
+ this._getProviderOptions = opts.getProviderOptions;
42
43
  }
43
44
  /**
44
45
  * Get the current session ID used for provider caching.
@@ -303,7 +304,9 @@ export class Agent {
303
304
  tools: this._state.tools,
304
305
  };
305
306
  let skipInitialSteeringPoll = options?.skipInitialSteeringPoll === true;
307
+ const providerOptions = await this._getProviderOptions?.(model);
306
308
  const config = {
309
+ ...(providerOptions ?? {}),
307
310
  model,
308
311
  reasoning,
309
312
  sessionId: this._sessionId,