@opengsd/gsd-pi 1.5.0 → 1.6.0

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 (499) hide show
  1. package/README.md +10 -10
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/ask-user-questions.js +1 -1
  4. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +114 -36
  5. package/dist/resources/extensions/gsd/activity-log.js +1 -1
  6. package/dist/resources/extensions/gsd/auto/closeout.js +97 -5
  7. package/dist/resources/extensions/gsd/auto/orchestrator.js +20 -13
  8. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
  9. package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
  10. package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -5
  11. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -7
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +69 -17
  13. package/dist/resources/extensions/gsd/auto-model-selection.js +28 -1
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  15. package/dist/resources/extensions/gsd/auto-prompts.js +29 -117
  16. package/dist/resources/extensions/gsd/auto-recovery.js +50 -6
  17. package/dist/resources/extensions/gsd/auto-start.js +57 -33
  18. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +12 -2
  19. package/dist/resources/extensions/gsd/auto-timers.js +9 -2
  20. package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
  21. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
  22. package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
  23. package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
  24. package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
  25. package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
  26. package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
  27. package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
  28. package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
  29. package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
  30. package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
  31. package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
  32. package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
  33. package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
  34. package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
  35. package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
  36. package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
  37. package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
  38. package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
  39. package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
  40. package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
  41. package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
  42. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
  43. package/dist/resources/extensions/gsd/auto-worktree.js +20 -2073
  44. package/dist/resources/extensions/gsd/auto.js +106 -34
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +20 -2
  47. package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
  48. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +185 -27
  49. package/dist/resources/extensions/gsd/codebase-generator.js +7 -1
  50. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  51. package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
  52. package/dist/resources/extensions/gsd/compat/compat-marker.js +44 -0
  53. package/dist/resources/extensions/gsd/config-overlay.js +7 -2
  54. package/dist/resources/extensions/gsd/db/engine.js +33 -0
  55. package/dist/resources/extensions/gsd/db/queries.js +9 -9
  56. package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
  57. package/dist/resources/extensions/gsd/db-adapter.js +30 -3
  58. package/dist/resources/extensions/gsd/docs/preferences-reference.md +3 -3
  59. package/dist/resources/extensions/gsd/doctor-engine-checks.js +93 -11
  60. package/dist/resources/extensions/gsd/flat-phase-migration.js +32 -3
  61. package/dist/resources/extensions/gsd/forensics.js +1 -1
  62. package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
  63. package/dist/resources/extensions/gsd/git-service.js +45 -0
  64. package/dist/resources/extensions/gsd/gsd-db.js +23 -11
  65. package/dist/resources/extensions/gsd/guided-flow.js +22 -17
  66. package/dist/resources/extensions/gsd/journal.js +1 -1
  67. package/dist/resources/extensions/gsd/markdown-renderer.js +34 -79
  68. package/dist/resources/extensions/gsd/md-importer.js +89 -23
  69. package/dist/resources/extensions/gsd/metrics.js +2 -2
  70. package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
  71. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +11 -0
  72. package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
  73. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
  75. package/dist/resources/extensions/gsd/paths.js +87 -52
  76. package/dist/resources/extensions/gsd/post-unit-hooks.js +27 -0
  77. package/dist/resources/extensions/gsd/preferences-models.js +66 -15
  78. package/dist/resources/extensions/gsd/preferences-skills.js +10 -16
  79. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  80. package/dist/resources/extensions/gsd/preferences-validation.js +148 -10
  81. package/dist/resources/extensions/gsd/preferences.js +20 -0
  82. package/dist/resources/extensions/gsd/prompts/system.md +6 -6
  83. package/dist/resources/extensions/gsd/quick.js +12 -3
  84. package/dist/resources/extensions/gsd/rule-registry.js +106 -10
  85. package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
  86. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
  87. package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
  88. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +1 -10
  89. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +3 -24
  90. package/dist/resources/extensions/gsd/state-reconciliation/index.js +10 -0
  91. package/dist/resources/extensions/gsd/tool-contract.js +14 -0
  92. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -5
  93. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +16 -10
  94. package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
  95. package/dist/resources/extensions/gsd/tools/reopen-task.js +13 -5
  96. package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -8
  97. package/dist/resources/extensions/gsd/uat-dispatch.js +94 -0
  98. package/dist/resources/extensions/gsd/unit-registry.js +12 -2
  99. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  100. package/dist/resources/extensions/gsd/uok/audit-toggle.js +31 -2
  101. package/dist/resources/extensions/gsd/uok/audit.js +3 -0
  102. package/dist/resources/extensions/gsd/uok/gate-runner.js +22 -30
  103. package/dist/resources/extensions/gsd/uok/gitops.js +18 -15
  104. package/dist/resources/extensions/gsd/uok/kernel.js +120 -46
  105. package/dist/resources/extensions/gsd/uok/model-policy.js +17 -14
  106. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
  107. package/dist/resources/extensions/gsd/workflow-event-ledger.js +1 -1
  108. package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
  109. package/dist/resources/extensions/gsd/workflow-projections.js +9 -26
  110. package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
  111. package/dist/resources/extensions/gsd/workspace.js +5 -14
  112. package/dist/resources/extensions/gsd/worktree-command.js +1 -1
  113. package/dist/resources/extensions/gsd/worktree-lifecycle.js +14 -9
  114. package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
  115. package/dist/resources/extensions/shared/gsd-browser-cli.js +29 -0
  116. package/dist/resources/extensions/shared/interview-ui.js +62 -9
  117. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  118. package/dist/web/standalone/.next/BUILD_ID +1 -1
  119. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  120. package/dist/web/standalone/.next/build-manifest.json +2 -2
  121. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  122. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/index.html +1 -1
  173. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  180. package/dist/web/standalone/.next/server/chunks/{1128.js → 1991.js} +1 -1
  181. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  182. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  184. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  185. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  186. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  187. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  188. package/dist/worktree-cli-create.d.ts +10 -0
  189. package/dist/worktree-cli-create.js +11 -0
  190. package/dist/worktree-cli-format.d.ts +12 -0
  191. package/dist/worktree-cli-format.js +38 -0
  192. package/dist/worktree-cli-plan.d.ts +16 -0
  193. package/dist/worktree-cli-plan.js +19 -0
  194. package/dist/worktree-cli-session.d.ts +13 -0
  195. package/dist/worktree-cli-session.js +18 -0
  196. package/dist/worktree-cli-status.d.ts +35 -0
  197. package/dist/worktree-cli-status.js +54 -0
  198. package/dist/worktree-cli.d.ts +1 -16
  199. package/dist/worktree-cli.js +28 -122
  200. package/integrations/hermes/open_gsd_hermes/gsd_client.py +25 -36
  201. package/integrations/hermes/pyproject.toml +1 -1
  202. package/integrations/hermes/tests/test_gsd_client_timeout.py +4 -4
  203. package/package.json +6 -6
  204. package/packages/cloud-mcp-gateway/package.json +2 -2
  205. package/packages/contracts/package.json +1 -1
  206. package/packages/daemon/dist/orchestrator-agent.d.ts +21 -0
  207. package/packages/daemon/dist/orchestrator-agent.d.ts.map +1 -0
  208. package/packages/daemon/dist/orchestrator-agent.js +113 -0
  209. package/packages/daemon/dist/orchestrator-agent.js.map +1 -0
  210. package/packages/daemon/dist/orchestrator-tools.d.ts +12 -0
  211. package/packages/daemon/dist/orchestrator-tools.d.ts.map +1 -0
  212. package/packages/daemon/dist/orchestrator-tools.js +137 -0
  213. package/packages/daemon/dist/orchestrator-tools.js.map +1 -0
  214. package/packages/daemon/dist/orchestrator.d.ts +4 -56
  215. package/packages/daemon/dist/orchestrator.d.ts.map +1 -1
  216. package/packages/daemon/dist/orchestrator.js +13 -303
  217. package/packages/daemon/dist/orchestrator.js.map +1 -1
  218. package/packages/daemon/dist/orchestrator.test.js +11 -1
  219. package/packages/daemon/dist/orchestrator.test.js.map +1 -1
  220. package/packages/daemon/package.json +4 -4
  221. package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
  222. package/packages/gsd-agent-core/package.json +5 -5
  223. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  224. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +3 -2
  225. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  226. package/packages/gsd-agent-modes/package.json +7 -7
  227. package/packages/mcp-server/package.json +4 -4
  228. package/packages/native/package.json +1 -1
  229. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  230. package/packages/pi-agent-core/dist/agent-loop.js +14 -9
  231. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  232. package/packages/pi-agent-core/package.json +1 -1
  233. package/packages/pi-ai/dist/index.d.ts +1 -0
  234. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  235. package/packages/pi-ai/dist/index.js +1 -0
  236. package/packages/pi-ai/dist/index.js.map +1 -1
  237. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
  239. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  240. package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
  241. package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
  242. package/packages/pi-ai/dist/tool-result-content.js +62 -0
  243. package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
  244. package/packages/pi-ai/dist/types.d.ts +8 -20
  245. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/types.js.map +1 -1
  247. package/packages/pi-ai/package.json +1 -1
  248. package/packages/pi-coding-agent/dist/core/package-manager.d.ts +9 -0
  249. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/package-manager.js +74 -53
  251. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +6 -0
  253. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/resource-loader.js +30 -2
  255. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts +66 -0
  257. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts.map +1 -0
  258. package/packages/pi-coding-agent/dist/core/skill-directories.js +138 -0
  259. package/packages/pi-coding-agent/dist/core/skill-directories.js.map +1 -0
  260. package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -1
  261. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  262. package/packages/pi-coding-agent/dist/core/skills.js +4 -1
  263. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  264. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  265. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/index.js +1 -0
  267. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  268. package/packages/pi-coding-agent/package.json +7 -7
  269. package/packages/pi-tui/package.json +2 -2
  270. package/packages/rpc-client/package.json +2 -2
  271. package/pkg/dist/core/export-html/template.js +53 -4
  272. package/pkg/package.json +1 -1
  273. package/src/resources/extensions/ask-user-questions.ts +1 -1
  274. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +146 -33
  275. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +25 -0
  276. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +93 -0
  277. package/src/resources/extensions/gsd/activity-log.ts +1 -1
  278. package/src/resources/extensions/gsd/auto/closeout.ts +114 -7
  279. package/src/resources/extensions/gsd/auto/orchestrator.ts +21 -14
  280. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
  281. package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
  282. package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -4
  283. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
  284. package/src/resources/extensions/gsd/auto-dispatch.ts +77 -16
  285. package/src/resources/extensions/gsd/auto-model-selection.ts +33 -1
  286. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -2
  287. package/src/resources/extensions/gsd/auto-prompts.ts +53 -113
  288. package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
  289. package/src/resources/extensions/gsd/auto-start.ts +62 -31
  290. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -2
  291. package/src/resources/extensions/gsd/auto-timers.ts +9 -2
  292. package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
  293. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
  294. package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
  295. package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
  296. package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
  297. package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
  298. package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
  299. package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
  300. package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
  301. package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
  302. package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
  303. package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
  304. package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
  305. package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
  306. package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
  307. package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
  308. package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
  309. package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
  310. package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
  311. package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
  312. package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
  313. package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
  314. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
  315. package/src/resources/extensions/gsd/auto-worktree.ts +69 -2429
  316. package/src/resources/extensions/gsd/auto.ts +114 -47
  317. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  318. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +20 -2
  319. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  320. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +218 -27
  321. package/src/resources/extensions/gsd/codebase-generator.ts +7 -1
  322. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  323. package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
  324. package/src/resources/extensions/gsd/compat/compat-marker.ts +47 -0
  325. package/src/resources/extensions/gsd/config-overlay.ts +7 -1
  326. package/src/resources/extensions/gsd/db/engine.ts +36 -0
  327. package/src/resources/extensions/gsd/db/queries.ts +9 -9
  328. package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
  329. package/src/resources/extensions/gsd/db-adapter.ts +29 -3
  330. package/src/resources/extensions/gsd/docs/preferences-reference.md +3 -3
  331. package/src/resources/extensions/gsd/doctor-engine-checks.ts +109 -10
  332. package/src/resources/extensions/gsd/flat-phase-migration.ts +34 -3
  333. package/src/resources/extensions/gsd/forensics.ts +1 -1
  334. package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
  335. package/src/resources/extensions/gsd/git-service.ts +53 -0
  336. package/src/resources/extensions/gsd/gsd-db.ts +33 -11
  337. package/src/resources/extensions/gsd/guided-flow.ts +26 -18
  338. package/src/resources/extensions/gsd/journal.ts +1 -1
  339. package/src/resources/extensions/gsd/markdown-renderer.ts +52 -91
  340. package/src/resources/extensions/gsd/md-importer.ts +93 -22
  341. package/src/resources/extensions/gsd/metrics.ts +2 -2
  342. package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
  343. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +15 -0
  344. package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
  345. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  346. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
  347. package/src/resources/extensions/gsd/paths.ts +108 -51
  348. package/src/resources/extensions/gsd/post-unit-hooks.ts +32 -0
  349. package/src/resources/extensions/gsd/preferences-models.ts +74 -20
  350. package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
  351. package/src/resources/extensions/gsd/preferences-types.ts +54 -1
  352. package/src/resources/extensions/gsd/preferences-validation.ts +146 -9
  353. package/src/resources/extensions/gsd/preferences.ts +20 -0
  354. package/src/resources/extensions/gsd/prompts/system.md +6 -6
  355. package/src/resources/extensions/gsd/quick.ts +11 -3
  356. package/src/resources/extensions/gsd/rule-registry.ts +111 -9
  357. package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
  358. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
  359. package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
  360. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +1 -9
  361. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +2 -22
  362. package/src/resources/extensions/gsd/state-reconciliation/index.ts +14 -0
  363. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +169 -1
  364. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
  365. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +41 -2
  366. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +48 -1
  367. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +57 -0
  368. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  369. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +29 -1
  370. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-supervisor-inflight-guard.test.ts +159 -0
  371. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +2 -1
  372. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
  373. package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
  374. package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
  375. package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
  376. package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
  377. package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
  378. package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
  379. package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
  380. package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
  381. package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
  382. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
  383. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
  384. package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
  385. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
  386. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  387. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +3 -1
  388. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +85 -0
  389. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +45 -0
  390. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
  391. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +39 -0
  392. package/src/resources/extensions/gsd/tests/db-writable-probe.test.ts +66 -0
  393. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
  394. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +174 -0
  395. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  396. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +71 -1
  397. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +46 -1
  398. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +72 -32
  399. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
  400. package/src/resources/extensions/gsd/tests/import-completion-lost-update.test.ts +196 -0
  401. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
  402. package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
  403. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
  404. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
  405. package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
  406. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
  407. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  408. package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
  409. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
  410. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
  411. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +88 -1
  412. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
  413. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -15
  414. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
  415. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
  416. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  417. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +91 -0
  418. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +2 -1
  419. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +439 -0
  420. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +24 -0
  421. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
  422. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
  423. package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
  424. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +0 -1
  425. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +269 -0
  426. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +8 -1
  427. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
  428. package/src/resources/extensions/gsd/tests/preferences.test.ts +19 -0
  429. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +5 -0
  430. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +54 -0
  431. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +49 -1
  432. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
  433. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +95 -1
  434. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
  435. package/src/resources/extensions/gsd/tests/sibling-model-fallbacks.test.ts +189 -0
  436. package/src/resources/extensions/gsd/tests/single-field-model-thinking.test.ts +156 -0
  437. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
  438. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +6 -1
  439. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
  440. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +32 -0
  441. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
  442. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
  443. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
  444. package/src/resources/extensions/gsd/tests/supervisor-model-swap-inflight-guard.test.ts +181 -0
  445. package/src/resources/extensions/gsd/tests/supervisor-model-swap-thinking-clamp.test.ts +122 -0
  446. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
  447. package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
  448. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
  449. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
  450. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
  451. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +196 -0
  452. package/src/resources/extensions/gsd/tests/uat-dispatch.test.ts +211 -0
  453. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +26 -1
  455. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +39 -0
  456. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +226 -2
  457. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +6 -0
  458. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +213 -2
  459. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
  460. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
  461. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
  462. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
  464. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  465. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
  466. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
  467. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -2
  468. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
  469. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
  470. package/src/resources/extensions/gsd/tool-contract.ts +29 -0
  471. package/src/resources/extensions/gsd/tools/complete-milestone.ts +9 -5
  472. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +19 -8
  473. package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
  474. package/src/resources/extensions/gsd/tools/reopen-task.ts +13 -5
  475. package/src/resources/extensions/gsd/tools/validate-milestone.ts +13 -9
  476. package/src/resources/extensions/gsd/types.ts +23 -4
  477. package/src/resources/extensions/gsd/uat-dispatch.ts +176 -0
  478. package/src/resources/extensions/gsd/unit-registry.ts +16 -2
  479. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  480. package/src/resources/extensions/gsd/uok/audit-toggle.ts +32 -2
  481. package/src/resources/extensions/gsd/uok/audit.ts +2 -0
  482. package/src/resources/extensions/gsd/uok/gate-runner.ts +26 -36
  483. package/src/resources/extensions/gsd/uok/gitops.ts +21 -18
  484. package/src/resources/extensions/gsd/uok/kernel.ts +169 -48
  485. package/src/resources/extensions/gsd/uok/model-policy.ts +20 -17
  486. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
  487. package/src/resources/extensions/gsd/workflow-event-ledger.ts +1 -1
  488. package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
  489. package/src/resources/extensions/gsd/workflow-projections.ts +9 -24
  490. package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
  491. package/src/resources/extensions/gsd/workspace.ts +5 -21
  492. package/src/resources/extensions/gsd/worktree-command.ts +1 -1
  493. package/src/resources/extensions/gsd/worktree-lifecycle.ts +19 -15
  494. package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
  495. package/src/resources/extensions/shared/gsd-browser-cli.ts +29 -0
  496. package/src/resources/extensions/shared/interview-ui.ts +58 -11
  497. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +32 -0
  498. /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → 6xYMOzxVhsQgryneJ5KRc}/_buildManifest.js +0 -0
  499. /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → 6xYMOzxVhsQgryneJ5KRc}/_ssgManifest.js +0 -0
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import json
6
6
  import os
