@opengsd/gsd-pi 1.9.0 → 1.10.0-dev.a5e42e99

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/README.md +10 -9
  2. package/dist/headless.js +2 -1
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/GSD-WORKFLOW.md +2 -2
  5. package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
  6. package/dist/resources/extensions/gsd/auto/loop.js +24 -4
  7. package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
  8. package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
  9. package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -8
  10. package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
  11. package/dist/resources/extensions/gsd/auto-model-selection.js +1 -0
  12. package/dist/resources/extensions/gsd/auto-prompts.js +102 -21
  13. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  14. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
  15. package/dist/resources/extensions/gsd/auto-start.js +30 -10
  16. package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
  17. package/dist/resources/extensions/gsd/auto-verification.js +25 -12
  18. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
  19. package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
  20. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
  21. package/dist/resources/extensions/gsd/auto.js +15 -5
  22. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -0
  23. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
  24. package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
  25. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +7 -26
  26. package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
  27. package/dist/resources/extensions/gsd/compat/compat-marker.js +80 -5
  28. package/dist/resources/extensions/gsd/constants.js +12 -13
  29. package/dist/resources/extensions/gsd/context-masker.js +97 -21
  30. package/dist/resources/extensions/gsd/db/engine.js +5 -2
  31. package/dist/resources/extensions/gsd/docs/preferences-reference.md +33 -2
  32. package/dist/resources/extensions/gsd/doctor-engine-checks.js +40 -12
  33. package/dist/resources/extensions/gsd/error-classifier.js +12 -2
  34. package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
  35. package/dist/resources/extensions/gsd/flat-phase-migration.js +12 -0
  36. package/dist/resources/extensions/gsd/git-service.js +19 -7
  37. package/dist/resources/extensions/gsd/gsd-db.js +75 -31
  38. package/dist/resources/extensions/gsd/guided-flow.js +11 -5
  39. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -21
  40. package/dist/resources/extensions/gsd/md-importer.js +5 -6
  41. package/dist/resources/extensions/gsd/model-cost-table.js +6 -1
  42. package/dist/resources/extensions/gsd/model-router.js +16 -0
  43. package/dist/resources/extensions/gsd/paths.js +66 -15
  44. package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
  45. package/dist/resources/extensions/gsd/planning-subagent-registry.js +33 -0
  46. package/dist/resources/extensions/gsd/preferences-models.js +50 -10
  47. package/dist/resources/extensions/gsd/preferences-types.js +6 -0
  48. package/dist/resources/extensions/gsd/preferences-validation.js +86 -4
  49. package/dist/resources/extensions/gsd/preferences.js +24 -0
  50. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
  51. package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
  52. package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
  53. package/dist/resources/extensions/gsd/skill-activation.js +17 -3
  54. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +98 -2
  55. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +4 -1
  56. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
  57. package/dist/resources/extensions/gsd/stop-notice.js +9 -0
  58. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +8 -0
  59. package/dist/resources/extensions/gsd/tools/complete-task.js +12 -5
  60. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -1
  61. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
  62. package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
  63. package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
  64. package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
  65. package/dist/resources/extensions/gsd/verification-evidence.js +5 -3
  66. package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
  67. package/dist/resources/extensions/gsd/workspace.js +2 -1
  68. package/dist/resources/extensions/gsd/worktree-state-projection.js +20 -18
  69. package/dist/resources/extensions/ollama/ollama-chat-provider.js +2 -2
  70. package/dist/resources/extensions/shared/interview-ui.js +43 -6
  71. package/dist/resources/extensions/subagent/index.js +1 -1
  72. package/dist/startup-model-validation.d.ts +1 -1
  73. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  74. package/dist/web/standalone/.next/BUILD_ID +1 -1
  75. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  76. package/dist/web/standalone/.next/build-manifest.json +3 -3
  77. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  78. package/dist/web/standalone/.next/required-server-files.json +3 -3
  79. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  80. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  90. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  93. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  118. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  140. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  150. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  176. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/index.html +1 -1
  186. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  187. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  188. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  189. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  191. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  192. package/dist/web/standalone/.next/server/app/page.js +2 -2
  193. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  195. package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
  196. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  197. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  198. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  199. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/middleware.js +3 -3
  201. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  202. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  203. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  204. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  206. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  207. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  209. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  210. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  211. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  212. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  213. package/dist/web/standalone/server.js +1 -1
  214. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  215. package/integrations/hermes/pyproject.toml +1 -1
  216. package/package.json +8 -6
  217. package/packages/cloud-mcp-gateway/package.json +2 -2
  218. package/packages/contracts/dist/rpc.d.ts +1 -1
  219. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  220. package/packages/contracts/dist/rpc.js +1 -1
  221. package/packages/contracts/dist/rpc.js.map +1 -1
  222. package/packages/contracts/dist/rpc.test.js +1 -1
  223. package/packages/contracts/dist/rpc.test.js.map +1 -1
  224. package/packages/contracts/package.json +1 -1
  225. package/packages/daemon/package.json +4 -4
  226. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  227. package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
  228. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  229. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  230. package/packages/gsd-agent-core/dist/sdk.js +1 -0
  231. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  232. package/packages/gsd-agent-core/package.json +5 -5
  233. package/packages/gsd-agent-modes/dist/cli/args.js +2 -2
  234. package/packages/gsd-agent-modes/dist/cli/args.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +1 -0
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js +1 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +1 -0
  243. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  244. package/packages/gsd-agent-modes/package.json +7 -7
  245. package/packages/gsd-cloud/README.md +21 -5
  246. package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
  247. package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
  248. package/packages/gsd-cloud/dist/background-cli.test.js +325 -0
  249. package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
  250. package/packages/gsd-cloud/dist/cli.d.ts.map +1 -1
  251. package/packages/gsd-cloud/dist/cli.js +146 -16
  252. package/packages/gsd-cloud/dist/cli.js.map +1 -1
  253. package/packages/gsd-cloud/dist/cloud-config.d.ts +1 -1
  254. package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -1
  255. package/packages/gsd-cloud/dist/cloud-config.js +7 -1
  256. package/packages/gsd-cloud/dist/cloud-config.js.map +1 -1
  257. package/packages/gsd-cloud/dist/cloud-runtime.d.ts +7 -4
  258. package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -1
  259. package/packages/gsd-cloud/dist/cloud-runtime.js +115 -31
  260. package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -1
  261. package/packages/gsd-cloud/dist/cloud-runtime.test.js +224 -59
  262. package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -1
  263. package/packages/gsd-cloud/dist/runtime-artifacts.d.ts +3 -0
  264. package/packages/gsd-cloud/dist/runtime-artifacts.d.ts.map +1 -0
  265. package/packages/gsd-cloud/dist/runtime-artifacts.js +36 -0
  266. package/packages/gsd-cloud/dist/runtime-artifacts.js.map +1 -0
  267. package/packages/gsd-cloud/dist/runtime-process.d.ts +32 -0
  268. package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
  269. package/packages/gsd-cloud/dist/runtime-process.js +640 -0
  270. package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
  271. package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
  272. package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
  273. package/packages/gsd-cloud/dist/runtime-process.test.js +543 -0
  274. package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
  275. package/packages/gsd-cloud/dist/runtime-telemetry.d.ts +117 -0
  276. package/packages/gsd-cloud/dist/runtime-telemetry.d.ts.map +1 -0
  277. package/packages/gsd-cloud/dist/runtime-telemetry.js +291 -0
  278. package/packages/gsd-cloud/dist/runtime-telemetry.js.map +1 -0
  279. package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts +2 -0
  280. package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts.map +1 -0
  281. package/packages/gsd-cloud/dist/runtime-telemetry.test.js +434 -0
  282. package/packages/gsd-cloud/dist/runtime-telemetry.test.js.map +1 -0
  283. package/packages/gsd-cloud/package.json +2 -2
  284. package/packages/mcp-server/README.md +7 -2
  285. package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
  286. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
  287. package/packages/mcp-server/dist/cli-runner.js +119 -33
  288. package/packages/mcp-server/dist/cli-runner.js.map +1 -1
  289. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  290. package/packages/mcp-server/dist/server.js +5 -5
  291. package/packages/mcp-server/dist/server.js.map +1 -1
  292. package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
  293. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  294. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  295. package/packages/mcp-server/package.json +4 -4
  296. package/packages/native/package.json +1 -1
  297. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  298. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  299. package/packages/pi-agent-core/dist/agent.js +2 -0
  300. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  301. package/packages/pi-agent-core/dist/types.d.ts +2 -2
  302. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  303. package/packages/pi-agent-core/dist/types.js.map +1 -1
  304. package/packages/pi-agent-core/package.json +1 -1
  305. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/models.generated.d.ts +187 -0
  307. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  308. package/packages/pi-ai/dist/models.generated.js +145 -0
  309. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  310. package/packages/pi-ai/dist/models.js +18 -6
  311. package/packages/pi-ai/dist/models.js.map +1 -1
  312. package/packages/pi-ai/dist/providers/amazon-bedrock.js +3 -2
  313. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  314. package/packages/pi-ai/dist/providers/anthropic.js +6 -1
  315. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts +1 -1
  317. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  319. package/packages/pi-ai/dist/providers/google-vertex.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/google.js.map +1 -1
  321. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts +1 -1
  322. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  323. package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
  324. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  325. package/packages/pi-ai/dist/providers/openai-completions.d.ts +1 -1
  326. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  327. package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
  328. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  329. package/packages/pi-ai/dist/providers/openai-responses.d.ts +1 -1
  330. package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  331. package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
  332. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  333. package/packages/pi-ai/dist/providers/simple-options.d.ts +1 -1
  334. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  335. package/packages/pi-ai/dist/providers/simple-options.js +1 -1
  336. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  337. package/packages/pi-ai/dist/types.d.ts +9 -1
  338. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  339. package/packages/pi-ai/dist/types.js.map +1 -1
  340. package/packages/pi-ai/package.json +1 -1
  341. package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
  342. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -0
  345. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/core/model-resolver.js +2 -2
  347. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +14 -4
  349. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  351. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/core/skills.d.ts +5 -0
  353. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/core/skills.js +54 -0
  355. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/theme/theme.d.ts +1 -1
  357. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/theme/theme.js +1 -0
  359. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  360. package/packages/pi-coding-agent/package.json +7 -7
  361. package/packages/pi-tui/package.json +2 -2
  362. package/packages/rpc-client/package.json +2 -2
  363. package/pkg/dist/theme/theme.d.ts +1 -1
  364. package/pkg/dist/theme/theme.d.ts.map +1 -1
  365. package/pkg/dist/theme/theme.js +1 -0
  366. package/pkg/dist/theme/theme.js.map +1 -1
  367. package/pkg/package.json +1 -1
  368. package/src/resources/GSD-WORKFLOW.md +2 -2
  369. package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
  370. package/src/resources/extensions/gsd/auto/loop.ts +48 -4
  371. package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
  372. package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
  373. package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -7
  374. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
  375. package/src/resources/extensions/gsd/auto-model-selection.ts +1 -0
  376. package/src/resources/extensions/gsd/auto-prompts.ts +118 -19
  377. package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
  378. package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
  379. package/src/resources/extensions/gsd/auto-start.ts +32 -9
  380. package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
  381. package/src/resources/extensions/gsd/auto-verification.ts +46 -12
  382. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
  383. package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
  384. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
  385. package/src/resources/extensions/gsd/auto.ts +20 -7
  386. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1 -0
  387. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
  388. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
  389. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +10 -31
  390. package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
  391. package/src/resources/extensions/gsd/compat/compat-marker.ts +99 -5
  392. package/src/resources/extensions/gsd/constants.ts +14 -13
  393. package/src/resources/extensions/gsd/context-masker.ts +98 -2
  394. package/src/resources/extensions/gsd/db/engine.ts +5 -2
  395. package/src/resources/extensions/gsd/docs/preferences-reference.md +33 -2
  396. package/src/resources/extensions/gsd/doctor-engine-checks.ts +45 -11
  397. package/src/resources/extensions/gsd/error-classifier.ts +13 -2
  398. package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
  399. package/src/resources/extensions/gsd/flat-phase-migration.ts +14 -0
  400. package/src/resources/extensions/gsd/git-service.ts +19 -6
  401. package/src/resources/extensions/gsd/gsd-db.ts +85 -33
  402. package/src/resources/extensions/gsd/guided-flow.ts +11 -4
  403. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -23
  404. package/src/resources/extensions/gsd/md-importer.ts +5 -5
  405. package/src/resources/extensions/gsd/model-cost-table.ts +14 -1
  406. package/src/resources/extensions/gsd/model-router.ts +17 -0
  407. package/src/resources/extensions/gsd/paths.ts +73 -15
  408. package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
  409. package/src/resources/extensions/gsd/planning-subagent-registry.ts +45 -0
  410. package/src/resources/extensions/gsd/preferences-models.ts +54 -10
  411. package/src/resources/extensions/gsd/preferences-types.ts +26 -2
  412. package/src/resources/extensions/gsd/preferences-validation.ts +108 -3
  413. package/src/resources/extensions/gsd/preferences.ts +38 -0
  414. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
  415. package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
  416. package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
  417. package/src/resources/extensions/gsd/skill-activation.ts +17 -3
  418. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +132 -2
  419. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +4 -1
  420. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
  421. package/src/resources/extensions/gsd/stop-notice.ts +11 -0
  422. package/src/resources/extensions/gsd/templates/PREFERENCES.md +8 -0
  423. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
  424. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
  425. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
  426. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
  427. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
  428. package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
  429. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
  430. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +25 -0
  431. package/src/resources/extensions/gsd/tests/complete-task.test.ts +76 -1
  432. package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
  433. package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
  434. package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
  435. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
  436. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
  437. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +147 -0
  438. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
  439. package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
  440. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +8 -9
  441. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
  442. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +32 -0
  443. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
  444. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
  445. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
  446. package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
  447. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
  448. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +23 -0
  449. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +55 -0
  450. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  451. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
  452. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +24 -0
  453. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +38 -1
  454. package/src/resources/extensions/gsd/tests/preferences.test.ts +151 -0
  455. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +7 -0
  456. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
  457. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
  458. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
  459. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
  460. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  461. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
  462. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
  463. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
  464. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +21 -1
  465. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
  466. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
  467. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  468. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
  469. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
  470. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +39 -0
  471. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
  472. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +12 -0
  473. package/src/resources/extensions/gsd/tests/workflow-authority-faults.test.ts +238 -0
  474. package/src/resources/extensions/gsd/tests/workflow-authority-fixture.test.ts +48 -0
  475. package/src/resources/extensions/gsd/tests/workflow-authority-fixture.ts +141 -0
  476. package/src/resources/extensions/gsd/tests/workflow-authority-projection-conflict.test.ts +177 -0
  477. package/src/resources/extensions/gsd/tests/workflow-fault-harness.test.ts +39 -0
  478. package/src/resources/extensions/gsd/tests/workflow-fault-harness.ts +72 -0
  479. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
  480. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +2 -2
  481. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
  482. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +74 -0
  483. package/src/resources/extensions/gsd/tools/complete-task.ts +20 -5
  484. package/src/resources/extensions/gsd/tools/plan-slice.ts +5 -1
  485. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
  486. package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
  487. package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
  488. package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
  489. package/src/resources/extensions/gsd/verification-evidence.ts +5 -2
  490. package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
  491. package/src/resources/extensions/gsd/workspace.ts +2 -1
  492. package/src/resources/extensions/gsd/worktree-state-projection.ts +21 -24
  493. package/src/resources/extensions/ollama/ollama-chat-provider.ts +2 -2
  494. package/src/resources/extensions/ollama/tests/ollama-chat-provider-think.test.ts +4 -0
  495. package/src/resources/extensions/shared/interview-ui.ts +47 -8
  496. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -0
  497. package/src/resources/extensions/subagent/index.ts +1 -1
  498. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  499. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  500. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  501. /package/dist/web/standalone/.next/static/{BE5XoklToI6lZjRzpXih8 → xwUaOqui04jIIFVsIBLiL}/_buildManifest.js +0 -0
  502. /package/dist/web/standalone/.next/static/{BE5XoklToI6lZjRzpXih8 → xwUaOqui04jIIFVsIBLiL}/_ssgManifest.js +0 -0
