gsd-pi 2.79.0-dev.ece5fd8ba → 2.80.0-dev.c5f2443b3

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 (502) hide show
  1. package/dist/resources/.managed-resources-content-hash +1 -1
  2. package/dist/resources/extensions/github-sync/templates.js +55 -70
  3. package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
  4. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
  5. package/dist/resources/extensions/gsd/auto/loop.js +359 -523
  6. package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
  7. package/dist/resources/extensions/gsd/auto/phases.js +55 -6
  8. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  9. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
  10. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
  11. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
  21. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
  23. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
  24. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
  26. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
  27. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
  28. package/dist/resources/extensions/gsd/auto-dashboard.js +3 -0
  29. package/dist/resources/extensions/gsd/auto-prompts.js +168 -3
  30. package/dist/resources/extensions/gsd/auto-recovery.js +45 -52
  31. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
  32. package/dist/resources/extensions/gsd/auto-verification.js +2 -11
  33. package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
  34. package/dist/resources/extensions/gsd/auto.js +159 -2
  35. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
  36. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  37. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -5
  38. package/dist/resources/extensions/gsd/commands-ship.js +23 -46
  39. package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
  40. package/dist/resources/extensions/gsd/component-loader.js +5 -11
  41. package/dist/resources/extensions/gsd/custom-workflow-engine.js +4 -0
  42. package/dist/resources/extensions/gsd/db-adapter.js +47 -0
  43. package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
  44. package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
  45. package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
  46. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
  47. package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
  48. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
  49. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
  50. package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
  51. package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
  52. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
  53. package/dist/resources/extensions/gsd/db-open-state.js +32 -0
  54. package/dist/resources/extensions/gsd/db-provider.js +108 -0
  55. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
  56. package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
  57. package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
  58. package/dist/resources/extensions/gsd/db-transaction.js +63 -0
  59. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
  60. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
  61. package/dist/resources/extensions/gsd/escalation.js +2 -0
  62. package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
  63. package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
  64. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
  65. package/dist/resources/extensions/gsd/model-router.js +9 -6
  66. package/dist/resources/extensions/gsd/notification-widget.js +21 -3
  67. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
  68. package/dist/resources/extensions/gsd/pr-evidence.js +76 -0
  69. package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
  70. package/dist/resources/extensions/gsd/process-task-path.js +61 -0
  71. package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
  72. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  73. package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  74. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  75. package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
  76. package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
  77. package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
  78. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  79. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  80. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  82. package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  83. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  84. package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  85. package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
  86. package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  87. package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
  88. package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
  89. package/dist/resources/extensions/gsd/prompts/system.md +65 -107
  90. package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  91. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  92. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  93. package/dist/resources/extensions/gsd/state.js +4 -0
  94. package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
  95. package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
  96. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +6 -1
  97. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  98. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  99. package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
  100. package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
  101. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  102. package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
  103. package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
  104. package/dist/resources/extensions/shared/interview-ui.js +15 -4
  105. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  106. package/dist/web/standalone/.next/BUILD_ID +1 -1
  107. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  108. package/dist/web/standalone/.next/build-manifest.json +2 -2
  109. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  110. package/dist/web/standalone/.next/required-server-files.json +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  129. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  131. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/git/route.js +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 +1 -1
  150. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/index.html +1 -1
  192. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  193. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  194. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  197. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  199. package/dist/web/standalone/.next/server/chunks/167.js +2 -0
  200. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  201. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  203. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  204. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  205. package/dist/web/standalone/package.json +1 -0
  206. package/dist/web/standalone/server.js +1 -1
  207. package/package.json +9 -2
  208. package/packages/contracts/dist/index.d.ts +3 -0
  209. package/packages/contracts/dist/index.d.ts.map +1 -0
  210. package/packages/contracts/dist/index.js +5 -0
  211. package/packages/contracts/dist/index.js.map +1 -0
  212. package/packages/contracts/dist/rpc.d.ts +549 -0
  213. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  214. package/packages/contracts/dist/rpc.js +53 -0
  215. package/packages/contracts/dist/rpc.js.map +1 -0
  216. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  217. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  218. package/packages/contracts/dist/rpc.test.js +47 -0
  219. package/packages/contracts/dist/rpc.test.js.map +1 -0
  220. package/packages/contracts/dist/workflow.d.ts +180 -0
  221. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  222. package/packages/contracts/dist/workflow.js +201 -0
  223. package/packages/contracts/dist/workflow.js.map +1 -0
  224. package/packages/contracts/package.json +39 -0
  225. package/packages/contracts/src/index.ts +5 -0
  226. package/packages/contracts/src/rpc.test.ts +72 -0
  227. package/packages/contracts/src/rpc.ts +286 -0
  228. package/packages/contracts/src/workflow.ts +213 -0
  229. package/packages/contracts/tsconfig.json +25 -0
  230. package/packages/contracts/tsconfig.tsbuildinfo +1 -0
  231. package/packages/daemon/package.json +3 -2
  232. package/packages/daemon/src/event-bridge.test.ts +2 -1
  233. package/packages/daemon/src/event-bridge.ts +1 -1
  234. package/packages/daemon/src/event-formatter.test.ts +1 -2
  235. package/packages/daemon/src/event-formatter.ts +1 -2
  236. package/packages/daemon/src/session-manager.ts +2 -2
  237. package/packages/daemon/src/types.ts +3 -18
  238. package/packages/mcp-server/dist/server.d.ts +13 -0
  239. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  240. package/packages/mcp-server/dist/server.js +77 -0
  241. package/packages/mcp-server/dist/server.js.map +1 -1
  242. package/packages/mcp-server/dist/session-manager.js +1 -1
  243. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  244. package/packages/mcp-server/dist/types.d.ts +3 -11
  245. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  246. package/packages/mcp-server/dist/types.js.map +1 -1
  247. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  248. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  249. package/packages/mcp-server/dist/workflow-tools.js +2 -40
  250. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  251. package/packages/mcp-server/package.json +3 -2
  252. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  253. package/packages/mcp-server/src/server.ts +99 -1
  254. package/packages/mcp-server/src/session-manager.ts +2 -2
  255. package/packages/mcp-server/src/types.ts +7 -18
  256. package/packages/mcp-server/src/workflow-tools.ts +2 -40
  257. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  258. package/packages/native/package.json +1 -1
  259. package/packages/pi-agent-core/package.json +1 -1
  260. package/packages/pi-ai/package.json +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +14 -0
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +20 -0
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +6 -1
  267. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +9 -1
  269. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -10
  271. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  273. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  275. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  276. package/packages/pi-coding-agent/package.json +2 -1
  277. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +23 -2
  278. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
  279. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +6 -1
  280. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -9
  281. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  282. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  283. package/packages/pi-tui/dist/tui.d.ts +1 -0
  284. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  285. package/packages/pi-tui/dist/tui.js +8 -2
  286. package/packages/pi-tui/dist/tui.js.map +1 -1
  287. package/packages/pi-tui/package.json +1 -1
  288. package/packages/pi-tui/src/tui.ts +8 -2
  289. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  290. package/packages/rpc-client/README.md +3 -3
  291. package/packages/rpc-client/dist/index.d.ts +1 -1
  292. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  293. package/packages/rpc-client/dist/index.js.map +1 -1
  294. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  295. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  296. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  297. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  298. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  299. package/packages/rpc-client/dist/rpc-types.js +3 -11
  300. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  301. package/packages/rpc-client/package.json +4 -1
  302. package/packages/rpc-client/src/index.ts +1 -1
  303. package/packages/rpc-client/src/rpc-client.ts +3 -6
  304. package/packages/rpc-client/src/rpc-types.ts +3 -398
  305. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  306. package/pkg/package.json +1 -1
  307. package/src/resources/extensions/github-sync/templates.ts +59 -84
  308. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  309. package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
  310. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  311. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
  312. package/src/resources/extensions/gsd/auto/loop.ts +411 -598
  313. package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
  314. package/src/resources/extensions/gsd/auto/phases.ts +82 -8
  315. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  316. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  317. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  318. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  319. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  320. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  321. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  322. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
  323. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  324. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  325. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  326. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  327. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  328. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  329. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  330. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  331. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  332. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  333. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  334. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
  335. package/src/resources/extensions/gsd/auto-dashboard.ts +4 -0
  336. package/src/resources/extensions/gsd/auto-prompts.ts +170 -3
  337. package/src/resources/extensions/gsd/auto-recovery.ts +42 -50
  338. package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
  339. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  340. package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
  341. package/src/resources/extensions/gsd/auto.ts +167 -1
  342. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +14 -1
  343. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
  344. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -5
  345. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  346. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  347. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  348. package/src/resources/extensions/gsd/custom-workflow-engine.ts +6 -0
  349. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  350. package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
  351. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  352. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  353. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  354. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  355. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  356. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  357. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  358. package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
  359. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  360. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  361. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  362. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  363. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  364. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  365. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  366. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  367. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  368. package/src/resources/extensions/gsd/escalation.ts +3 -1
  369. package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
  370. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  371. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  372. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  373. package/src/resources/extensions/gsd/model-router.ts +10 -6
  374. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  375. package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
  376. package/src/resources/extensions/gsd/pr-evidence.ts +124 -0
  377. package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
  378. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  379. package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
  380. package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  381. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  382. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  383. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  384. package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
  385. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  386. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  387. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  388. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  389. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  390. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  391. package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  392. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  393. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  394. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  395. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  396. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  397. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  398. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  399. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  400. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  401. package/src/resources/extensions/gsd/state.ts +6 -3
  402. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +32 -0
  403. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +65 -0
  404. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +38 -0
  405. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
  406. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
  407. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
  408. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
  409. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  410. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  411. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  412. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
  413. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  414. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +38 -0
  415. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  416. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +12 -0
  417. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
  418. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  419. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  420. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  421. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  422. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  423. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  424. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  425. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  426. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  427. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  428. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  429. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  430. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  431. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  432. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  433. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  434. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  435. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  436. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  437. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
  438. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  439. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
  440. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  441. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  442. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  443. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
  444. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
  445. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  446. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
  447. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  448. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  449. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
  450. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  451. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  452. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  453. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
  454. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  455. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  456. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
  457. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
  458. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  459. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  460. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
  461. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  462. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  463. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +6 -6
  464. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  465. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  466. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  467. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  468. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  469. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  470. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  471. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
  472. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  473. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  474. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  475. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  476. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  477. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  478. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  479. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  480. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  481. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  482. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  483. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +32 -0
  484. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  485. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  486. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
  487. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  488. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  489. package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
  490. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +6 -1
  491. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  492. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  493. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  494. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  495. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  496. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  497. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  498. package/src/resources/extensions/shared/interview-ui.ts +18 -5
  499. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
  500. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  501. /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → bQDK5_LtkGVS64AirQgQG}/_buildManifest.js +0 -0
  502. /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → bQDK5_LtkGVS64AirQgQG}/_ssgManifest.js +0 -0