7
+ import shutil
7
8
  import subprocess
8
9
  import threading
9
10
  import time
@@ -62,7 +63,12 @@ class GsdMcpClient:
62
63
 
63
64
  def _env(self) -> dict[str, str]:
64
65
  env = os.environ.copy()
65
- env["GSD_CLI_PATH"] = self._config.cli_path
66
+ # Resolve cli_path to an absolute path so the MCP server's
67
+ # resolveCLIPath() does not resolve a bare command name (e.g. "gsd")
68
+ # against the project directory, producing a non-existent
69
+ # project-relative path that hangs gsd_execute until timeout.
70
+ resolved = shutil.which(self._config.cli_path) or self._config.cli_path
71
+ env["GSD_CLI_PATH"] = resolved
66
72
  return env
67
73
 
68
74
  def ensure_version(self) -> None:
@@ -134,9 +140,11 @@ class GsdMcpClient:
134
140
  def _send(self, payload: dict[str, Any], *, project_dir: str | None = None) -> None:
135
141
  proc = self._ensure_process(project_dir)
136
142
  assert proc.stdin is not None
137
- body = json.dumps(payload).encode("utf-8")
138
- header = f"Content-Length: {len(body)}\r\n\r\n".encode("ascii")
139
- proc.stdin.write(header + body)
143
+ # gsd-mcp-server uses the @modelcontextprotocol/sdk stdio transport,
144
+ # which is newline-delimited JSON (NDJSON), not the Content-Length
145
+ # framing from the LSP-style MCP spec. Emit one JSON object per line.
146
+ data = json.dumps(payload, ensure_ascii=False).encode("utf-8") + b"\n"
147
+ proc.stdin.write(data)
140
148
  proc.stdin.flush()
