@opengsd/gsd-pi 1.3.0-dev.65546769 → 1.3.0-dev.738160b9

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 (488) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +17 -4
  3. package/dist/headless-answers.js +1 -1
  4. package/dist/headless-ui.d.ts +1 -1
  5. package/dist/headless-ui.js +1 -1
  6. package/dist/headless.js +1 -1
  7. package/dist/resources/.managed-resources-content-hash +1 -1
  8. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +11 -2
  10. package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
  11. package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
  12. package/dist/resources/extensions/gsd/auto/orchestrator.js +12 -3
  13. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  14. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  15. package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
  16. package/dist/resources/extensions/gsd/auto-budget.js +5 -1
  17. package/dist/resources/extensions/gsd/auto-dispatch.js +34 -20
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  19. package/dist/resources/extensions/gsd/auto-prompts.js +29 -14
  20. package/dist/resources/extensions/gsd/auto-recovery.js +9 -510
  21. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
  22. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
  23. package/dist/resources/extensions/gsd/auto-verification.js +5 -2
  24. package/dist/resources/extensions/gsd/auto.js +19 -10
  25. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -13
  26. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
  27. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -5
  28. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
  29. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +41 -21
  31. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -19
  32. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +96 -10
  33. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  34. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
  35. package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
  36. package/dist/resources/extensions/gsd/commands-context.js +19 -1
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +17 -11
  38. package/dist/resources/extensions/gsd/commands-usage.js +1 -1
  39. package/dist/resources/extensions/gsd/commands-worktree.js +12 -10
  40. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -3
  41. package/dist/resources/extensions/gsd/db/engine.js +4 -1
  42. package/dist/resources/extensions/gsd/db/queries.js +60 -0
  43. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
  44. package/dist/resources/extensions/gsd/db-workspace.js +55 -3
  45. package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
  46. package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  47. package/dist/resources/extensions/gsd/doctor-engine-checks.js +192 -4
  48. package/dist/resources/extensions/gsd/doctor-providers.js +92 -8
  49. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
  50. package/dist/resources/extensions/gsd/exec-sandbox.js +53 -11
  51. package/dist/resources/extensions/gsd/flat-phase-migration.js +45 -0
  52. package/dist/resources/extensions/gsd/forensics.js +2 -32
  53. package/dist/resources/extensions/gsd/git-service.js +61 -4
  54. package/dist/resources/extensions/gsd/gitignore.js +4 -1
  55. package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
  56. package/dist/resources/extensions/gsd/health-widget.js +55 -29
  57. package/dist/resources/extensions/gsd/json-persistence.js +20 -0
  58. package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
  59. package/dist/resources/extensions/gsd/layout-policy.js +3 -1
  60. package/dist/resources/extensions/gsd/markdown-renderer.js +8 -9
  61. package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
  62. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
  63. package/dist/resources/extensions/gsd/metrics.js +4 -4
  64. package/dist/resources/extensions/gsd/migrate-external.js +11 -2
  65. package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
  66. package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
  67. package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
  68. package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
  69. package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
  70. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  71. package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -3
  72. package/dist/resources/extensions/gsd/quick.js +45 -2
  73. package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
  74. package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
  75. package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
  76. package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
  77. package/dist/resources/extensions/gsd/session-forensics.js +11 -1
  78. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  79. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  80. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  81. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  82. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  83. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  84. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +45 -2
  85. package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
  86. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
  87. package/dist/resources/extensions/gsd/state.js +12 -611
  88. package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
  89. package/dist/resources/extensions/gsd/tools/complete-slice.js +2 -2
  90. package/dist/resources/extensions/gsd/tools/complete-task.js +43 -14
  91. package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
  92. package/dist/resources/extensions/gsd/tools/plan-slice.js +59 -44
  93. package/dist/resources/extensions/gsd/tools/plan-task.js +28 -5
  94. package/dist/resources/extensions/gsd/undo.js +43 -6
  95. package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
  96. package/dist/resources/extensions/gsd/unit-registry.js +36 -6
  97. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +33 -3
  98. package/dist/resources/extensions/gsd/validation-block-guard.js +9 -4
  99. package/dist/resources/extensions/gsd/verification-gate.js +7 -0
  100. package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
  101. package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
  102. package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
  103. package/dist/resources/extensions/gsd/worktree-manager.js +44 -2
  104. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  105. package/dist/web/standalone/.next/BUILD_ID +1 -1
  106. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  107. package/dist/web/standalone/.next/build-manifest.json +3 -3
  108. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  109. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  110. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +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/page_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/index.html +1 -1
  130. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  131. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  132. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  133. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  138. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  139. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  142. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  143. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  144. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  145. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  146. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  147. package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
  148. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  149. package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
  150. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  151. package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
  152. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  153. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  154. package/package.json +1 -1
  155. package/packages/cloud-mcp-gateway/package.json +2 -2
  156. package/packages/contracts/dist/workflow.d.ts +1 -0
  157. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  158. package/packages/contracts/dist/workflow.js +2 -0
  159. package/packages/contracts/dist/workflow.js.map +1 -1
  160. package/packages/contracts/package.json +1 -1
  161. package/packages/daemon/package.json +4 -4
  162. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  163. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  164. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  165. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  166. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  167. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  168. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  169. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  170. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  171. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  172. package/packages/gsd-agent-core/dist/index.js +2 -0
  173. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  174. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  175. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  176. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  177. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  178. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  179. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  180. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  181. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  182. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  183. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  184. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  185. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  186. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  187. package/packages/gsd-agent-core/package.json +5 -5
  188. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  192. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  193. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  194. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  195. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  196. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  197. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  198. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -829
  199. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  200. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  201. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  202. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  203. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  204. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  205. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  206. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  207. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  208. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  209. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +258 -0
  211. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  212. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  213. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  214. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  215. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  218. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
  219. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  220. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  222. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  223. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  224. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  226. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  227. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  228. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  229. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  231. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  232. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  233. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  234. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  235. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  236. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
  237. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +23 -5
  239. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  240. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  242. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  243. package/packages/gsd-agent-modes/package.json +7 -7
  244. package/packages/mcp-server/README.md +1 -1
  245. package/packages/mcp-server/dist/server.d.ts +1 -1
  246. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  247. package/packages/mcp-server/dist/server.js +3 -3
  248. package/packages/mcp-server/dist/server.js.map +1 -1
  249. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  250. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  251. package/packages/mcp-server/dist/workflow-tools.js +35 -21
  252. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  253. package/packages/mcp-server/package.json +4 -4
  254. package/packages/native/package.json +1 -1
  255. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  256. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  257. package/packages/pi-agent-core/package.json +1 -1
  258. package/packages/pi-ai/dist/models.generated.d.ts +46 -0
  259. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  260. package/packages/pi-ai/dist/models.generated.js +38 -0
  261. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  262. package/packages/pi-ai/package.json +1 -1
  263. package/packages/pi-coding-agent/README.md +3 -2
  264. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  265. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  266. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  267. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  268. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  269. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  270. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  271. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  272. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  273. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  274. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  275. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  276. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
  277. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  278. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  279. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  280. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  281. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
  283. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  285. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  287. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  290. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  291. package/packages/pi-coding-agent/package.json +7 -7
  292. package/packages/pi-tui/package.json +2 -2
  293. package/packages/rpc-client/package.json +2 -2
  294. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  295. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  296. package/pkg/dist/theme/theme-schema.js +1 -1
  297. package/pkg/dist/theme/theme-schema.js.map +1 -1
  298. package/pkg/dist/theme/theme.d.ts.map +1 -1
  299. package/pkg/dist/theme/theme.js +11 -7
  300. package/pkg/dist/theme/theme.js.map +1 -1
  301. package/pkg/package.json +1 -1
  302. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  303. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +20 -2
  304. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
  305. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +80 -0
  306. package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
  307. package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
  308. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  309. package/src/resources/extensions/gsd/auto/orchestrator.ts +25 -11
  310. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  311. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
  312. package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
  313. package/src/resources/extensions/gsd/auto-budget.ts +12 -1
  314. package/src/resources/extensions/gsd/auto-dispatch.ts +35 -24
  315. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  316. package/src/resources/extensions/gsd/auto-prompts.ts +41 -15
  317. package/src/resources/extensions/gsd/auto-recovery.ts +13 -511
  318. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
  319. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
  320. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  321. package/src/resources/extensions/gsd/auto.ts +23 -8
  322. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +125 -12
  323. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
  324. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -5
  325. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
  326. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  327. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +52 -21
  328. package/src/resources/extensions/gsd/bootstrap/system-context.ts +52 -18
  329. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +104 -10
  330. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  331. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
  332. package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
  333. package/src/resources/extensions/gsd/commands-context.ts +18 -1
  334. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -10
  335. package/src/resources/extensions/gsd/commands-usage.ts +1 -1
  336. package/src/resources/extensions/gsd/commands-worktree.ts +12 -10
  337. package/src/resources/extensions/gsd/dashboard-overlay.ts +32 -3
  338. package/src/resources/extensions/gsd/db/engine.ts +8 -1
  339. package/src/resources/extensions/gsd/db/queries.ts +79 -0
  340. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
  341. package/src/resources/extensions/gsd/db-workspace.ts +61 -3
  342. package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
  343. package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  344. package/src/resources/extensions/gsd/doctor-engine-checks.ts +233 -5
  345. package/src/resources/extensions/gsd/doctor-providers.ts +103 -9
  346. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
  347. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  348. package/src/resources/extensions/gsd/exec-sandbox.ts +56 -11
  349. package/src/resources/extensions/gsd/flat-phase-migration.ts +44 -0
  350. package/src/resources/extensions/gsd/forensics.ts +2 -33
  351. package/src/resources/extensions/gsd/git-service.ts +69 -5
  352. package/src/resources/extensions/gsd/gitignore.ts +4 -1
  353. package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
  354. package/src/resources/extensions/gsd/health-widget.ts +69 -32
  355. package/src/resources/extensions/gsd/json-persistence.ts +20 -0
  356. package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
  357. package/src/resources/extensions/gsd/layout-policy.ts +2 -1
  358. package/src/resources/extensions/gsd/markdown-renderer.ts +8 -11
  359. package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
  360. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
  361. package/src/resources/extensions/gsd/metrics.ts +4 -4
  362. package/src/resources/extensions/gsd/migrate-external.ts +8 -2
  363. package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
  364. package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
  365. package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
  366. package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
  367. package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
  368. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  369. package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -3
  370. package/src/resources/extensions/gsd/quick.ts +43 -2
  371. package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
  372. package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
  373. package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
  374. package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
  375. package/src/resources/extensions/gsd/session-forensics.ts +11 -1
  376. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  377. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  378. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  379. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  380. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  381. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  382. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +81 -7
  383. package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
  384. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
  385. package/src/resources/extensions/gsd/state.ts +32 -732
  386. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
  387. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
  388. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
  389. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
  390. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
  391. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +146 -1
  392. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
  393. package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
  394. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
  395. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
  396. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
  397. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
  398. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +11 -0
  399. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
  400. package/src/resources/extensions/gsd/tests/complete-task.test.ts +75 -0
  401. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +55 -2
  402. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
  403. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
  404. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
  405. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
  406. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
  407. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
  408. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +107 -0
  409. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +239 -2
  410. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
  411. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
  412. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
  413. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
  414. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +37 -2
  415. package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
  416. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
  417. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
  418. package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
  419. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
  420. package/src/resources/extensions/gsd/tests/integration/queue-active-milestone-context-budget.test.ts +93 -0
  421. package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
  422. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
  423. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
  424. package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +14 -0
  425. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -0
  426. package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
  427. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
  428. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
  429. package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
  430. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
  431. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  432. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +43 -1
  433. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
  434. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +26 -0
  435. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
  436. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  437. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +10 -0
  438. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
  439. package/src/resources/extensions/gsd/tests/plan-task.test.ts +44 -1
  440. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
  441. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +54 -1
  442. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  443. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
  444. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
  445. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +195 -1
  446. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -0
  447. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +87 -0
  448. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +103 -0
  449. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
  450. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
  451. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +56 -0
  452. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  453. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +208 -0
  454. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +32 -3
  455. package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
  456. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +193 -14
  457. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +25 -0
  458. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +38 -0
  459. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +79 -0
  460. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
  461. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +66 -0
  462. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
  463. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
  464. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
  465. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +6 -5
  466. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
  467. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
  468. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  469. package/src/resources/extensions/gsd/tools/complete-slice.ts +2 -2
  470. package/src/resources/extensions/gsd/tools/complete-task.ts +53 -15
  471. package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
  472. package/src/resources/extensions/gsd/tools/plan-slice.ts +60 -47
  473. package/src/resources/extensions/gsd/tools/plan-task.ts +30 -5
  474. package/src/resources/extensions/gsd/undo.ts +47 -6
  475. package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
  476. package/src/resources/extensions/gsd/unit-registry.ts +36 -6
  477. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +41 -5
  478. package/src/resources/extensions/gsd/validation-block-guard.ts +13 -7
  479. package/src/resources/extensions/gsd/verification-gate.ts +8 -0
  480. package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
  481. package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
  482. package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
  483. package/src/resources/extensions/gsd/worktree-manager.ts +41 -1
  484. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  485. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
  486. package/dist/web/standalone/.next/static/chunks/webpack-f46ea08200a0227e.js +0 -1
  487. /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → 2A_WqqCS-EoYZxN9_v3d2}/_buildManifest.js +0 -0
  488. /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → 2A_WqqCS-EoYZxN9_v3d2}/_ssgManifest.js +0 -0