@@ -0,0 +1,160 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Unit tests for auto-mode unit dispatch contract adapter.
3
+
4
+ import assert from "node:assert/strict";
5
+ import test from "node:test";
6
+
7
+ import type { SidecarItem } from "../auto/session.ts";
8
+ import type { IterationContext, IterationData, LoopState } from "../auto/types.ts";
9
+ import type { UokGraphNode } from "../uok/contracts.ts";
10
+ import {
11
+ runUnitPhaseViaContract,
12
+ type UnitDispatchScheduler,
13
+ type UnitPhaseResult,
14
+ } from "../auto/workflow-unit-dispatch.ts";
15
+
16
+ function makeIterData(overrides?: Partial<IterationData>): IterationData {
17
+ return {
18
+ unitType: "execute-task",
19
+ unitId: "M001/S001/T001",
20
+ prompt: "Run task",
21
+ finalPrompt: "Run task",
22
+ pauseAfterUatDispatch: false,
23
+ state: {} as IterationData["state"],
24
+ mid: "M001",
25
+ midTitle: "Milestone 1",
26
+ isRetry: false,
27
+ previousTier: undefined,
28
+ ...overrides,
29
+ };
30
+ }
31
+
32
+ function makeSidecarItem(kind: SidecarItem["kind"]): SidecarItem {
33
+ return {
34
+ kind,
35
+ unitType: `sidecar/${kind}`,
36
+ unitId: kind,
37
+ prompt: `Run ${kind}`,
38
+ };
39
+ }
40
+
41
+ class FakeScheduler implements UnitDispatchScheduler {
42
+ readonly handlers = new Map<UokGraphNode["kind"], (node: UokGraphNode) => Promise<void>>();
43
+ nodes: UokGraphNode[] = [];
44
+ options: unknown;
45
+ runHandler = true;
46
+
47
+ registerHandler(kind: UokGraphNode["kind"], handler: (node: UokGraphNode) => Promise<void>): void {
48
+ this.handlers.set(kind, handler);
49
+ }
50
+
51
+ async run(nodes: UokGraphNode[], options: { parallel: false; maxWorkers: 1 }): Promise<void> {
52
+ this.nodes = nodes;
53
+ this.options = options;
54
+ if (this.runHandler) {
55
+ await this.handlers.get(nodes[0]!.kind)?.(nodes[0]!);
56
+ }
57
+ }
58
+ }
59
+
60
+ test("runUnitPhaseViaContract calls legacy runner directly", async () => {
61
+ const result: UnitPhaseResult = { action: "next", data: { unitStartedAt: 1 } };
62
+ const calls: unknown[] = [];
63
+ const sidecarItem = makeSidecarItem("hook");
64
+
65
+ const outcome = await runUnitPhaseViaContract(
66
+ "legacy-direct",
67
+ { iteration: 3 } as IterationContext,
68
+ makeIterData(),
69
+ {} as LoopState,
70
+ sidecarItem,
71
+ {
72
+ runUnitPhase: async (...args) => {
73
+ calls.push(args);
74
+ return result;
75
+ },
76
+ createScheduler: () => assert.fail("createScheduler should not be called"),
77
+ },
78
+ );
79
+
80
+ assert.equal(outcome, result);
81
+ assert.equal(calls.length, 1);
82
+ assert.equal((calls[0] as unknown[])[3], sidecarItem);
83
+ });
84
+
85
+ test("runUnitPhaseViaContract dispatches through scheduler in uok mode", async () => {
86
+ const scheduler = new FakeScheduler();
87
+ const result: UnitPhaseResult = { action: "next", data: { requestDispatchedAt: 2 } };
88
+
89
+ const outcome = await runUnitPhaseViaContract(
90
+ "uok-scheduler",
91
+ { iteration: 4 } as IterationContext,
92
+ makeIterData(),
93
+ {} as LoopState,
94
+ undefined,
95
+ {
96
+ runUnitPhase: async () => result,
97
+ createScheduler: () => scheduler,
98
+ },
99
+ );
100
+
101
+ assert.equal(outcome, result);
102
+ assert.deepEqual(Array.from(scheduler.handlers.keys()), [
103
+ "unit",
104
+ "hook",
105
+ "subagent",
106
+ "team-worker",
107
+ "verification",
108
+ "reprocess",
109
+ ]);
110
+ assert.deepEqual(scheduler.nodes, [{
111
+ id: "dispatch:4:execute-task:M001/S001/T001",
112
+ kind: "unit",
113
+ dependsOn: [],
114
+ metadata: {
115
+ unitType: "execute-task",
116
+ unitId: "M001/S001/T001",
117
+ },
118
+ }]);
119
+ assert.deepEqual(scheduler.options, { parallel: false, maxWorkers: 1 });
120
+ });
121
+
122
+ test("runUnitPhaseViaContract maps sidecar kind to scheduler node kind", async () => {
123
+ const scheduler = new FakeScheduler();
124
+
125
+ await runUnitPhaseViaContract(
126
+ "uok-scheduler",
127
+ { iteration: 1 } as IterationContext,
128
+ makeIterData({ unitType: "sidecar/triage", unitId: "triage-1" }),
129
+ {} as LoopState,
130
+ makeSidecarItem("triage"),
131
+ {
132
+ runUnitPhase: async () => ({ action: "next", data: {} }),
133
+ createScheduler: () => scheduler,
134
+ },
135
+ );
136
+
137
+ assert.equal(scheduler.nodes[0]?.kind, "verification");
138
+ });
139
+
140
+ test("runUnitPhaseViaContract breaks when scheduler never runs a handler", async () => {
141
+ const scheduler = new FakeScheduler();
142
+ scheduler.runHandler = false;
143
+
144
+ const outcome = await runUnitPhaseViaContract(
145
+ "uok-scheduler",
146
+ { iteration: 1 } as IterationContext,
147
+ makeIterData(),
148
+ {} as LoopState,
149
+ undefined,
150
+ {
151
+ runUnitPhase: async () => assert.fail("runUnitPhase should not be called"),
152
+ createScheduler: () => scheduler,
153
+ },
154
+ );
155
+
156
+ assert.deepEqual(outcome, {
157
+ action: "break",
158
+ reason: "scheduler-dispatch-missing-result",
159
+ });
160
+ });
@@ -0,0 +1,123 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Unit tests for auto-mode worker heartbeat adapter.
3
+
4
+ import assert from "node:assert/strict";
5
+ import test from "node:test";
6
+
7
+ import {
8
+ maintainWorkerHeartbeat,
9
+ type MaintainWorkerHeartbeatDeps,
10
+ type WorkerHeartbeatSession,
11
+ } from "../auto/workflow-worker-heartbeat.ts";
12
+
13
+ function makeDeps(overrides?: Partial<MaintainWorkerHeartbeatDeps>): {
14
+ deps: MaintainWorkerHeartbeatDeps;
15
+ calls: unknown[];
16
+ errors: unknown[];
17
+ } {
18
+ const calls: unknown[] = [];
19
+ const errors: unknown[] = [];
20
+ const deps: MaintainWorkerHeartbeatDeps = {
21
+ heartbeatAutoWorker: workerId => calls.push(["heartbeat", workerId]),
22
+ refreshMilestoneLease: (workerId, milestoneId, token) => {
23
+ calls.push(["refresh", workerId, milestoneId, token]);
24
+ return true;
25
+ },
26
+ logHeartbeatFailure: err => errors.push(err),
27
+ ...overrides,
28
+ };
29
+ return { deps, calls, errors };
30
+ }
31
+
32
+ test("maintainWorkerHeartbeat no-ops without a worker id", () => {
33
+ const { deps, calls, errors } = makeDeps();
34
+
35
+ maintainWorkerHeartbeat({}, deps);
36
+
37
+ assert.deepEqual(calls, []);
38
+ assert.deepEqual(errors, []);
39
+ });
40
+
41
+ test("maintainWorkerHeartbeat refreshes worker heartbeat without active lease", () => {
42
+ const { deps, calls, errors } = makeDeps();
43
+
44
+ maintainWorkerHeartbeat({ workerId: "worker-1" }, deps);
45
+
46
+ assert.deepEqual(calls, [["heartbeat", "worker-1"]]);
47
+ assert.deepEqual(errors, []);
48
+ });
49
+
50
+ test("maintainWorkerHeartbeat refreshes active milestone lease when token exists", () => {
51
+ const { deps, calls, errors } = makeDeps();
52
+ const session: WorkerHeartbeatSession = {
53
+ workerId: "worker-1",
54
+ currentMilestoneId: "M001",
55
+ milestoneLeaseToken: 7,
56
+ };
57
+
58
+ maintainWorkerHeartbeat(session, deps);
59
+
60
+ assert.deepEqual(calls, [
61
+ ["heartbeat", "worker-1"],
62
+ ["refresh", "worker-1", "M001", 7],
63
+ ]);
64
+ assert.deepEqual(errors, []);
65
+ });
66
+
67
+ test("maintainWorkerHeartbeat skips lease refresh when token is null", () => {
68
+ const { deps, calls, errors } = makeDeps();
69
+
70
+ maintainWorkerHeartbeat({
71
+ workerId: "worker-1",
72
+ currentMilestoneId: "M001",
73
+ milestoneLeaseToken: null,
74
+ }, deps);
75
+
76
+ assert.deepEqual(calls, [["heartbeat", "worker-1"]]);
77
+ assert.deepEqual(errors, []);
78
+ });
79
+
80
+ test("maintainWorkerHeartbeat logs and suppresses heartbeat failures", () => {
81
+ const failure = new Error("db unavailable");
82
+ const { deps, calls, errors } = makeDeps({
83
+ heartbeatAutoWorker: workerId => {
84
+ calls.push(["heartbeat", workerId]);
85
+ throw failure;
86
+ },
87
+ });
88
+
89
+ assert.doesNotThrow(() => {
90
+ maintainWorkerHeartbeat({
91
+ workerId: "worker-1",
92
+ currentMilestoneId: "M001",
93
+ milestoneLeaseToken: 7,
94
+ }, deps);
95
+ });
96
+
97
+ assert.deepEqual(calls, [["heartbeat", "worker-1"]]);
98
+ assert.deepEqual(errors, [failure]);
99
+ });
100
+
101
+ test("maintainWorkerHeartbeat logs and suppresses lease refresh failures", () => {
102
+ const failure = new Error("lease stale");
103
+ const { deps, calls, errors } = makeDeps({
104
+ refreshMilestoneLease: (workerId, milestoneId, token) => {
105
+ calls.push(["refresh", workerId, milestoneId, token]);
106
+ throw failure;
107
+ },
108
+ });
109
+
110
+ assert.doesNotThrow(() => {
111
+ maintainWorkerHeartbeat({
112
+ workerId: "worker-1",
113
+ currentMilestoneId: "M001",
114
+ milestoneLeaseToken: 7,
115
+ }, deps);
116
+ });
117
+
118
+ assert.deepEqual(calls, [
119
+ ["heartbeat", "worker-1"],
120
+ ["refresh", "worker-1", "M001", 7],
121
+ ]);
122
+ assert.deepEqual(errors, [failure]);
123
+ });
@@ -17,8 +17,8 @@
17
17
  *