141
149
 
142
150
  def _read_stdout_chunk(self, deadline: float) -> None:
@@ -179,42 +187,23 @@ class GsdMcpClient:
179
187
  f"{self._config.mcp_read_timeout_seconds:g}s"
180
188
  )
181
189
 
182
- def _read_header(self, deadline: float) -> bytes:
190
+ def _read_line(self, deadline: float) -> bytes:
183
191
  while True:
184
- crlf_idx = self._stdout_buffer.find(b"\r\n\r\n")
185
- lf_idx = self._stdout_buffer.find(b"\n\n")
186
- candidates = [
187
- (idx, sep_len)
188
- for idx, sep_len in ((crlf_idx, 4), (lf_idx, 2))
189
- if idx >= 0
190
- ]
191
- if candidates:
192
- idx, sep_len = min(candidates)
193
- header = self._stdout_buffer[:idx]
194
- self._stdout_buffer = self._stdout_buffer[idx + sep_len :]
195
- return header
192
+ idx = self._stdout_buffer.find(b"\n")
193
+ if idx >= 0:
194
+ raw = self._stdout_buffer[:idx]
195
+ self._stdout_buffer = self._stdout_buffer[idx + 1 :]
196
+ return raw.rstrip(b"\r")
196
197
  self._read_stdout_chunk(deadline)