@@ -28,6 +28,7 @@ import {
28
28
  import { rowToGate } from "../db-gate-rows.js";
29
29
  import { rowToArtifact, rowToMilestone, type ArtifactRow, type MilestoneRow } from "../db-milestone-artifact-rows.js";
30
30
  import { rowToSlice, rowToTask, type SliceRow, type TaskRow } from "../db-task-slice-rows.js";
31
+ import { TERMINAL_STATUS_SQL } from "./sql-constants.js";
31
32
 
32
33
 
33
34
  function parseStringArrayColumn(raw: unknown): string[] {
@@ -49,6 +50,59 @@ function normalizeRepoPath(file: string): string {
49
50
  return file.trim().replace(/\\/g, "/").replace(/^\.\/+/, "");
50
51
  }
51
52
 
53
+ export interface HierarchyCompletionCounts {
54
+ milestones: number;
55
+ milestonesTotal: number;
56
+ slices: number;
57
+ slicesTotal: number;
58
+ tasks: number;
59
+ tasksTotal: number;
60
+ }
61
+
62
+ function numberColumn(row: Record<string, unknown> | undefined, column: string): number {
63
+ const value = row?.[column];
64
+ if (typeof value === "number") return value;
65
+ if (typeof value === "bigint") return Number(value);
66
+ if (typeof value === "string") {
67
+ const parsed = Number(value);
68
+ return Number.isFinite(parsed) ? parsed : 0;
69
+ }
70
+ return 0;
71
+ }
72
+
73
+ function getCompletionCount(table: "milestones" | "slices" | "tasks"): { completed: number; total: number } {
74
+ const row = getDbOrNull()!.prepare(
75
+ `SELECT
76
+ COUNT(*) AS total,
77
+ COALESCE(SUM(CASE WHEN status IN (${TERMINAL_STATUS_SQL}) THEN 1 ELSE 0 END), 0) AS completed
78
+ FROM ${table}`,
79
+ ).get();
80
+
81
+ return {
82
+ completed: numberColumn(row, "completed"),
83
+ total: numberColumn(row, "total"),
84
+ };
85
+ }
86
+
87
+ export function getHierarchyCompletionCounts(): HierarchyCompletionCounts {
88
+ if (!getDbOrNull()!) {
89
+ return { milestones: 0, milestonesTotal: 0, slices: 0, slicesTotal: 0, tasks: 0, tasksTotal: 0 };
90
+ }
91
+
92
+ const milestones = getCompletionCount("milestones");
93
+ const slices = getCompletionCount("slices");
94
+ const tasks = getCompletionCount("tasks");
95
+
96
+ return {
97
+ milestones: milestones.completed,
98
+ milestonesTotal: milestones.total,
99
+ slices: slices.completed,
100
+ slicesTotal: slices.total,
101
+ tasks: tasks.completed,
102
+ tasksTotal: tasks.total,
103
+ };
104
+ }
105
+
52
106
  export function getDecisionById(id: string): Decision | null {
53
107
  if (!getDbOrNull()!) return null;
54
108
  const row = getDbOrNull()!.prepare("SELECT * FROM decisions WHERE id = ?").get(id);
@@ -490,6 +544,31 @@ export function getAssessment(path: string): Record<string, unknown> | null {
490
544
  return row ?? null;
491
545
  }
492
546
 
547
+ /**
548
+ * Look up a slice's `run-uat` assessment by (milestoneId, sliceId) identity,
549
+ * independent of the artifact `path`. Used as a DB fallback by the UAT
550
+ * closeout gate when a path migration orphans the ASSESSMENT markdown from its
551
+ * canonical expected path (ADR-017: DB-authoritative UAT sign-off).
552
+ *
553
+ * `status` holds the normalized verdict (`pass`/`fail`/…) written by
554
+ * `executeUatResultSave`; `fullContent` carries the ASSESSMENT body so callers
555
+ * can derive `uatType` without re-reading a file that may not exist.
556
+ */
557
+ export function getSliceRunUatAssessment(
558
+ milestoneId: string,
559
+ sliceId: string,
560
+ ): { status: string; fullContent: string } | null {
561
+ if (!getDbOrNull()!) return null;
562
+ const row = getDbOrNull()!.prepare(
563
+ `SELECT status, full_content AS fullContent FROM assessments
564
+ WHERE milestone_id = :mid AND slice_id = :sid AND scope = 'run-uat'
565
+ ORDER BY created_at DESC, ROWID DESC
566
+ LIMIT 1`,
567
+ ).get({ ":mid": milestoneId, ":sid": sliceId });
568
+ if (!row) return null;
569
+ return { status: String(row["status"] ?? ""), fullContent: String(row["fullContent"] ?? "") };
570
+ }
571
+
493
572
  export function getLatestAssessmentByScope(
494
573
  milestoneId: string,
495
574
  scope: string,
@@ -2,11 +2,18 @@
2
2
  // File Purpose: Memory FTS5 SQLite schema helpers for the GSD database facade.
3
3
 
4
4
  import type { DbAdapter } from "./db-adapter.js";
5
+ import { createRuntimeKvTableV25 } from "./db-runtime-kv-schema.js";
6
+
7
+ export const MEMORIES_FTS_REBUILT_KEY = "memories_fts_rebuilt_at";
5
8
 
6
9
  export interface MemoryFtsSchemaOptions {
7
10
  onUnavailable?: (message: string) => void;
8
11
  }
9
12
 
13
+ export interface MemoryFtsRebuildOptions {
14
+ onRebuildFailed?: (message: string) => void;
15
+ }
16
+
10
17
  function formatFtsUnavailableError(err: unknown): string {
11
18
  const message = err instanceof Error ? err.message : String(err);
12
19
  return message.replace(/\bmoduel\s*:\s*/gi, "module: ");
@@ -64,3 +71,41 @@ export function isMemoriesFtsAvailableSchema(db: DbAdapter): boolean {
64
71
  return false;
65
72
  }
66
73
  }
74
+
75
+ export function rebuildMemoriesFtsSchemaOnce(
76
+ db: DbAdapter,
77
+ options: MemoryFtsRebuildOptions = {},
78
+ ): void {
79
+ if (!isMemoriesFtsAvailableSchema(db)) return;
80
+
81
+ createRuntimeKvTableV25(db);
82
+ const marker = db.prepare(
83
+ "SELECT 1 as present FROM runtime_kv WHERE scope = 'global' AND scope_id = '' AND key = :key",
84
+ ).get({ ":key": MEMORIES_FTS_REBUILT_KEY });
85
+ if (marker) return;
86
+
87
+ const now = new Date().toISOString();
88
+ try {
89
+ db.exec("BEGIN");
90
+ db.exec("INSERT INTO memories_fts(memories_fts) VALUES('rebuild')");
91
+ db.prepare(
92
+ `INSERT INTO runtime_kv (scope, scope_id, key, value_json, updated_at)
93
+ VALUES ('global', '', :key, :value_json, :updated_at)
94
+ ON CONFLICT (scope, scope_id, key) DO UPDATE SET
95
+ value_json = excluded.value_json,
96
+ updated_at = excluded.updated_at`,
97
+ ).run({
98
+ ":key": MEMORIES_FTS_REBUILT_KEY,
99
+ ":value_json": JSON.stringify(now),
100
+ ":updated_at": now,
101
+ });
102
+ db.exec("COMMIT");
103
+ } catch (err) {
104
+ try {
105
+ db.exec("ROLLBACK");
106
+ } catch {
107
+ // Best effort: leave startup alive and retry the rebuild on next open.
108
+ }
109
+ options.onRebuildFailed?.(`FTS5 rebuild failed: ${(err as Error).message}`);
110
+ }
111
+ }
@@ -2,7 +2,7 @@
2
2
  // File Purpose: Workspace-facing Interface for opening and maintaining the workflow database.
3
3
 
4
4
  import { existsSync } from "node:fs";
5
- import { dirname } from "node:path";
5
+ import { dirname, join } from "node:path";
6
6
 
7
7
  import type { GsdWorkspace, MilestoneScope } from "./workspace.js";
8
8
  import type { DbAdapter } from "./db-adapter.js";
@@ -24,8 +24,8 @@ import {
24
24
  vacuumDatabase,
25
25
  wasDbOpenAttempted,
26
26
  } from "./gsd-db.js";
27
- import { resolveGsdPathContract } from "./paths.js";
28
- import { setLogBasePath } from "./workflow-logger.js";
27
+ import { resolveGsdPathContract, gsdRoot } from "./paths.js";
28
+ import { logWarning, setLogBasePath } from "./workflow-logger.js";
29
29
 
30
30
  export interface WorkflowDatabaseLocation {
31
31
  projectRoot: string;
@@ -56,6 +56,20 @@ export type WorkflowDatabaseOpenResult =
56
56
  export type WorkflowDatabaseStatus = ReturnType<typeof getDbStatus>;
57
57
  export type WorkflowDatabaseProvider = ReturnType<typeof getDbProvider>;
58
58
 
59
+ /**
60
+ * Global SQLite handle invariants:
61
+ *
62
+ * - `openWorkflowDatabase` / `openDatabase` switch the process-global handle consumed by
63
+ * deriveState, dispatch, reconciliation repairs, and domain writers. Only one active
64
+ * project database should own the global handle at a time.
65
+ * - `openWorkflowDatabaseIsolated` opens a caller-owned connection that does not clobber
66
+ * the global handle. Use for read-only observers (parallel monitor) and other background
67
+ * probes that must not disturb the active workflow session.
68
+ * - Reconciliation repairs that write markdown/DB state must use `ensureWorkflowDbForBase`
69
+ * so repairs target the correct project; those paths intentionally re-open the global handle.
70
+ * - Pair ad-hoc project switches with `closeWorkflowDatabase()` or restore via
71
+ * `ensureWorkflowDbForBase(..., { refresh: true })` before returning to derive/dispatch.
72
+ */
59
73
  export function resolveWorkflowDatabaseLocation(basePath: string): WorkflowDatabaseLocation {
60
74
  const contract = resolveGsdPathContract(basePath);
61
75
  return {
@@ -172,6 +186,50 @@ export function refreshWorkflowDatabaseFromDisk(): boolean {
172
186
  return refreshOpenDatabaseFromDisk();
173
187
  }
174
188
 
189
+ export function expectedWorkflowDbPathForBase(basePath: string): string {
190
+ return join(gsdRoot(basePath), "gsd.db");
191
+ }
192
+
193
+ export interface EnsureWorkflowDbOptions {
194
+ /** When true, refresh from disk before reopening if already open on the correct path. */
195
+ refresh?: boolean;
196
+ }
197
+
198
+ export function ensureWorkflowDbAtPath(dbPath: string | null): boolean {
199
+ if (!dbPath || dbPath === ":memory:") return isDbAvailable();
200
+ if (isDbAvailable() && getWorkflowDatabasePath() === dbPath) return true;
201
+ if (!existsSync(dbPath)) return false;
202
+ try {
203
+ return openWorkflowDatabasePath(dbPath);
204
+ } catch (err) {
205
+ logWarning("reconcile", `ensureWorkflowDbAtPath could not reopen DB: ${(err as Error).message}`);
206
+ return false;
207
+ }
208
+ }
209
+
210
+ export function ensureWorkflowDbForBase(
211
+ basePath: string,
212
+ options: EnsureWorkflowDbOptions = {},
213
+ ): boolean {
214
+ const dbPath = expectedWorkflowDbPathForBase(basePath);
215
+ if (!existsSync(dbPath)) return false;
216
+
217
+ try {
218
+ if (options.refresh) {
219
+ if (isDbAvailable() && getWorkflowDatabasePath() === dbPath && refreshWorkflowDatabaseFromDisk()) {
220
+ return true;
221
+ }
222
+ return openWorkflowDatabasePath(dbPath);
223
+ }
224
+
225
+ if (isDbAvailable() && getWorkflowDatabasePath() === dbPath) return true;
226
+ return openWorkflowDatabasePath(dbPath);
227
+ } catch (err) {
228
+ logWarning("reconcile", `ensureWorkflowDbForBase could not reopen DB: ${(err as Error).message}`);
229
+ return false;
230
+ }
231
+ }
232
+
175
233
  export function checkpointWorkflowDatabase(): void {
176
234
  checkpointDatabase();
177
235
  }
@@ -121,7 +121,7 @@ const POLICY: Record<string, DelegationPolicyEntry> = {
121
121
  toolName: "gsd_plan_task",
122
122
  verdict: "no",
123
123
  rationale:
124
- "plan-slice prompt explicitly forbids calling gsd_plan_task separately; per-task granularity multiplies manifest writes and projection re-renders with no payoff.",
124
+ "Incremental task planning mutates the active slice plan and re-renders projections; keep it ordered in the foreground plan-slice unit.",
125
125
  },
126
126
  };
127
127
 
@@ -273,10 +273,10 @@ This config sets a parent workspace with two child repositories. The implicit `p
273
273
  - `audit_unified.enabled`: boolean — dual-write unified audit envelope events. Default: `true`.
274
274
  - `plan_v2.enabled`: boolean — enable bounded clarify/research/draft/compile planning flow. Default: `true`.
275
275
 
276
- - `context_management`: configures context hygiene for auto-mode sessions. Keys:
276
+ - `context_management`: configures context hygiene for auto-mode sessions. In step mode, the configurable threshold is a soft warning; automatic session re-rooting happens only at the fixed 90% hard context boundary. Keys:
277
277
  - `observation_masking`: boolean — mask old tool results to reduce context bloat. Default: `true`.
278
278
  - `observation_mask_turns`: number — keep this many recent turns verbatim (1-50). Default: `8`.
279
- - `compaction_threshold_percent`: number — trigger compaction at this % of context window (0.5-0.95). Lower values fire compaction earlier, reducing drift. Default: `0.60`.
279
+ - `compaction_threshold_percent`: number — show a soft context warning at this fraction of the context window (0.5-0.95). Lower values warn earlier so operators can compact manually before drift accumulates. Default: `0.60`.
280
280
  - `tool_result_max_chars`: number — max chars per tool result in GSD sessions (200-10000). Default: `800`.
281
281
 
282
282
  - `auto_visualize`: boolean — show a visualizer hint after each milestone completion in auto-mode. Default: `false`.
@@ -1,14 +1,148 @@
1
- import { existsSync, statSync } from "node:fs";
2
- import { join } from "node:path";
1
+ import { existsSync, readFileSync, statSync } from "node:fs";
2
+ import { isAbsolute, join, relative } from "node:path";
3
3
 
4
4
  import type { DoctorIssue } from "./doctor-types.js";
5
- import { isDbAvailable, _getAdapter } from "./gsd-db.js";
5
+ import {
6
+ getAllMilestones,
7
+ getMilestoneSlices,
8
+ getSliceTasks,
9
+ isDbAvailable,
10
+ isMemoriesFtsAvailable,
11
+ _getAdapter,
12
+ } from "./gsd-db.js";
13
+ import { MEMORIES_FTS_REBUILT_KEY } from "./db-memory-fts-schema.js";
6
14
  import { isAfter, latestExplicitReopenAt } from "./milestone-reopen-events.js";
7
- import { resolveGsdPathContract, resolveMilestoneFile } from "./paths.js";
15
+ import { gsdProjectionRoot, gsdRoot, resolveGsdPathContract, resolveMilestoneFile, resolveSliceFile } from "./paths.js";
8
16
  import { deriveState } from "./state.js";
17
+ import { isClosedStatus } from "./status-guards.js";
9
18
  import { workflowEventLogPath } from "./workflow-event-ledger.js";
10
19
  import { readEvents } from "./workflow-events.js";
11
20
  import { flushWorkflowProjections } from "./projection-flush.js";
21
+ import { parseRoadmapSlices } from "./roadmap-slices.js";
22
+ import { parsePlan } from "./parsers-legacy.js";
23
+
24
+ function relativeFile(basePath: string, filePath: string): string {
25
+ return relative(basePath, filePath).split("\\").join("/");
26
+ }
27
+
28
+ function reportCheckboxDbStatusDivergence(
29
+ issues: DoctorIssue[],
30
+ basePath: string,
31
+ filePath: string,
32
+ scope: "slice" | "task",
33
+ unitId: string,
34
+ status: string,
35
+ checkboxDone: boolean,
36
+ ): void {
37
+ const dbDone = isClosedStatus(status);
38
+ if (checkboxDone === dbDone) return;
39
+
40
+ issues.push({
41
+ severity: "error",
42
+ code: "checkbox_db_status_divergence",
43
+ scope,
44
+ unitId,
45
+ message: `${scope === "slice" ? "Slice" : "Task"} ${unitId} is ${dbDone ? "closed" : "open"} in the database (status: ${status}) but the markdown checkbox is ${checkboxDone ? "checked" : "unchecked"}.`,
46
+ file: relativeFile(basePath, filePath),
47
+ fixable: false,
48
+ });
49
+ }
50
+
51
+ function checkProjectionCheckboxDbStatus(basePath: string, milestoneIds: string[], issues: DoctorIssue[]): void {
52
+ for (const milestoneId of milestoneIds) {
53
+ const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
54
+ const slices = getMilestoneSlices(milestoneId);
55
+
56
+ if (roadmapPath && existsSync(roadmapPath)) {
57
+ try {
58
+ const roadmap = readFileSync(roadmapPath, "utf-8");
59
+ const sliceDoneById = new Map(parseRoadmapSlices(roadmap).map((entry) => [entry.id, entry.done]));
60
+ for (const slice of slices) {
61
+ const checkboxDone = sliceDoneById.get(slice.id);
62
+ if (checkboxDone === undefined) continue;
63
+ reportCheckboxDbStatusDivergence(
64
+ issues,
65
+ basePath,
66
+ roadmapPath,
67
+ "slice",
68
+ `${milestoneId}/${slice.id}`,
69
+ slice.status,
70
+ checkboxDone,
71
+ );
72
+ }
73
+ } catch {
74
+ // Non-fatal — checkbox drift diagnostics must never block doctor.
75
+ }
76
+ }
77
+
78
+ for (const slice of slices) {
79
+ const planPath = resolveSliceFile(basePath, milestoneId, slice.id, "PLAN");
80
+ if (!planPath || !existsSync(planPath)) continue;
81
+ try {
82
+ const plan = readFileSync(planPath, "utf-8");
83
+ // parsePlan reads the authoritative task checkboxes (the flat-phase
84
+ // <tasks> block / ## Tasks section), so a stray task-style checkbox
85
+ // line elsewhere in PLAN.md (e.g. a Must-Haves or Verification bullet
86
+ // above <tasks>) can no longer hide real drift or fake a divergence.
87
+ const taskDoneById = new Map(parsePlan(plan).tasks.map((entry) => [entry.id, entry.done]));
88
+ for (const task of getSliceTasks(milestoneId, slice.id)) {
89
+ const checkboxDone = taskDoneById.get(task.id);
90
+ if (checkboxDone === undefined) continue;
91
+ reportCheckboxDbStatusDivergence(
92
+ issues,
93
+ basePath,
94
+ planPath,
95
+ "task",
96
+ `${milestoneId}/${slice.id}/${task.id}`,
97
+ task.status,
98
+ checkboxDone,
99
+ );
100
+ }
101
+ } catch {
102
+ // Non-fatal — checkbox drift diagnostics must never block doctor.
103
+ }
104
+ }
105
+ }
106
+ }
107
+
108
+ function isClearedByMilestoneShellProjectionFlush(
109
+ basePath: string,
110
+ issue: DoctorIssue,
111
+ reRenderedMilestoneIds: Set<string>,
112
+ ): boolean {
113
+ if (issue.code !== "checkbox_db_status_divergence") return false;
114
+ if (issue.scope !== "slice") return false;
115
+
116
+ const milestoneId = issue.unitId.split("/")[0] ?? "";
117
+ if (!reRenderedMilestoneIds.has(milestoneId)) return false;
118
+
119
+ const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
120
+ if (!roadmapPath || !issue.file) return false;
121
+
122
+ return issue.file === relativeFile(basePath, roadmapPath);
123
+ }
124
+
125
+ function artifactExistsOnDisk(basePath: string, artifactPath: string): boolean {
126
+ if (isAbsolute(artifactPath)) return existsSync(artifactPath);
127
+ return [
128
+ join(gsdProjectionRoot(basePath), artifactPath),
129
+ join(gsdRoot(basePath), artifactPath),
130
+ ].some((candidate) => existsSync(candidate));
131
+ }
132
+
133
+ function artifactUnitId(row: { milestone_id: string | null; slice_id: string | null; task_id: string | null }): string {
134
+ if (!row.milestone_id) return "project";
135
+ if (row.slice_id && row.task_id) return `${row.milestone_id}/${row.slice_id}/${row.task_id}`;
136
+ if (row.slice_id) return `${row.milestone_id}/${row.slice_id}`;
137
+ return row.milestone_id;
138
+ }
139
+
140
+ function artifactScope(row: { milestone_id: string | null; slice_id: string | null; task_id: string | null }): DoctorIssue["scope"] {
141
+ if (row.task_id) return "task";
142
+ if (row.slice_id) return "slice";
143
+ if (row.milestone_id) return "milestone";
144
+ return "project";
145
+ }
12
146
 
13
147
  export async function checkEngineHealth(
14
148
  basePath: string,
@@ -34,6 +168,32 @@ export async function checkEngineHealth(
34
168
  if (isDbAvailable()) {
35
169
  const adapter = _getAdapter()!;
36
170
 
171
+ try {
172
+ if (isMemoriesFtsAvailable(adapter)) {
173
+ const runtimeKv = adapter
174
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='runtime_kv'")
175
+ .get();
176
+ const marker = runtimeKv
177
+ ? adapter.prepare(
178
+ "SELECT 1 as present FROM runtime_kv WHERE scope = 'global' AND scope_id = '' AND key = :key",
179
+ ).get({ ":key": MEMORIES_FTS_REBUILT_KEY })
180
+ : undefined;
181
+ if (!marker) {
182
+ issues.push({
183
+ severity: "warning",
184
+ code: "memories_fts_rebuild_missing",
185
+ scope: "project",
186
+ unitId: "project",
187
+ message: `Memory full-text index exists but runtime_kv has no ${MEMORIES_FTS_REBUILT_KEY} marker. The index may be stale or incomplete, so memory search can silently degrade to the LIKE fallback.`,
188
+ file: ".gsd/gsd.db",
189
+ fixable: false,
190
+ });
191
+ }
192
+ }
193
+ } catch {
194
+ // Non-fatal — memory FTS health check failed
195
+ }
196
+
37
197
  // a. Orphaned tasks (task.slice_id points to non-existent slice)
38
198
  try {
39
199
  const orphanedTasks = adapter
@@ -196,7 +356,41 @@ export async function checkEngineHealth(
196
356
  // Non-fatal — completed-milestone reopen check failed
197
357
  }
198
358
 
199
- // f. Completion artifacts disagree with open DB hierarchy rows.
359
+ // f. Artifact rows reference files that no longer exist on disk.
360
+ try {
361
+ const artifactRows = adapter
362
+ .prepare(
363
+ `SELECT path, artifact_type, milestone_id, slice_id, task_id
364
+ FROM artifacts
365
+ WHERE path != ''
366
+ ORDER BY path`,
367
+ )
368
+ .all() as Array<{
369
+ path: string;
370
+ artifact_type: string;
371
+ milestone_id: string | null;
372
+ slice_id: string | null;
373
+ task_id: string | null;
374
+ }>;
375
+
376
+ for (const row of artifactRows) {
377
+ if (artifactExistsOnDisk(basePath, row.path)) continue;
378
+ const unitId = artifactUnitId(row);
379
+ issues.push({
380
+ severity: "error",
381
+ code: "artifact_file_missing",
382
+ scope: artifactScope(row),
383
+ unitId,
384
+ message: `Artifact ${row.path} is recorded in the database as ${row.artifact_type || "UNKNOWN"} but no matching file exists on disk`,
385
+ file: row.path,
386
+ fixable: false,
387
+ });
388
+ }
389
+ } catch {
390
+ // Non-fatal — artifact file existence check failed
391
+ }
392
+
393
+ // g. Completion artifacts disagree with open DB hierarchy rows.
200
394
  try {
201
395
  const rows = adapter
202
396
  .prepare(
@@ -225,6 +419,7 @@ export async function checkEngineHealth(
225
419
 
226
420
  const seen = new Set<string>();
227
421
  for (const row of rows) {
422
+ if (!artifactExistsOnDisk(basePath, row.path)) continue;
228
423
  const reopenAt = latestExplicitReopenAt(basePath, row.milestone_id);
229
424
  if (!isAfter(row.imported_at, reopenAt)) continue;
230
425
  const isSliceSummary = row.slice_id && !row.task_id && row.slice_status && !["complete", "done", "skipped", "closed"].includes(row.slice_status);
@@ -256,9 +451,24 @@ export async function checkEngineHealth(
256
451
  // Non-fatal — DB constraint checks failed entirely
257
452
  }
258
453
 
454
+ // Checkbox-vs-DB divergence detection runs before projection drift auto-fix
455
+ // so stale re-renders cannot overwrite manually edited markdown first. Runs
456
+ // inside its own try/catch: getAllMilestones / getMilestoneSlices /
457
+ // getSliceTasks issue prepared queries that can throw on a corrupt or locked
458
+ // DB, and like every other DB-touching check here this diagnostic must never
459
+ // block doctor.
460
+ try {
461
+ if (isDbAvailable()) {
462
+ checkProjectionCheckboxDbStatus(basePath, getAllMilestones().map((milestone) => milestone.id), issues);
463
+ }
464
+ } catch {
465
+ // Non-fatal: checkbox-vs-DB divergence check must never block doctor
466
+ }
467
+
259
468
  // ── Projection drift detection ──────────────────────────────────────────
260
469
  // If the DB is available, check whether markdown projections are stale
261
470
  // relative to the event log and re-render them.
471
+ const reRenderedMilestoneIds: string[] = [];
262
472
  try {
263
473
  if (isDbAvailable()) {
264
474
  const eventLogPath = workflowEventLogPath(basePath);
@@ -273,6 +483,7 @@ export async function checkEngineHealth(
273
483
  try {
274
484
  await flushWorkflowProjections(basePath, { milestoneId: milestone.id });
275
485
  fixesApplied.push(`re-rendered missing projections for ${milestone.id}`);
486
+ reRenderedMilestoneIds.push(milestone.id);
276
487
  } catch {
277
488
  // Non-fatal — projection re-render failed
278
489
  }
@@ -283,6 +494,7 @@ export async function checkEngineHealth(
283
494
  try {
284
495
  await flushWorkflowProjections(basePath, { milestoneId: milestone.id });
285
496
  fixesApplied.push(`re-rendered stale projections for ${milestone.id}`);
497
+ reRenderedMilestoneIds.push(milestone.id);
286
498
  } catch {
287
499
  // Non-fatal — projection re-render failed
288
500
  }
@@ -293,4 +505,20 @@ export async function checkEngineHealth(
293
505
  } catch {
294
506
  // Non-fatal — projection drift check must never block doctor
295
507
  }
508
+
509
+ if (reRenderedMilestoneIds.length > 0) {
510
+ const reRendered = new Set(reRenderedMilestoneIds);
511
+ for (let i = issues.length - 1; i >= 0; i--) {
512
+ const issue = issues[i]!;
513
+ // flushWorkflowProjections re-renders milestone shell projections (not
514
+ // slice PLAN.md files), so only clear stale ROADMAP checkbox diagnostics.
515
+ if (isClearedByMilestoneShellProjectionFlush(basePath, issue, reRendered)) {
516
+ issues.splice(i, 1);
517
+ continue;
518
+ }
519
+ if (issue.code === "artifact_file_missing" && issue.file && artifactExistsOnDisk(basePath, issue.file)) {
520
+ issues.splice(i, 1);
521
+ }
522
+ }
523
+ }
296
524
  }