18
18
  * This rewrite builds a real git parent repo + local submodule, creates
19
19
  * a worktree, dirties a tracked file inside the submodule, then invokes
20
- * `removeWorktree` and asserts observable behaviour on stderr (where
21
- * `logWarning` writes) and on the filesystem (the worktree is gone).
20
+ * `removeWorktree` and asserts observable behaviour through the workflow log
21
+ * buffer and on the filesystem (the worktree is gone).
22
22
  */
23
23
 
24
24
  import { describe, test, beforeEach, afterEach } from "node:test";
@@ -35,6 +35,7 @@ import { join } from "node:path";
35
35
  import { tmpdir } from "node:os";
36
36
 
37
37
  import { createWorktree, removeWorktree } from "../worktree-manager.ts";
38
+ import { _resetLogs, peekLogs } from "../workflow-logger.ts";
38
39
 
39
40
  interface Harness {
40
41
  parent: string;
@@ -112,53 +113,38 @@ function makeHarness(): Harness {
112
113
  };
113
114
  }
114
115
 
115
- /** Capture stderr writes during `fn`. `logWarning` writes to stderr, so
116
- * this reveals warnings emitted by the worktree-manager. */
117
- function captureStderr(fn: () => void): string {
118
- const streamAny = process.stderr as unknown as {
119
- write: (chunk: string | Uint8Array, ...rest: unknown[]) => boolean;
120
- };
121
- const original = streamAny.write.bind(streamAny);
122
- const chunks: string[] = [];
123
- streamAny.write = (chunk: string | Uint8Array): boolean => {
124
- chunks.push(typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf-8"));
125
- return true;
126
- };
127
- try {
128
- fn();
129
- } finally {
130
- streamAny.write = original;
131
- }
132
- return chunks.join("");
116
+ function workflowLogMessages(): string {
117
+ return peekLogs().map((entry) => entry.message).join("\n");
133
118
  }
134
119
 
135
120
  describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
136
121
  let h: Harness;
137
122
 
138
123
  beforeEach(() => {
124
+ _resetLogs();
139
125
  h = makeHarness();
140
126
  });
141
127
 
142
128
  afterEach(() => {
143
129
  h.cleanup();
130
+ _resetLogs();
144
131
  });
145
132
 
146
133
  test("clean submodules: worktree removes without stashing or submodule warnings", () => {
147
134
  const wt = createWorktree(h.parent, "cleanwt");
148
135
  runGit(wt.path, ["submodule", "update", "--init", "--recursive"]);
149
136
 
150
- const stderr = captureStderr(() => {
151
- removeWorktree(h.parent, "cleanwt");
152
- });
137
+ removeWorktree(h.parent, "cleanwt");
138
+ const logs = workflowLogMessages();
153
139
 
154
140
  assert.ok(!existsSync(wt.path), "worktree directory should be gone");
155
141
  assert.doesNotMatch(
156
- stderr,
142
+ logs,
157
143
  /Saved uncommitted submodule changes to rescue branch/,
158
144
  "clean submodule must not trigger rescue-branch creation",
159
145
  );
160
146
  assert.doesNotMatch(
161
- stderr,
147
+ logs,
162
148
  /Submodule rescue branch creation failed/,
163
149
  "clean submodule must not trigger rescue-branch failure warning",
164
150
  );
@@ -191,9 +177,8 @@ describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
191
177
  `precondition: submodule must be diverged, got: "${subStatus}"`,
192
178
  );
193
179
 
194
- const stderr = captureStderr(() => {
195
- removeWorktree(h.parent, "dirtywt");
196
- });
180
+ removeWorktree(h.parent, "dirtywt");
181
+ const logs = workflowLogMessages();
197
182
 
198
183
  // Worktree is gone: force fallback succeeded.
199
184
  assert.ok(!existsSync(wt.path), "worktree directory should be removed");
@@ -205,7 +190,7 @@ describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
205
190
  // removal. This is the assertion that #4823 demanded in place of
206
191
  // the tautological `src.includes("submodule") && src.includes("force")`.
207
192
  assert.match(
208
- stderr,
193
+ logs,
209
194
  /Saved uncommitted submodule changes to rescue branch|Submodule rescue branch creation failed|Submodule changes detected/,
210
195
  "dirty submodule must trigger detection-and-warning path",
211
196
  );
@@ -231,12 +216,11 @@ describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
231
216
  renameSync(modPath, hiddenPath);
232
217
  }
233
218
 
234
- const stderr = captureStderr(() => {
235
- removeWorktree(h.parent, "no-gitmodules");
236
- });
219
+ removeWorktree(h.parent, "no-gitmodules");
220
+ const logs = workflowLogMessages();
237
221
 
238
222
  assert.doesNotMatch(
239
- stderr,
223
+ logs,
240
224
  /Saved uncommitted submodule changes to rescue branch/,
241
225
  "missing .gitmodules should skip submodule detection entirely",
242
226
  );
@@ -1,3 +1,4 @@
1
+ // GSD2 complete-milestone tool handler
1
2
  /**
2
3
  * complete-milestone handler — the core operation behind gsd_complete_milestone.
3
4
  *
@@ -57,6 +58,7 @@ export interface CompleteMilestoneResult {
57
58
  milestoneId: string;
58
59
  summaryPath: string;
59
60
  stale?: boolean;
61
+ alreadyComplete?: boolean;
60
62
  }
61
63
 
62
64
  function renderMilestoneSummaryMarkdown(params: CompleteMilestoneParams): string {
@@ -143,6 +145,7 @@ export async function handleCompleteMilestone(
143
145
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
144
146
  const completedAt = new Date().toISOString();
145
147
  let guardError: string | null = null;
148
+ let alreadyComplete = false;
146
149
 
147
150
  transaction(() => {
148
151
  // State machine preconditions (inside txn for atomicity)
@@ -152,7 +155,7 @@ export async function handleCompleteMilestone(
152
155
  return;
153
156
  }
154
157
  if (isClosedStatus(milestone.status)) {
155
- guardError = `milestone ${params.milestoneId} is already complete`;
158
+ alreadyComplete = true;
156
159
  return;
157
160
  }
158
161
 
@@ -238,14 +241,16 @@ export async function handleCompleteMilestone(
238
241
  logWarning("tool", `complete-milestone manifest warning: ${(mfErr as Error).message}`);
239
242
  }
240
243
  try {
241
- appendEvent(basePath, {
242
- cmd: "complete-milestone",
243
- params: { milestoneId: params.milestoneId },
244
- ts: new Date().toISOString(),
245
- actor: "agent",
246
- actor_name: params.actorName,
247
- trigger_reason: params.triggerReason,
248
- });
244
+ if (!alreadyComplete) {
245
+ appendEvent(basePath, {
246
+ cmd: "complete-milestone",
247
+ params: { milestoneId: params.milestoneId },
248
+ ts: new Date().toISOString(),
249
+ actor: "agent",
250
+ actor_name: params.actorName,
251
+ trigger_reason: params.triggerReason,
252
+ });
253
+ }
249
254
  } catch (eventErr) {
250
255
  logError("tool", `complete-milestone event log FAILED — completion invisible to reconciliation`, { error: (eventErr as Error).message });
251
256
  }
@@ -254,5 +259,6 @@ export async function handleCompleteMilestone(
254
259
  milestoneId: params.milestoneId,
255
260
  summaryPath,
256
261
  ...(projectionStale ? { stale: true } : {}),
262
+ ...(alreadyComplete ? { alreadyComplete: true } : {}),
257
263
  };
258
264
  }
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Complete-task tool handler for GSD workflow state and summaries.
3
+
1
4
  /**
2
5
  * complete-task handler — the core operation behind gsd_complete_task.
3
6
  *
@@ -55,7 +58,7 @@ export interface CompleteTaskResult {
55
58
  stale?: boolean;
56
59
  }
57
60
 
58
- import type { TaskRow } from "../gsd-db.js";
61
+ import type { TaskRow } from "../db-task-slice-rows.js";
59
62
 
60
63
  /**
61
64
  * Map an execute-task-owned gate id to the CompleteTaskParams field whose
@@ -477,12 +477,17 @@ export async function executeCompleteMilestone(
477
477
  isError: true,
478
478
  };
479
479
  }
480
+ const message = result.alreadyComplete
481
+ ? `Milestone ${result.milestoneId} is already complete. Summary available at ${result.summaryPath}`
482
+ : `Completed milestone ${result.milestoneId}. Summary written to ${result.summaryPath}`;
480
483
  return {
481
- content: [{ type: "text", text: `Completed milestone ${result.milestoneId}. Summary written to ${result.summaryPath}` }],
484
+ content: [{ type: "text", text: message }],
482
485
  details: {
483
486
  operation: "complete_milestone",
484
487
  milestoneId: result.milestoneId,
485
488
  summaryPath: result.summaryPath,
489
+ ...(result.alreadyComplete ? { alreadyComplete: true } : {}),
490
+ ...(result.stale ? { stale: true } : {}),
486
491
  },
487
492
  };
488
493
  } catch (err) {
@@ -113,7 +113,7 @@ const CONTEXT_MODE_LANE_LABELS: Record<Exclude<ContextModePolicy, "none">, strin
113
113
  };
114
114
 
115
115
  const CONTEXT_MODE_GUIDANCE =
116
- "Use `gsd_exec` for noisy scans, builds, and tests so full output stays out of prompt context; call `gsd_exec_search` before repeating prior runs; call `gsd_resume` after compaction or resume to recover stored execution context.";
116
+ "Use `gsd_exec` for noisy commands, `gsd_exec_search` before reruns, and `gsd_resume` after compaction or resume.";
117
117
 
118
118
  /**
119
119
  * Render the Context Mode instruction lane for a unit type. Unknown unit
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Selects the UOK kernel path and records parity diagnostics.
1
3
  import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
2
4
  import { appendFileSync, mkdirSync } from "node:fs";
3
5
  import { join } from "node:path";
@@ -9,6 +11,7 @@ import { buildAuditEnvelope, emitUokAuditEvent } from "./audit.js";
9
11
  import { setUnifiedAuditEnabled } from "./audit-toggle.js";
10
12
  import { resolveUokFlags } from "./flags.js";
11
13
  import { createTurnObserver } from "./loop-adapter.js";
14
+ import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
12
15
 
13
16
  interface RunAutoLoopWithUokArgs {
14
17
  ctx: ExtensionContext;
@@ -54,10 +57,14 @@ export async function runAutoLoopWithUok(args: RunAutoLoopWithUokArgs): Promise<
54
57
  const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
55
58
  const flags = resolveUokFlags(prefs);
56
59
  setUnifiedAuditEnabled(flags.auditUnified);
60
+ const pathLabel = resolveKernelPathLabel(flags);
61
+ if (pathLabel !== "uok-kernel") {
62
+ incrementLegacyTelemetry("legacy.uokFallbackUsed");
63
+ }
57
64
 
58
65
  writeParityEvent(s.basePath, {
59
66
  ts: new Date().toISOString(),
60
- path: resolveKernelPathLabel(flags),
67
+ path: pathLabel,
61
68
  flags,
62
69
  phase: "enter",
63
70
  });
@@ -98,7 +105,7 @@ export async function runAutoLoopWithUok(args: RunAutoLoopWithUokArgs): Promise<
98
105
  }
99
106
  writeParityEvent(s.basePath, {
100
107
  ts: new Date().toISOString(),
101
- path: resolveKernelPathLabel(flags),
108
+ path: pathLabel,
102
109
  flags,
103
110
  phase: "exit",
104
111
  status: "ok",
@@ -106,7 +113,7 @@ export async function runAutoLoopWithUok(args: RunAutoLoopWithUokArgs): Promise<
106
113
  } catch (err) {
107
114
  writeParityEvent(s.basePath, {
108
115
  ts: new Date().toISOString(),
109
- path: resolveKernelPathLabel(flags),
116
+ path: pathLabel,
110
117
  flags,
111
118
  phase: "exit",
112
119
  status: "error",
@@ -1,9 +1,13 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: UOK plan v2 graph compilation from GSD workflow state.
3
+
1
4
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
5
  import { join } from "node:path";
3
6
 
4
7
  import type { GSDState, Phase } from "../types.js";
5
8
  import { gsdRoot, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
6
- import { isDbAvailable, getMilestoneSlices, getSliceTasks, type SliceRow } from "../gsd-db.js";
9
+ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "../gsd-db.js";
10
+ import type { SliceRow } from "../db-task-slice-rows.js";
7
11
  import type { UokGraphNode } from "./contracts.js";
8
12
 
9
13
  const PLAN_V2_CLARIFY_ROUND_LIMIT = 3;
@@ -3,13 +3,12 @@
3
3
  // Captures structured entries that the auto-loop can drain after each unit
4
4
  // to surface root causes for stuck loops, silent degradation, and blocked writes.
5
5
  // Error-severity entries are persisted to .gsd/audit-log.jsonl (sanitized) for
6
- // post-mortem analysis. Warnings are ephemeral (stderr + buffer only) to avoid
7
- // log amplification from expected-control-flow catch paths.
6
+ // post-mortem analysis. Warnings persist to notifications and remain available
7
+ // in the in-memory buffer, but are not printed to stderr.
8
8
  //
9
- // Stderr policy: every logWarning/logError call writes immediately to stderr
10
- // for terminal visibility. This is intentional unlike debug-logger (which is
11
- // opt-in and zero-overhead when disabled), workflow-logger covers operational
12
- // warnings/errors that should always be visible. There is no disable flag.
9
+ // Stderr policy: logError writes immediately to stderr for terminal visibility.
10
+ // logWarning stays out of the TUI/stdout stream and is surfaced through the
11
+ // notification store plus the auto-loop issue buffer.
13
12
  //
14
13
  // Singleton safety: _buffer is module-level and shared across all calls within
15
14
  // a process. The auto-loop must call _resetLogs() (or drainAndSummarize()) at
@@ -109,7 +108,8 @@ export function setStderrLoggingEnabled(enabled: boolean): boolean {
109
108
  // ─── Public API ─────────────────────────────────────────────────────────
110
109
 
111
110
  /**
112
- * Record a warning. Also writes to stderr for terminal visibility.
111
+ * Record a warning. Warnings are persisted to notifications and buffered for
112
+ * auto-loop issue summaries, but they are intentionally not written to stderr.
113
113
  */
114
114
  export function logWarning(
115
115
  component: LogComponent,
@@ -271,10 +271,10 @@ function _push(
271
271
  ...(context ? { context } : {}),
272
272
  };
273
273
 
274
- // Always forward to stderr so terminal watchers see it (see module header for policy)
275
- const prefix = severity === "error" ? "ERROR" : "WARN";
276
- const ctxStr = context ? ` ${JSON.stringify(context)}` : "";
277
- _writeStderr(`[gsd:${component}] ${prefix}: ${message}${ctxStr}\n`);
274
+ if (severity === "error") {
275
+ const ctxStr = context ? ` ${JSON.stringify(context)}` : "";
276
+ _writeStderr(`[gsd:${component}] ERROR: ${message}${ctxStr}\n`);
277
+ }
278
278
 
279
279
  // Persist to notification store (both warnings and errors)
280
280
  try {
@@ -317,8 +317,8 @@ function _push(
317
317
  }
318
318
 
319
319
  // Persist errors to .gsd/audit-log.jsonl so they survive context resets.
320
- // Only error-severity entries are persisted warnings are ephemeral (stderr + buffer)
321
- // to avoid log amplification from expected-control-flow catch paths.
320
+ // Warnings are already persisted to notifications and buffered for the
321
+ // current auto-loop unit.
322
322
  if (_auditBasePath && severity === "error") {
323
323
  try {
324
324
  const auditDir = join(_auditBasePath, ".gsd");
@@ -1,11 +1,14 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: State manifest snapshot and restore orchestration for GSD workflow data.
3
+
1
4
  import {
2
5
  _getAdapter,
3
6
  readTransaction,
4
7
  restoreManifest,
5
- type MilestoneRow,
6
- type SliceRow,
7
- type TaskRow,
8
8
  } from "./gsd-db.js";
9
+ import type { MilestoneRow } from "./db-milestone-artifact-rows.js";
10
+ import type { SliceRow, TaskRow } from "./db-task-slice-rows.js";
11
+ import type { VerificationEvidenceRow } from "./db-verification-evidence-rows.js";
9
12
  import type { Decision } from "./types.js";
10
13
  import { atomicWriteSync } from "./atomic-write.js";
11
14
  import { readFileSync, existsSync, mkdirSync } from "node:fs";
@@ -13,18 +16,6 @@ import { join } from "node:path";
13
16
 
14
17
  // ─── Manifest Types ──────────────────────────────────────────────────────
15
18
 
16
- export interface VerificationEvidenceRow {
17
- id: number;
18
- task_id: string;
19
- slice_id: string;
20
- milestone_id: string;
21
- command: string;
22
- exit_code: number | null;
23
- verdict: string;
24
- duration_ms: number | null;
25
- created_at: string;
26
- }
27
-
28
19
  export interface StateManifest {
29
20
  version: 1;
30
21
  exported_at: string; // ISO 8601