197
198
 
198
- def _read_exact(self, length: int, deadline: float) -> bytes:
199
- while len(self._stdout_buffer) < length:
200
- self._read_stdout_chunk(deadline)
201
- body = self._stdout_buffer[:length]
202
- self._stdout_buffer = self._stdout_buffer[length:]
203
- return body
204
-
205
199
  def _read_message(self) -> dict[str, Any]:
206
200
  deadline = time.monotonic() + self._config.mcp_read_timeout_seconds
207
- header = self._read_header(deadline)
208
- headers: dict[str, str] = {}
209
- for raw_line in header.splitlines():
210
- decoded = raw_line.decode("utf-8").strip()
211
- if not decoded:
212
- continue
213
- key, _, val = decoded.partition(":")
214
- headers[key.strip().lower()] = val.strip()
215
- length = int(headers.get("content-length", "0"))
216
- body = self._read_exact(length, deadline)
217
- return json.loads(body.decode("utf-8"))
201
+ # gsd-mcp-server emits newline-delimited JSON (NDJSON); each line is a
202
+ # complete JSON-RPC message. Skip blank keep-alive lines.
203
+ while True:
204
+ line = self._read_line(deadline)
205
+ if line.strip():
206
+ return json.loads(line.decode("utf-8"))
218
207
 
219
208
  def _initialize(self) -> None:
220
209
  self._request_id += 1
@@ -226,7 +215,7 @@ class GsdMcpClient:
226
215
  "params": {
227
216
  "protocolVersion": "2024-11-05",
228
217
  "capabilities": {},
229
- "clientInfo": {"name": "open-gsd-hermes", "version": "1.2.0"},
218
+ "clientInfo": {"name": "open-gsd-hermes", "version": "1.6.0"},
230
219
  },
231
220
  }
232
221
  )
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "open-gsd-hermes"
7
- version = "1.2.0"
7
+ version = "1.6.0"
8
8
  description = "Hermes Agent plugin — GSD structured delivery engine integration"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -31,7 +31,7 @@ def test_read_message_times_out_waiting_for_headers() -> None:
31
31
  proc.kill()
32
32
 
33
33
 
34
- def test_read_message_times_out_waiting_for_body() -> None:
34
+ def test_read_message_times_out_waiting_for_newline() -> None:
35
35
  client = GsdMcpClient(GsdConfig(mcp_read_timeout_seconds=0.05))