@@ -15,7 +15,7 @@ import { isClosedStatus } from "../status-guards.js";
15
15
  import { transaction, insertMilestone, insertSlice, insertTask, insertVerificationEvidence, getMilestone, getSlice, getTask, updateTaskStatus, deleteVerificationEvidence, saveGateResult, getPendingGatesForTurn, getUnresolvedBlockingReworkFindingsForTask, getBlockingReworkFindingsForTask, applyReworkResolutions, } from "../gsd-db.js";
16
16
  import { getWorkflowDatabasePath, ensureWorkflowDbAtPath } from "../db-workspace.js";
17
17
  import { getGatesForTurn } from "../gate-registry.js";
18
- import { gsdProjectionRoot, clearPathCache, resolveMilestonePath, resolveSlicePath } from "../paths.js";
18
+ import { buildFlatTaskFileName, buildTaskFileName, gsdProjectionRoot, clearPathCache, legacyMilestonesDir, resolveMilestonePath, resolveSlicePath, } from "../paths.js";
19
19
  import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
20
20
  import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
21
21
  import { saveFile, clearParseCache } from "../files.js";
@@ -34,13 +34,20 @@ function taskSummaryPath(basePath, milestoneId, sliceId, taskId) {
34
34
  // a legacy layout and breaks all subsequent path resolution for the session.
35
35
  const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
36
36
  const phaseDir = resolveMilestonePath(basePath, milestoneId);
37
- if (slicePath && phaseDir && slicePath !== phaseDir) {
38
- // Legacy layout: the slice has its own slices/SID/ subdir → tasks/ subdir
39
- return join(slicePath, "tasks", `${taskId}-SUMMARY.md`);
37
+ const legacyBase = legacyMilestonesDir(basePath);
38
+ const isLegacy = phaseDir
39
+ ? phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\")
40
+ : false;
41
+ if (isLegacy && phaseDir) {
42
+ // Legacy layout: the slice has its own slices/SID/ subdir → tasks/ subdir.
43
+ const legacySlicePath = slicePath && slicePath !== phaseDir
44
+ ? slicePath
45
+ : join(phaseDir, "slices", sliceId);
46
+ return join(legacySlicePath, "tasks", buildTaskFileName(taskId, "SUMMARY"));
40
47
  }
41
48
  if (phaseDir) {
42
49
  // Flat-phase: task summaries go in the phase dir (no tasks/ subdir)
43
- return join(phaseDir, `${taskId}-SUMMARY.md`);
50
+ return join(phaseDir, buildFlatTaskFileName(sliceId, taskId, "SUMMARY"));
44
51
  }
45
52
  // Fallback: legacy hardcoded path (milestone/slice dir not on disk yet)
46
53
  return join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId, "tasks", `${taskId}-SUMMARY.md`);
@@ -6,7 +6,7 @@ import { isNonEmptyString, validateStringArray } from "../validation.js";
6
6
  import { getGateIdsForTurn } from "../gate-registry.js";
7
7
  import { transaction, getMilestone, getSlice, getSliceTasks, insertTask, upsertSlicePlanning, upsertTaskPlanning, insertGateRow, updateSliceStatus, setSliceSketchFlag, deleteTask, deleteArtifactByPath, } from "../gsd-db.js";
8
8
  import { invalidateStateCache } from "../state.js";
9
- import { renderPlanFromDb } from "../markdown-renderer.js";
9
+ import { renderPlanCheckboxes, renderPlanFromDb } from "../markdown-renderer.js";
10
10
  import { writeManifest } from "../workflow-manifest.js";
11
11
  import { appendEvent } from "../workflow-events.js";
12
12
  import { logWarning } from "../workflow-logger.js";
@@ -371,9 +371,13 @@ export async function handlePlanSlice(rawParams, basePath) {
371
371
  deleteArtifactByPath(artifactPath);
372
372
  }
373
373
  const sliceTasks = getSliceTasks(params.milestoneId, params.sliceId);
374
+ const hasClosedTasks = sliceTasks.some((task) => isClosedStatus(task.status));
374
375
  const renderResult = sliceTasks.length === 0
375
376
  ? { planPath: "", taskPlanPaths: [] }
376
377
  : await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
378
+ if (sliceTasks.length > 0 && hasClosedTasks) {
379
+ await renderPlanCheckboxes(basePath, params.milestoneId, params.sliceId);
380
+ }
377
381
  if (sliceTasks.length > 0) {
378
382
  setSliceSketchFlag(params.milestoneId, params.sliceId, false);
379
383
  }
@@ -16,7 +16,7 @@ import { logWarning } from "../workflow-logger.js";
16
16
  import { debugLog } from "../debug-logger.js";
17
17
  import { existsSync, unlinkSync } from "node:fs";
18
18
  import { join } from "node:path";
19
- import { resolveMilestonePath, resolveSlicePath, resolveTasksDir, clearPathCache } from "../paths.js";
19
+ import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveSlicePath, resolveTasksDir, clearPathCache, } from "../paths.js";
20
20
  export async function handleReopenMilestone(params, basePath) {
21
21
  // ── Validate required fields ────────────────────────────────────────────
22
22
  if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
@@ -41,6 +41,8 @@ export async function handleReopenMilestone(params, basePath) {
41
41
  // auto-corrects entities back to "complete", making reopen a no-op (#3161).
42
42
  try {
43
43
  const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
44
+ const legacyBase = legacyMilestonesDir(basePath);
45
+ const isLegacy = !!milestoneDir && (milestoneDir.startsWith(legacyBase + "/") || milestoneDir.startsWith(legacyBase + "\\"));
44
46
  if (milestoneDir) {
45
47
  const milestoneSummary = join(milestoneDir, `${params.milestoneId}-SUMMARY.md`);
46
48
  if (existsSync(milestoneSummary))
@@ -58,10 +60,17 @@ export async function handleReopenMilestone(params, basePath) {
58
60
  unlinkSync(sliceUat);
59
61
  }
60
62
  const tasksDir = resolveTasksDir(basePath, params.milestoneId, slice.id);
61
- if (tasksDir) {
62
- const tasks = getSliceTasks(params.milestoneId, slice.id);
63
- for (const task of tasks) {
64
- const taskSummary = join(tasksDir, `${task.id}-SUMMARY.md`);
63
+ const tasks = getSliceTasks(params.milestoneId, slice.id);
64
+ for (const task of tasks) {
65
+ const taskSummaries = isLegacy
66
+ ? (tasksDir ? [join(tasksDir, buildTaskFileName(task.id, "SUMMARY"))] : [])
67
+ : milestoneDir
68
+ ? [
69
+ join(milestoneDir, buildFlatTaskFileName(slice.id, task.id, "SUMMARY")),
70
+ join(milestoneDir, buildTaskFileName(task.id, "SUMMARY")),
71
+ ]
72
+ : [];
73
+ for (const taskSummary of taskSummaries) {
65
74
  if (existsSync(taskSummary))
66
75
  unlinkSync(taskSummary);
67
76
  }
@@ -22,7 +22,7 @@ import { appendEvent } from "../workflow-events.js";
22
22
  import { logWarning } from "../workflow-logger.js";
23
23
  import { existsSync, unlinkSync } from "node:fs";
24
24
  import { join } from "node:path";
25
- import { resolveTasksDir, resolveSlicePath, clearPathCache } from "../paths.js";
25
+ import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveTasksDir, resolveSlicePath, clearPathCache, } from "../paths.js";
26
26
  export async function handleReopenSlice(params, basePath) {
27
27
  // ── Validate required fields ────────────────────────────────────────────
28
28
  if (!params.sliceId || typeof params.sliceId !== "string" || params.sliceId.trim() === "") {
@@ -52,11 +52,21 @@ export async function handleReopenSlice(params, basePath) {
52
52
  // Without this, the DB-filesystem reconciler sees SUMMARY.md files and
53
53
  // auto-corrects tasks back to "complete", making reopen a no-op (#3161).
54
54
  try {
55
+ const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
56
+ const legacyBase = legacyMilestonesDir(basePath);
57
+ const isLegacy = !!milestoneDir && (milestoneDir.startsWith(legacyBase + "/") || milestoneDir.startsWith(legacyBase + "\\"));
55
58
  const tasksDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
56
- if (tasksDir) {
57
- const tasks = getSliceTasks(params.milestoneId, params.sliceId);
58
- for (const task of tasks) {
59
- const summaryPath = join(tasksDir, `${task.id}-SUMMARY.md`);
59
+ const tasks = getSliceTasks(params.milestoneId, params.sliceId);
60
+ for (const task of tasks) {
61
+ const summaryPaths = isLegacy
62
+ ? (tasksDir ? [join(tasksDir, buildTaskFileName(task.id, "SUMMARY"))] : [])
63
+ : milestoneDir
64
+ ? [
65
+ join(milestoneDir, buildFlatTaskFileName(params.sliceId, task.id, "SUMMARY")),
66
+ join(milestoneDir, buildTaskFileName(task.id, "SUMMARY")),
67
+ ]
68
+ : [];
69
+ for (const summaryPath of summaryPaths) {
60
70
  if (existsSync(summaryPath))
61
71
  unlinkSync(summaryPath);
62
72
  }
@@ -17,8 +17,8 @@ import { appendEvent } from "../workflow-events.js";
17
17
  import { logWarning } from "../workflow-logger.js";
18
18
  import { writeReopenReason } from "../reopen-reason.js";
19
19
  import { existsSync, unlinkSync } from "node:fs";
20
- import { join, basename, dirname } from "node:path";
21
- import { resolveTasksDir, resolveSlicePath, clearPathCache } from "../paths.js";
20
+ import { join } from "node:path";
21
+ import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveTasksDir, resolveSlicePath, clearPathCache, } from "../paths.js";
22
22
  export async function handleReopenTask(params, basePath) {
23
23
  // ── Validate required fields ────────────────────────────────────────────
24
24
  if (!params.taskId || typeof params.taskId !== "string" || params.taskId.trim() === "") {
@@ -76,14 +76,20 @@ export async function handleReopenTask(params, basePath) {
76
76
  // summary cleanup into tasks/ (#1208).
77
77
  try {
78
78
  const slicePath = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
79
- if (slicePath) {
80
- const isLegacySlice = basename(dirname(slicePath)) === "slices";
81
- const summaryDir = isLegacySlice
82
- ? (resolveTasksDir(basePath, params.milestoneId, params.sliceId) ?? slicePath)
83
- : slicePath;
84
- const summaryPath = join(summaryDir, `${params.taskId}-SUMMARY.md`);
85
- if (existsSync(summaryPath))
86
- unlinkSync(summaryPath);
79
+ const milestonePath = resolveMilestonePath(basePath, params.milestoneId);
80
+ if (milestonePath) {
81
+ const legacyBase = legacyMilestonesDir(basePath);
82
+ const isLegacy = milestonePath.startsWith(legacyBase + "/") || milestonePath.startsWith(legacyBase + "\\");
83
+ const summaryPaths = isLegacy
84
+ ? [join(resolveTasksDir(basePath, params.milestoneId, params.sliceId) ?? slicePath ?? join(milestonePath, "slices", params.sliceId, "tasks"), buildTaskFileName(params.taskId, "SUMMARY"))]
85
+ : [
86
+ join(milestonePath, buildFlatTaskFileName(params.sliceId, params.taskId, "SUMMARY")),
87
+ join(milestonePath, buildTaskFileName(params.taskId, "SUMMARY")),
88
+ ];
89
+ for (const summaryPath of summaryPaths) {
90
+ if (existsSync(summaryPath))
91
+ unlinkSync(summaryPath);
92
+ }
87
93
  }
88
94
  }
89
95
  catch (cleanupErr) {
@@ -36,6 +36,7 @@
36
36
  // owned by the unit, not in the composer. Reviews must enforce this — it
37
37
  // is the difference between an orchestrator and a runaway DSL.
38
38
  import { resolveManifest, } from "./unit-context-manifest.js";
39
+ import { resolveEffectivePlanningToolsPolicy } from "./planning-subagent-policy.js";
39
40
  import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
40
41
  /**
41
42
  * Produce the inlined-context portion of a unit's system prompt by
@@ -148,11 +149,32 @@ const TOOL_SURFACE_GUIDANCE_BY_UNIT = {
148
149
  "validate-milestone": "Dispatch reviewer subagents in parallel, then persist the verdict via `gsd_validate_milestone`. Do not query `.gsd/gsd.db` directly — use `gsd_milestone_status` and inlined context.",
149
150
  "complete-milestone": "Persist completion only through `gsd_complete_milestone` after verification passes. Do not query `.gsd/gsd.db` directly. Do not write `.gsd/PROJECT.md` or `.gsd/REQUIREMENTS.md` by hand — use `gsd_summary_save` and `gsd_requirement_update`.",
150
151
  "replan-slice": "Persist replans through `gsd_replan_slice` only. Do not edit `PLAN.md` or task plans directly.",
151
- "plan-slice": "Persist planning through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner** for reconnaissance — not implementation agents. Do not edit user source files outside `.gsd/**`.",
152
- "refine-slice": "Persist refinements through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner**. Do not edit user source files outside `.gsd/**`.",
153
- "plan-milestone": "Persist milestone planning through `gsd_plan_milestone` / `gsd_plan_slice`. Do not edit user source files outside `.gsd/**`.",
154
152
  "research-slice": "Dispatch subagents only to **scout** or **planner** for reconnaissance. Do not edit user source files outside `.gsd/**`.",
155
153
  };
154
+ function formatAllowedAgents(agents) {
155
+ return agents.map((agent) => `**${agent}**`).join(", ");
156
+ }
157
+ function guidanceForUnitToolsPolicy(unitType, policy) {
158
+ if (unitType === "plan-slice") {
159
+ const dispatch = policy.mode === "planning-dispatch"
160
+ ? ` Dispatch subagents only to ${formatAllowedAgents(policy.allowedSubagents)} for reconnaissance — not implementation agents.`
161
+ : " Do not dispatch subagents.";
162
+ return `Persist planning through \`gsd_plan_slice\` only.${dispatch} Do not edit user source files outside \`.gsd/**\`.`;
163
+ }
164
+ if (unitType === "refine-slice") {
165
+ const dispatch = policy.mode === "planning-dispatch"
166
+ ? ` Dispatch subagents only to ${formatAllowedAgents(policy.allowedSubagents)}.`
167
+ : " Do not dispatch subagents.";
168
+ return `Persist refinements through \`gsd_plan_slice\` only.${dispatch} Do not edit user source files outside \`.gsd/**\`.`;
169
+ }
170
+ if (unitType === "plan-milestone") {
171
+ const dispatch = policy.mode === "planning-dispatch"
172
+ ? ` Dispatch subagents only to ${formatAllowedAgents(policy.allowedSubagents)}.`
173
+ : "";
174
+ return `Persist milestone planning through \`gsd_plan_milestone\` / \`gsd_plan_slice\`.${dispatch} Do not edit user source files outside \`.gsd/**\`.`;
175
+ }
176
+ return undefined;
177
+ }
156
178
  function guidanceForToolsPolicy(policy) {
157
179
  switch (policy.mode) {
158
180
  case "planning":
@@ -191,8 +213,9 @@ export function composeToolSurfaceInstructions(unitType, opts) {
191
213
  const manifest = resolveManifest(unitType);
192
214
  if (!manifest)
193
215
  return "";
194
- const unitGuidance = TOOL_SURFACE_GUIDANCE_BY_UNIT[unitType];
195
- const policyGuidance = unitGuidance ? null : guidanceForToolsPolicy(manifest.tools);
216
+ const effectiveTools = resolveEffectivePlanningToolsPolicy(unitType, manifest.tools, opts.basePath) ?? manifest.tools;
217
+ const unitGuidance = guidanceForUnitToolsPolicy(unitType, effectiveTools) ?? TOOL_SURFACE_GUIDANCE_BY_UNIT[unitType];
218
+ const policyGuidance = unitGuidance ? null : guidanceForToolsPolicy(effectiveTools);
196
219
  const forbiddenLine = formatForbiddenWorkflowToolsLine(unitType, unitGuidance);
197
220
  const parts = [unitGuidance, policyGuidance, forbiddenLine].filter((part) => typeof part === "string" && part.length > 0);
198
221
  if (parts.length === 0)
@@ -11,13 +11,14 @@
11
11
  import { mkdirSync, writeFileSync } from "node:fs";
12
12
  import { join } from "node:path";
13
13
  /**
14
- * Write a T##-VERIFY.json artifact to the tasks directory.
14
+ * Write a T##-VERIFY.json artifact to the evidence directory.
15
15
  * Creates the directory with mkdirSync({ recursive: true }) if it doesn't exist.
16
+ * Flat-phase callers can pass sliceId to write S##-T##-VERIFY.json.
16
17
  *
17
18
  * stdout/stderr are excluded from the JSON — the full output lives in VerificationResult
18
19
  * in memory and is logged to stderr during the gate run.
19
20
  */
20
- export function writeVerificationJSON(result, tasksDir, taskId, unitId, retryAttempt, maxRetries) {
21
+ export function writeVerificationJSON(result, tasksDir, taskId, unitId, retryAttempt, maxRetries, sliceId) {
21
22
  mkdirSync(tasksDir, { recursive: true });
22
23
  const evidence = {
23
24
  schemaVersion: 1,
@@ -52,7 +53,8 @@ export function writeVerificationJSON(result, tasksDir, taskId, unitId, retryAtt
52
53
  fixAvailable: w.fixAvailable,
53
54
  }));
54
55
  }
55
- const filePath = join(tasksDir, `${taskId}-VERIFY.json`);
56
+ const fileName = sliceId ? `${sliceId}-${taskId}-VERIFY.json` : `${taskId}-VERIFY.json`;
57
+ const filePath = join(tasksDir, fileName);
56
58
  writeFileSync(filePath, JSON.stringify(evidence, null, 2) + "\n", "utf-8");
57
59
  }
58
60
  /**
@@ -13,7 +13,7 @@ import { isClosedStatus } from "./status-guards.js";
13
13
  import { deriveState } from "./state.js";
14
14
  import { renderPlanFromDb, renderRoadmapFromDb } from "./markdown-renderer.js";
15
15
  import { readManifest } from "./workflow-manifest.js";
16
- import { gsdRoot, resolveMilestoneFile, resolveSliceFile, resolveTaskFile, relTaskFile } from "./paths.js";
16
+ import { gsdRoot, resolveMilestoneFile, resolveSliceFile, resolveTaskFile, targetTaskFile } from "./paths.js";
17
17
  // ─── Helpers ─────────────────────────────────────────────────────────────
18
18
  /**
19
19
  * Strip a leading ID prefix (e.g. "M001: " or "S04: ") from a title
@@ -276,8 +276,7 @@ export function renderSummaryProjection(basePath, milestoneId, sliceId, taskId)
276
276
  return;
277
277
  const evidenceRows = getVerificationEvidence(milestoneId, sliceId, taskId);
278
278
  const content = renderSummaryContent(taskRow, sliceId, milestoneId, evidenceRows);
279
- const summaryPath = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY")
280
- ?? join(basePath, relTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY", getMilestone(milestoneId)?.title));
279
+ const summaryPath = targetTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY", getMilestone(milestoneId)?.title);
281
280
  mkdirSync(dirname(summaryPath), { recursive: true });
282
281
  atomicWriteSync(summaryPath, content);
283
282
  }
@@ -2,6 +2,7 @@
2
2
  import { dirname, join, resolve } from "node:path";
3
3
  import { resolveGsdPathContract, resolveMilestoneFile, resolveMilestonePath, targetMilestoneFile, normalizeRealPath, } from "./paths.js";
4
4
  import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
5
+ import { milestoneMetaPath } from "./git-service.js";
5
6
  function tryRealpath(p) {
6
7
  return normalizeRealPath(p);
7
8
  }
@@ -63,7 +64,7 @@ export function scopeMilestone(workspace, milestoneId) {
63
64
  stateFile: () => join(gsd, "STATE.md"),
64
65
  dbPath: () => contract.projectDb,
65
66
  milestoneDir: () => scopeMilestoneDir(basePath, milestoneId),
66
- metaJson: () => join(gsd, `${milestoneId}-META.json`),
67
+ metaJson: () => milestoneMetaPath(basePath, milestoneId),
67
68
  });
68
69
  return scope;
69
70
  }
@@ -21,7 +21,7 @@
21
21
  import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, statSync, unlinkSync, } from "node:fs";
22
22
  import { join } from "node:path";
23
23
  import { reconcileWorktreeDb } from "./gsd-db.js";
24
- import { resolveGsdPathContract } from "./paths.js";
24
+ import { dirIsContentBearingLegacyMilestone, resolveGsdPathContract } from "./paths.js";
25
25
  import { safeCopy, safeCopyRecursive } from "./safe-fs.js";
26
26
  import { logError, logWarning } from "./workflow-logger.js";
27
27
  // ─── Private helpers ──────────────────────────────────────────────────────
@@ -129,6 +129,8 @@ function syncOtherMilestoneArtifacts(srcMilestonesDir, dstMilestonesDir, current
129
129
  if (milestoneEntry.name === currentMilestoneId)
130
130
  continue;
131
131
  const srcMilestoneDir = join(srcMilestonesDir, milestoneEntry.name);
132
+ if (!dirIsContentBearingLegacyMilestone(srcMilestoneDir))
133
+ continue;
132
134
  const dstMilestoneDir = join(dstMilestonesDir, milestoneEntry.name);
133
135
  // Additively project the entire milestone subtree (force:false), not just
134
136
  // top-level files. Prior completed milestones keep their per-slice and
@@ -219,25 +221,25 @@ export function _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestone
219
221
  // Without this, worktree-local files (e.g. VALIDATION.md written
220
222
  // by validate-milestone) get clobbered by stale project root copies,
221
223
  // causing an infinite re-validation loop (#1886).
222
- safeCopyRecursive(join(prGsd, "milestones", milestoneId), join(wtGsd, "milestones", milestoneId), { force: false });
223
- // Additively project the full subtree of every OTHER milestone so
224
- // worktree-bound units can read prior-milestone context artifacts and so
225
- // completed milestones retain their per-slice/per-task SUMMARY.md and
226
- // UAT.md on the worktree filesystem (otherwise the stale-render detector
227
- // flags them as "complete in DB but missing on disk").
228
- syncOtherMilestoneArtifacts(join(prGsd, "milestones"), join(wtGsd, "milestones"), milestoneId);
229
- // Force-sync ASSESSMENT files that have a verdict from project root (#2821).
230
- // The additive-only copy above preserves worktree-local files, but
231
- // ASSESSMENT files are special: after run-uat writes a verdict and post-unit
232
- // syncs it to the project root, the worktree may retain a stale copy (e.g.
233
- // verdict:fail while the project root has verdict:pass from a retry). On
234
- // session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
235
- // persists, checkNeedsRunUat finds no passing verdict → re-dispatches
236
- // run-uat indefinitely (stuck-loop ×9).
237
224
  const prMilestoneDir = join(prGsd, "milestones", milestoneId);
238
225
  const wtMilestoneDir = join(wtGsd, "milestones", milestoneId);
239
- forceOverwriteValidationWithVerdict(prMilestoneDir, wtMilestoneDir, milestoneId);
240
- forceOverwriteAssessmentsWithVerdict(prMilestoneDir, wtMilestoneDir);
226
+ if (dirIsContentBearingLegacyMilestone(prMilestoneDir)) {
227
+ safeCopyRecursive(prMilestoneDir, wtMilestoneDir, { force: false });
228
+ // Force-sync ASSESSMENT files that have a verdict from project root (#2821).
229
+ // The additive-only copy above preserves worktree-local files, but
230
+ // ASSESSMENT files are special: after run-uat writes a verdict and post-unit
231
+ // syncs it to the project root, the worktree may retain a stale copy (e.g.
232
+ // verdict:fail while the project root has verdict:pass from a retry). On
233
+ // session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
234
+ // persists, checkNeedsRunUat finds no passing verdict → re-dispatches
235
+ // run-uat indefinitely (stuck-loop ×9).
236
+ forceOverwriteValidationWithVerdict(prMilestoneDir, wtMilestoneDir, milestoneId);
237
+ forceOverwriteAssessmentsWithVerdict(prMilestoneDir, wtMilestoneDir);
238
+ }
239
+ // Additively project the full subtree of every OTHER content-bearing legacy
240
+ // milestone so worktree-bound units can read prior-milestone context artifacts
241
+ // without recreating empty/meta-only milestones/ scaffolds in flat-phase projects.
242
+ syncOtherMilestoneArtifacts(join(prGsd, "milestones"), join(wtGsd, "milestones"), milestoneId);
241
243
  // Forward-sync completed-units.json from project root to worktree.
242
244
  // Project root is authoritative for completion state after crash recovery;
243
245
  // without this, the worktree re-dispatches already-completed units (#1886).
@@ -160,7 +160,7 @@ export function streamOllamaChat(model, context, options) {
160
160
  * - `"low" | "medium" | "high"` are passed through as strings; gpt-oss honors
161
161
  * them as strength levels, other thinking models treat any present value
162
162
  * as "thinking enabled".
163
- * - `"xhigh"` is collapsed to `"high"` (ollama caps strength at high).
163
+ * - `"xhigh"` and `"max"` are collapsed to `"high"` (ollama caps strength at high).
164
164
  */
165
165
  export function buildThinkParam(model, options) {
166
166
  if (!model.reasoning)
@@ -170,7 +170,7 @@ export function buildThinkParam(model, options) {
170
170
  return undefined;
171
171
  if (level === "minimal")
172
172
  return false;
173
- if (level === "xhigh")
173
+ if (level === "xhigh" || level === "max")
174
174
  return "high";
175
175
  return level;
176
176
  }
@@ -144,6 +144,10 @@ export async function showInterviewRound(questions, opts, ctx) {
144
144
  let previewViewport = 0;
145
145
  let previewTotal = 0;
146
146
  function resetPreviewScroll() { previewScroll = 0; }
147
+ let optionsScroll = 0;
148
+ let optionsViewport = 0;
149
+ let optionsTotal = 0;
150
+ function resetOptionsScroll() { optionsScroll = 0; }
147
151
  function finish(result) {
148
152
  if (completed)
149
153
  return;
@@ -203,6 +207,7 @@ export async function showInterviewRound(questions, opts, ctx) {
203
207
  saveEditorToState();
204
208
  currentIdx = newIdx;
205
209
  resetPreviewScroll();
210
+ resetOptionsScroll();
206
211
  loadStateToEditor();
207
212
  focusNotes = states[currentIdx].notesVisible && states[currentIdx].notes.length > 0;
208
213
  refresh();
@@ -376,32 +381,49 @@ export async function showInterviewRound(questions, opts, ctx) {
376
381
  return;
377
382
  }
378
383
  }
379
- // ── Preview scrolling ────────────────────────────────────────
384
+ // ── Side-by-side panel scrolling ─────────────────────────────
380
385
  if (matchesKey(data, Key.pageUp)) {
386
+ let didScroll = false;
387
+ if (optionsScroll > 0) {
388
+ optionsScroll = Math.max(0, optionsScroll - optionsViewport);
389
+ didScroll = true;
390
+ }
381
391
  if (previewScroll > 0) {
382
392
  previewScroll = Math.max(0, previewScroll - previewViewport);
383
- refresh();
393
+ didScroll = true;
384
394
  }
395
+ if (didScroll)
396
+ refresh();
385
397
  return;
386
398
  }
387
399
  if (matchesKey(data, Key.pageDown)) {
400
+ let didScroll = false;
401
+ const maxOptionsScroll = Math.max(0, optionsTotal - optionsViewport);
402
+ if (optionsScroll < maxOptionsScroll) {
403
+ optionsScroll = Math.min(maxOptionsScroll, optionsScroll + optionsViewport);
404
+ didScroll = true;
405
+ }
388
406
  const maxScroll = Math.max(0, previewTotal - previewViewport);
389
407
  if (previewScroll < maxScroll) {
390
408
  previewScroll = Math.min(maxScroll, previewScroll + previewViewport);
391
- refresh();
409
+ didScroll = true;
392
410
  }
411
+ if (didScroll)
412
+ refresh();
393
413
  return;
394
414
  }
395
415
  // ── Cursor navigation ────────────────────────────────────────
396
416
  if (matchesKey(data, Key.up)) {
397
417
  st.cursorIndex = (st.cursorIndex - 1 + optCount) % optCount;
398
418
  resetPreviewScroll();
419
+ resetOptionsScroll();
399
420
  refresh();
400
421
  return;
401
422
  }
402
423
  if (matchesKey(data, Key.down)) {
403
424
  st.cursorIndex = (st.cursorIndex + 1) % optCount;
404
425
  resetPreviewScroll();
426
+ resetOptionsScroll();
405
427
  refresh();
406
428
  return;
407
429
  }
@@ -637,6 +659,8 @@ export async function showInterviewRound(questions, opts, ctx) {
637
659
  // No scrollable preview unless the side-by-side path sets these below.
638
660
  previewTotal = 0;
639
661
  previewViewport = 0;
662
+ optionsTotal = 0;
663
+ optionsViewport = 0;
640
664
  if (useSideBySide) {
641
665
  // ── Preview path ──────────────────────────────────────
642
666
  const ui = makeUI(theme, contentWidth);
@@ -672,10 +696,21 @@ export async function showInterviewRound(questions, opts, ctx) {
672
696
  const previewWidth = Math.max(MIN_PREVIEW_WIDTH, Math.min(contentWidth - MIN_OPTIONS_WIDTH - DIVIDER_WIDTH, Math.floor(contentWidth * PREVIEW_RATIO)));
673
697
  const leftWidth = Math.max(MIN_OPTIONS_WIDTH, contentWidth - previewWidth - DIVIDER_WIDTH);
674
698
  const fullLeft = renderOptionsColumn(leftWidth);
675
- const leftLines = fullLeft.slice(0, maxBody);
699
+ optionsTotal = fullLeft.length;
700
+ optionsViewport = maxBody;
701
+ const maxOptionsScroll = Math.max(0, fullLeft.length - maxBody);
702
+ if (optionsScroll > maxOptionsScroll)
703
+ optionsScroll = maxOptionsScroll;
704
+ const leftLines = fullLeft.slice(optionsScroll, optionsScroll + maxBody);
676
705
  if (fullLeft.length > maxBody) {
677
- const n = fullLeft.length - maxBody + 1;
678
- leftLines[maxBody - 1] = scrollIndicator(`+${n} lines hidden`, leftWidth);
706
+ const hiddenAbove = optionsScroll;
707
+ const hiddenBelow = fullLeft.length - (optionsScroll + maxBody);
708
+ if (hiddenAbove > 0) {
709
+ leftLines[0] = scrollIndicator(`▲ ${hiddenAbove} more`, leftWidth);
710
+ }
711
+ if (hiddenBelow > 0) {
712
+ leftLines[leftLines.length - 1] = scrollIndicator(`▼ ${hiddenBelow} more · PgUp/PgDn`, leftWidth);
713
+ }
679
714
  }
680
715
  const preview = getCurrentPreview();
681
716
  const fullRight = preview ? renderPreviewColumn(preview, previewWidth) : [];
@@ -734,6 +769,8 @@ export async function showInterviewRound(questions, opts, ctx) {
734
769
  }
735
770
  if (previewTotal > previewViewport)
736
771
  hints.push("pgup/pgdn scroll preview");
772
+ if (optionsTotal > optionsViewport)
773
+ hints.push("pgup/pgdn scroll options");
737
774
  hints.push("esc to exit");
738
775
  const footer = ui.hints(hints)[0] ?? "";
739
776
  cachedLines = renderSharedDialogFrame(theme, title, lines, width, { footer });
@@ -591,7 +591,7 @@ thinkingOverride) {
591
591
  }
592
592
  }
593
593
  }
594
- const ThinkingLevelSchema = StringEnum(["off", "minimal", "low", "medium", "high", "xhigh"], {
594
+ const ThinkingLevelSchema = StringEnum(["off", "minimal", "low", "medium", "high", "xhigh", "max"], {
595
595
  description: "Reasoning effort override for the subagent (forwarded as --thinking). " +
596
596
  "Independent of model choice; unsupported levels are clamped to the model at dispatch.",
597
597
  });
@@ -15,7 +15,7 @@ interface MinimalModel {
15
15
  interface MinimalModelRegistry {
16
16
  getAvailable(): MinimalModel[];
17
17
  }
18
- type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
18
+ type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
19
19
  interface MinimalSettingsManager {
20
20
  getDefaultProvider(): string | undefined;
21
21
  getDefaultModel(): string | undefined;