36
36
  proc = subprocess.Popen(
37
37
  [
@@ -39,7 +39,7 @@ def test_read_message_times_out_waiting_for_body() -> None:
39
39
  "-c",
40
40
  (
41
41
  "import sys, time; "
42
- "sys.stdout.buffer.write(b'Content-Length: 2\\r\\n\\r\\n{'); "
42
+ "sys.stdout.buffer.write(b'{\"jsonrpc\":\"2.0\"'); "
43
43
  "sys.stdout.flush(); "
44
44
  "time.sleep(10)"
45
45
  ),
@@ -59,7 +59,7 @@ def test_read_message_times_out_waiting_for_body() -> None:
59
59
  proc.kill()
60
60
 
61
61
 
62
- def test_read_message_fails_without_respawning_when_stdout_closes_mid_body(
62
+ def test_read_message_fails_without_respawning_when_stdout_closes_mid_line(
63
63
  tmp_path,
64
64
  ) -> None:
65
65
  client = GsdMcpClient(GsdConfig(mcp_read_timeout_seconds=1))
@@ -69,7 +69,7 @@ def test_read_message_fails_without_respawning_when_stdout_closes_mid_body(
69
69
  "-c",
70
70
  (
71
71
  "import sys; "
72
- "sys.stdout.buffer.write(b'Content-Length: 20\\r\\n\\r\\n{'); "
72
+ "sys.stdout.buffer.write(b'{\"jsonrpc\":\"2.0\"'); "
73
73
  "sys.stdout.flush()"
74
74
  ),
75
75
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengsd/gsd-pi",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "GSD Pi local-first coding agent",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -210,11 +210,11 @@
210
210
  },
211
211
  "optionalDependencies": {
212
212
  "@mariozechner/clipboard": "0.3.6",
213
- "@opengsd/engine-darwin-arm64": "1.5.0",
214
- "@opengsd/engine-darwin-x64": "1.5.0",
215
- "@opengsd/engine-linux-arm64-gnu": "1.5.0",
216
- "@opengsd/engine-linux-x64-gnu": "1.5.0",
217
- "@opengsd/engine-win32-x64-msvc": "1.5.0",
213
+ "@opengsd/engine-darwin-arm64": "1.6.0",
214
+ "@opengsd/engine-darwin-x64": "1.6.0",
215
+ "@opengsd/engine-linux-arm64-gnu": "1.6.0",
216
+ "@opengsd/engine-linux-x64-gnu": "1.6.0",
217
+ "@opengsd/engine-win32-x64-msvc": "1.6.0",
218
218
  "fsevents": "~2.3.3",
219
219
  "koffi": "^2.9.0"
220
220
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengsd/cloud-mcp-gateway",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "Cloud MCP gateway for brokering remote MCP clients to local GSD runtimes",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -29,7 +29,7 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@modelcontextprotocol/sdk": "^1.27.1",
32
- "@opengsd/mcp-server": "^1.5.0",
32
+ "@opengsd/mcp-server": "^1.6.0",
33
33
  "ws": "^8.20.0",
34
34
  "zod": "^4.0.0"
35
35
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengsd/contracts",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "Shared public contracts for GSD workspace boundaries",
5
5
  "license": "MIT",
6
6
  "gsd": {
@@ -0,0 +1,21 @@
1
+ import type Anthropic from '@anthropic-ai/sdk';
2
+ import type { MessageParam } from '@anthropic-ai/sdk/resources/messages/messages';
3
+ import { type OrchestratorToolContext } from './orchestrator-tools.js';
4
+ export interface OrchestratorAgentConfig {
5
+ model: string;
6
+ max_tokens: number;
7
+ }
8
+ export declare class OrchestratorAgent {
9
+ private readonly config;
10
+ private readonly toolContext;
11
+ private client;
12
+ private history;
13
+ constructor(config: OrchestratorAgentConfig, toolContext: OrchestratorToolContext, client?: Anthropic);
14
+ run(content: string): Promise<string>;
15
+ getHistory(): MessageParam[];
16
+ stop(): void;
17
+ private getClient;
18
+ private runToolLoop;
19
+ private trimHistory;
20
+ }
21
+ //# sourceMappingURL=orchestrator-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-agent.d.ts","sourceRoot":"","sources":["../src/orchestrator-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAqCD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAsB;gBAGnC,MAAM,EAAE,uBAAuB,EAC/B,WAAW,EAAE,uBAAuB,EACpC,MAAM,CAAC,EAAE,SAAS;IAOd,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB3C,UAAU,IAAI,YAAY,EAAE;IAI5B,IAAI,IAAI,IAAI;YAKE,SAAS;YAQT,WAAW;IAkDzB,OAAO,CAAC,WAAW;CAKpB"}
@@ -0,0 +1,113 @@
1
+ import { ORCHESTRATOR_TOOLS, executeOrchestratorTool, } from './orchestrator-tools.js';
2
+ const SYSTEM_PROMPT = `You are GSD Control — a concise, capable orchestrator for managing GSD (Git Ship Done) coding agent sessions via Discord.
3
+
4
+ You have tools to list projects, start sessions, get status, stop sessions, and inspect session details. Use them to fulfill the user's requests.
5
+
6
+ Response guidelines:
7
+ - Be terse and direct. No filler, no performed enthusiasm.
8
+ - When reporting status, use bullet points with project name, status, duration, and cost.
9
+ - When starting a session, confirm with the project name and session ID.
10
+ - When stopping a session, confirm which session was stopped.
11
+ - If something fails, say what went wrong plainly.
12
+ - Use Discord markdown formatting (bold, code blocks) for readability.
13
+ - Never expose internal error stack traces to the user — summarize the issue.`;
14
+ const MAX_HISTORY = 30;
15
+ const MAX_TOOL_ITERATIONS = 10;
16
+ function resolveAnthropicApiKey() {
17
+ const apiKey = process.env.ANTHROPIC_API_KEY;
18
+ if (!apiKey) {
19
+ throw new Error('ANTHROPIC_API_KEY is required. Set it in your environment or run `gsd config`.');
20
+ }
21
+ return apiKey;
22
+ }
23
+ function isAuthError(message) {
24
+ return (message.includes('authentication') ||
25
+ message.includes('apiKey') ||
26
+ message.includes('authToken') ||
27
+ message.includes('401'));
28
+ }
29
+ export class OrchestratorAgent {
30
+ config;
31
+ toolContext;
32
+ client;
33
+ history = [];
34
+ constructor(config, toolContext, client) {
35
+ this.config = config;
36
+ this.toolContext = toolContext;
37
+ this.client = client ?? null;
38
+ }
39
+ async run(content) {
40
+ this.history.push({ role: 'user', content });
41
+ try {
42
+ const responseText = await this.runToolLoop();
43
+ this.history.push({ role: 'assistant', content: responseText });
44
+ return responseText;
45
+ }
46
+ catch (err) {
47
+ const errorMsg = err instanceof Error ? err.message : String(err);
48
+ if (isAuthError(errorMsg)) {
49
+ this.client = null;
50
+ }
51
+ this.history.push({ role: 'assistant', content: '[error — see logs]' });
52
+ throw err;
53
+ }
54
+ finally {
55
+ this.trimHistory();
56
+ }
57
+ }
58
+ getHistory() {
59
+ return [...this.history];
60
+ }
61
+ stop() {
62
+ this.history = [];
63
+ this.client = null;
64
+ }
65
+ async getClient() {
66
+ if (this.client)
67
+ return this.client;
68
+ const apiKey = resolveAnthropicApiKey();
69
+ const { default: AnthropicSDK } = await import('@anthropic-ai/sdk');
70
+ this.client = new AnthropicSDK({ apiKey });
71
+ return this.client;
72
+ }
73
+ async runToolLoop() {
74
+ const client = await this.getClient();
75
+ const { model, max_tokens } = this.config;
76
+ let loopMessages = [...this.history];
77
+ for (let i = 0; i < MAX_TOOL_ITERATIONS; i++) {
78
+ const response = await client.messages.create({
79
+ model,
80
+ max_tokens,
81
+ system: SYSTEM_PROMPT,
82
+ tools: ORCHESTRATOR_TOOLS,
83
+ messages: loopMessages,
84
+ });
85
+ if (response.stop_reason !== 'tool_use') {
86
+ const textBlocks = response.content.filter((b) => b.type === 'text');
87
+ return textBlocks.map((b) => b.text).join('\n') || '(No response)';
88
+ }
89
+ const toolUseBlocks = response.content.filter((b) => b.type === 'tool_use');
90
+ const toolResults = [];
91
+ for (const toolUse of toolUseBlocks) {
92
+ const result = await executeOrchestratorTool(this.toolContext, toolUse.name, toolUse.input);
93
+ toolResults.push({
94
+ type: 'tool_result',
95
+ tool_use_id: toolUse.id,
96
+ content: result,
97
+ });
98
+ }
99
+ loopMessages = [
100
+ ...loopMessages,
101
+ { role: 'assistant', content: response.content },
102
+ { role: 'user', content: toolResults },
103
+ ];
104
+ }
105
+ return 'I hit the maximum number of tool iterations. Please try a simpler request.';
106
+ }
107
+ trimHistory() {
108
+ while (this.history.length > MAX_HISTORY) {
109
+ this.history.splice(0, 2);
110
+ }
111
+ }
112
+ }
113
+ //# sourceMappingURL=orchestrator-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-agent.js","sourceRoot":"","sources":["../src/orchestrator-agent.ts"],"names":[],"mappings":"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","sourcesContent":["import type Anthropic from '@anthropic-ai/sdk';\nimport type {\n MessageParam,\n ContentBlockParam,\n ToolResultBlockParam,\n ToolUseBlock,\n TextBlock,\n} from '@anthropic-ai/sdk/resources/messages/messages';\nimport {\n ORCHESTRATOR_TOOLS,\n executeOrchestratorTool,\n type OrchestratorToolContext,\n} from './orchestrator-tools.js';\n\nexport interface OrchestratorAgentConfig {\n model: string;\n max_tokens: number;\n}\n\nconst SYSTEM_PROMPT = `You are GSD Control — a concise, capable orchestrator for managing GSD (Git Ship Done) coding agent sessions via Discord.\n\nYou have tools to list projects, start sessions, get status, stop sessions, and inspect session details. Use them to fulfill the user's requests.\n\nResponse guidelines:\n- Be terse and direct. No filler, no performed enthusiasm.\n- When reporting status, use bullet points with project name, status, duration, and cost.\n- When starting a session, confirm with the project name and session ID.\n- When stopping a session, confirm which session was stopped.\n- If something fails, say what went wrong plainly.\n- Use Discord markdown formatting (bold, code blocks) for readability.\n- Never expose internal error stack traces to the user — summarize the issue.`;\n\nconst MAX_HISTORY = 30;\nconst MAX_TOOL_ITERATIONS = 10;\n\nfunction resolveAnthropicApiKey(): string {\n const apiKey = process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'ANTHROPIC_API_KEY is required. Set it in your environment or run `gsd config`.',\n );\n }\n return apiKey;\n}\n\nfunction isAuthError(message: string): boolean {\n return (\n message.includes('authentication') ||\n message.includes('apiKey') ||\n message.includes('authToken') ||\n message.includes('401')\n );\n}\n\nexport class OrchestratorAgent {\n private readonly config: OrchestratorAgentConfig;\n private readonly toolContext: OrchestratorToolContext;\n private client: Anthropic | null;\n private history: MessageParam[] = [];\n\n constructor(\n config: OrchestratorAgentConfig,\n toolContext: OrchestratorToolContext,\n client?: Anthropic,\n ) {\n this.config = config;\n this.toolContext = toolContext;\n this.client = client ?? null;\n }\n\n async run(content: string): Promise<string> {\n this.history.push({ role: 'user', content });\n\n try {\n const responseText = await this.runToolLoop();\n this.history.push({ role: 'assistant', content: responseText });\n return responseText;\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (isAuthError(errorMsg)) {\n this.client = null;\n }\n this.history.push({ role: 'assistant', content: '[error — see logs]' });\n throw err;\n } finally {\n this.trimHistory();\n }\n }\n\n getHistory(): MessageParam[] {\n return [...this.history];\n }\n\n stop(): void {\n this.history = [];\n this.client = null;\n }\n\n private async getClient(): Promise<Anthropic> {\n if (this.client) return this.client;\n const apiKey = resolveAnthropicApiKey();\n const { default: AnthropicSDK } = await import('@anthropic-ai/sdk');\n this.client = new AnthropicSDK({ apiKey });\n return this.client;\n }\n\n private async runToolLoop(): Promise<string> {\n const client = await this.getClient();\n const { model, max_tokens } = this.config;\n\n let loopMessages: MessageParam[] = [...this.history];\n\n for (let i = 0; i < MAX_TOOL_ITERATIONS; i++) {\n const response = await client.messages.create({\n model,\n max_tokens,\n system: SYSTEM_PROMPT,\n tools: ORCHESTRATOR_TOOLS,\n messages: loopMessages,\n });\n\n if (response.stop_reason !== 'tool_use') {\n const textBlocks = response.content.filter(\n (b): b is TextBlock => b.type === 'text',\n );\n return textBlocks.map((b) => b.text).join('\\n') || '(No response)';\n }\n\n const toolUseBlocks = response.content.filter(\n (b): b is ToolUseBlock => b.type === 'tool_use',\n );\n\n const toolResults: ToolResultBlockParam[] = [];\n for (const toolUse of toolUseBlocks) {\n const result = await executeOrchestratorTool(\n this.toolContext,\n toolUse.name,\n toolUse.input as Record<string, unknown>,\n );\n toolResults.push({\n type: 'tool_result',\n tool_use_id: toolUse.id,\n content: result,\n });\n }\n\n loopMessages = [\n ...loopMessages,\n { role: 'assistant', content: response.content as ContentBlockParam[] },\n { role: 'user', content: toolResults },\n ];\n }\n\n return 'I hit the maximum number of tool iterations. Please try a simpler request.';\n }\n\n private trimHistory(): void {\n while (this.history.length > MAX_HISTORY) {\n this.history.splice(0, 2);\n }\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type { Tool } from '@anthropic-ai/sdk/resources/messages/messages';
2
+ import type { SessionManager } from './session-manager.js';
3
+ import type { ProjectInfo } from './types.js';
4
+ import type { Logger } from './logger.js';
5
+ export interface OrchestratorToolContext {
6
+ sessionManager: SessionManager;
7
+ scanProjects: () => Promise<ProjectInfo[]>;
8
+ logger: Logger;
9
+ }
10
+ export declare const ORCHESTRATOR_TOOLS: Tool[];
11
+ export declare function executeOrchestratorTool(context: OrchestratorToolContext, name: string, input: Record<string, unknown>): Promise<string>;
12
+ //# sourceMappingURL=orchestrator-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-tools.d.ts","sourceRoot":"","sources":["../src/orchestrator-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,EAAE,IAAI,EAqDpC,CAAC;AAeF,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
@@ -0,0 +1,137 @@
1
+ import { z } from 'zod';
2
+ export const ORCHESTRATOR_TOOLS = [
3
+ {
4
+ name: 'list_projects',
5
+ description: 'List all detected projects across configured scan roots. Returns project names, paths, and detected markers (git, node, gsd, etc.).',
6
+ input_schema: {
7
+ type: 'object',
8
+ properties: {},
9
+ required: [],
10
+ },
11
+ },
12
+ {
13
+ name: 'start_session',
14
+ description: 'Start a new GSD auto-mode session for a project. Provide the absolute project path. Optionally provide a command to run instead of the default "/gsd auto".',
15
+ input_schema: {
16
+ type: 'object',
17
+ properties: {
18
+ projectPath: { type: 'string', description: 'Absolute path to the project directory' },
19
+ command: { type: 'string', description: 'Optional command to send instead of "/gsd auto"' },
20
+ },
21
+ required: ['projectPath'],
22
+ },
23
+ },
24
+ {
25
+ name: 'get_status',
26
+ description: 'Get the current status of all active GSD sessions. Shows project name, status, duration, and cost for each.',
27
+ input_schema: {
28
+ type: 'object',
29
+ properties: {},
30
+ required: [],
31
+ },
32
+ },
33
+ {
34
+ name: 'stop_session',
35
+ description: 'Stop a running GSD session. Provide a session ID or project name — fuzzy matching is used to find the session.',
36
+ input_schema: {
37
+ type: 'object',
38
+ properties: {
39
+ identifier: { type: 'string', description: 'Session ID or project name to match' },
40
+ },
41
+ required: ['identifier'],
42
+ },
43
+ },
44
+ {
45
+ name: 'get_session_detail',
46
+ description: 'Get detailed information about a specific session including cost breakdown, recent events, pending blockers, and error state.',
47
+ input_schema: {
48
+ type: 'object',
49
+ properties: {
50
+ sessionId: { type: 'string', description: 'The session ID to inspect' },
51
+ },
52
+ required: ['sessionId'],
53
+ },
54
+ },
55
+ ];
56
+ const StartSessionInput = z.object({
57
+ projectPath: z.string(),
58
+ command: z.string().optional(),
59
+ });
60
+ const StopSessionInput = z.object({
61
+ identifier: z.string(),
62
+ });
63
+ const GetSessionDetailInput = z.object({
64
+ sessionId: z.string(),
65
+ });
66
+ export async function executeOrchestratorTool(context, name, input) {
67
+ try {
68
+ switch (name) {
69
+ case 'list_projects':
70
+ return await listProjects(context);
71
+ case 'start_session':
72
+ return await startSession(context, input);
73
+ case 'get_status':
74
+ return getStatus(context);
75
+ case 'get_session_detail':
76
+ return getSessionDetail(context, input);
77
+ case 'stop_session':
78
+ return await stopSession(context, input);
79
+ default:
80
+ return `Unknown tool: ${name}`;
81
+ }
82
+ }
83
+ catch (err) {
84
+ const msg = err instanceof Error ? err.message : String(err);
85
+ context.logger.error('tool execution error', { tool: name, error: msg });
86
+ return `Error: ${msg}`;
87
+ }
88
+ }
89
+ async function listProjects(context) {
90
+ const projects = await context.scanProjects();
91
+ if (projects.length === 0)
92
+ return 'No projects found.';
93
+ return JSON.stringify(projects.map((p) => ({ name: p.name, path: p.path, markers: p.markers })), null, 2);
94
+ }
95
+ async function startSession(context, input) {
96
+ const parsed = StartSessionInput.parse(input);
97
+ const sessionId = await context.sessionManager.startSession({
98
+ projectDir: parsed.projectPath,
99
+ command: parsed.command,
100
+ });
101
+ return `Session started: ${sessionId} for ${parsed.projectPath}`;
102
+ }
103
+ function getStatus(context) {
104
+ const sessions = context.sessionManager.getAllSessions();
105
+ if (sessions.length === 0)
106
+ return 'No active sessions.';
107
+ return sessions
108
+ .map((s) => {
109
+ const durationMin = Math.floor((Date.now() - s.startTime) / 60_000);
110
+ const cost = s.cost.totalCost.toFixed(4);
111
+ return `• ${s.projectName} — ${s.status} (${durationMin}m, $${cost})`;
112
+ })
113
+ .join('\n');
114
+ }
115
+ async function stopSession(context, input) {
116
+ const parsed = StopSessionInput.parse(input);
117
+ const { identifier } = parsed;
118
+ const byId = context.sessionManager.getSession(identifier);
119
+ if (byId) {
120
+ await context.sessionManager.cancelSession(identifier);
121
+ return `Stopped session ${identifier} (${byId.projectName})`;
122
+ }
123
+ const normalizedIdentifier = identifier.toLowerCase();
124
+ const match = context.sessionManager.getAllSessions().find((s) => s.projectName.toLowerCase().includes(normalizedIdentifier) ||
125
+ s.projectDir.toLowerCase().includes(normalizedIdentifier));
126
+ if (match) {
127
+ await context.sessionManager.cancelSession(match.sessionId);
128
+ return `Stopped session ${match.sessionId} (${match.projectName})`;
129
+ }
130
+ return `No session found matching "${identifier}"`;
131
+ }
132
+ function getSessionDetail(context, input) {
133
+ const parsed = GetSessionDetailInput.parse(input);
134
+ const result = context.sessionManager.getResult(parsed.sessionId);
135
+ return JSON.stringify(result, null, 2);
136
+ }
137
+ //# sourceMappingURL=orchestrator-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-tools.js","sourceRoot":"","sources":["../src/orchestrator-tools.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport type { Tool } from '@anthropic-ai/sdk/resources/messages/messages';\nimport type { SessionManager } from './session-manager.js';\nimport type { ProjectInfo, ManagedSession } from './types.js';\nimport type { Logger } from './logger.js';\n\nexport interface OrchestratorToolContext {\n sessionManager: SessionManager;\n scanProjects: () => Promise<ProjectInfo[]>;\n logger: Logger;\n}\n\nexport const ORCHESTRATOR_TOOLS: Tool[] = [\n {\n name: 'list_projects',\n description: 'List all detected projects across configured scan roots. Returns project names, paths, and detected markers (git, node, gsd, etc.).',\n input_schema: {\n type: 'object' as const,\n properties: {},\n required: [],\n },\n },\n {\n name: 'start_session',\n description: 'Start a new GSD auto-mode session for a project. Provide the absolute project path. Optionally provide a command to run instead of the default \"/gsd auto\".',\n input_schema: {\n type: 'object' as const,\n properties: {\n projectPath: { type: 'string', description: 'Absolute path to the project directory' },\n command: { type: 'string', description: 'Optional command to send instead of \"/gsd auto\"' },\n },\n required: ['projectPath'],\n },\n },\n {\n name: 'get_status',\n description: 'Get the current status of all active GSD sessions. Shows project name, status, duration, and cost for each.',\n input_schema: {\n type: 'object' as const,\n properties: {},\n required: [],\n },\n },\n {\n name: 'stop_session',\n description: 'Stop a running GSD session. Provide a session ID or project name — fuzzy matching is used to find the session.',\n input_schema: {\n type: 'object' as const,\n properties: {\n identifier: { type: 'string', description: 'Session ID or project name to match' },\n },\n required: ['identifier'],\n },\n },\n {\n name: 'get_session_detail',\n description: 'Get detailed information about a specific session including cost breakdown, recent events, pending blockers, and error state.',\n input_schema: {\n type: 'object' as const,\n properties: {\n sessionId: { type: 'string', description: 'The session ID to inspect' },\n },\n required: ['sessionId'],\n },\n },\n];\n\nconst StartSessionInput = z.object({\n projectPath: z.string(),\n command: z.string().optional(),\n});\n\nconst StopSessionInput = z.object({\n identifier: z.string(),\n});\n\nconst GetSessionDetailInput = z.object({\n sessionId: z.string(),\n});\n\nexport async function executeOrchestratorTool(\n context: OrchestratorToolContext,\n name: string,\n input: Record<string, unknown>,\n): Promise<string> {\n try {\n switch (name) {\n case 'list_projects':\n return await listProjects(context);\n case 'start_session':\n return await startSession(context, input);\n case 'get_status':\n return getStatus(context);\n case 'get_session_detail':\n return getSessionDetail(context, input);\n case 'stop_session':\n return await stopSession(context, input);\n default:\n return `Unknown tool: ${name}`;\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n context.logger.error('tool execution error', { tool: name, error: msg });\n return `Error: ${msg}`;\n }\n}\n\nasync function listProjects(context: OrchestratorToolContext): Promise<string> {\n const projects = await context.scanProjects();\n if (projects.length === 0) return 'No projects found.';\n return JSON.stringify(\n projects.map((p) => ({ name: p.name, path: p.path, markers: p.markers })),\n null,\n 2,\n );\n}\n\nasync function startSession(\n context: OrchestratorToolContext,\n input: Record<string, unknown>,\n): Promise<string> {\n const parsed = StartSessionInput.parse(input);\n const sessionId = await context.sessionManager.startSession({\n projectDir: parsed.projectPath,\n command: parsed.command,\n });\n return `Session started: ${sessionId} for ${parsed.projectPath}`;\n}\n\nfunction getStatus(context: OrchestratorToolContext): string {\n const sessions = context.sessionManager.getAllSessions();\n if (sessions.length === 0) return 'No active sessions.';\n\n return sessions\n .map((s: ManagedSession) => {\n const durationMin = Math.floor((Date.now() - s.startTime) / 60_000);\n const cost = s.cost.totalCost.toFixed(4);\n return `• ${s.projectName} — ${s.status} (${durationMin}m, $${cost})`;\n })\n .join('\\n');\n}\n\nasync function stopSession(\n context: OrchestratorToolContext,\n input: Record<string, unknown>,\n): Promise<string> {\n const parsed = StopSessionInput.parse(input);\n const { identifier } = parsed;\n\n const byId = context.sessionManager.getSession(identifier);\n if (byId) {\n await context.sessionManager.cancelSession(identifier);\n return `Stopped session ${identifier} (${byId.projectName})`;\n }\n\n const normalizedIdentifier = identifier.toLowerCase();\n const match = context.sessionManager.getAllSessions().find(\n (s: ManagedSession) =>\n s.projectName.toLowerCase().includes(normalizedIdentifier) ||\n s.projectDir.toLowerCase().includes(normalizedIdentifier),\n );\n if (match) {\n await context.sessionManager.cancelSession(match.sessionId);\n return `Stopped session ${match.sessionId} (${match.projectName})`;\n }\n\n return `No session found matching \"${identifier}\"`;\n}\n\nfunction getSessionDetail(\n context: OrchestratorToolContext,\n input: Record<string, unknown>,\n): string {\n const parsed = GetSessionDetailInput.parse(input);\n const result = context.sessionManager.getResult(parsed.sessionId);\n return JSON.stringify(result, null, 2);\n}\n"]}
@@ -1,14 +1,8 @@
1
1
  /**
2
- * Orchestrator — LLM-powered agent for the #gsd-control Discord channel.
2
+ * Orchestrator — Discord-facing controller for the #gsd-control channel.
3
3
  *
4
- * Receives Discord messages, maintains conversation history, calls the
5
- * Anthropic messages API with 5 tool definitions (list_projects, start_session,
6
- * get_status, stop_session, get_session_detail), and sends the LLM's response
7
- * back to Discord.
8
- *
9
- * Uses the standard messages.create() tool-use loop (not betaZodTool helpers,
10
- * which don't exist in SDK v0.52). Zod schemas are used for input validation
11
- * at the tool execution layer.
4
+ * Receives Discord messages, filters them by channel/owner/bot guards, delegates
5
+ * valid user content to OrchestratorAgent, and sends the response back to Discord.
12
6
  */
13
7
  import type Anthropic from '@anthropic-ai/sdk';
14
8
  import type { MessageParam } from '@anthropic-ai/sdk/resources/messages/messages';
@@ -31,58 +25,12 @@ export interface OrchestratorDeps {
31
25
  }
32
26
  export declare class Orchestrator {
33
27
  private readonly deps;
34
- private client;
35
- private history;
36
- /**
37
- * @param deps - orchestrator dependencies (session manager, channel manager, etc.)
38
- * @param client - optional Anthropic client for testability; if omitted, created from env
39
- */
28
+ private readonly agent;
40
29
  constructor(deps: OrchestratorDeps, client?: Anthropic);
41
- /**
42
- * Lazily initialise the Anthropic client. Dynamic import handles K007 module resolution.
43
- * Requires ANTHROPIC_API_KEY environment variable.
44
- */
45
- private getClient;
46
- /**
47
- * Handle an incoming Discord message. Entry point called by the bot's
48
- * message handler for every message in every channel.
49
- *
50
- * Guards: ignores bot messages, non-owner messages, and non-control-channel messages.
51
- */
52
30
  handleMessage(message: DiscordMessageLike): Promise<void>;
53
- /**
54
- * Run the tool-use loop: call messages.create(), execute any tool calls,
55
- * feed results back, repeat until the model produces a final text response.
56
- */
57
- private runAgentLoop;
58
- /**
59
- * Execute a single tool by name. Returns a string result for the LLM.
60
- * All errors are caught and returned as error strings (the LLM can reason about them).
61
- */
62
- private executeTool;
63
- private toolListProjects;
64
- private toolStartSession;
65
- private toolGetStatus;
66
- private toolStopSession;
67
- private toolGetSessionDetail;
68
- /**
69
- * Trim conversation history to MAX_HISTORY entries.
70
- * Removes the oldest user+assistant pair from the front to keep pairs aligned.
71
- */
72
- private trimHistory;
73
- /**
74
- * Return a copy of the conversation history (for debugging / observability).
75
- */
76
31
  getHistory(): MessageParam[];
77
- /**
78
- * Stop the orchestrator — clears history and nulls client reference.
79
- */
80
32
  stop(): void;
81
33
  }
82
- /**
83
- * Minimal Discord message interface — avoids importing discord.js directly,
84
- * making the orchestrator testable without full discord.js mocking.
85
- */
86
34
  export interface DiscordMessageLike {
87
35
  author: {
88
36
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EACV,YAAY,EAMb,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAqB1C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAyGD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAsB;IAErC;;;OAGG;gBACS,IAAI,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,SAAS;IAKtD;;;OAGG;YACW,SAAS;IAQvB;;;;;OAKG;IACG,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoE/D;;;OAGG;YACW,YAAY;IAyD1B;;;OAGG;YACW,WAAW;YA2BX,gBAAgB;YAUhB,gBAAgB;IAS9B,OAAO,CAAC,aAAa;YAaP,eAAe;IA0B7B,OAAO,CAAC,oBAAoB;IAU5B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;OAEG;IACH,IAAI,IAAI,IAAI;CAIb;AAMD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,UAAU,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;KACpC,CAAC;CACH"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;gBAE9B,IAAI,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,SAAS;IAahD,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C/D,UAAU,IAAI,YAAY,EAAE;IAI5B,IAAI,IAAI,IAAI;CAGb;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,UAAU,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;KACpC,CAAC;CACH"}